요약 링커는 컴파일러가 생성한 대상 파일 여러 개를 하나로 묶어 하나의 최종 실행 파일을 생성함. 링크의 전체 과정 대상 파일이 참조하고 있는 **외부 심벌(external symbol)**에 대한 실제 구현이 어느 모듈이든지 단 하나만 있어야 하며, 링커는 이를 찾아내서 연결하는 작업을 하는데, 이를 **심벌 해석(symbol resolution)** 이라고 함. 대상 파일을 모아 하나로 합침. 대상 파일에서 다른 파일의 내용을 ‘참조’ 하고 싶지만, 아직 다른 파일의 내용이 작성되지 않은 경우, 임시로 그 값을 비워두었다가 그 파일의 작업이 마쳐지면 그때 쭉 다 바꿔준다. 이 과정을 **재배치(relocation)** 이라고 함. 링크 과정 (심벌 해석) 심벌은 전역 변수와 함수의 이름을 포함하는 모..
요약 프로그래밍 언어로 작성된 “소스 파일”을 컴파일러에게 먹여주면 컴파일러는 이것을 꼭꼭 씹고 뜯고 맛본 후, 실행 파일 형태로 뱉어냄. 실행 파일이 바로 CPU가 직접 실행할 수 있는 기계 명령어 임. 즉, 컴파일러는 “번역기” 이자 “텍스트 처리 프로그램” 이라고 생각할 수 있음. 컴파일러는 소스 파일의 각 항목을 잘게 쪼개어 토큰화 함. 소스 코드에서 토큰을 추출하는 과정을 어휘 분석(lexical analysis) 라고 함. 토큰을 가지고 그 의도를 표현해야만 함. 특정 토큰 키워드에 따라 컴파일러는 문법 오류를 보고할 수 있음. 이 과정을 해석(parsing) 이라고 함. 컴파일러는 해석을 통한 구조를 트리로 표현함. 구문 트리에서 이상이 있는지 확인함. 이 단계를 통과하면 컴파일 오류가 없다..
요약 (Section 1.1 여러분이 프로그래밍 언어를 발명한다면?) CPU는 단순하지만 빠르다. 프로그래머는 단순하지만 빠른 CPU를 다루기 위해 천공 카드로 컴퓨터 작업을 제어함. 하지만 이는 CPU 관점의 코드일 뿐 인간이 이해하기 어려움 어셈블리어를 통해 인간이 인식할 수 있는 ‘기계 명령어’ 를 이용하여 CPU를 제어하게됨. 하지만 여전히 어셈블리어는 저수준 언어임. 저수준 언어는 매우 추상화되어 있어 구체적으로 ‘우리가 원하는 동작’ 을 하려면 세부 사항들을 하나하나 다 알려줘야 함. 고급 프로그래밍 언어를 통해 CPU를 동작시키기 위한 ‘추상적인 표현’ 을 ‘구체적인 표현’으로 자동 변환할 수 있게 됨. 프로그래밍 언어를 통해 단순한 문장을 표현하기도 하지만, 이들이 중첩되어 복잡한 문장을 ..