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