[Powered by Google Translate] ROB BOWDEN: Pojďme mluvit o kompilátory.
Až do tohoto bodu, jste právě zadali svůj zdrojový kód do
Některé soubory, poslal prostřednictvím tohoto velkého černého pole, které je
Řinčet, a ven vychází na spustitelný soubor, který dělá
přesně to, co jste napsal ve zdrojovém kódu.
Jak magický jako to už, budeme se blíže
podívejte se na to, co se vlastně děje
když jsme kompilaci souboru.
Takže co to znamená sestavit něco?
>> No, v tom nejobecnějším slova smyslu, to prostě znamená,
transformace kód napsaný v jednom
programovací jazyk na jiný.
Ale většinou, když lidé říkají, že sestavit něco, že
znamená, že bereš to z vyšší úrovně programování
jazyka na nižší jazykové úrovni programování.
Ty může zdát jako velmi subjektivní hlediska.
Například, pravděpodobně si nemyslím, že C jako vysoce
úrovni programovací jazyk, ale nemáte zkompilovat.
Ale je to všechno relativní.
Jak uvidíme, kód assembleru a nakonec stroj
kód, který jsme zkompilovat dolů, je nesporně nižší úroveň
než C.
Přestože budeme používat zvonění v dnešním demonstraci,
Mnoho z nápadů zde přenést na jiné kompilátory.
>> Pro Clang, existují čtyři hlavní kroky v celkové
kompilace.
Jedná se o jeden, předzpracování provádí preprocesoru, dva,
sestavování provádí kompilátor, tři, montáž
provádí assembleru, a čtyři,
propojení provádí linker.
To může být matoucí, že jeden z dílčí kroky v celkové
Řinčet překladače se nazývá překladač, ale
budeme se k tomu.
Budeme používat jednoduché Hello World program jako náš příklad
v tomto videu.
Pojďme se podívat.
>> Prvním krokem je předzpracování.
Co preprocesoru dělat?
V téměř všech C programu, které jste kdy četl nebo písemné,
jste použili řádky kódu, které začínají s hash.
Zavolám to hash, ale můžete také volat to liber, číslo
přihlásit, nebo ostré.
Každá taková linka je preprocesor směrnice.
Pravděpodobně jste již viděli # define a # include dříve, ale
několik více, že preprocesor rozpoznává.
Dodejme # define našeho Hello World příkladu.
Nyní pojďme spustí pouze preprocesor na tento soubor.
Předáním CLAGE-E příznak, že jste pokyn, aby byl spuštěn
jen preprocesor.
Pojďme se podívat, co se stane.
Vypadá to, že zvonění jen vyplivne všechno
na příkazovém řádku.
Aby bylo možné uložit celou výstup do nového souboru nazvaného
hello2.c, budeme přidávat> hello2.c naší příkazu.
Nyní se pojďme podívat na naše preprocessed souboru.
>> Whoa, co se stalo s naší krátké malé programu?
Pokud bychom jet celou cestu až na dno tohoto souboru, uvidíme
některé kódu, které skutečně napsal.
Všimněte si, že # define je pryč a všechny instance dříve
byly nahrazeny přesně to, co jsme specifikovali v
# define řádek.
Takže jaké jsou všechny tyto typedefs a funkce prohlášení
v horní části souboru?
Povšimněte si, že # define nebyla jedinou preprocesor
směrnice, kterou jsme specifikovali.
Máme také # include stdio.h.
Takže všechny bláznivých tratí jsou vlastně jen stdio.h kopírovat
a vloží do horní části tohoto souboru.
To je důvod, proč hlavičkové soubory jsou tak užitečné pro funkci
prohlášení.
Místo toho, aby museli zkopírovat a vložit všechny funkce
prohlášení plánujete používat v horní části souboru, je
preprocesor bude zkopírovat a vložit z hlavičky
soubor pro vás.
>> Teď jsme skončili předzpracování, jdeme do
kompilace.
Důvodem nazýváme tento krok kompilace je, protože to je
krok, kde zvonění vlastně dělá jeho kompilaci z C na
kód assembleru.
Za účelem získání zvonění spis dolů na montáž, ale
pokračovat dál, předat jej the-S flag
na příkazovém řádku.
Pojďme se podívat na shromáždění
soubor, který byl na výstupu.
Vypadá to jako docela jiném jazyce.
Montáž kód je velmi specifický procesor.
V tomto případě, vzhledem k tomu CS50 spotřebič běží
virtuální x86 procesor, to je x86 kód assembleru.
Velmi málo lidí psát přímo v assembleru v těchto dnech,
ale každý program C jste někdy psát dostane transformována dolů
do sestavy.
Opět, nazýváme tento krok sestavení C do sestavy
protože jsme se jít z vyšší úrovně na nižší úrovni
programovací jazyk.
>> Co dělá montáž nižší úrovně, než C?
No, v sestavě, jsme velmi omezené v tom, co můžeme udělat.
Nejsou k dispozici žádné pokud je, zatímco to, za to, nebo smyčky jakéhokoliv druhu.
Ale můžete dosáhnout stejné věci, které tyto kontroly
struktury poskytují pomocí omezených operací, které
Sestava se poskytují.
Ale vidět, jak nízká úroveň montáž je opravdu, pojďme
o krok dál v naší kompilace, montáž.
Je to assembler je úkol transformovat kód assembleru
do objektu nebo strojovém kódu.
Pamatujte si, že assembler není výstupní sestavu;
poněkud, to se bere v sestavě a výstupy strojovém kódu.
Strojový kód je skutečná 1 a 0, že CPU může
pochopit, i když jsme ještě trošku práce zbývá
Než budeme moci spustit náš program.
Pojďme sestavit náš kód assembleru předáním
Řinčení-c vlajky.
Nyní se podívejme, co je ve smontovaném souboru.
>> No, to nám nepomůže moc.
Pamatujte si, že strojový kód je jedniček a nul, že
Váš počítač může pochopit.
To neznamená, že je to pro nás snadné pochopit.
Tak přesně tak, jak nízká úroveň je montáž?
Je to téměř totožné s objektovým kódem.
Přechod z montáže do strojového kódu, je mnohem více
Překlad než transformace, což je důvod, proč
člověk nemusí považovat assembler
dělat žádnou skutečnou kompilaci.
Ve skutečnosti, je to docela snadné, aby manuálně přeložit z
montáž do strojového kódu.
Při pohledu na sestavy pro hlavní funkce, které první řádek
stane odpovídat hexadecimální 0x55.
V binární, je to 1010101.
Druhý řádek se stane odpovídat hexadecimální 0x895.
A další, 0x56.
Vzhledem k tomu, relativně jednoduchá tabulka, můžete přeložit
montáž do kódu, že stroje mohou rozumět také.
>> Takže je tu ještě jedna zbývající krok
sestavování, které je spojuje.
Propojení kombinuje spoustu objektových souborů do jednoho velkého souboru
že můžete skutečně provést.
Propojení je velmi závislá na systému.
Takže nejjednodušší způsob, jak se dostat zvonění jen propojit objekt
Soubory společně je zavolat zařinčení na všech souborů, které
Chcete-li propojit.
Pokud zadáte. O soubory, pak to nebude muset znovu zpracovat,
sestavit, a montujeme všechny vaše zdrojového kódu.
Pojďme hodit matematickou funkci do našeho souboru, takže máme
něco propojit palců
Nyní pojďme sestavit ho zpět do objektového kódu a
volání zvonit na něj.
Chybička se vloudila.
Vzhledem k tomu, jsme zařadili na matematickou funkci, musíme propojit v
matematická knihovna s-lm.
>> Pokud bychom chtěli propojit spoustu. O soubory, které jsme
napsal na naše vlastní, bychom stačí zadat je všechny
příkazového řádku.
Omezení je, že pouze jeden z těchto souborů musí být
skutečně určit hlavní funkci, jinak
Výsledný spustitelný bych nevěděl, kde začít
spuštění kódu.
Jaký je rozdíl mezi určením souboru propojení s
s-l a jen zadáním soubor přímo?
Nic.
Je to jen, že zvonění se stane přesně vědět, co soubor
něco jako-lm stane se odkazovat na.
Pokud jste věděl, že soubor sami, můžete specifikovat
explicitně.
Jen nezapomeňte, že all-l vlajky mají přijít na konci
Vaší poptávky klientů.
>> A to je všechno, co je k tomu.
Když stačí spustit zvonění některých souborů, to je to, co to je
vlastně dělá.
Mé jméno je Rob Bowden, a to je CS50.