[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.