목록2024/11/12 (7)
센로그
가급적 전처리기보다 컴파일러를 더 가까이 하자.#define을 쓰면, 전처리기가 텍스트를 상수로 대체해서 컴파일러에게 넘긴다.컴파일러의 기호 테이블에도 이름이 들어가지 않는다. 매크로 상수보다는 const나 enum을 쓰자.매크로 상수전처리기가 해주는 단순한 텍스트 치환이다.스코프 개념 없이 전역적이다.타입 안정성도 없다.메모리에 안 올라가며, 따라서 주소 참조도 안된다.const 객체컴파일러가 처리해준다. 기호 테이블(symbol table)에 넣어주므로 타입 검사가 가능하다.따라서 특정 스코프 내에서만 사용 가능하도록 할 수도 있다.메모리에 존재하며, 따라서 주소를 참조할 수도 있다.enum 둔갑술 (enum hack)컴파일러가 처리해준다.int 상수가 필요할 때, enum 둔갑술을 사용하면 어느정도..
초창기의 C++초창기 C++은 클래스가 있는 C 였음.그러나 꾸준한 성장을 거치면서 엄청나게 유연해지고 표현성이 좋아짐 C++을 잘 이해하려면 어떻게 해야 할까?C++을 단일 언어로 바라보는 것을 넘어, 상관 관계가 있는 여러 언어들의 연합체로 바라보자.C++을 구성하는 4가지 하위 언어들CC style의 C++ 요소들객체지향 개념의 C++클래스, 캡슐화, 상속, 다형성, 가상함수 ...템플릿 C++템플릿, 템플릿 메타프로그래밍, ...STL컨테이너, 이터레이터, 알고리즘, 함수 객체 ...각 하위 언어들을 뭉쳐서 통합 언어로 만든 것이 아니라, 각 하위 언어가 자신만의 규칙을 갖고 있는 형태이다.따라서 이 중에서 어떤 부분을 사용하느냐에 따라, C++을 사용한 효과적인 프로그래밍 규칙이 달라진다.
문제 상황을 쉽게 재현할 수 있도록 하는 것이 중요한 이유곧바로 원인을 해결하는 데 집중할 수 있다.문제 상황을 설명하기도 쉽다오류를 수정한 뒤, 해당 상황을 여러 번 반복함으로써 문제가 해결되었다는 것을 증명하기 쉽다. 문제를 효율적으로 재현하는 방법문제를 재현하는 테스트 케이스를 간결하게 만든다.문제를 재현하는 테스트 케이스를 최대한 독립적으로 실행할 수 있는 형태로 만든다.반복적으로 실행할 수 있는 환경을 마련한다.어떤 문제냐에 따라서 환경의 범위가 달라지지만, 만약 시스템을 건드리는 문제라면 가상머신이나 도커 컨테이너 등을 사용하면 실패할 때마다 초기화할 수 있으므로 효과적이다.오류가 발생하는 버전의 복사본을 언제든 생성할 수 있도록 버전 관리 시스템을 사용한다.
성공적인 디버깅을 위한 마음가짐소프트웨어에서 발생한 문제는 항상 찾아서 고칠 수 있다고 믿는다.문제를 해결할 수 있다는 믿음이 없으면 흔들리거나 포기하기 쉽다.발생한 문제를 재현할 수 있다면, 반드시 해결할 수 있다. 재현하기 힘든 문제도 얼마든지 해결 방법을 찾을 수 있다.디버깅을 위한 충분한 시간을 확보한다.디버깅은 프로그래밍보다 훨씬 많은 노력이 필요한 작업이다.디버깅을 할 때는 고도로 집중해야 한다.방해 요인을 제거하고 다양한 가능성을 논리적으로 생각해본다.포기하지 않는다 ^_^ 어려운 문제를 만나면 잠을 자는 것도 좋다!더 이상 해결의 실마리가 보이지 않는 막다른 상황에서, 완전히 새로운 관점으로 디버깅 전략을 수정함으로써 돌파구를 찾을 수있다.잠은 이렇게 새로운 관점을 떠올리기 위해 필요하다!..
버그의 우선순위를 정하는 팁높은 우선순위데이터 손실 이슈고객과의 신뢰 문제이므로 중요하다.보안 이슈서비스 가용성을 저하시키는 이슈금전적인 문제로 직결되기 때문이다.안전과 관련된 이슈충돌 또는 멈춤 현상코드 위생 문제컴파일러 경고, 어서션 실패, 제대로 처리하지 않은 예외, 메모리 누수 등비교적 낮은 우선순위레거시 지원하위 버전 호환성 지원미적인 이슈우회 방법 문서화'다시 시도하세요' 같은 문구로 잠시 덮어두는 것거의 사용하지 않는 기능에서 발생하는 이슈 모든 문제를 해결할 필요는 없다.우선순위가 낮은 이슈를 해결하느라 우선순위가 높은 이슈를 해결하는 게 늦어지면 안된다.우선순위 낮은 이슈를 무시할 거라면, 이슈 추적 시스템에서 명확히 표시하도록 함'해결하지 않을 것임' 액션을 지정하고 이슈를 닫으라는 뜻..
소프트웨어를 다른 환경에서 컴파일 또는 실행해보면 문제를 찾을 수도 있다.프로세서 아키텍처아키텍처 별로 바이트 순서, 널 포인터 처리 방식 등 동작이 다르곤 함.현재는 Intel과 ARM 아키텍처로 좁혀졌음에도, 여전히 아키텍쳐로 인한 차이가 존재함ex) 메모리 레이아웃이나 잘못 정렬된 메모리 접근을 처리하는 방식이 다름아키텍처의 비트 수에 따라서도 동작이 달라짐.보통 N비트 아키텍처~ 이런 건 CPU가 한 번에 처리할 수 있는 데이터 크기와 메모리 주소 공간 크기를 의미함예를들어 long의 사이즈, char* 사이즈 같은 근본적인 값도 OS나 비트수에 따라 달라지곤 함. 다른 환경 사용하는법Virtual Machine 사용하기라즈베리 파이 사용하기클라우드 임대하기 컴파일러 또한 여러 컴파일러를 함께 사..