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