1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB Bowden: Estu parolu pri tradukiloj. 2 00:00:09,100 --> 00:00:11,490 Ĝis tiu punkto, vi ĵus tajpis vian fontokodon en 3 00:00:11,490 --> 00:00:14,260 iuj dosieroj, sendis ilin tra ĉi tiu granda nigra skatolo, kiu estas 4 00:00:14,260 --> 00:00:16,890 Clang kaj el venas viaj ruleblan dosieron kiu faras 5 00:00:16,890 --> 00:00:19,430 precize kion vi skribis en via fontkodo. 6 00:00:19,430 --> 00:00:22,170 Kiel magia kiel tiu jam pasis, ni iras preni pli proksima 7 00:00:22,170 --> 00:00:23,590 rigardi kio efektive okazas 8 00:00:23,590 --> 00:00:25,220 kiam ni kompilos dosieron. 9 00:00:25,220 --> 00:00:28,580 Do kion tio signifas por kompili ion? 10 00:00:28,580 --> 00:00:31,150 >> Nu, en la plej ĝenerala senso, ĝuste signifas 11 00:00:31,150 --> 00:00:32,580 transformante kodo skribita en unu 12 00:00:32,580 --> 00:00:34,680 programado lingvo al alia. 13 00:00:34,680 --> 00:00:37,550 Sed kutime, kiam oni diras, ke ili kompili ion, ili 14 00:00:37,550 --> 00:00:39,660 mean ili prenas ĝin de pli alta nivelo programado 15 00:00:39,660 --> 00:00:42,460 lingvo al pli malalta nivelo programlingvo. 16 00:00:42,460 --> 00:00:44,960 Tiuj povas simili tre subjektiva terminoj. 17 00:00:44,960 --> 00:00:48,090 Ekzemple, vi eble ne pensi pri C kiel alta 18 00:00:48,090 --> 00:00:51,440 nivelo programlingvo, sed vi kompili ĝin. 19 00:00:51,440 --> 00:00:52,730 Sed estas tute relativaj. 20 00:00:52,730 --> 00:00:55,790 Kiel ni vidos, la asembleo kodo kaj eventuale maŝino 21 00:00:55,790 --> 00:00:59,270 kodo, ke ni kompilos malsupren al estas innegablemente pli malalta nivelo 22 00:00:59,270 --> 00:01:00,700 ol C. 23 00:01:00,700 --> 00:01:03,310 Kvankam ni povas uzi Clang en la hodiaŭa manifestacio, oni 24 00:01:03,310 --> 00:01:06,360 loto de la ideoj tie portas super aliaj tradukiloj. 25 00:01:06,360 --> 00:01:09,160 >> Por Clang, estas kvar ĉefaj paŝoj en la ĝenerala 26 00:01:09,160 --> 00:01:10,200 kompilaĵo. 27 00:01:10,200 --> 00:01:15,430 Tio estas unu, preprocesamiento farita de la antaŭtraktilo, po du, 28 00:01:15,430 --> 00:01:19,530 kompilaĵo farita de la tradukilo; tri, ariganta 29 00:01:19,530 --> 00:01:22,010 farita de la assembler, kaj kvar, 30 00:01:22,010 --> 00:01:24,640 kunligi farita de la enlazador. 31 00:01:24,640 --> 00:01:27,600 Ĝi povas esti konfuzanta, ke unu el la substeps de la entuta 32 00:01:27,600 --> 00:01:30,980 Clang tradukiloj estas nomata la tradukilo, sed 33 00:01:30,980 --> 00:01:32,530 ni atingos tion. 34 00:01:32,530 --> 00:01:35,050 Ni uzos simplan saluton mondo programo kiel nia ekzemplo 35 00:01:35,050 --> 00:01:36,270 laŭlonge de ĉi tiu video. 36 00:01:36,270 --> 00:01:38,380 Ni rigardu. 37 00:01:38,380 --> 00:01:40,330 >> La unua paŝo estas preprocesamiento. 38 00:01:40,330 --> 00:01:42,520 Kion faras la antaŭtraktilo fari? 39 00:01:42,520 --> 00:01:45,560 En preskaux cxiuj C-programo vi iam legas aŭ skribas, 40 00:01:45,560 --> 00:01:48,310 vi uzis linioj de kodo kiuj komencas kun hash. 41 00:01:48,310 --> 00:01:51,730 Mi nomas ĝin hash, sed vi povas ankaŭ nomas ĝin funtoj, nombro 42 00:01:51,730 --> 00:01:53,280 subskribi, aŭ akra. 43 00:01:53,280 --> 00:01:56,840 Ĉia tia linio estas antaŭtraktilo direktivo. 44 00:01:56,840 --> 00:02:00,650 Vi verŝajne vidis # difini kaj # include antaŭe, sed 45 00:02:00,650 --> 00:02:03,690 Estas pluraj pli ke la antaŭtraktilo rekonas. 46 00:02:03,690 --> 00:02:07,340 Ni aldonu # difini nian saluton mondo ekzemplo. 47 00:02:07,340 --> 00:02:11,690 Nun ni kuras nur la antaŭtraktilo de ĉi tiu dosiero. 48 00:02:11,690 --> 00:02:16,150 Por pasi clage la-E flago, vi instruante ĝin kuri 49 00:02:16,150 --> 00:02:17,880 nur la antaŭtraktilo. 50 00:02:17,880 --> 00:02:19,130 Ni vidu kio okazos. 51 00:02:22,250 --> 00:02:24,020 Ĝi aspektas kiel Clang simple kraĉas el ĉio 52 00:02:24,020 --> 00:02:25,200 ĉe la komandlinio. 53 00:02:25,200 --> 00:02:27,800 Por savi ĉio ĉi eligo al nova dosiero nomata 54 00:02:27,800 --> 00:02:33,850 hello2.c, ni aldonas> hello2.c al nia komando. 55 00:02:33,850 --> 00:02:37,800 Nun ni rigardu nian preprocessed dosiero. 56 00:02:37,800 --> 00:02:40,810 >> Haltu, kio okazis al nia mallonga iom programo? 57 00:02:40,810 --> 00:02:43,890 Se ni iras tuta vojo al la fundo de tiu dosiero, ni vidos 58 00:02:43,890 --> 00:02:46,070 kelkaj el la kodo kiun ni efektive skribis. 59 00:02:46,070 --> 00:02:49,800 Rimarku ke la # difini foriris kaj ĉiuj kazoj de nomo 60 00:02:49,800 --> 00:02:51,950 estis anstataŭita ĝuste kion ni specifita en 61 00:02:51,950 --> 00:02:53,590 la # difini linio. 62 00:02:53,590 --> 00:02:56,530 Do kio estas ĉiuj tiuj typedefs kaj funkcio deklaroj 63 00:02:56,530 --> 00:02:58,140 ĉe la supro de la dosiero? 64 00:02:58,140 --> 00:03:00,820 Rimarku ke la # difini ne estis la sola antaŭtraktilo 65 00:03:00,820 --> 00:03:02,390 direktivo, ke ni specifitaj. 66 00:03:02,390 --> 00:03:05,280 Ni ankaŭ # include stdio.h. 67 00:03:05,280 --> 00:03:09,560 Do ĉiuj frenezaj linioj estas fakte ĝuste stdio.h kopiitaj 68 00:03:09,560 --> 00:03:11,810 kaj pasted en la supro de ĉi tiu dosiero. 69 00:03:11,810 --> 00:03:14,110 Tial header dosieroj estas tiel utila por funkcio 70 00:03:14,110 --> 00:03:15,160 deklarojn. 71 00:03:15,160 --> 00:03:17,740 Anstataŭ bezonado kopii kaj almeti la tuta de la funkcio 72 00:03:17,740 --> 00:03:21,050 deklaroj vi planas uzi ĉe la supro de via arkivo, la 73 00:03:21,050 --> 00:03:22,990 antaŭtraktilo kopios kaj gluu ilin el la kaplinio 74 00:03:22,990 --> 00:03:24,140 dosieron por vi. 75 00:03:24,140 --> 00:03:26,480 >> Nun ke ni faris preprocesamiento, ni movi sur 76 00:03:26,480 --> 00:03:27,680 kompilaĵo. 77 00:03:27,680 --> 00:03:30,725 La kialo ni nomas ĉi tiun paŝon kompilita estas ĉar ĉi tiu estas 78 00:03:30,725 --> 00:03:34,130 la paŝo kie Clang fakte ne lian kompili de C al 79 00:03:34,130 --> 00:03:35,370 asembleo kodo. 80 00:03:35,370 --> 00:03:38,280 Por havi Clang kompili dosieron malsupren al asembleo, sed 81 00:03:38,280 --> 00:03:42,030 daŭrigi ne plu, pasi ĝin la-S flago 82 00:03:42,030 --> 00:03:43,560 ĉe la komandlinio. 83 00:03:43,560 --> 00:03:44,790 Ni rigardu la asembleo 84 00:03:44,790 --> 00:03:47,390 dosiero kiu outputted. 85 00:03:47,390 --> 00:03:49,740 Ĝi aspektas kiel tute alian lingvon. 86 00:03:49,740 --> 00:03:52,660 Asembleo kodo estas tre procesoro specifa. 87 00:03:52,660 --> 00:03:55,440 En ĉi tiu kazo, ĉar la CS50 aparaton kuras sur 88 00:03:55,440 --> 00:04:00,470 virtuala x86 procesoro, ĉi tiu estas x86 asembleo kodo. 89 00:04:00,470 --> 00:04:03,450 Tre malmultaj homoj skribu rekte en asembleo kodo tiuj tagoj, 90 00:04:03,450 --> 00:04:06,490 sed ĉiu C-programo vi iam skribi gets transformita malsupren 91 00:04:06,490 --> 00:04:07,940 en asembleo. 92 00:04:07,940 --> 00:04:11,440 Denove, ni nomas ĉi tiun paŝon kompili la C en asembleo 93 00:04:11,440 --> 00:04:14,170 ĉar ni iras de pli alta nivelo al malsupera nivelo 94 00:04:14,170 --> 00:04:15,480 programado lingvo. 95 00:04:15,480 --> 00:04:17,880 >> Kion faras asembleo suba nivelo ol C? 96 00:04:17,880 --> 00:04:21,660 Nu, en asembleo, ni estas tre limigitaj en kio ni povas fari. 97 00:04:21,660 --> 00:04:25,120 Ne estas kvazaŭ la, dum estas, por estas, aŭ cikloj de iu ajn speco. 98 00:04:25,120 --> 00:04:27,560 Sed vi povas plenumi la samajn aferojn kiujn tiuj kontrolo 99 00:04:27,560 --> 00:04:30,270 strukturoj proponas uzi la limigita operacioj kiuj 100 00:04:30,270 --> 00:04:32,350 asembleo faras provizis. 101 00:04:32,350 --> 00:04:35,960 Sed por vidi kiom malalta nivelo asembleo vere estas, ni iru 102 00:04:35,960 --> 00:04:39,320 unu paŝon en nia kompilaĵo, ensamblando. 103 00:04:39,320 --> 00:04:41,890 Estas la ensamblador la laboron por transformi la asembleo kodo 104 00:04:41,890 --> 00:04:44,740 en objekton aŭ maŝino kodo. 105 00:04:44,740 --> 00:04:47,610 Memoru ke la ensamblador ne eligo asembleo; 106 00:04:47,610 --> 00:04:51,080 pli ĝuste, ĝi prenas en asembleo kaj eliroj maŝino kodo. 107 00:04:51,080 --> 00:04:54,040 Maŝino kodo estas la reala 1-oj kaj 0-oj kiuj CPU povas 108 00:04:54,040 --> 00:04:57,290 kompreni, kvankam ni ankoraŭ havas ete da laboro forlasis 109 00:04:57,290 --> 00:04:59,380 antaŭ ol ni povas kuri nia programo. 110 00:04:59,380 --> 00:05:01,400 Ni kolektos niajn asembleo kodo pasante 111 00:05:01,400 --> 00:05:04,080 Clang la-c flago. 112 00:05:04,080 --> 00:05:06,410 Nun ni vidu kio estas en la kuniĝinta dosiero. 113 00:05:06,410 --> 00:05:09,220 >> Nu, tio ne helpas al ni tre multe. 114 00:05:09,220 --> 00:05:11,340 Memoru ke la maŝino kodo estas la aĵoj kaj nuloj ke 115 00:05:11,340 --> 00:05:13,240 Via komputilo povas kompreni. 116 00:05:13,240 --> 00:05:16,080 Tio ne signifas ke estas facila por ni kompreni. 117 00:05:16,080 --> 00:05:19,160 Do ĝuste kiel malalta nivelo estas asembleo? 118 00:05:19,160 --> 00:05:21,480 Estas preskaŭ identa al celkodo. 119 00:05:21,480 --> 00:05:24,300 Irante de komunumo al objekto kodo estas multe pli ol 120 00:05:24,300 --> 00:05:27,540 tradukado ol transformado, tial 121 00:05:27,540 --> 00:05:29,310 oni povus ne konsideri la ensamblador al 122 00:05:29,310 --> 00:05:31,400 fari ajnan reala kompili. 123 00:05:31,400 --> 00:05:34,110 Fakte, ĝi estas bela facile permane traduki el 124 00:05:34,110 --> 00:05:36,050 asembleo al maŝino kodo. 125 00:05:36,050 --> 00:05:39,040 Rigardante la asembleo por ĉefa funkcio, tiu unua linio 126 00:05:39,040 --> 00:05:42,100 okazas respondi al deksesuma 0x55. 127 00:05:42,100 --> 00:05:45,470 En duuma, jen 1010101. 128 00:05:45,470 --> 00:05:49,300 La dua linio okazas respondi deksesuma 0x895. 129 00:05:49,300 --> 00:05:51,290 Kaj la sekva, 0x56. 130 00:05:51,290 --> 00:05:53,730 Donita relative simpla tablo, vi povus traduki 131 00:05:53,730 --> 00:05:57,130 komunumon en la kodo kiun maŝinoj povas kompreni ankaŭ. 132 00:05:57,130 --> 00:05:58,810 >> Do ekzistas unu cetera paŝo en 133 00:05:58,810 --> 00:06:01,150 kompilaĵo, kiu kunligas. 134 00:06:01,150 --> 00:06:04,530 Ligi kombinas amason da objekto dosieroj en unu grandan dosieron 135 00:06:04,530 --> 00:06:06,380 ke vi povas reale ekzekuti. 136 00:06:06,380 --> 00:06:08,570 Ligi estas tre sistemo dependa. 137 00:06:08,570 --> 00:06:11,030 Do la plej facila maniero por akiri Clang justaj ligi objekto 138 00:06:11,030 --> 00:06:13,920 dosieroj kune estas nomi Clang sur ĉiuj el la dosieroj 139 00:06:13,920 --> 00:06:15,190 vi volas ligi kune. 140 00:06:15,190 --> 00:06:18,740 Se vi specifas. O dosieroj, tiam ĝi ne bezonas reprocess, 141 00:06:18,740 --> 00:06:21,680 kompili, kaj kunvenigu cxiujn el viaj fontkodo. 142 00:06:21,680 --> 00:06:23,960 Ni ĵeti math funkcio en nian dosieron, do ni havas 143 00:06:23,960 --> 00:06:25,210 ion por ligi in 144 00:06:34,220 --> 00:06:37,010 Nun ni kompilos ĝin malsupren al celkodo kaj 145 00:06:37,010 --> 00:06:38,260 voki Clang sur ĝi. 146 00:06:40,560 --> 00:06:41,420 Oops. 147 00:06:41,420 --> 00:06:43,790 Ĉar ni inkludis math funkcio, ni bezonas ligi en 148 00:06:43,790 --> 00:06:46,610 la math biblioteko kun-lm. 149 00:06:46,610 --> 00:06:48,990 >> Se ni volis ligi kune bunch of. O dosierojn kiujn ni 150 00:06:48,990 --> 00:06:51,420 skribis en nia propra, ni volas nur precizigi ilin ĉiujn en la 151 00:06:51,420 --> 00:06:52,460 komandlinio. 152 00:06:52,460 --> 00:06:55,320 La limigo estas, ke nur unu el tiuj dosieroj devas 153 00:06:55,320 --> 00:06:57,790 fakte specifi ĉefa funkcio, aŭ alie la 154 00:06:57,790 --> 00:06:59,930 rezultan ruleblan ne scius kie komenci 155 00:06:59,930 --> 00:07:00,910 kurante vian kodon. 156 00:07:00,910 --> 00:07:03,360 Kio estas la diferenco inter preciziganta dosieron ligi en 157 00:07:03,360 --> 00:07:06,600 kun-l kaj nur preciziganta dosieron rekte? 158 00:07:06,600 --> 00:07:07,440 Nenio. 159 00:07:07,440 --> 00:07:09,850 Estas nur ke Clang okazas scii precize kion dosieron 160 00:07:09,850 --> 00:07:12,560 iu kiel-lm okazas al referi al. 161 00:07:12,560 --> 00:07:14,700 Se vi scius, ke dosiero mem, vi povus precizigi ĝin 162 00:07:14,700 --> 00:07:15,930 eksplicite. 163 00:07:15,930 --> 00:07:18,990 Nur memoras ke ĉiuj-l flagoj devas veni al la fino 164 00:07:18,990 --> 00:07:20,770 de via kliento peto. 165 00:07:20,770 --> 00:07:22,300 >> Kaj jen ĉio estas al ĝi. 166 00:07:22,300 --> 00:07:24,940 Kiam vi ĵus kuras Clang sur iu dosiero, tiu estas kio ĝi estas 167 00:07:24,940 --> 00:07:26,350 efektive faras. 168 00:07:26,350 --> 00:07:29,490 Mia nomo estas Rob Bowden, kaj ĉi tiu estas CS50.