- Binabago ng pag-compile ang source code sa executable machine code.
- Ang isang compiler ay nagsasagawa ng lexical, syntactic at semantic analysis.
- Mayroong AOT, JIT, cross compiler at transpiler.
- Ang pinagsama-samang code ay mas mabilis kaysa sa na-interpret na code.
Kung nakapasok ka na sa mundo ng programming, malamang narinig mo na ang termino magtipon. Ang konseptong ito ay mahalaga sa pagbuo ng software, dahil tinutukoy nito ang proseso kung saan ang source code na nakasulat sa isang programming language ay binago sa isang format na maipapatupad ng isang computer.
Ang pag-unawa sa ibig sabihin ng pag-compile at kung paano gumagana ang isang compiler ay mahalaga para sa sinumang programmer na gustong i-optimize ang kanilang code at mas maunawaan kung paano gumagana ang mga programming language. Sa ibaba ay ipinapaliwanag namin nang detalyado kung ano ang kasama sa prosesong ito, ang mga uri ng mga compiler na umiiral, at ang mga pangunahing pagkakaiba sa pagitan ng pinagsama-sama at na-interpret na code.
Ano ang pag-iipon?
Ang pagsasama-sama ay ang proseso ng pagsasalin ng source code mula sa isang mataas na antas ng wika (tulad ng C++, Java, o Rust) hanggang sa binary code o machine code, na maaaring direktang isagawa ng processor ng computer.
Ang source code ay nakasulat sa isang wika na nababasa at nauunawaan ng mga tao, ngunit ang mga computer ay maaari lamang mag-interpret ng binary code. Samakatuwid, isang tiyak na programa na tinatawag na tagatala, na nagsasagawa ng conversion ng source code sa executable code. Kung gusto mong linawin ang paksang ito, maaari mong konsultahin ang aming gabay sa Mga konsepto at pagkakaiba sa pagitan ng mga compiler at interpreter.
Ano ang isang compiler at paano ito gumagana?
Un tagatala Ito ay isang programa na dalubhasa sa pagbabago ng source code sa object o executable code. Ang proseso ng conversion na ito ay binubuo ng ilang mga yugto:
1. Preprocessing
Bago ang compilation, ang source code ay dumaan sa isang preprocessing phase kung saan ang mga macro ay pinalawak, ang mga kinakailangang file ay kasama, at iba pang mga pagbabago ay ginawa bago bumuo ng code na aktwal na pinagsama-sama.
2. Leksikal na pagsusuri
Ini-scan ng compiler ang source code at hinahati ito sa token, na kung saan ay ang pinakamaliit na unit ng kahulugan sa programming language, gaya ng mga keyword, identifier, at operator.
3. Sintaktikong pagsusuri
Sa yugtong ito, ang istraktura ng code ay napatunayan na tama ayon sa grammar ng programming language. Kung may mga error sa syntax, makikita ng compiler ang mga ito at sasabihin sa programmer kung nasaan sila upang maitama ang mga ito.
4. Pagsusuri ng semantiko
Sinusuri ng compiler na ang mga operasyon at expression sa code ay may lohikal na kahulugan. Dito nasusuri na ang mga variable at ang mga function ay mahusay na tinukoy at wastong mga operasyon ay ginanap. Ito ay mahalaga upang matiyak na ang iyong code ay nag-compile nang walang mga problema.
5. Intermediate code generation
Pagkatapos suriin ang syntax at semantics ng code, ang compiler ay bumubuo ng a intermediate code, isang pinasimpleng representasyon na maaaring i-optimize bago ang huling pagsasalin sa machine code.
6. Pag-optimize ng code
Sa yugtong ito, pinapabuti ng compiler ang nabuong code upang gawin itong higit pa episyente at bawasan ang pagkonsumo ng memorya at oras ng pagproseso.
7. Pagbuo ng code ng makina
Sa wakas, ang intermediate code ay na-convert sa mga tagubilin. code ng makina tiyak sa arkitektura ng processor ng computer. Ang bahaging ito ng proseso ay mahalaga upang matiyak na ang programa ay tatakbo nang maayos sa hardware.
8. Pag-uugnay
Ang nabuong object code ay pinagsama sa mga aklatan at iba pang kinakailangang mga module upang makagawa ng panghuling maipapatupad na file. Kawili-wili kung paano pinamamahalaan ang mga aklatang ito, at para dito, maaaring maging kapaki-pakinabang ang isang dalubhasang compiler, tulad ng mga makikita mo sa aming seksyon sa compiler para sa wikang C.
Mga uri ng compiler
Mayroong iba't ibang uri ng mga compiler depende sa kanilang operasyon at layunin:
- AOT (Ahead-Of-Time) compiler: Binubuo nila ang lahat ng code bago ito isagawa. Mga halimbawa: GCC, Clang.
- JIT (Just-In-Time) compiler: Kino-compile nila ang code sa panahon ng pagpapatupad upang mapabuti ang pagganap. Mga halimbawa: JVM para sa Java, V8 para sa JavaScript. Para sa mas malalim na pag-unawa sa ganitong uri, iminumungkahi namin ang aming gabay sa Mga Just-In-Time compiler.
- Mga cross compiler: Bumubuo sila ng executable code para sa isang platform maliban sa pinapatakbo nila. Kung interesado ka, maaari mong basahin ang tungkol sa Mga cross compiler nang detalyado.
- Transpilers: Binabago nila ang code mula sa isang mataas na antas ng wika patungo sa isa pa, gaya ng TypeScript tungo sa JavaScript.
Compiled code vs interpreted code
Ang isa sa mga pangunahing pagkakaiba sa pagpapatupad ng programa ay kung ang code ay pinagsama-sama o binibigyang kahulugan:
- Pinagsama-samang code: Ito ay ganap na isinalin bago tumakbo at kadalasang mas mabilis. Halimbawa: C, C++.
- Na-interpret na code: Isinalin ang linya sa pamamagitan ng linya sa runtime, pinapadali ang portability ngunit binabawasan ang pagganap. Halimbawa: Python, JavaScript.
Halimbawa ng praktikal na compilation
Ipagpalagay na sumulat ka ng isang programa sa C:
#isama int main() { printf("Kumusta, mundo!\n"); bumalik 0; }
Upang i-compile ang code na ito sa GCC sa isang terminal, tatakbo ka:
gcc program.c -o program
Sa buong artikulo, na-explore namin ang proseso ng compilation nang malalim, mula sa kahulugan nito hanggang sa kahalagahan nito sa pagbuo ng software. Bagama't nag-aalok ang mga na-interpret na wika ng flexibility, ang mga pinagsama-samang wika ay kapansin-pansin sa kanilang kahusayan. Ang pag-unawa kung paano gumagana ang isang compiler at ang mga yugto ng proseso ay susi sa pagpapabuti ng aming mga kasanayan bilang mga programmer.