[Powered by Google Translate] ROB Bowden: Poďme hovoriť o kompilátory.
Až do tohto bodu, ste práve zadali svoj zdrojový kód do
Niektoré súbory, poslal prostredníctvom tohto veľkého čierneho poľa, ktoré je
Rinčať, a von vychádza na spustiteľný súbor, ktorý robí
presne to, čo ste napísal v zdrojovom kóde.
Ako magický ako to už, budeme sa bližšie
pozrite sa na to, čo sa vlastne deje
keď sme kompiláciu súboru.
Takže čo to znamená zostaviť niečo?
>> No, v tom najvšeobecnejšom slova zmysle, to jednoducho znamená,
transformácie kód napísaný v jednom
programovací jazyk na iný.
Ale väčšinou, keď ľudia hovoria, že zostaviť niečo, že
znamená, že berieš to z vyššej úrovne programovania
jazyka na nižšej jazykovej úrovni programovania.
Tie môže zdať ako veľmi subjektívne hľadiska.
Napríklad, pravdepodobne si nemyslím, že C ako vysoko
úrovni programovací jazyk, ale nemáte skompilovať.
Ale je to všetko relatívne.
Ako uvidíme, kód zhromaždenie a nakoniec stroj
kód, ktorý sme skompilovať dolu, je nesporne nižšia úroveň
ako C.
Hoci budeme používať zvonenie v dnešnom demonštráciu,
Mnohé z nápadov tu preniesť na iné kompilátory.
>> Pre Clang, existujú štyri hlavné kroky v celkovej
kompilácie.
Jedná sa o jeden, predspracovanie vykonáva preprocesoru, dva,
zostavovaní vykonáva kompilátor, tri, montáž
vykonáva assembleri, a štyri,
prepojenie vykonáva linker.
To môže byť mätúce, že jeden z čiastkové kroky v celkovej
Rinčať prekladača sa nazýva prekladač, ale
budeme sa k tomu.
Budeme používať jednoduché Hello World program ako náš príklad
v tomto videu.
Poďme sa pozrieť.
>> Prvým krokom je predspracovanie.
Čo preprocesor robiť?
V takmer všetkých C programu, ktoré ste kedy čítal alebo písomné,
ste použili riadky kódu, ktoré začínajú s hash.
Zavolám to hash, ale môžete tiež volať to libier, číslo
prihlásiť, alebo ostré.
Každá takáto linka je preprocesor smernice.
Pravdepodobne ste už videli # define a # include skôr, ale
niekoľko viac, že ​​preprocesor rozpoznáva.
Dodajme # define nášho Hello World príklade.
Teraz poďme spustí iba preprocesor na tento súbor.
Odovzdaním CLAGE-E príznak, že ste pokyn, aby bol spustený
len preprocesor.
Poďme sa pozrieť, čo sa stane.
Vyzerá to, že zvonenie len vypľuje všetko
na príkazovom riadku.
Aby bolo možné uložiť celú výstup do nového súboru nazvaného
hello2.c, budeme pridávať> hello2.c našej príkazu.
Teraz sa poďme pozrieť na naše preprocessed súboru.
>> Whoa, čo sa stalo s našou krátke malé programu?
Ak by sme ísť celú cestu až na dno tohto súboru, uvidíme
niektoré kódu, ktoré skutočne napísal.
Všimnite si, že # define je preč a všetky inštancie skôr
boli nahradené presne to, čo sme špecifikovali v
# Define riadok.
Takže aké sú všetky tieto typedefs a funkcie vyhlásenie
v hornej časti súboru?
Všimnite si, že # define nebola jedinou preprocesor
smernice, ktorú sme špecifikovali.
Máme tiež # include stdio.h.
Takže všetky bláznivých tratí sú vlastne len stdio.h kopírovať
a vloží do hornej časti tohto súboru.
To je dôvod, prečo hlavičkové súbory sú tak užitočné pre funkciu
vyhlásenie.
Namiesto toho, aby museli skopírovať a vložiť všetky funkcie
vyhlásenie plánujete používať v hornej časti súboru, je
preprocesor bude skopírovať a vložiť z hlavičky
súbor pre vás.
>> Teraz sme skončili predspracovanie, ideme do
kompilácie.
Dôvodom nazývame tento krok kompilácie je, pretože to je
krok, kde zvonenie vlastne robí jeho kompiláciu z C na
kód assembleri.
Aby mal zvonenie zostaviť súbor do zhromaždenia, ale
pokračovať ďalej, odovzdať ho the-S flag
na príkazovom riadku.
Poďme sa pozrieť na zhromaždenie
súbor, ktorý bol na výstupe.
Vyzerá to ako celkom inom jazyku.
Montáž kód je veľmi špecifický procesor.
V tomto prípade, vzhľadom k tomu CS50 spotrebič beží
virtuálne x86 procesor, to je x86 kód assembleri.
Veľmi málo ľudí písať priamo v assembleri v týchto dňoch,
ale každý program C ste niekedy písať dostane transformovaná dole
do zostavy.
Opäť, nazývame tento krok zostavenie C do zostavy
pretože sme sa ísť na vyššej úrovni na nižšiu úroveň
programovacím jazykom,.
>> Čo robí montáž nižšej úrovne, ako C?
No, v zostave, sme veľmi obmedzené v tom, čo môžeme urobiť.
Nie sú k dispozícii žiadne ak je, kým to, za to, alebo slučky akéhokoľvek druhu.
Ale môžete dosiahnuť rovnaké veci, ktoré tieto kontroly
štruktúry poskytujú pomocou obmedzených operácií, ktoré
Zostava sa poskytujú.
Ale vidieť, ako nízka úroveň montáž je naozaj, poďme
o krok ďalej v našej kompilácie, montáž.
Je to assembler je úloha transformovať kód assembleri
do objektu alebo v strojovom kóde.
Pamätajte si, že assembler nie je výstupný zostavu;
trochu, to sa berie v zostave a výstupy strojovom kóde.
Strojový kód je skutočná 1 a 0, že CPU môže
pochopiť, aj keď sme ešte trošku práce zostáva
Než budeme môcť spustiť náš program.
Poďme zostaviť náš kód assembleri odovzdaním
Rinčanie-c vlajky.
Teraz sa pozrime, čo je v zmontovanom súboru.
>> No, to nám nepomôže moc.
Pamätajte si, že strojový kód je jedničiek a núl, že
Váš počítač môže pochopiť.
To neznamená, že je to pre nás ľahké pochopiť.
Tak presne tak, ako nízka úroveň je montáž?
Je to takmer totožné s objektovým kódom.
Prechod z montáže do strojového kódu, je oveľa viac
Preklad ako transformácie, čo je dôvod, prečo
človek nemusí považovať assembler
robiť žiadnu skutočnú kompiláciu.
V skutočnosti, je to celkom jednoduché, aby manuálne preložiť z
montáž do strojového kódu.
Pri pohľade na zostavy pre hlavné funkcie, ktoré prvý riadok
stane odpovedať hexadecimálne 0x55.
V binárne, je to 1010101.
Druhý riadok sa stane odpovedať hexadecimálne 0x895.
A ďalšie, 0x56.
Vzhľadom k tomu, relatívne jednoduchá tabuľka, môžete preložiť
montáž do kódu, že stroje môžu rozumieť tiež.
>> Takže je tu ešte jedna zostávajúce krok
zostavovanie, ktoré ich spája.
Prepojenie kombinuje veľa objektových súborov do jedného veľkého súboru
že môžete skutočne urobiť.
Prepojenie je veľmi závislá na systéme.
Takže najjednoduchší spôsob, ako sa dostať zvonenie len prepojiť objekt
Súbory spoločne je zavolať zařinčení na všetkých súborov, ktoré
Ak chcete prepojiť.
Ak zadáte. O súbory, potom to nebude musieť znovu spracovať,
zostaviť, a montujeme všetky vaše zdrojového kódu.
Poďme hodiť matematickú funkciu do nášho súboru, takže máme
niečo prepojiť palcov
Teraz poďme zostaviť ho naspäť do objektového kódu a
volanie zvoniť na neho.
Chybička sa vlúdila.
Vzhľadom k tomu, sme zaradili na matematickú funkciu, musíme prepojiť v
matematická knižnica s-lm.
>> Ak by sme chceli prepojiť veľa. O súbory, ktoré sme
napísal na naše vlastné, by sme stačí zadať ich všetky
príkazového riadku.
Obmedzenie je, že iba jeden z týchto súborov musí byť
skutočne určiť hlavnú funkciu, inak
Výsledný spustiteľný by som nevedel, kde začať
spustenie kódu.
Aký je rozdiel medzi určením súboru prepojenie s
s-l a len zadaním súbor priamo?
Nič.
Je to len, že zvonenie sa stane presne vedieť, čo súbor
niečo ako-lm stane sa odkazovať na.
Ak ste vedel, že súbor sami, môžete špecifikovať
explicitne.
Len nezabudnite, že all-l vlajky majú prísť na konci
Vašej dopytu klientov.
>> A to je všetko, čo je k tomu.
Keď stačí spustiť zvonenie niektorých súborov, to je to, čo to je
vlastne robí.
Moje meno je Rob Bowden, a to je CS50.