[Powered by Google Translate] ROB BOWDEN: Lad os tale om compilers.
Indtil dette punkt, har du lige har skrevet op din kilde kode i
nogle filer, sendte dem gennem denne store sorte boks, der er
Klang, og ud kommer din eksekverbar fil, der gør
præcis, hvad du skrev i din kildekode.
Så magisk som det har været, vi kommer til at tage et nærmere
se på, hvad der rent faktisk sker
Når vi opretter en sagsmappe.
Så hvad betyder det at samle noget?
>> Tja, i den mest almindelige betydning, det betyder bare,
omdanne kode skrevet i ét
programmering sprog til et andet.
Men som regel, når folk siger, at de udarbejder noget, de
betyder, at de tager det fra et højere niveau programmering
sprog til et lavere niveau programmeringssprog.
Disse kan synes som meget subjektive betingelser.
For eksempel, sandsynligvis du ikke tænke på C som en høj
niveau programmeringssprog, men du kompilere det.
Men det er alle relative.
Som vi vil se, samling kode og til sidst maskine
kode, som vi kompilere ned til, er unægtelig et lavere niveau
end C.
Selv om vi kommer til at bruge Dunk i dagens demonstration, en
Mange af de ideer her fremførsel til andre compilere.
>> For Dunk er der fire vigtige skridt i den overordnede
kompilering.
Dette er en, forbehandling udført af forprocessoren, to,
kompilering udført af compileren, tre, montage
udført af assembler, og fire,
forbinder udført af linkeren.
Det kan være forvirrende, at en af ​​undertrin for den samlede
Klang compilers kaldes compiler, men
vi vil komme til det.
Vi kommer til at bruge et simpelt hej verden program som vores eksempel
hele denne video.
Lad os tage et kig.
>> Det første skridt er forbehandling.
Hvad gør præprocessoren gøre?
I stort set alle C-program, du nogensinde har læst eller skrevet,
du har brugt linjer kode, der begynder med en hash.
Jeg vil kalde det hash, men du kan også kalde det pounds, antal
underskrive, eller skarpe.
Enhver sådan linje er en præprocessor direktiv.
Du har sikkert set # define og # include før, men der
er flere mere at præprocessoren genkender.
Lad os tilføje en # define til vores hej verden eksempel.
Nu lad os køre bare præprocessoren på denne fil.
Ved at føre clage-E flag, er du instruere det til at køre
bare præprocessoren.
Lad os se hvad der sker.
Det ligner Dunk bare spytter alt
på kommandolinjen.
For at redde alt dette output til en ny fil kaldet
hello2.c, vil vi tilføje> hello2.c på vores kommando.
Lad os nu tage et kig på vores præprocesseret fil.
>> Whoa, hvad der skete med vores kort lille program?
Hvis vi går hele vejen ned til bunden af ​​denne fil, vil vi se
nogle af den kode, vi faktisk skrev.
Bemærk at # define er væk, og alle tilfælde af navn
er blevet erstattet med præcis, hvad vi er specificeret i
# define linjen.
Så hvad er alle disse typedefs og funktion erklæringer
øverst i filen?
Bemærk at # define ikke var den eneste præprocessor
direktiv, som vi angivet.
Vi har også # include stdio.h.
Så alle de skøre linjer er faktisk lige stdio.h kopieret
og indsat i toppen af ​​denne fil.
Det er derfor, header-filer er så nyttigt for funktion
erklæringer.
I stedet for at skulle kopiere og indsætte hele funktionen
erklæringer du planlægger at bruge i toppen af ​​din fil,
præprocessor vil kopiere og indsætte dem fra header
filen for dig.
>> Nu, hvor vi er færdige forbehandling, vi bevæger os ind på
kompilering.
Grunden til at vi kalder dette trin samling er fordi det er
det trin, hvor Dunk rent faktisk sin kompilere fra C til
montage kode.
For at få Dunk opretter en sagsmappe ned til samling, men
fortsætte længere, passere det the-S flag
på kommandolinjen.
Lad os tage et kig på samlingen
fil, der blev udsendt.
Det ligner en ganske anden sprog.
Assembly kode er meget processor specifik.
I dette tilfælde CS50 apparatet, da kører på en
virtuel x86 processor, det er x86 forsamling kode.
Meget få mennesker skrive direkte i montage kode i disse dage,
men hver C-program, du nogensinde skriver bliver transformeret ned
i samlingen.
Igen, vi kalder dette trin oprettes et C i samlingen
da vi går fra et højere niveau til et lavere niveau
programmeringssprog.
>> Hvad gør monteringen lavere niveau end C?
Tja, i samling, er vi meget begrænset, hvad vi kan gøre.
Der er ingen IF'ens, mens, thi er, eller sløjfer af nogen art.
Men du kan udføre de samme ting, som disse kontrol
strukturer giver anvendelse af de begrænsede operationer,
samling giver dog.
Men at se hvor lavt niveau samling virkelig er, lad os gå
et skridt videre i vores samling, montage.
Det er assembler opgave at omdanne forsamlingen kode
i objekt eller maskinkode.
Husk, at assembler ikke afgiver samling;
snarere, det tager i montering og udgange maskine kode.
Machine kode er den faktiske 1-taller og 0 er, at en CPU kan
forstå, selv om vi stadig har en lille smule arbejde tilbage
før vi kan køre vores program.
Lad os samle vores forsamling kode ved at passere
Klang for-c flag.
Lad os nu se hvad der er i den samlede fil.
>> Tja, betyder det ikke hjælper os meget.
Husk at maskinen koden er de ettaller og nuller, at
computeren kan forstå.
Det betyder ikke, det er nemt for os at forstå.
Så præcis hvordan lavt niveau er samling?
Det er næsten identisk med objekt kode.
Går fra samling til objekt kode er meget mere af en
oversættelse end en transformation, hvilket er grunden
kunne man ikke betragte assembler til
gøre nogen reel compiling.
Faktisk er det temmelig nemt at manuelt oversætte fra
forsamling til maskine kode.
Ser man på samlingen for en hovedfunktion, at første linje
tilfældigvis svarer til hexadecimale 0x55.
I binær, er det 1.010.101.
Den anden linje sker for at svare hexadecimal 0x895.
Og den næste, 0x56.
Givet en relativt simpel tabel, kan du oversætte
samling i koden, at maskinerne kan forstå også.
>> Så der er én resterende skridt i
kompilering, der forbinder.
Sammenkædning kombinerer en masse objekt filer til én stor fil
at du faktisk kan udføre.
Sammenkædning er meget afhængig af systemet.
Så den nemmeste måde at få Dunk bare sammenkæde objektet
filer sammen er at kalde Dunk på alle de filer,
du vil linke sammen.
Hvis du angiver. O-filer, så vil det ikke nødvendigt at oparbejde,
kompilere og samle alle dine kildekode.
Lad os kaste et matematisk funktion i vores fil, så vi har
noget at forbinde i.
Lad os nu kompilere det tilbage ned til objekt-kode og
kalde Dunk på det.
Ups.
Da vi inkluderet en matematisk funktion, er vi nødt til at linke i
math bibliotek med-lm.
>> Hvis vi ønskede at sammenkæde flok. O-filer, som vi
skrev på vores egne, ville vi bare angive dem alle på
kommandolinje.
Begrænsningen er, at kun en af ​​disse filer skal
faktisk angive en hovedfunktion, ellers
resulterende eksekverbare ville ikke vide hvor du skal starte
kører din kode.
Hvad er forskellen mellem at angive en fil til at linke i
med-l og blot angive en fil direkte?
Ingenting.
Det er bare at Dunk sker at vide præcis, hvad fil
noget lignende-lm sker for at henvise til.
Hvis du vidste, at filen selv, kan du angive det
eksplicit.
Bare husk, at al-l-flag er nødt til at komme i slutningen
af din klient efterspørgsel.
>> Og det er alt der er til det.
Når du bare køre Dunk på nogle filer, det er hvad det er
faktisk gør.
Mit navn er Rob Bowden, og dette er CS50.