1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] 롭 보덴 :하자가 컴파일러에 대해 이야기. 2 00:00:09,100 --> 00:00:11,490 이 시점까지, 당신은 소스 코드를로까지 입력 한 3 00:00:11,490 --> 00:00:14,260 일부 파일은이 커다란 블랙 박스를 통해 보낸 4 00:00:14,260 --> 00:00:16,890 꽝, 그리고 아웃합니까하여 실행 파일을 제공 5 00:00:16,890 --> 00:00:19,430 정확히 귀하의 소스 코드에 썼다. 6 00:00:19,430 --> 00:00:22,170 있었습니다 그와 같은 마법으로, 우리는 더 가까이 데려 갈거야 7 00:00:22,170 --> 00:00:23,590 실제로 무슨 일이 일어나고 있는지보세요 8 00:00:23,590 --> 00:00:25,220 우리는 파일을 컴파일 할 때. 9 00:00:25,220 --> 00:00:28,580 그래서 그 뭔가를 컴파일한다는 것은 무슨 뜻입니까? 10 00:00:28,580 --> 00:00:31,150 >> 음, 가장 일반적인 의미에서, 그냥 의미 11 00:00:31,150 --> 00:00:32,580 변환 코드는 하나의 작성 12 00:00:32,580 --> 00:00:34,680 다른 언어를 프로그래밍. 13 00:00:34,680 --> 00:00:37,550 하지만 사람들은 말을 보통 때 그들은 뭔가를 컴파일 14 00:00:37,550 --> 00:00:39,660 그들은 높은 수준의 프로그래밍에서 복용 의미 15 00:00:39,660 --> 00:00:42,460 낮은 수준의 프로그래밍 언어에 대한 언어입니다. 16 00:00:42,460 --> 00:00:44,960 이것들은 매우 subjective 용어처럼 보일 수 있습니다. 17 00:00:44,960 --> 00:00:48,090 예를 들어, 당신은 아마 높은로 C 라 생각하지 마세요 18 00:00:48,090 --> 00:00:51,440 레벨 프로그래밍 언어,하지만 당신은 컴파일 않습니다. 19 00:00:51,440 --> 00:00:52,730 그러나 모든 상대입니다. 20 00:00:52,730 --> 00:00:55,790 우리가 볼 때, 어셈블리 코드 결국 기계 21 00:00:55,790 --> 00:00:59,270 우리가 아래로 컴파일되는 코드는 대단한 낮은 수준이다 22 00:00:59,270 --> 00:01:00,700 C.보다 23 00:01:00,700 --> 00:01:03,310 우리가 오늘날의 데모에서 꽝을 사용됩니다 만, 24 00:01:03,310 --> 00:01:06,360 여기에 아이디어 많은 다른 컴파일러로 수행합니다. 25 00:01:06,360 --> 00:01:09,160 >> 꽝를 들어, 전체의 네 개의 주요 단계가 있습니다 26 00:01:09,160 --> 00:01:10,200 편집. 27 00:01:10,200 --> 00:01:15,430 두,이 한, 전처리에 의해 수행 전처리 아르 28 00:01:15,430 --> 00:01:19,530 컴파일러에 의해 수행 컴파일, 3, 조립 29 00:01:19,530 --> 00:01:22,010 , 4, 어셈블러에 의해 수행 30 00:01:22,010 --> 00:01:24,640 연결은 링커에 의해 수행. 31 00:01:24,640 --> 00:01:27,600 이 혼란 될 수 전체의 substeps 중 하나 32 00:01:27,600 --> 00:01:30,980 꽝 컴파일러는 컴파일러라고되어 있지만, 33 00:01:30,980 --> 00:01:32,530 우리는 그로 연결됩니다. 34 00:01:32,530 --> 00:01:35,050 우리는 우리의 예제로 간단한 인사 세계 프로그램을 사용됩니다 35 00:01:35,050 --> 00:01:36,270 이 동영상을 전체. 36 00:01:36,270 --> 00:01:38,380 가 살펴 보자. 37 00:01:38,380 --> 00:01:40,330 >> 첫 번째 단계는 전처리입니다. 38 00:01:40,330 --> 00:01:42,520 전처리는 무엇입니까? 39 00:01:42,520 --> 00:01:45,560 지금까지 읽거나 작성한 거의 모든 C 프로그램에서, 40 00:01:45,560 --> 00:01:48,310 당신은 해시로 시작하는 코드의 라인을 사용했습니다. 41 00:01:48,310 --> 00:01:51,730 나는 해시 전화 할게,하지만 또한 파운드 번호 전화 할 수 있습니다 42 00:01:51,730 --> 00:01:53,280 로그인하거나 날카로운. 43 00:01:53,280 --> 00:01:56,840 이러한 줄은 선행 처리기 지시어입니다. 44 00:01:56,840 --> 00:02:00,650 당신은 아마 # 전에 정의하고 # 등 볼 수 있지만, 거기에 한 45 00:02:00,650 --> 00:02:03,690 전처리가 인식하는 여러 개 있습니다. 46 00:02:03,690 --> 00:02:07,340 가 # 우리의 여러분, 안녕하세요 예에 정의를 추가 할 수 있습니다. 47 00:02:07,340 --> 00:02:11,690 지금의이 파일에 그냥 처리기를 실행할 수 있습니다. 48 00:02:11,690 --> 00:02:16,150 clage-E 플래그를 전달하여, 당신이 실행하는 지시하는 49 00:02:16,150 --> 00:02:17,880 단지 전처리. 50 00:02:17,880 --> 00:02:19,130 어떻게 알아 보자. 51 00:02:22,250 --> 00:02:24,020 꽝이 모든 걸를 사는 것 같습니다 52 00:02:24,020 --> 00:02:25,200 명령 줄에서. 53 00:02:25,200 --> 00:02:27,800 라는 새 파일이 출력 모두를 구원하기 위하여 54 00:02:27,800 --> 00:02:33,850 hello2.c, 우리는 명령에> hello2.c를 추가합니다. 55 00:02:33,850 --> 00:02:37,800 지금이 우리의 preprocessed 파일을 살펴 보자. 56 00:02:37,800 --> 00:02:40,810 >> 오, 무슨 우리가이 작은 프로그램에 일이 있었죠? 57 00:02:40,810 --> 00:02:43,890 우리는이 파일의 맨 아래에있는 모든 길을 갈 경우, 우리는 볼 수 있습니다 58 00:02:43,890 --> 00:02:46,070 우리가 실제로 작성하는 코드의 일부. 59 00:02:46,070 --> 00:02:49,800 # 정의가 사라되고 있다는 사실을 알 수와 이름의 모든 인스턴스 60 00:02:49,800 --> 00:02:51,950 우리가 지정한 정확히로 대체되었습니다 61 00:02:51,950 --> 00:02:53,590 # 행을 정의합니다. 62 00:02:53,590 --> 00:02:56,530 따라서 이러한 모든 typedefs 및 함수 선언은 무엇입니까 63 00:02:56,530 --> 00:02:58,140 파일의 상단에있는? 64 00:02:58,140 --> 00:03:00,820 # 정의는 유일한 전처리 않았 음을 확인합니다 65 00:03:00,820 --> 00:03:02,390 우리가 지정된 지시어. 66 00:03:02,390 --> 00:03:05,280 우리는 또한 # stdio.h를 포함하고 있습니다. 67 00:03:05,280 --> 00:03:09,560 그래서 미친 라인의 모든은 stdio.h 복사 실제 68 00:03:09,560 --> 00:03:11,810 이 파일의 상단에 붙여 넣기. 69 00:03:11,810 --> 00:03:14,110 헤더 파일 기능에 대한 매우 유용한 이유 70 00:03:14,110 --> 00:03:15,160 선언. 71 00:03:15,160 --> 00:03:17,740 대신 기능을 모두 복사하여 붙여 넣기 할 필요의 72 00:03:17,740 --> 00:03:21,050 당신이 파일의 상단에 사용할 계획 선언, 73 00:03:21,050 --> 00:03:22,990 전처리는 헤더에서 그들을 복사하여 붙여 넣기합니다 74 00:03:22,990 --> 00:03:24,140 당신을 제출하십시오. 75 00:03:24,140 --> 00:03:26,480 >> 이제 우리는 전처리를 완료하는, 우리는으로 이동 76 00:03:26,480 --> 00:03:27,680 편집. 77 00:03:27,680 --> 00:03:30,725 이 때문에 우리는이 단계 편집에 전화하는 이유는 78 00:03:30,725 --> 00:03:34,130 꽝이 실제로는 C에서에 컴파일 않는 단계 79 00:03:34,130 --> 00:03:35,370 조립 코드입니다. 80 00:03:35,370 --> 00:03:38,280 꽝이 어셈블리에 대한 파일을 컴파일해야하지만,하기 위하여 81 00:03:38,280 --> 00:03:42,030 더 이상 계속하지, 그것을 통과-S 플래그 82 00:03:42,030 --> 00:03:43,560 명령 줄에서. 83 00:03:43,560 --> 00:03:44,790 하자 어셈블리에서 살펴 84 00:03:44,790 --> 00:03:47,390 파일은 해당이 출력되었습니다. 85 00:03:47,390 --> 00:03:49,740 꽤 다른 언어 것 같습니다. 86 00:03:49,740 --> 00:03:52,660 어셈블리 코드는 매우 프로세서에만 적용됩니다. 87 00:03:52,660 --> 00:03:55,440 이 경우, 이후 CS50 어플라이언스에서 실행되고 88 00:03:55,440 --> 00:04:00,470 가상 x86 프로세서,이 x86의 어셈블리 코드입니다. 89 00:04:00,470 --> 00:04:03,450 매우 소수의 사람들이 요즘 어셈블리 코드에서 직접 작성 90 00:04:03,450 --> 00:04:06,490 하지만 아빠는 항상 쓰는 모든 C 프로그램은 아래 변환됩니다 91 00:04:06,490 --> 00:04:07,940 조립에. 92 00:04:07,940 --> 00:04:11,440 다시 말하지만, 우리는 어셈블리로 C를 컴파일이 단계를 전화 93 00:04:11,440 --> 00:04:14,170 우리는 더 높은 수준에서 낮은 수준으로 이동되므로 94 00:04:14,170 --> 00:04:15,480 언어를 프로그래밍. 95 00:04:15,480 --> 00:04:17,880 >> 어떻게 C보다 조립 낮은 수준 하죠? 96 00:04:17,880 --> 00:04:21,660 음, 조립, 우리는 매우 우리가 할 수있는 일에 제한됩니다. 97 00:04:21,660 --> 00:04:25,120 어떤 종류의의 경우 일 때입니다에 대한, 또는 루프가 있습니다. 98 00:04:25,120 --> 00:04:27,560 하지만 당신은 동일한 작업을 수행 할 수있는 이러한 컨트롤 99 00:04:27,560 --> 00:04:30,270 구조는 제한된 작업을 사용하여 제공하고 100 00:04:30,270 --> 00:04:32,350 총회는 제공하지 않습니다. 101 00:04:32,350 --> 00:04:35,960 그러나 낮은 수준의 조립은 정말 얼마나보고 가자 102 00:04:35,960 --> 00:04:39,320 우리 컴파일에서 추가 한 단계, 조립. 103 00:04:39,320 --> 00:04:41,890 이 어셈블리 코드를 변환하는 어셈블러의 일이야 104 00:04:41,890 --> 00:04:44,740 개체 나 기계 코드로. 105 00:04:44,740 --> 00:04:47,610 어셈블러 출력 어셈블리를하지 않는 기억, 106 00:04:47,610 --> 00:04:51,080 대신에, 조립 및 출력 시스템 코드에서이 소요됩니다. 107 00:04:51,080 --> 00:04:54,040 기계 코드는 실제 하나의과 0의 그 CPU 드릴 수 있습니다 108 00:04:54,040 --> 00:04:57,290 우리가 여전히 남아 작품의 작은 비트를 가지고 있지만, 이해 109 00:04:57,290 --> 00:04:59,380 우리는 우리의 프로그램을 실행하기 전에. 110 00:04:59,380 --> 00:05:01,400 하자 전달하여 어셈블리 코드를 조립 111 00:05:01,400 --> 00:05:04,080 꽝-C 플래그. 112 00:05:04,080 --> 00:05:06,410 이제 조립 파일에 알아 보자. 113 00:05:06,410 --> 00:05:09,220 >> 자, 아주 많이 도움이되지 않습니다. 114 00:05:09,220 --> 00:05:11,340 기계 코드가 그 애들과 제로입니다 기억 115 00:05:11,340 --> 00:05:13,240 컴퓨터가 이해 할 수 있습니다. 116 00:05:13,240 --> 00:05:16,080 그게 우리가 이해하기 쉬운 것은 아닙니다. 117 00:05:16,080 --> 00:05:19,160 그럼 조립 정확히 얼마나 낮은 수준인가? 118 00:05:19,160 --> 00:05:21,480 이 오브젝트 코드와 거의 동일입니다. 119 00:05:21,480 --> 00:05:24,300 어셈블리에서 개체 코드에가는 것은 더 이상합니다 120 00:05:24,300 --> 00:05:27,540 변화보다 번역되는데,이 이유 121 00:05:27,540 --> 00:05:29,310 하나에 어셈블러를 고려하지 않을 수 122 00:05:29,310 --> 00:05:31,400 모든 실제 컴파일을 수행. 123 00:05:31,400 --> 00:05:34,110 사실, 수동에서 번역 쉽죠 124 00:05:34,110 --> 00:05:36,050 기계 코드에 조립. 125 00:05:36,050 --> 00:05:39,040 그 첫 번째 줄은 main () 함수의 어셈블리를 살펴보면 126 00:05:39,040 --> 00:05:42,100 진수 0x55에 상응하도록 발생합니다. 127 00:05:42,100 --> 00:05:45,470 바이너리에 그 1,010,101입니다. 128 00:05:45,470 --> 00:05:49,300 두 번째 줄 16 진수 0x895에 대응하기 위해 발생합니다. 129 00:05:49,300 --> 00:05:51,290 그리고 그 다음, 0x56. 130 00:05:51,290 --> 00:05:53,730 비교적 간단한 테이블을 감안할 때, 당신은 번역 할 수 131 00:05:53,730 --> 00:05:57,130 기계가 너무 이해할 수있는 코드로 어셈블리. 132 00:05:57,130 --> 00:05:58,810 >> 따라서 한 나머지 단계는이 133 00:05:58,810 --> 00:06:01,150 연결되어 컴파일. 134 00:06:01,150 --> 00:06:04,530 연결은 하나의 큰 파일로 오브젝트 파일의 무리를 결합 135 00:06:04,530 --> 00:06:06,380 당신은 실제로 실행할 수 있는지 확인하십시오. 136 00:06:06,380 --> 00:06:08,570 연결은 매우 시스템에 따라 달라집니다. 137 00:06:08,570 --> 00:06:11,030 단지 객체를 연결하는 꽝를 얻을 수 있도록 가장 쉬운 방법 138 00:06:11,030 --> 00:06:13,920 함께 파일은 모든 파일에 꽝를 호출하는 것입니다 139 00:06:13,920 --> 00:06:15,190 당신은 함께 연결하려고합니다. 140 00:06:15,190 --> 00:06:18,740 당신이 지정하는 경우. O 파일을 다음은, 재 처리 할 필요가 없습니다 141 00:06:18,740 --> 00:06:21,680 컴파일하고 소스 코드를 모두 조립. 142 00:06:21,680 --> 00:06:23,960 이 우리의 파일에 수학 기능을 던져 버리는, 그래서 우리는이 143 00:06:23,960 --> 00:06:25,210 인치 링크 할 일 144 00:06:34,220 --> 00:06:37,010 이번에는 오브젝트 코드로 다시 내려 컴파일하게하고 145 00:06:37,010 --> 00:06:38,260 거기에 꽝를 호출합니다. 146 00:06:40,560 --> 00:06:41,420 죄송합니다. 147 00:06:41,420 --> 00:06:43,790 우리가 수학 기능을 포함하기 때문에, 우리는에 연결해야합니다 148 00:06:43,790 --> 00:06:46,610 수학 라이브러리 - 임. 149 00:06:46,610 --> 00:06:48,990 >> 우리가의 다발을 함께 연결하고 싶어합니다. O 파일 우리 150 00:06:48,990 --> 00:06:51,420 우리 힘으로 쓴, 우리는에서 그들 모두를 지정합니다 151 00:06:51,420 --> 00:06:52,460 명령 줄. 152 00:06:52,460 --> 00:06:55,320 제한은 이러한 파일의 하나의 필수 153 00:06:55,320 --> 00:06:57,790 실제로 main 함수를 지정하거나 다른 154 00:06:57,790 --> 00:06:59,930 결과 실행 파일은 어디서부터 시작해야할지하지 않을 155 00:06:59,930 --> 00:07:00,910 코드를 실행할 수 있습니다. 156 00:07:00,910 --> 00:07:03,360 에 링크 할 파일을 지정의 차이점은 무엇입니까 157 00:07:03,360 --> 00:07:06,600 와 - 내가 불과 직접 파일을 지정? 158 00:07:06,600 --> 00:07:07,440 아무것도. 159 00:07:07,440 --> 00:07:09,850 이건 그냥 꽝 정확히 어떤 파일을 알고 많죠 160 00:07:09,850 --> 00:07:12,560 뭔가가 같은 - 임 참조 할 발생합니다. 161 00:07:12,560 --> 00:07:14,700 해당 파일을 직접 알고 있다면, 당신이를 지정할 수 162 00:07:14,700 --> 00:07:15,930 명시 적으로. 163 00:07:15,930 --> 00:07:18,990 그냥 모든 - 내가 플래그가 마지막에 와야 기억 164 00:07:18,990 --> 00:07:20,770 고객 수요. 165 00:07:20,770 --> 00:07:22,300 >> 그리고 그게 전부예요. 166 00:07:22,300 --> 00:07:24,940 당신은 단지 파일에 꽝을 실행하면이 그건 무슨 167 00:07:24,940 --> 00:07:26,350 실제로 하죠. 168 00:07:26,350 --> 00:07:29,490 내 이름은 롭 보덴 있으며,이 CS50입니다.