[Powered by Google Translate] ROB Bowden: Estu parolu pri tradukiloj.
Ĝis tiu punkto, vi ĵus tajpis vian fontokodon en
iuj dosieroj, sendis ilin tra ĉi tiu granda nigra skatolo, kiu estas
Clang kaj el venas viaj ruleblan dosieron kiu faras
precize kion vi skribis en via fontkodo.
Kiel magia kiel tiu jam pasis, ni iras preni pli proksima
rigardi kio efektive okazas
kiam ni kompilos dosieron.
Do kion tio signifas por kompili ion?
>> Nu, en la plej ĝenerala senso, ĝuste signifas
transformante kodo skribita en unu
programado lingvo al alia.
Sed kutime, kiam oni diras, ke ili kompili ion, ili
mean ili prenas ĝin de pli alta nivelo programado
lingvo al pli malalta nivelo programlingvo.
Tiuj povas simili tre subjektiva terminoj.
Ekzemple, vi eble ne pensi pri C kiel alta
nivelo programlingvo, sed vi kompili ĝin.
Sed estas tute relativaj.
Kiel ni vidos, la asembleo kodo kaj eventuale maŝino
kodo, ke ni kompilos malsupren al estas innegablemente pli malalta nivelo
ol C.
Kvankam ni povas uzi Clang en la hodiaŭa manifestacio, oni
loto de la ideoj tie portas super aliaj tradukiloj.
>> Por Clang, estas kvar ĉefaj paŝoj en la ĝenerala
kompilaĵo.
Tio estas unu, preprocesamiento farita de la antaŭtraktilo, po du,
kompilaĵo farita de la tradukilo; tri, ariganta
farita de la assembler, kaj kvar,
kunligi farita de la enlazador.
Ĝi povas esti konfuzanta, ke unu el la substeps de la entuta
Clang tradukiloj estas nomata la tradukilo, sed
ni atingos tion.
Ni uzos simplan saluton mondo programo kiel nia ekzemplo
laŭlonge de ĉi tiu video.
Ni rigardu.
>> La unua paŝo estas preprocesamiento.
Kion faras la antaŭtraktilo fari?
En preskaux cxiuj C-programo vi iam legas aŭ skribas,
vi uzis linioj de kodo kiuj komencas kun hash.
Mi nomas ĝin hash, sed vi povas ankaŭ nomas ĝin funtoj, nombro
subskribi, aŭ akra.
Ĉia tia linio estas antaŭtraktilo direktivo.
Vi verŝajne vidis # difini kaj # include antaŭe, sed
Estas pluraj pli ke la antaŭtraktilo rekonas.
Ni aldonu # difini nian saluton mondo ekzemplo.
Nun ni kuras nur la antaŭtraktilo de ĉi tiu dosiero.
Por pasi clage la-E flago, vi instruante ĝin kuri
nur la antaŭtraktilo.
Ni vidu kio okazos.
Ĝi aspektas kiel Clang simple kraĉas el ĉio
ĉe la komandlinio.
Por savi ĉio ĉi eligo al nova dosiero nomata
hello2.c, ni aldonas> hello2.c al nia komando.
Nun ni rigardu nian preprocessed dosiero.
>> Haltu, kio okazis al nia mallonga iom programo?
Se ni iras tuta vojo al la fundo de tiu dosiero, ni vidos
kelkaj el la kodo kiun ni efektive skribis.
Rimarku ke la # difini foriris kaj ĉiuj kazoj de nomo
estis anstataŭita ĝuste kion ni specifita en
la # difini linio.
Do kio estas ĉiuj tiuj typedefs kaj funkcio deklaroj
ĉe la supro de la dosiero?
Rimarku ke la # difini ne estis la sola antaŭtraktilo
direktivo, ke ni specifitaj.
Ni ankaŭ # include stdio.h.
Do ĉiuj frenezaj linioj estas fakte ĝuste stdio.h kopiitaj
kaj pasted en la supro de ĉi tiu dosiero.
Tial header dosieroj estas tiel utila por funkcio
deklarojn.
Anstataŭ bezonado kopii kaj almeti la tuta de la funkcio
deklaroj vi planas uzi ĉe la supro de via arkivo, la
antaŭtraktilo kopios kaj gluu ilin el la kaplinio
dosieron por vi.
>> Nun ke ni faris preprocesamiento, ni movi sur
kompilaĵo.
La kialo ni nomas ĉi tiun paŝon kompilita estas ĉar ĉi tiu estas
la paŝo kie Clang fakte ne lian kompili de C al
asembleo kodo.
Por havi Clang kompili dosieron malsupren al asembleo, sed
daŭrigi ne plu, pasi ĝin la-S flago
ĉe la komandlinio.
Ni rigardu la asembleo
dosiero kiu outputted.
Ĝi aspektas kiel tute alian lingvon.
Asembleo kodo estas tre procesoro specifa.
En ĉi tiu kazo, ĉar la CS50 aparaton kuras sur
virtuala x86 procesoro, ĉi tiu estas x86 asembleo kodo.
Tre malmultaj homoj skribu rekte en asembleo kodo tiuj tagoj,
sed ĉiu C-programo vi iam skribi gets transformita malsupren
en asembleo.
Denove, ni nomas ĉi tiun paŝon kompili la C en asembleo
ĉar ni iras de pli alta nivelo al malsupera nivelo
programado lingvo.
>> Kion faras asembleo suba nivelo ol C?
Nu, en asembleo, ni estas tre limigitaj en kio ni povas fari.
Ne estas kvazaŭ la, dum estas, por estas, aŭ cikloj de iu ajn speco.
Sed vi povas plenumi la samajn aferojn kiujn tiuj kontrolo
strukturoj proponas uzi la limigita operacioj kiuj
asembleo faras provizis.
Sed por vidi kiom malalta nivelo asembleo vere estas, ni iru
unu paŝon en nia kompilaĵo, ensamblando.
Estas la ensamblador la laboron por transformi la asembleo kodo
en objekton aŭ maŝino kodo.
Memoru ke la ensamblador ne eligo asembleo;
pli ĝuste, ĝi prenas en asembleo kaj eliroj maŝino kodo.
Maŝino kodo estas la reala 1-oj kaj 0-oj kiuj CPU povas
kompreni, kvankam ni ankoraŭ havas ete da laboro forlasis
antaŭ ol ni povas kuri nia programo.
Ni kolektos niajn asembleo kodo pasante
Clang la-c flago.
Nun ni vidu kio estas en la kuniĝinta dosiero.
>> Nu, tio ne helpas al ni tre multe.
Memoru ke la maŝino kodo estas la aĵoj kaj nuloj ke
Via komputilo povas kompreni.
Tio ne signifas ke estas facila por ni kompreni.
Do ĝuste kiel malalta nivelo estas asembleo?
Estas preskaŭ identa al celkodo.
Irante de komunumo al objekto kodo estas multe pli ol
tradukado ol transformado, tial
oni povus ne konsideri la ensamblador al
fari ajnan reala kompili.
Fakte, ĝi estas bela facile permane traduki el
asembleo al maŝino kodo.
Rigardante la asembleo por ĉefa funkcio, tiu unua linio
okazas respondi al deksesuma 0x55.
En duuma, jen 1010101.
La dua linio okazas respondi deksesuma 0x895.
Kaj la sekva, 0x56.
Donita relative simpla tablo, vi povus traduki
komunumon en la kodo kiun maŝinoj povas kompreni ankaŭ.
>> Do ekzistas unu cetera paŝo en
kompilaĵo, kiu kunligas.
Ligi kombinas amason da objekto dosieroj en unu grandan dosieron
ke vi povas reale ekzekuti.
Ligi estas tre sistemo dependa.
Do la plej facila maniero por akiri Clang justaj ligi objekto
dosieroj kune estas nomi Clang sur ĉiuj el la dosieroj
vi volas ligi kune.
Se vi specifas. O dosieroj, tiam ĝi ne bezonas reprocess,
kompili, kaj kunvenigu cxiujn el viaj fontkodo.
Ni ĵeti math funkcio en nian dosieron, do ni havas
ion por ligi in
Nun ni kompilos ĝin malsupren al celkodo kaj
voki Clang sur ĝi.
Oops.
Ĉar ni inkludis math funkcio, ni bezonas ligi en
la math biblioteko kun-lm.
>> Se ni volis ligi kune bunch of. O dosierojn kiujn ni
skribis en nia propra, ni volas nur precizigi ilin ĉiujn en la
komandlinio.
La limigo estas, ke nur unu el tiuj dosieroj devas
fakte specifi ĉefa funkcio, aŭ alie la
rezultan ruleblan ne scius kie komenci
kurante vian kodon.
Kio estas la diferenco inter preciziganta dosieron ligi en
kun-l kaj nur preciziganta dosieron rekte?
Nenio.
Estas nur ke Clang okazas scii precize kion dosieron
iu kiel-lm okazas al referi al.
Se vi scius, ke dosiero mem, vi povus precizigi ĝin
eksplicite.
Nur memoras ke ĉiuj-l flagoj devas veni al la fino
de via kliento peto.
>> Kaj jen ĉio estas al ĝi.
Kiam vi ĵus kuras Clang sur iu dosiero, tiu estas kio ĝi estas
efektive faras.
Mia nomo estas Rob Bowden, kaj ĉi tiu estas CS50.