[Powered by Google Translate] ROB Bowden: pričajmo o prevodiocima. Do ove točke, upravo ste upisali svoj izvorni kod u neke datoteke, poslao ih kroz ove velike crne kutije koja je Jeka, i iz pitanju vaš izvršnu datoteku koja ne radi točno ono što je napisao u svom izvornom kodu. Kao čaroban kao da je bilo, idemo uzeti bliže pogled na ono što se zapravo događa kad smo sastaviti datoteku. Dakle, što to znači da sastavi nešto? Pa, u najopćenitijem smislu, to samo znači pretvarajući kod napisan u jednom programskom jeziku u drugi. No, obično kada ljudi kažu da sastaviti nešto, oni Znaci oni ga uzimati s više razine programiranja jezik na nižoj razini programskog jezika. To se može činiti kao vrlo subjektivnim uvjetima. Na primjer, vjerojatno ne razmišljaju o C kao visoka Razina programski jezik, ali ne ga sastaviti. No, to je sve relativna. Kao što ćemo vidjeti, montaža broj i na kraju stroj kod koji smo sastaviti dolje to je nedvojbeno niža razina nego C. Iako ćemo biti koristeći zveka u današnjem demonstracije, puno ideja ovdje prenijeti na drugim prevodiocima. Za zveka, postoje četiri glavna koraka u ukupnom kompilacija. To su jedan, predobradba učinio preprocesora; dva, Kompilacija učinio prevodilac, tri, montaže obavlja asembler, i četiri, povezivanje obavlja spojnici. To može biti zbunjujuće da je jedan od substeps ukupnog Jek prevoditelji zove prevodilac, ali ćemo doći do toga. Mi ćemo se pomoću jednostavnog Hello World program kao naš primjer tijekom ovog videa. Idemo pogledati. Prvi korak je predobradba. Što preprocesor učiniti? U prilično mnogo svaki C programu ste ikada pročitali ili pisani, Ako ste već koristili linija koda koje počinju s mljeveno meso. Nazvat ću ga mljeveno meso, ali također može nazvati funti, broj potpisati ili oštra. Svaka takva linija je preprocesor direktiva. Vjerojatno ste vidjeli # define i # include prije, ali ima su još nekoliko koji preprocesor prepoznaje. Dodajmo # define našem Hello World primjer. Sada ćemo pokrenuti samo preprocesor na ovu sliku. Do donošenja clage the-E zastavu, naređujete da pokrenete samo preprocesor. Idemo vidjeti što se događa. To izgleda kao jeka samo ispljune sve u zapovjednoj liniji. Da bi spasio sve ove proizvodnje na novu datoteku pod nazivom hello2.c, mi ćemo dodati> hello2.c na našim zapovjedništvom. Sada ćemo pogledati naš preprocessed datoteku. Opa, što se dogodilo s našim kratkom malo programa? Ako idemo skroz na dnu ove datoteke, vidjet ćemo neki kod da mi zapravo napisao. Primjetite da # define je otišao i sve instance ime zamijenjeni su upravo ono što je navedeno u # define linije. Dakle, ono što su svi ti typedefs i funkcije deklaracije na vrhu datoteke? Primjetite da # define nije bio jedini preprocesor direktiva koje smo naveli. Mi također uključuju stdio.h # su. Dakle, sve lude linije su zapravo samo stdio.h kopirati i zalijepiti u vrhu ove datoteke. To je razlog zašto zaglavlje datoteke su tako korisne za funkciju deklaracije. Umjesto potrebe za kopirati i zalijepiti sve funkcije Izjave koje planirate o korištenju na vrhu datoteku, preprocesor će kopirati i zalijepiti ih iz glave datoteku za vas. Sada kada smo učinili predobradba, krećemo na kompilacija. Razlog zovemo ovaj korak kompilaciju je jer je to korak gdje zveka zapravo ne njegovo sastavljanje od C do Skupština broj. Da bi zveka sastaviti datoteku dolje na skupštini, ali nastaviti dalje, to prođe-S zastava u zapovjednoj liniji. Hajdemo pogledati na skupštini datoteku koja je outputted. To izgleda kao prilično drugom jeziku. Skupština code je vrlo specifičan procesor. U ovom slučaju, jer CS50 uređaj radi na virtualni x86 procesora, to je x86 skupština koda. Vrlo malo ljudi pisati izravno u asemblerskom kodu ovih dana, ali svaki C program ćete ikada pisati dobiva pretvorena dolje u skupštini. Opet, mi zovemo ovaj korak sastavljanju C u skupštini budući da ćemo s više razine na nižu razinu programskom jeziku. Što čini sklop nižu razinu nego C? Pa, u skupštini, vrlo smo ograničeni u onome što možemo učiniti. Nema ako je, dok je, za to, ili petlje bilo koje vrste. Ali možete ostvariti iste stvari koje ti kontrola strukture nude pomoću ograničene operacije koje Skupština ne daju. No, samo da vidim kako niska razina montaža stvarno, ajmo jedan korak dalje u našem izračunu, montaže. To je monter posao transformirati sklopa kod u objekt ili strojni kod. Sjetite se da je monter ne izlazni sklop; umjesto toga, on uzima u skupštini i izlaza strojnom kodu. Stroj kod je stvarna 1 i 0 je da CPU može razumjeti, iako još uvijek imamo jedan maleni malo posla lijevo prije nego što možemo pokrenuti naš program. Ajmo okupiti naše proizvodne kod prolazeći Jeka-c zastava. Sada ćemo vidjeti što je u okupljenom datoteku. Pa, to nam ne pomaže mnogo. Sjetite se da je stroj kod one i nula da vaše računalo može razumjeti. To ne znači da je lako za nas da shvatimo. Dakle, točno kako niska razina je montaža? To je gotovo identičan objektnom kodu. Ide od okupljanja na objektnom kodu je mnogo više od prevođenje od transformacije, što je razlog zašto nitko ne može uzeti u obzir da monter učiniti bilo stvarni sastavljanja. U stvari, to je prilično jednostavan za ručno prevesti s Skupština na strojnom kodu. Gledajući na skupštini za glavne funkcije, da prva linija dogodi da odgovaraju heksadecimalni 0x55. U binarnom, to je 1.010.101. Druga linija dogodi da odgovaraju heksadecimalni 0x895. I pored, 0x56. S obzirom na relativno jednostavan stol, što bi moglo prevesti Skupština u kodu da strojevi mogu shvatiti previše. Dakle, postoji jedan preostali korak u kompilacija, koja povezuje. Povezivanje kombinira hrpa objekta datoteka u jednu veliku datoteku da zapravo možete izvršiti. Povezivanje je vrlo ovisi o sustavu. Dakle, najlakši način da dobijete zveka samo povezati objekt slika zajedno je nazvati zveka na sve datoteke koje želite povezati. Ako ste naveli. Salbunj datoteke, onda to neće trebati preobraditi, sastaviti, i skupite sve svoje izvornog koda. Ajmo baciti matematičke funkcije u našoj datoteci, tako da imamo nešto povezati u. Sada ćemo ga sastaviti natrag dolje na objektnom kodu i nazovite zveka na njega. Ups. Budući da smo uključeni matematičke funkcije, moramo povezati u matematike knjižnica s-lm. Ako želimo povezati hrpu. O datoteke koje smo napisao na naš vlastiti, moramo samo bih navesti ih sve na naredbenog retka. Ograničenje je da samo jedan od tih datoteka mora zapravo odrediti glavnu funkciju, ili pak rezultiralo izvršnu ne bi znao gdje početi trčanje svoj kôd. Koja je razlika između navodeći datoteku povezati u s-l, a samo određivanjem datoteku izravno? Ništa. To je samo da zveka se događa da znam točno što datoteku nešto poput-lm dogodi da se odnosi na. Ako je znao tu datoteku sebe, da bi mogao odrediti eksplicitno. Dovoljno je sjetiti da su svi l zastave moraju doći na kraju vašeg klijenta potražnje. I to je sve što je na njega. Kada samo pokrenuti zveka na nekim datotekama, to je ono što je zapravo radi. Moje ime je Rob Bowden, a ovo je CS50.