Ch1.3 It Pays to Understand How Compilation Systems Work

Park Choong Ho·2021년 8월 9일
0

1.3 It Pays to Understand How Compilation Systems Work

hello.c 프로그램 같이 간단한 프로그램에서는, 정확하고 효율적인 기계어를 생성하기 위해 컴파일 시스템에 의존합니다. 하지만, 왜 프로그래머들이 컴파일 시스템의 동작 방식을 이해해야하는지 몇가지 중요한 이유가 있습니다.

  • Optimizing program performance. 현대 컴파일러들은 좋은 코드를 생성하는 정교한 도구입니다. 프로그래머로서 효율적인 코드를 쓰기위해서는 컴파일러의 내부동작을 알 필요가 있습니다. 하지만, C 프로그램에서의 좋은 코딩 결정을 내리기 위해, machine-level 코드와 컴파일러가 C 구문들을 기계어로 변환시키는 방식에 대한 기초적인 이해가 필요합니다. 예를 들어, switch문은 언제나 if-else문보다 효율적일까요? 함수 호출로 인한 오버헤드는 어느 정도일까요? while문이 for문보다 더 효율적일까요? 포인터 참조는 배열 index보다 더 효율적일까요? 왜 루프문은 by reference로 전달하는 것보다 지역변수로 더하는 것이 더 빠를까요? 어떻게 단순히 수학적 표현에서의 parentheses를 재배열 함으로써 함수가 더 빨라질까요? 3장에서는 최신 세대의 기계어인 x86-64를 소개합니다. 우리는 컴파일러가 다른 C 구조들을 이 언어로 어떻게 변환하는지 살펴볼 것입니다. 5장에서는, C code에 간단한 변화를 줘 컴파일러가 일을 더 잘하게 함으로써 C 프로그램 퍼포먼스를 상승시켜볼 것입니다. 6장에서는, 메모리 시스템의 계층적구조에 대해 배울것입니다. 거기에 더해 어떻게 C 컴파일러가 메모리에 배열 데이터를 저장하는지, 어떻게 C 프로그램들이 이러한 특성을 활용해 더 효율적으로 동작하는지도 살펴볼 것입니다.
  • Understanding link-time errors. 경험에 비추어 보았을 때, 몇몇 가장 알려진 프로그래밍 에러들은 링커 동작과 연관되어 있습니다. 특히 큰 소프트웨어 시스템을 생성할 때 그렇습니다. 예를 들어, 링커가 reference를 resolve할 수 없다는 것이 무엇을 의미할까요? static 변수와 global 변수의 차이점은 무엇일까요? 만약 다른 C 파일에 같은 이름의 두 global 변수를 선언하면 어떻게 될까요? static 라이브러리와 dynamic 라이브러리의 차이점은 무엇일까요? 왜 우리가 명령어에 나열하는 라이브러리 순서가 중요할 까요? 이 모든 것을 차치하고 왜 몇몇 링커 관련 오류들은 런타임까지 나타나지 않을까요? 우리는 이와 관련된 질문에 대한 해답을 7장에서 찾을 것입니다.
  • Avoiding security holes. 수년에 걸쳐, buffer overflow 취약성은 네트워크와 인터넷 서버의 많은 취약점을 설명해 왔습니다. 이 취약점들은 너무 적은 프로그래머들 만이 신뢰하지 않는 소스로부터 들어오는 데이터 형태와 양을 주의해서 제한해야함을 이해하고 있기에 발생합니다. 안전한 프로그래밍을 하는 첫발은 데이터와 제어 정보가 프로그램 스택에 저장되는 방식의 결과를 이해하는 것에서부터 출발합니다. 우리는 스택 규율과 버퍼 오버플로우 취약성을 3장에서 다룹니다. 또한 프로그래머, 컴파일러, 운영체제에 의해 활용되는 이러한 위협을 줄이는 방법 또한 배우게 될것입니다.
profile
백엔드 개발자 디디라고합니다.

0개의 댓글