[Powered by Google Translate] ROB BOWDEN: Låt oss tala om kompilatorer.
Fram till denna punkt, har du skrivit bara upp din källkod till
några filer, skickade dem genom denna stora svarta lådan som är
Klang, och ut kommer din körbar fil som gör
exakt vad du skrev i din källkod.
Så magiskt som det har varit, vi ska ta en närmare
titta på vad som faktiskt händer
När vi sammanställer en fil.
Så vad betyder det att sammanställa något?
>> Jo, i den mest allmänna mening, det betyder bara
omvandla kod skriven i ett
programmering språk till ett annat.
Men oftast när folk säger att de sammanställa något, de
menar de tar det från en högre nivå programmering
språk till en lägre nivå programmeringsspråk.
Dessa kan tyckas mycket subjektiva termer.
Till exempel har du förmodligen tänker inte på C som en hög
nivå programmeringsspråk, men du kompilera den.
Men det är alla relativa.
Som vi ser det assemblerkod och så småningom maskin
kod som vi sammanställer om är onekligen en lägre nivå
än C.
Även om vi kommer att använda klang i dagens demonstration, en
många av de idéer här föra över till andra kompilatorer.
>> För klang, finns det fyra viktiga steg i den totala
sammanställning.
Det är en, förbehandling görs av preprocessor, två,
sammanställning görs av kompilatorn, tre, montering
görs av montören, och fyra,
länkning utförs av linkern.
Det kan vara förvirrande att en av delstegen i den övergripande
Klang kompilatorer kallas kompilator, men
Vi kommer till det.
Vi kommer att använda ett enkelt Hello World program som vårt exempel
hela den här videon.
Låt oss ta en titt.
>> Det första steget är förbehandling.
Vad gör preprocessorn?
I stort sett varje C-program du någonsin läst eller skrivit,
du har använt kodrader som börjar med en hash.
Jag kallar det hash, men du kan också kalla det pounds, antal
underteckna, eller skarp.
En sådan linje är en preprocessor direktiv.
Du har säkert sett # define och # include innan, men det
finns flera mer att preprocessorn känner igen.
Låt oss lägga till en # define till vår hallå världen exempel.
Nu ska vi bara köra preprocessorn i detta ärende.
Genom att skicka clage-E flaggan, du instruerar den att köra
bara förbehandlaren.
Låt oss se vad som händer.
Det ser ut som klang bara spottar ut allt
på kommandoraden.
För att spara allt av denna produktion till en ny fil som heter
hello2.c, vi lägga> hello2.c till vårt kommando.
Nu ska vi ta en titt på vår förbehandlade fil.
>> Oj, vad hände med våra kort litet program?
Om vi ​​går hela vägen till botten av denna fil, vi får se
en del av den kod som vi faktiskt skrev.
Observera att # define är borta och alla förekomster av namn
har ersatts med exakt vad vi specificeras i
den # define linjen.
Så vad är alla dessa typedefs och förklaringar funktion
längst upp i filen?
Observera att # define var inte den enda preprocessor
direktiv som vi angett.
Vi har även inkludera # stdio.h.
Så alla de galna linjer är egentligen bara stdio.h kopieras
och klistras in i toppen av denna fil.
Det är därför huvudfiler är så användbart för funktion
deklarationer.
Istället för att behöva kopiera och klistra in hela funktionen
deklarationer du tänker använda på toppen av din fil,
preprocessorn kommer att kopiera och klistra in dem från huvudet
fil för dig.
>> Nu när vi är klara förbehandling flyttar vi till
sammanställning.
Anledningen till att vi kallar detta steg sammanställning är att det är
steget där klang faktiskt gör sitt sammanställa från C till
assemblerkod.
För att få klang kompilera en fil ned till montering, men
fortsätta längre, förbi den-S flaggan
på kommandoraden.
Låt oss ta en titt på församlingen
fil som matas ut.
Det ser ut som en helt annan språk.
Assemblerkod är mycket processorn specifik.
I detta fall, eftersom CS50 maskinen körs på en
virtuell x86-processor, detta x86 assemblerkod.
Mycket få människor skriva direkt i Assembler dessa dagar,
men varje C-program du någonsin skriver blir transformeras ner
in montering.
Återigen, vi kallar detta steg sammanställningen av C i monteringen
eftersom vi kommer från en högre nivå till en lägre nivå
programmeringsspråk.
>> Vad gör monteringen lägre nivå än C?
Tja, i monteringen, är vi mycket begränsade i vad vi kan göra.
Det finns inga IF: s, medan är, för det eller öglor av något slag.
Men du kan åstadkomma samma saker som dessa styr
strukturer erbjuder hjälp de begränsade operationer som
montering faktiskt tillhandahåller.
Men att se hur låg montering egentligen är, låt oss gå
ytterligare ett steg i vår sammanställning, montering.
Det är assembler uppgift att omvandla assemblerkod
i objekt eller maskinkod.
Kom ihåg att montören inte utgång montering;
snarare, tar det i montering och utgångar maskinkod.
Maskinkod är den verkliga 1 s och 0 är att en CPU kan
förstå, även om vi fortfarande har en liten bit av arbete kvar
innan vi kan köra vårt program.
Låt oss samla våra assemblerkod genom att
Klang-c flaggan.
Låt oss nu se vad som finns i den monterade filen.
>> Tja, hjälper det inte oss mycket.
Kom ihåg att maskinen koden är ettor och nollor som
datorn kan förstå.
Det betyder inte att det är lätt för oss att förstå.
Så exakt hur låg nivå är monteringen?
Det är nästan identiskt med objektkod.
Att gå från montering till objektkod är mycket mer av en
översättning än en omvandling, vilket är anledningen till
en kanske inte anser att montören att
göra någon faktisk kompilerar.
I själva verket är det ganska lätt att manuellt översätta från
montering till maskinkod.
Man tittar på sammansättningen för en huvudfunktion, att första raden
råkar motsvara hexadecimala 0x55.
I binär, det är 1.010.101.
Den andra raden råkar motsvara hexadecimalt 0x895.
Och nästa, 0x56.
Med tanke på en relativt enkel tabell, kan du översätta
enheten i den kod som maskiner kan förstå också.
>> Så det finns en kvarvarande steg i
sammanställning, som länkning.
Länkning kombinerar ett gäng objektfiler till ett stor fil
att du faktiskt kan köra.
Länkning är mycket systemberoende.
Så det enklaste sättet att få klang att bara koppla objekt
filer tillsammans är att ringa klang på alla filer som
du vill länka samman.
Om du anger. O-filer, då det inte kommer att behöva bearbeta,
sammanställa och montera all din källkod.
Låt oss kasta en matematisk funktion i vår fil, så vi har
något att koppla in
Nu ska vi sammanställa det tillbaka ner till objektkod och
kalla klang på det.
Oops.
Eftersom vi ingår en matematisk funktion måste vi knyta i
matten biblioteket med-LM.
>> Om vi ​​ville knyta ihop gäng. O filer som vi
skrev på egen hand, skulle vi ange bara dem alla på
kommandoraden.
Begränsningen är att endast en av dessa filer måste
faktiskt specificera en huvudfunktion, annars
resulterande körbara inte vet var du ska börja
kör din kod.
Vad är skillnaden mellan att ange en fil att länka in
med-l och bara ange en fil direkt?
Inget.
Det är bara att klang råkar veta exakt vad fil
något som-LM råkar referera till.
Om du visste att filen själv, kan du ange det
explicit.
Kom bara ihåg att alla-l flaggor måste komma i slutet
av din klient efterfrågan.
>> Och det är allt som finns till den.
När du bara köra klang på vissa filer, det är vad det är
faktiskt gör.
Mitt namn är Rob Bowden, och detta är CS50.