1.3 어떻게 컴파일 시스템이 동작하는 지 알아야 하는 이유
프로그램 성능 최적화하기
컴파일러가 어떻게 C 문장들을 기계어 코드로 번역하는가?
- switch문은 if else 문을 연속해서 사용하는 것보다 얼마나 효율적?
- 오버헤드는 얼마나 되는가? 부가적인 B처리
- while루프가 for 보다 얼마나 효율적인가?
- 포인터 참조가 왜 인덱스보다 효율적인가?
- 합계를 지역변수 저장보다 참조형태로 받은 것 보다 왜 빨리 실행 되는가?
- 괄호 재배치만 해도 왜 더 빨리 실행 되는가?
링크 에러 이해하기
- 큰 규모의 소프트웨어 시스템을 빌드 할려는 경우
- 링커가 참조를 풀어낼 수 없다? 무슨 뜻인가?
- 정적변수와 전역변수의 차이는 ?
- 다른 파일에 동일한 이름의 전역변수를 정의하면 무슨 일 ?
- 정적 라이브러리, 동적 라이브러리의 차이는?
보안 약점 피하기
- 버퍼 오버플로우 취약성, 신뢰할 수 없는 곳에서 데이터의 양과 형태를 깊게 제한해야한다
- 프로그램 스택에 데이터와 제어정보가 저장 되는 방식 때문에 생기는 영향
1.4 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다
쉘에 인터프리터로 프롬프트를 출력 --> 명령어 라인 입력 --> 명령 실행
1.4.1 시스템의 하드웨어 조직

-
버스: 전기적 배선군을 버스, 바이트 정보를 전송! 일반적으로 워드 크기 단위를 즉 16bit 엇 근데 이것은 시스템마다 다르기 때문에 4바이트 32bit 혹은 8 바이트 64bit 가 대부분이다.
-
입출력 장치: 입력용키보드 /마우스 /출력용 디스플레이/ 디스크 드라이브
컨트롤러나 어댑터를 통해서 연결 --> 패키징차이 이다
컨트롤러: 디바이스 자체가 칩셋, 머더보드에 장착
어댑터: 머더보드 슬롯에 장착되는 카드
-
메인 메모리: 프로그램 실행중 데이터, 프로그램을 저장하는 임시 저장장치
DRAM 칩, 연속적인 바이트 배열 0부터 시작해서 각자 고유의 주소가 있다
-
프로세서: 메인 메모리에 저장된 인스트럭션을 해독. 워드 크기의 저장장치인 PC가 존재한다.
- 메인 메모리에 hello 파일을 로딩
- DMA라는 접근은 디스크에서 메인 메모리로 직접 이동
- main 루틴의 기계어 인스트럭션을 실행