[Powered by Google Translate] 롭 보덴 :하자가 컴파일러에 대해 이야기. 이 시점까지, 당신은 소스 코드를로까지 입력 한 일부 파일은이 커다란 블랙 박스를 통해 보낸 꽝, 그리고 아웃합니까하여 실행 파일을 제공 정확히 귀하의 소스 코드에 썼다. 있었습니다 그와 같은 마법으로, 우리는 더 가까이 데려 갈거야 실제로 무슨 일이 일어나고 있는지보세요 우리는 파일을 컴파일 할 때. 그래서 그 뭔가를 컴파일한다는 것은 무슨 뜻입니까? 음, 가장 일반적인 의미에서, 그냥 의미 변환 코드는 하나의 작성 다른 언어를 프로그래밍. 하지만 사람들은 말을 보통 때 그들은 뭔가를 컴파일 그들은 높은 수준의 프로그래밍에서 복용 의미 낮은 수준의 프로그래밍 언어에 대한 언어입니다. 이것들은 매우 subjective 용어처럼 보일 수 있습니다. 예를 들어, 당신은 아마 높은로 C 라 생각하지 마세요 레벨 프로그래밍 언어,하지만 당신은 컴파일 않습니다. 그러나 모든 상대입니다. 우리가 볼 때, 어셈블리 코드 결국 기계 우리가 아래로 컴파일되는 코드는 대단한 낮은 수준이다 C.보다 우리가 오늘날의 데모에서 꽝을 사용됩니다 만, 여기에 아이디어 많은 다른 컴파일러로 수행합니다. 꽝를 들어, 전체의 네 개의 주요 단계가 있습니다 편집. 두,이 한, 전처리에 의해 수행 전처리 아르 컴파일러에 의해 수행 컴파일, 3, 조립 , 4, 어셈블러에 의해 수행 연결은 링커에 의해 수행. 이 혼란 될 수 전체의 substeps 중 하나 꽝 컴파일러는 컴파일러라고되어 있지만, 우리는 그로 연결됩니다. 우리는 우리의 예제로 간단한 인사 세계 프로그램을 사용됩니다 이 동영상을 전체. 가 살펴 보자. 첫 번째 단계는 전처리입니다. 전처리는 무엇입니까? 지금까지 읽거나 작성한 거의 모든 C 프로그램에서, 당신은 해시로 시작하는 코드의 라인을 사용했습니다. 나는 해시 전화 할게,하지만 또한 파운드 번호 전화 할 수 있습니다 로그인하거나 날카로운. 이러한 줄은 선행 처리기 지시어입니다. 당신은 아마 # 전에 정의하고 # 등 볼 수 있지만, 거기에 한 전처리가 인식하는 여러 개 있습니다. 가 # 우리의 여러분, 안녕하세요 예에 정의를 추가 할 수 있습니다. 지금의이 파일에 그냥 처리기를 실행할 수 있습니다. clage-E 플래그를 전달하여, 당신이 실행하는 지시하는 단지 전처리. 어떻게 알아 보자. 꽝이 모든 걸를 사는 것 같습니다 명령 줄에서. 라는 새 파일이 출력 모두를 구원하기 위하여 hello2.c, 우리는 명령에> hello2.c를 추가합니다. 지금이 우리의 preprocessed 파일을 살펴 보자. 오, 무슨 우리가이 작은 프로그램에 일이 있었죠? 우리는이 파일의 맨 아래에있는 모든 길을 갈 경우, 우리는 볼 수 있습니다 우리가 실제로 작성하는 코드의 일부. # 정의가 사라되고 있다는 사실을 알 수와 이름의 모든 인스턴스 우리가 지정한 정확히로 대체되었습니다 # 행을 정의합니다. 따라서 이러한 모든 typedefs 및 함수 선언은 무엇입니까 파일의 상단에있는? # 정의는 유일한 전처리 않았 음을 확인합니다 우리가 지정된 지시어. 우리는 또한 # stdio.h를 포함하고 있습니다. 그래서 미친 라인의 모든은 stdio.h 복사 실제 이 파일의 상단에 붙여 넣기. 헤더 파일 기능에 대한 매우 유용한 이유 선언. 대신 기능을 모두 복사하여 붙여 넣기 할 필요의 당신이 파일의 상단에 사용할 계획 선언, 전처리는 헤더에서 그들을 복사하여 붙여 넣기합니다 당신을 제출하십시오. 이제 우리는 전처리를 완료하는, 우리는으로 이동 편집. 이 때문에 우리는이 단계 편집에 전화하는 이유는 꽝이 실제로는 C에서에 컴파일 않는 단계 조립 코드입니다. 꽝이 어셈블리에 대한 파일을 컴파일해야하지만,하기 위하여 더 이상 계속하지, 그것을 통과-S 플래그 명령 줄에서. 하자 어셈블리에서 살펴 파일은 해당이 출력되었습니다. 꽤 다른 언어 것 같습니다. 어셈블리 코드는 매우 프로세서에만 적용됩니다. 이 경우, 이후 CS50 어플라이언스에서 실행되고 가상 x86 프로세서,이 x86의 어셈블리 코드입니다. 매우 소수의 사람들이 요즘 어셈블리 코드에서 직접 작성 하지만 아빠는 항상 쓰는 모든 C 프로그램은 아래 변환됩니다 조립에. 다시 말하지만, 우리는 어셈블리로 C를 컴파일이 단계를 전화 우리는 더 높은 수준에서 낮은 수준으로 이동되므로 언어를 프로그래밍. 어떻게 C보다 조립 낮은 수준 하죠? 음, 조립, 우리는 매우 우리가 할 수있는 일에 제한됩니다. 어떤 종류의의 경우 일 때입니다에 대한, 또는 루프가 있습니다. 하지만 당신은 동일한 작업을 수행 할 수있는 이러한 컨트롤 구조는 제한된 작업을 사용하여 제공하고 총회는 제공하지 않습니다. 그러나 낮은 수준의 조립은 정말 얼마나보고 가자 우리 컴파일에서 추가 한 단계, 조립. 이 어셈블리 코드를 변환하는 어셈블러의 일이야 개체 나 기계 코드로. 어셈블러 출력 어셈블리를하지 않는 기억, 대신에, 조립 및 출력 시스템 코드에서이 소요됩니다. 기계 코드는 실제 하나의과 0의 그 CPU 드릴 수 있습니다 우리가 여전히 남아 작품의 작은 비트를 가지고 있지만, 이해 우리는 우리의 프로그램을 실행하기 전에. 하자 전달하여 어셈블리 코드를 조립 꽝-C 플래그. 이제 조립 파일에 알아 보자. 자, 아주 많이 도움이되지 않습니다. 기계 코드가 그 애들과 제로입니다 기억 컴퓨터가 이해 할 수 있습니다. 그게 우리가 이해하기 쉬운 것은 아닙니다. 그럼 조립 정확히 얼마나 낮은 수준인가? 이 오브젝트 코드와 거의 동일입니다. 어셈블리에서 개체 코드에가는 것은 더 이상합니다 변화보다 번역되는데,이 이유 하나에 어셈블러를 고려하지 않을 수 모든 실제 컴파일을 수행. 사실, 수동에서 번역 쉽죠 기계 코드에 조립. 그 첫 번째 줄은 main () 함수의 어셈블리를 살펴보면 진수 0x55에 상응하도록 발생합니다. 바이너리에 그 1,010,101입니다. 두 번째 줄 16 진수 0x895에 대응하기 위해 발생합니다. 그리고 그 다음, 0x56. 비교적 간단한 테이블을 감안할 때, 당신은 번역 할 수 기계가 너무 이해할 수있는 코드로 어셈블리. 따라서 한 나머지 단계는이 연결되어 컴파일. 연결은 하나의 큰 파일로 오브젝트 파일의 무리를 결합 당신은 실제로 실행할 수 있는지 확인하십시오. 연결은 매우 시스템에 따라 달라집니다. 단지 객체를 연결하는 꽝를 얻을 수 있도록 가장 쉬운 방법 함께 파일은 모든 파일에 꽝를 호출하는 것입니다 당신은 함께 연결하려고합니다. 당신이 지정하는 경우. O 파일을 다음은, 재 처리 할 필요가 없습니다 컴파일하고 소스 코드를 모두 조립. 이 우리의 파일에 수학 기능을 던져 버리는, 그래서 우리는이 인치 링크 할 일 이번에는 오브젝트 코드로 다시 내려 컴파일하게하고 거기에 꽝를 호출합니다. 죄송합니다. 우리가 수학 기능을 포함하기 때문에, 우리는에 연결해야합니다 수학 라이브러리 - 임. 우리가의 다발을 함께 연결하고 싶어합니다. O 파일 우리 우리 힘으로 쓴, 우리는에서 그들 모두를 지정합니다 명령 줄. 제한은 이러한 파일의 하나의 필수 실제로 main 함수를 지정하거나 다른 결과 실행 파일은 어디서부터 시작해야할지하지 않을 코드를 실행할 수 있습니다. 에 링크 할 파일을 지정의 차이점은 무엇입니까 와 - 내가 불과 직접 파일을 지정? 아무것도. 이건 그냥 꽝 정확히 어떤 파일을 알고 많죠 뭔가가 같은 - 임 참조 할 발생합니다. 해당 파일을 직접 알고 있다면, 당신이를 지정할 수 명시 적으로. 그냥 모든 - 내가 플래그가 마지막에 와야 기억 고객 수요. 그리고 그게 전부예요. 당신은 단지 파일에 꽝을 실행하면이 그건 무슨 실제로 하죠. 내 이름은 롭 보덴 있으며,이 CS50입니다.