[Powered by Google Translate] ROB BOWDEN: Gadewch i ni siarad am crynoadyddion. Tan y pwynt hwn, eich bod wedi teipio yn unig i fyny eich cod ffynhonnell i rhai ffeiliau, eu hanfon drwy'r blwch du mawr sy'n Clang, ac allan daw eich ffeil gweithredadwy sy'n gwneud yn union beth rydych wedi ysgrifennu yn eich cod ffynhonnell. Fel hudol fel sydd wedi bod, rydym yn mynd i gymryd yn nes edrych ar yr hyn sy'n digwydd mewn gwirionedd pan fyddwn yn llunio ffeil. Felly, beth mae'n ei olygu i lunio rhywbeth? Wel, yn yr ystyr mwyaf cyffredinol, 'i jyst yn golygu cod trawsnewid ysgrifenedig mewn un raglennu iaith i'r llall. Ond fel arfer pan fydd pobl yn dweud eu llunio rhywbeth, maent yn golygu eu bod yn cymryd o raglennu lefel uwch iaith i iaith raglennu lefel is. Gall y rhain yn ymddangos fel termau yn oddrychol iawn. Er enghraifft, mae'n debyg nad ydych yn meddwl am C yn uchel iaith rhaglennu lefel, ond byddwch yn llunio ei. Ond mae'r cyfan perthynas. Fel byddwn yn gweld, y cod cynulliad ac yn y pen draw peiriant cod a llunio i lawr i yn ddiymwad lefel is nag C. Er y byddwn yn defnyddio Clang yn arddangos heddiw, a llawer o'r syniadau yma cario drosodd i crynoadyddion eraill. Er Clang, mae pedwar cam mawr yn y cyffredinol casglu. Mae'r rhain yn un, preprocessing a wneir gan y Preprocessor, dau, casgliad a wneir gan y compiler, tair, cydosod a wneir gan y cyfosodwr, a phedwar, cysylltu a wneir gan y linker. Gall fod yn ddryslyd mai un o substeps y cyffredinol Crynoadyddion Clang yw'r enw ar y compiler, ond byddwn yn mynd i hynny. Byddwn yn defnyddio'r rhaglen fyd helo syml fel ein enghraifft drwy gydol y fideo. Gadewch i ni edrych. Y cam cyntaf yw preprocessing. Beth mae'r Preprocessor yn ei wneud? Yn 'n bert lawer pob rhaglen C ydych chi wedi darllen erioed neu ysgrifenedig, rydych wedi defnyddio llinellau o god sy'n dechrau gyda hash. 'N annhymerus' alw hash, ond efallai y byddwch hefyd yn ei alw bunnoedd, rhif lofnodi, neu miniog. Unrhyw linell o'r fath yn gyfarwyddeb Preprocessor. Rydych chi wedi gweld yn ôl pob tebyg # diffinio a # cynnwys o'r blaen, ond mae yn nifer mwy na'r Preprocessor yn cydnabod. Gadewch i ni ychwanegu # define at ein henghraifft byd helo. Nawr, gadewch i redeg dim ond y Preprocessor ar y ffeil hon. Drwy basio clage E-faner, rydych yn cyfarwyddo i redeg dim ond y Preprocessor. Gadewch i ni weld beth sy'n digwydd. Mae'n edrych fel Clang just poeri allan bopeth ar y llinell orchymyn. Er mwyn achub yr holl allbwn hwn at ffeil newydd o'r enw hello2.c, byddwn yn atodi> hello2.c i'n gorchymyn. Nawr gadewch i ni gymryd golwg ar ein ffeil preprocessed. Pwy yw, yr hyn a ddigwyddodd i'n rhaglen ychydig yn brin? Os ydym yn mynd yr holl ffordd i waelod y ffeil, gawn ni weld rhai o'r cod yr ydym yn mewn gwirionedd yn ysgrifennu. Sylwch fod Diffiniwch # yn cael ei mynd a phob achos o enw wedi cael eu disodli gyda union beth yr ydym a nodir yn y # define llinell. Felly beth yw'r holl typedefs a datganiadau swyddogaeth ar ben y ffeil? Sylwch nad Diffiniwch # oedd yr Preprocessor yn unig gyfarwyddeb yn y penodedig. Rydym hefyd wedi cynnwys stdio.h #. Felly yr holl o'r llinellau crazy mewn gwirionedd dim ond copïo stdio.h a gludo i mewn i frig y ffeil. Dyna pam y ffeiliau pennawd mor ddefnyddiol ar gyfer swyddogaeth datganiadau. Yn hytrach na bod angen i gopïo a gludo yr holl swyddogaeth datganiadau ydych yn bwriadu ar ddefnyddio ar frig eich ffeil, mae'r Bydd Preprocessor copïo a'u gludo oddi wrth y pennawd ffeilio i chi. Nawr ein bod yn gwneud preprocessing, rydym yn symud ymlaen casglu. Y rheswm rydym yn galw hyn casgliad cam rheswm am hyn yw y cam lle Clang mewn gwirionedd mae ei llunio o C i cod cynulliad. Er mwyn cael Clang llunio ffeil i lawr i ymgynnull, ond barhau dim pellach, yn ei throsglwyddo i'r S-faner ar y llinell orchymyn. Gadewch i ni edrych ar y cynulliad ffeil a outputted. Mae'n edrych fel dipyn o iaith wahanol. Cynulliad côd yn brosesydd penodol. Yn yr achos hwn, gan fod yr offer CS50 yn rhedeg ar prosesydd x86 rhithwir, mae hyn yn cod cynulliad x86. Ychydig iawn o bobl ysgrifennu yn uniongyrchol mewn cod cynulliad y dyddiau hyn, ond mae pob rhaglen C chi'n ysgrifennu yn cael ei drawsnewid i lawr i mewn cynulliad. Unwaith eto, rydym yn galw hyn yn cam llunio'r C yn y cynulliad gan ein bod yn mynd o lefel uwch i lefel is raglennu iaith. Beth sy'n gwneud lefel cynulliad is na C? Wel, yn y gwasanaeth, rydym yn gyfyngedig iawn yn yr hyn y gallwn ei wneud. Nid oes unrhyw os, tra mae, er yn, neu ddolenni o unrhyw fath. Ond gallwch gyflawni yr un pethau bod y rheolaeth strwythurau yn cynnig ddefnyddio'r gweithrediadau cyfyngedig sydd Cynulliad yn darparu. Ond i weld yn union pa mor cynulliad lefel isel mewn gwirionedd, gadewch i ni fynd un cam ymhellach yn ein casgliad, cydosod. Mae'n waith y cyfosodwr i drawsnewid y cod cynulliad i mewn i wrthrych neu god peiriant. Cofiwch nad yw'r cyfosodwr yn y cynulliad allbwn; yn hytrach, mae'n cymryd yn y gwasanaeth a chod pheiriant allbynnau. Cod peiriant yn y gwir 1 a 0 yn bod CPU gall deall, er ein bod yn dal i gael ychydig bach o waith ar ôl cyn y gallwn redeg ein rhaglen. Gadewch i ni ymgynnull ein cod cynulliad drwy basio Clang y c-faner. Nawr gadewch i ni weld beth sydd yn y ffeil ymgynnull. Wel, nid yw hynny'n ein helpu yn fawr iawn. Cofiwch fod y cod peiriant yn y rhai a sero y gall eich cyfrifiadur ddeall. Nid yw hynny'n golygu ei fod yn hawdd i ni ei ddeall. Felly, yn union pa mor isel lefel yn y cynulliad? Mae'n bron yn union yr un fath i cod gwrthrych. Mynd o cynulliad i god gwrthrych yn llawer mwy o cyfieithu na trawsnewid, a dyna pam Efallai na fydd un ystyried y cyfosodwr i gwneud unrhyw lunio'r gwirioneddol. Yn wir, mae'n eithaf hawdd i manually gyfieithu o'r cynulliad i god peiriant. O edrych ar y cynulliad ar gyfer prif swyddogaeth, y llinell gyntaf digwydd i gyfateb i 0x55 hecsadegol. Yn deuaidd, dyna 1,010,101. Mae'r ail linell yn digwydd i gyfateb 0x895 hecsadegol. A'r nesaf, 0x56. O ystyried tabl cymharol syml, gallech cyfieithu cynulliad i mewn i'r cod y gall peiriannau ddeall hefyd. Felly, mae un cam sy'n weddill yn llunio, sy'n cael ei gysylltu. Cysylltu cyfuno criw o ffeiliau gwrthrych i mewn i un ffeil fawr eich bod yn gallu mewn gwirionedd yn gweithredu. Cysylltu iawn system ddibynnol. Felly, y ffordd hawsaf i gael Clang i ychydig cysylltu gwrthrych ffeiliau gyda'i gilydd yw galw Clang ar yr holl ffeiliau yr ydych am gysylltu â'i gilydd. Os byddwch yn nodi. Ffeiliau o, yna ni fydd angen i ailbrosesu, lunio, a chydosod eich holl cod ffynhonnell. Gadewch i ni taflu swyddogaeth mathemateg yn ein ffeil, felly mae gennym rhywbeth i gysylltu i mewn Nawr gadewch i ni llunio yn ôl i lawr i cod gwrthrych a alw Clang arno. Wps. Ers i ni yn cynnwys swyddogaeth mathemateg, mae angen i ni gysylltu y llyfrgell math â-lm. Os ydym eisiau cysylltu â'i gilydd criw o. Ffeiliau o ein bod yn Ysgrifennodd ar ein pen ein hunain, byddem dim ond nodi i gyd ar y llinell orchymyn. Mae'r cyfyngiad yw bod un yn unig o'r ffeiliau hyn rhaid i mewn gwirionedd yn nodi prif swyddogaeth, neu arall y Ni fyddai gweithredadwy o ganlyniad yn gwybod ble i ddechrau rhedeg eich cod. Beth yw'r gwahaniaeth rhwng pennu ffeil i gysylltu â-l, a dim ond pennu ffeil yn uniongyrchol? Dim byd. Mae'n dim ond bod Clang digwydd i wybod ffeil yn union beth rhywbeth tebyg yn digwydd lm i gyfeirio atynt. Os ydych yn gwybod y ffeil eich hun, gallech nodi ei yn benodol. Ond cofiwch fod pob-l faneri rhaid i ddod ar y diwedd eich galw gan gleientiaid. A dyna i gyd yna iddo. Pan fyddwch yn unig yn rhedeg Clang ar rai ffeiliau, mae hyn yn beth mae'n ei wneud mewn gwirionedd. Fy enw i yw Rob Bowden, ac mae hyn yn CS50.