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