[Powered by Google Translate] ROB Bowden: Kom ons praat oor samestellers.
Tot op hierdie punt, jy het net getik jou bron kode in
sommige lêers het hulle gestuur deur middel van hierdie groot swart boks wat
Klang, en kom uit jou uitvoerbare lêer wat nie
presies wat jy geskryf het in jou bronkode.
As magiese as wat, ons gaan 'n nader te neem
kyk na wat is eintlik gebeur
wanneer ons 'n lêer saam te stel.
So wat beteken dit om iets saam te stel?
>> Wel, in die mees algemene sin van die woord, dit beteken net
die transformasie van kode wat geskryf is in een
programmering taal na 'n ander.
Maar gewoonlik wanneer mense sê hulle stel iets, hulle
beteken dat hulle is om dit van 'n hoër vlak programmeringsomgewing
taal na 'n laer vlak programmeertaal.
Dit kan lyk soos 'n baie subjektiewe terme.
Byvoorbeeld, het jy waarskynlik dink nie van C as 'n hoë
vlak programmeertaal, maar jy stel dit.
Maar dit is alles relatief.
Soos ons sal sien, die gemeente-kode en uiteindelik masjien
kode wat ons stel af na is onteenseglik 'n laer vlak
as C.
Alhoewel ons sal gebruik word om kletteren in vandag se demonstrasie, 'n
baie van die idees hier dra aan ander vertalers.
>> Klang, is daar vier belangrike stappe in die algehele
samestelling.
Dit is een preprocessing gedoen deur die preprocessor, twee,
samestelling gedoen deur die samesteller, drie, monteerwerk
gedoen deur die assembler en vier,
koppel deur die koppelingshistoon gedoen.
Dit kan verwarrend wees dat een van die substeps van die algehele
Kletteren samestellers word genoem die vertaler, maar
ons sal kry.
Ons sal gebruik word om 'n eenvoudige hello world program as ons 'n voorbeeld
regdeur hierdie video.
Kom ons neem 'n blik.
>> Preprocessing is die eerste stap.
Wat beteken die voorverwerker doen?
In pretty much elke C program wat jy ooit gelees of geskryf,
jy gebruik om lyne van die kode wat begin met 'n hash.
Ek sal dit noem hash, maar jy kan noem dit ook pond, die aantal
teken, of skerp.
Enige so 'n lyn is 'n preprocessor richtlijn.
Jy het waarskynlik gesien # definieer en # include voor, maar daar
is verskeie meer dat die voorverwerker erken.
Kom ons voeg 'n # define ons hello world voorbeeld.
Nou kom ons hardloop net die voorverwerker op hierdie lêer.
Deur clage die-E vlag, jy opdrag om dit te doen
net die voorverwerker.
Kom ons kyk wat gebeur.
Dit lyk soos kletteren net spoeg alles
op die command line.
Ten einde al van hierdie uitset te slaan na 'n nuwe lêer met die naam
hello2.c, sal ons te heg> hello2.c op ons opdrag.
Nou laat ons neem 'n blik by ons preprocessed lêer.
>> Whoa, wat gebeur het met ons kort klein program?
As ons gaan al die pad aan die onderkant van hierdie lêer, sal ons sien
sommige van die kode dat ons eintlik geskryf het.
Let daarop dat die # define is verby en alle gevalle van naam
is vervang met presies wat ons gespesifiseer in
# define lyn.
So, wat is al hierdie typedefs en funksie verklarings
op die top van die lêer?
Let daarop dat die # define was nie die enigste preprocessor
Richtlijn dat ons gespesifiseer.
Ons sluit ook # het stdio.h.
So was dan al van die gek lyne is eintlik net stdio.h gekopieer
en geplak in die top van hierdie lêer.
Dit is die rede waarom header lêers is so nuttig vir funksie
verklarings.
In plaas van hoef te kopieer en plak van die funksie
verklarings jy van plan op die gebruik op die top van jou lêer, die
preprocessor sal kopieer en plak hulle uit die kop
dien vir jou.
>> Nou dat ons preprocessing klaar is, beweeg ons op
samestelling.
Die rede waarom ons noem hierdie stap samestelling is, want dit is
die stap waar die geratel nie eintlik sy die opstel van C na
vergadering kode.
Ten einde te kletteren stel 'n lêer af na die gemeente nie, maar
voortgaan nie verder, verby die-S vlag
op die command line.
Kom ons neem 'n blik op die vergadering
lêer wat outputted.
Dit lyk soos 'n ander taal.
Vergadering kode is baie verwerker spesifieke.
In hierdie geval, aangesien die CS50 toestel loop op 'n
virtuele x86 verwerker, dit is x86 vergadering kode.
Baie min mense skryf direk in die gemeente-kode hierdie dae,
maar elke C program wat jy al ooit skryf kry getransformeer
in die gemeente.
Weer, noem ons hierdie stap die samestelling van die C in die gemeente
want ons gaan van 'n hoër vlak na 'n laer vlak
programmeertaal.
>> Wat vergadering laer vlak as C?
Wel, in die gemeente, is ons baie beperk in wat ons kan doen.
Daar is nie indien, terwyl is, is of lissies van enige aard.
Maar jy kan bereik dieselfde dinge dat hierdie beheer
strukture bied deur gebruik te maak van die beperkte bedrywighede wat
vergadering nie voorsien.
Maar om te sien hoe lae vlak gemeente werklik is, laat ons gaan
'n stap verder in ons samestelling, vervaardiging.
Dit is die samesteller se werk om die vergadering kode te omskep
in die voorwerp of masjien-kode.
Onthou dat die assembler nie uitset vergadering;
eerder, dit neem in die gemeente en uitsette masjien kode.
Machine kode is die werklike 1 en 0 se dat 'n SVE kan
verstaan, alhoewel ons nog 'n klein bietjie van die werk verlaat het
voordat ons kan hardloop ons program.
Kom ons versamel ons vergadering kode deur '
Klang-c vlag.
Nou laat ons kyk wat is in die saamgestelde lêer.
>> Wel, wat nie help ons baie.
Onthou dat die masjien kode is die ene en nulle wat
jou rekenaar kan verstaan.
Dit beteken nie dit is maklik vir ons om te verstaan.
So presies hoe lae vlak is die vergadering?
Dit is byna identies aan object code.
Gaan van die vergadering aan die object code is veel meer van 'n
vertaling as 'n transformasie, wat is die rede waarom
dalk nie die assembler oorweeg
doen enige werklike Opstel.
Om die waarheid te sê, dit is redelik maklik om te vertaal die hand van
vergadering aan die masjien kode.
Op soek na die vergadering vir 'n belangrike funksie, wat eerste reël
gebeur om ooreen te stem heksadesimale 0x55.
In binêre, dit is 1.010.101.
Die tweede lyn gebeur heksadesimale 0x895 om ooreen te stem.
En die volgende, 0x56.
Gegewe 'n relatief eenvoudige tafel, kan jy dit vertaal
vergadering in die kode dat masjiene te kan verstaan.
>> So is daar een oorblywende stap in
samestelling, wat 'n skakel.
Met 'n skakel kombineer 'n klomp van die voorwerp lêers in een groot lêer
dat jy eintlik kan voer.
Skakel is baie stelsel afhanklik.
Dus is die maklikste manier om kletteren te kry om net te koppel voorwerp
lêers tesame kletteren te roep op al die lêers wat
jy wil aan mekaar te koppel.
As jy spesifiseer. O lêers, dan sal dit nie nodig het om te verwerk,
stel, en versamel al van jou bronkode.
Kom ons gooi 'n wiskunde-funksie in ons lêer, sodat ons '
iets om te skakel.
Nou laat ons stel dit weer af te object code en
noem kletteren op dit.
Oeps.
Aangesien ons 'n wiskunde-funksie, moet ons in skakel
die wiskunde biblioteek met lm.
>> As ons wou saam te koppel klomp van die o lêers wat ons
geskryf het op ons eie, ons wil net spesifiseer hulle almal by die
command line.
Die beperking is dat slegs een van hierdie lêers moet
eintlik 'n hooffunksie spesifiseer, of anders die
gevolg uitvoerbaar sou nie weet waar om te begin nie
die bestuur van jou kode.
Wat is die verskil tussen die spesifiseer van 'n lêer om te skakel in
met-l en net spesifiseer 'n lêer direk?
Niks nie.
Dis net dat die geratel gebeur presies wat lêer om te weet
iets soos lm gebeur om te verwys na.
As jy geweet het dat 'n lêer jouself, kan jy spesifiseer dit
uitdruklik.
Net onthou dat al-l vlae het om te kom aan die einde
van jou kliënt vraag.
>> En dit is al wat daar is om dit.
Wanneer jy net op 'n paar lêers loop klang, dit is wat dit is
eintlik doen.
My naam is Rob Bowden, en dit is CS50.