[Powered by Google Translate] ROB Bowden: skulum tala um vistþýðendur. Fram þessum tímapunkti, þú hefur bara slegið upp kóðann inn sumir skrá, sendi þá í gegnum þetta stór svartur kassi sem er Clang, og út kemur executable skrá sem gerir nákvæmlega það sem þú skrifaðir í kóða þínum. Eins töfrum sem það hefur verið, við erum að fara að taka a loka líta á það sem er raunverulega að gerast þegar við taka saman skrá. Og hvað þýðir það að þýða eitthvað? Jæja, í flestum almennum skilningi, það bara breyta númerið skrifað í einu forritunarmál til annars. En venjulega þegar fólk segir að þeir þýða eitthvað, þeir meina þeir eru að taka það frá hærra stigi forritun tungumál til lægra stigi forritunarmál. Þetta kann að virðast eins og mjög huglæg hugtök. Til dæmis, þú sennilega dont 'hugsa um C sem hátt stigi forritunarmál, en þú þýða það. En það er allt ættingja. Eins og við munum sjá, að samkoma númer og að lokum vél kóða sem við saman niður til er óneitanlega lægra stigi en C. Þó að við munum vera með Clang í mótmælum í dag, mikið af þeim hugmyndum hér bera yfir öðrum vistþýðendur. Fyrir Clang eru fjögur stór skref í heild samantekt. Þetta eru einn, forvinnu gert af Preprocessor, tveir, samantekt unnin af þýðanda, þrír, samsetningu gert af Assembler, og fjórir, tengja gert af linker. Það getur verið ruglingslegt að einn substeps af heildar Clang vistþýðendur heitir þýðanda, en við munum komast að því. Við munum vera með einfalt Halló heimur forrit sem dæmi okkar um þetta myndband. Við skulum taka a líta. Fyrsta skrefið er forvinnu. Hvað Preprocessor gera? Í nánast hvert C forrit sem þú hefur nokkurn tíma lesið eða skrifað, þú hefur notað línur af kóða sem byrja með kjötkássa. Ég kalla það kjötkássa, en þú getur líka hringt í það pund, númer undirrita, eða skarpur. Sérhver slík lína er Preprocessor tilskipun. Þú hefur sennilega séð # skilgreina og # include áður, en það eru nokkrir fleiri sem Preprocessor viðurkennir. Við skulum bæta # skilgreina á Halló heimur dæmi okkar. Nú skulum hlaupa bara Preprocessor á þessari skrá. Við brottför clage The-E fána, þú ert leiðbeina því að keyra bara Preprocessor. Við skulum sjá hvað gerist. Það lítur út eins og Clang bara spits út allt á stjórn lína. Til að vista öll þessi framleiðsla í nýja skrá sem heitir hello2.c, munum við auka> hello2.c að stjórn okkar. Nú skulum taka a líta á preprocessed skrá okkar. Vá, hvað gerðist til skamms litla kerfi okkar? Ef við förum alla leið til the botn af þessari skrá, munum við sjá sumir af the merkjamál sem við skrifaði reyndar. Takið eftir að # define er farinn og öll dæmi um nafn hefur verið skipt út nákvæmlega hvað við tilgreint í á # skilgreina línu. Svo það eru allar þessar typedefs og hlutverk yfirlýsingar efst á skránni? Takið eftir að # define var ekki aðeins Preprocessor tilskipun sem við tilgreint. Við höfum einnig fela # stdio.h. Svo allar brjálaður línur eru í raun bara stdio.h afrita og límt inn efst á þessari skrá. Þess vegna haus skrár eru svo gagnlegur fyrir virka yfirlýsingar. Í stað þess að þurfa að afrita og líma alla virka yfirlýsingar sem þú ætlar að nota efst á skránni þinni, Preprocessor munu afrita og líma þær frá haus skrá fyrir þig. Nú þegar við erum búin forvinnu, hreyfa við á samantekt. Ástæðan sem við köllum þetta skref samantekt er vegna þess að þetta er skref þar Clang raun er að setja saman sitt frá C til samkoma kóða. Til þess að hafa Clang saman skrá niður samkoma, en halda ekki lengra, gefa það sem-S fáninn á stjórn lína. Við skulum taka a líta á þinginu skrá sem var outputted. Það lítur út eins og nokkuð annað tungumál. Þingið númerið er mjög örgjörva sérstakur. Í þessu tilviki, þar sem CS50 tæki er í gangi á raunverulegur x86 örgjörva, þetta er x86 samkoma kóða. Mjög fáir skrifa beint í kóða samkoma þessa dagana, en sérhver C forrit sem þú skrifar alltaf fær umbreytt niður í þinginu. Aftur, kalla okkur þetta skref að setja saman C í söfnuðinum þar sem við erum að fara frá hærra stigi til lægra stigi forritunarmáli. Hvað gerir samkoma lægri en C? Jæja, í söfnuði, við erum takmörkuð mjög í hvað við getum gert. Það eru ekki ef er, en, því, eða lykkjur af einhverju tagi. En þú getur náð sömu hlutina að þessi stjórn mannvirki bjóða nota takmarkaða starfsemi sem samkoma er veitt. En til þess að sjá hversu lágt samkoma í raun er, við skulum fara einu skrefi lengra í samantekt okkar, samsetningu. Það er starf Assembler að umbreyta samkoma númer í hlut eða vél númer. Mundu að Assembler ekki framleiðsla samkoma; heldur tekur það í söfnuði og framleiðsla vél númer. Machine kóða er í raun 1 og er 0 að CPU getur skilja, þó að við höfum enn smá hluti af starfi vinstri áður en við getum keyrt forrit okkar. Við skulum saman samkoma kóða okkar við brottför Clang The-c-fána. Nú skulum sjá hvað er í safnað saman skrá. Jæja, það þýðir ekki að hjálpa okkur mjög mikið. Mundu að vélin kóða er sjálfur og núll að tölva getur skilið. Það þýðir ekki að það er auðvelt fyrir okkur að skilja. Svo nákvæmlega hversu lágu stigi er samkoma? Það er næstum eins og að mótmæla kóða. Going úr söfnuðinum að mótmæla kóða er mun meira af þýðing en umbreytingu, sem er hvers vegna mætti ​​ekki fjalla um Assembler til gera allir raunverulegur söfnun. Í raun er það nokkuð auðvelt að höndunum þýða úr samkoma til vél númer. Þegar litið er á þingi fyrir meginvirkni, að fyrsta lína gerist samsvara sextánskur 0x55. Í tvöfaldur, það er 1010101. Seinni línan gerist að svara sextánskur 0x895. Og næst, 0x56. Í ljósi tiltölulega einfalt borð, væri hægt að þýða samkoma í kóða sem vélar geta skilið líka. Þannig að það sem eftir skref í samantekt, sem er hlekkur. Krækjur sameinar fullt af skrá mótmæla í eina stóra skrá að þú getur í raun keyrt. Krækjur er mjög kerfi háð. Svo einfaldasta leiðin til að fá Clang að bara tengja hlut skrár saman er að kalla Clang á allar skrár sem þú vilt tengja saman. Ef þú tilgreinir. O skrá, þá mun ekki þurfa að endurvinna, safna saman, og safna öllum frumkóða þínu. Við skulum kasta stærðfræði virka í skrá okkar, þannig að við höfum eitthvað til að tengja inn Nú skulum þýða það aftur niður að mótmæla kóða og kalla Clang á það. Oops. Þar sem við með stærðfræði virka, þurfum við að tengja á stærðfræði bókasafn með-LM. Ef við vildum að tengja saman fullt af. O skrár sem við skrifaði á okkar eigin, við myndum bara skilgreina þeim öllum á stjórn lína. Takmörkunin er sú eina af þessum skrám skulu raun að tilgreina helstu hlutverk, eða annars leiðir executable vildi ekki vita hvar á að byrja keyra kóðann þinn. Hver er munurinn á að tilgreina skrá til að tengja í með-l og bara tilgreina skrá beint? Ekkert. Það er bara gerist að Clang að vita nákvæmlega hvaða skrá eitthvað eins-LM gerist að vísa til. Ef þú vissir að skrá þig, getur þú skilgreint það sérstaklega. Mundu bara að allt l fánar að koma í lok af eftirspurn viðskiptavina þinn. Og þessi 'allur there er til það. Þegar þú keyrir bara Clang á sumum skrám, þetta er það sem það er í raun að gera. Mitt nafn er Rob Bowden, og þetta er CS50.