[Powered by Google Translate] Rob Bowden: Hebu majadiliano kuhusu compilers. Mpaka hatua hii, ve tu typed up chanzo yako code katika baadhi files, akawatuma kwa njia ya sanduku hili kubwa nyeusi kwamba ni Clang, na nje anakuja executable faili yako kwamba hana hasa nini aliandika katika chanzo code yako. Kama kichawi kama kwamba imekuwa, sisi ni kwenda kuchukua karibu kuangalia nini ni kweli yanatokea wakati sisi kukusanya faili. Hivyo ni nini maana kukusanya kitu? Naam, katika maana zaidi ya jumla, ni njia tu kubadilisha iliyoandikwa katika moja programu lugha na mwingine. Lakini kwa kawaida wakati watu wanasema kukusanya kitu fulani, wao mean wao ni kuchukua ni kutoka programu ngazi za juu Lugha ya lugha ngazi ya chini ya programu. Haya yanaweza kuonekana kama suala subjective sana. Kwa mfano, pengine sidhani wa C kama juu ngazi ya programu ya lugha, lakini huna kukusanya yake. Lakini zote ni jamaa. Kama tutaweza kuona, code mkutano na hatimaye mashine kificho kwamba sisi kukusanya chini ni undeniably ngazi ya chini kuliko C. Ingawa sisi utakuwa kutumia Clang katika maandamano ya leo, mawazo mengi hapa kubeba zaidi ya watunzi wengine. Kwa Clang, kuna hatua nne kuu katika ujumla mkusanyiko. Hizi ni moja, preprocessing kufanyika kwa preprocessor; mbili, mkusanyiko kufanyika kwa compiler; tatu, kukusanyika kufanyika kwa assembler, na nne, kuunganisha kufanyika kwa linker. Ni inaweza kuwa utata kwamba mmoja wa substeps ya jumla Compilers Clang inaitwa compiler, lakini tutaweza kupata kwamba. Sisi utakuwa kutumia rahisi hujambo dunia mpango kama mfano wetu katika video hii. Hebu tuangalie. Hatua ya kwanza ni preprocessing. Je preprocessor kufanya? Katika pretty much kila mpango C ve milele kusoma au kuandika, umetumia mistari ya kificho kwamba kuanza na hash. Mimi nitakuita ni hash, lakini pia unaweza kuiita paundi, idadi saini, au mkali. Yoyote line vile ni agizo preprocessor. Ve pengine kuona # define na # pamoja kabla, lakini kuna kadhaa zaidi kwamba preprocessor inatambua. Hebu kuongeza # define kwa mfano wetu hujambo dunia. Sasa hebu kukimbia tu preprocessor juu ya faili hii. Kwa kupita clage Barua bendera, wewe ni mwelekezaji ni kukimbia tu preprocessor. Hebu kuona nini kinatokea. Inaonekana kama Clang tu mtemi kila kitu katika mstari amri. Ili kuokoa wote wa pato hii na faili mpya iitwayo hello2.c, tutaweza append> hello2.c kwa amri yetu. Sasa hebu tuangalie faili wetu preprocessed. Ho, nini kilichotokea na mpango wetu mfupi kidogo? Kama sisi kwenda njia yote hadi chini ya faili hili, tutaweza kuona baadhi ya kificho kwamba sisi kweli aliandika. Ona kwamba define # ni wamekwenda na matukio yote ya jina wamekuwa kubadilishwa na nini hasa sisi maalum katika # Define mstari. Kwa hiyo kile ni hawa wote typedefs na maazimio ya kazi saa ya juu ya faili? Ona kwamba define # hakuwa preprocessor tu maelekezo kwamba sisi maalum. Sisi pia ni pamoja # stdio.h. Basi wote wa mistari mambo ni kweli tu stdio.h kunakiliwa na pasted ndani ya juu ya faili hii. Hiyo ndiyo sababu header files ni hivyo muhimu kwa ajili ya kazi maazimio. Badala ya wanaohitaji na nakala na kuweka wote wa kazi maazimio mpango juu ya kutumia saa ya juu ya faili yako, preprocessor itakuwa nakala na kuweka yao kutoka header faili kwa ajili yenu. Sasa kwa kuwa sisi ni kosa preprocessing, sisi kuhamia kwenye mkusanyiko. sababu sisi wito huu mkusanyiko hatua ni kwa sababu hii ni hatua ambapo Clang kweli haina kuandaa wake kutoka C kwa mkutano code. Ili kuwa na Clang kukusanya faili chini ya kanisa, lakini kuendelea hakuna zaidi, kupita S-bendera katika mstari amri. Hebu tuangalie katika mkutano faili kwamba alikuwa outputted. Inaonekana kama lugha tofauti kabisa. Bunge code ni sana processor maalum. Katika kesi hiyo, tangu appliance CS50 ni mbio juu ya virtual processor x86, hii ni x86 mkutano code. Watu wachache sana kuandika moja kwa moja katika mkutano code siku hizi, lakini mpango kila C wewe milele kuandika anapata kubadilishwa chini ndani ya kanisa. Tena, sisi kuwaita hatua hii kuandaa C katika mkutano tangu sisi ni kwenda kutoka ngazi ya juu kwa ngazi za chini programu lugha. Kinachofanya mkutano ngazi ya chini kuliko C? Naam, katika mkutano, sisi ni mdogo sana katika nini tunaweza kufanya. Hakuna kama wa,, wakati ni kwa ni, au matanzi ya aina yoyote. Lakini unaweza kukamilisha mambo sawa kwamba hawa kudhibiti miundo kutoa kutumia shughuli mdogo kwamba mkutano gani kutoa. Lakini kuona tu jinsi kiwango cha chini mkutano kweli ni, twende hatua moja zaidi katika mkusanyiko wetu, kukusanyika. Ni kazi assembler ya kubadilisha code mkutano ndani ya kitu au code mashine. Kumbuka kwamba assembler haina pato kanisa; badala yake, inachukua katika mkutano na matokeo code mashine. Machine code ni halisi 1 na 0 kwamba CPU unaweza kuelewa, ingawa bado tuna kidogo kidogo ya kazi kushoto kabla tunaweza kuendesha programu yetu. Hebu kukusanyika mkutano wetu code kwa kupita Clang c-bendera. Sasa hebu angalia nini katika faili wamekusanyika. Naam, hiyo haina kutusaidia sana. Kumbuka kwamba code mashine ni ndio na zeros kwamba kompyuta yako inaweza kuelewa. Hiyo haina maana ni rahisi kwa sisi kuelewa. Hivyo hasa jinsi kiwango cha chini ni mkutano? Ni karibu kufanana kwa kificho kitu. Kwenda kutoka mkutano kwa kificho kitu ni zaidi ya tafsiri ya mageuzi, ambayo ni kwa nini mtu anaweza kufikiria assembler kwa kufanya lolote kuandaa halisi. Kwa kweli, ni pretty rahisi manually kutafsiri kutoka mkutano kwa code mashine. Kuangalia kanisa kwa ajili ya kazi kuu, kwamba mstari wa kwanza kinachotokea kwa yanahusiana na 0x55 hexadesimoli. Katika binary, hiyo ni 1,010,101. mstari wa pili hutokea yanahusiana 0x895 hexadesimoli. Na pili, 0x56. Kutokana na meza rahisi, unaweza kutafsiri mkutano ndani ya kificho kwamba mashine wanaweza kuelewa pia. Hivyo kuna moja iliyobaki hatua katika mkusanyiko, ambayo ni ya kuunganisha. Kuunganisha unachanganya rundo la files kifaa kwenye faili moja kubwa kuwa unaweza kweli nitafanya. Kuunganisha ni sana mfumo tegemezi. Hivyo njia rahisi ya kupata Clang tu kuunganisha kifaa files pamoja ni kuwaita Clang wote wa files kwamba unataka kuunganisha pamoja. Kama wewe taja files o., Basi itakuwa si haja ya reprocess, kukusanya, na kukusanyika wote wa chanzo code yako. Hebu kutupa kazi math katika faili wetu, hivyo tuna kitu zilizounganishwa in Sasa hebu kukusanya nyuma chini code kitu na piga Clang juu yake. Lo. Tangu sisi ni pamoja na kazi math, tunahitaji kuunganisha katika maktaba na math-LM. Kama sisi alitaka kuunganisha pamoja rundo la. O files kwamba sisi aliandika juu yetu wenyewe, tunatarajia tu kutaja yao yote katika amri line. kizuizi ni kwamba moja tu ya hizi files lazima kweli bayana kazi kuu, au mwingine kusababisha executable bila kujua wapi kuanza mbio code yako. Nini tofauti kati ya inayobainisha faili kuhusisha katika kwa-l na tu inayobainisha faili moja kwa moja? Chochote. Ni tu Clang kinachotokea kwa kujua nini hasa faili kitu kama-LM kinachotokea kwa kutaja. Kama alijua kwamba faili mwenyewe, unaweza kutaja ni waziwazi. Kumbuka tu kwamba wote-l bendera na kuja mwishoni ya mteja mahitaji yako. Na kwamba wote kilichopo. Wakati wewe kukimbia tu juu ya Clang files baadhi, hii ni nini ni kweli kufanya. Jina langu ni Rob Bowden, na hii ni CS50.