Tahapan Kompilasi

March 17th, 2014 by wimpy No comments »
Kompilasi adalah sebuah proses untuk mengubah sebuah ‘program’ yang pada dasarnya merupakan bahasa yang dibuat sedemikian rupa sehingga mudah dipahami oleh manusia, menjadi bahasa mesin atau bahasa yang tingkatannya lebih rendah. Kompilasi pada dasarnya bertujuan untuk mempermudah manusia dalam melakukan pembuatan program. Dalam melakukan kompilasi, ada 6 tahapan yang akan dilakukan, yaitu:

Proses1. Analisa Leksikal (Lexical Analysis)

Analisa Leksikal atau biasa juga disebut Scanning merupakan sebuah tahapan mengkonversikan rangkaian kata menjadi sebuah rangkaian token. Di mana token sendiri merupakan sebuah kumpulan string yang dideskripsikan berdasarkan pola tertentu.

Komponen perangkat lunak yang  melakukan analisa leksikal ini biasa disebut Lexical Analyzer, Lexer, Tokenizer, atau Scanner. Biasanya Lexer tidak mengembalikan seluruh rangkaian token sekaligus, namun tergantung dari Parser ( yang melakukan Analisa Sintaks, step selanjutnya ). Lexer biasanya hanya mengembalikan token ketika parser meminta.

2. Analisa Sintaks (Syntax Analysis)

Analisa sintaks biasa juga disebut sebagai Parsing yaitu merupakan proses menganalisa sebuah kalimat atau string menjadi kata per kata dan kemudian menjadi komponen – komponennya masing – masing, menghasilkan sebuah parse tree yang akan memperlihatkan relasi sintaktis satu dengan yang lainnya, yang juga dapat mengandung semantik ataupun informasi lainnya.

Komponen perangkat lunak yang melakukan proses parsing disebut dengan Parser. Parser mengambil input data dan kemudian membangun struktur data yang kemudian melakukan pengecekan, apakah sumber kode yang diberikan memenuhi aturan yang diberikan Context Free Grammar (CFG) atau tidak. Jika memenuhi, maka parser akan membentuk sebuah parse tree dari program, namun jika tidak memenuhi, maka Parser akan mengembalikan pesan error.

Contoh:

CFG:

S -> (S)
S -> S * S
S -> S + S
S -> S = S

Token :

a.  S = S S + S -> Return error

b.  S = S * S + B -> Success

sintaks

3. Analisa Semantik (Semantic Analysis)

Analisa Semantik merupakan fase di mana kompiler menambahkan informasi semantik dalam parse tree yang telah dibuat sebelumnya oleh parser dan membentuk tabel simbol. Fase ini melakukan pengecekan semantik, seperti type checking, object binding, definite assignment, rejecting incorrect programs or issuing warnings. Analisa semantik biasanya membutuhkan parse tree yang lengkap, di mana itu berarti bahwa fase ini secara logika mengikuti fase parsing.

4. Intermediate Code Generating

Intermediate Code adalah kode yang bertipe Machine independent atau tidak bergantung pada mesin, dengan kata lain sebuah kode universal yang sama di manapun mesin yang kita gunakan. Compiler selalu men-generate code menjadi independent terlebih dahulu sebelum nantinya digenerate ke bahasa mesin yang lebih spesifik, berbeda antara satu dengan yang lainnya bergantung pada mesin. Namun intermediate code ini sudah cukup dekat dengan bahasa mesin, tidak sejauh bahasa tingkat tinggi yang biasa kita gunakan (C, C++, Java, dll). Berbagai bahasa dapat digunakan dalam bahasa penengah ini, dan perancang compiler lah yang menentukan bahasa penengah ini.

5. Code Optimization

Optimasi kode merupakan kegiatan melakukan perubahan terhadap sistem untuk memastikan kerja sistem lebih efisien atau menggunakan sumber daya seminimal mungkin, atau bisa juga supaya lebih responsif terhadap UI / antarmuka pengguna. Menghindari kualitas buruk dari code juga dapat meningkatkan performa, dan mempermudah dalam melakukan maintenance, beberapa compiler juga lebih cepat dengan code yang lebih simpel.

6. Code Generating

Code Generator melakukan code generating dengan menggunakan representasi kode program dalam bahasa penengah (intermediate code) yang digenerate di front-end, dengan informasi yang didapatkan dari tabel simbol. Kode output harus benar dan memiliki kualitas yang baik, yang mana harus menggunakan resource mesin dengan efektif dan efisien.

Kode output bisa mengambil salah satu dari 3 bentuk, yaitu:
  • Absolute Machine Language
    Memiliki Keunggulan yaitu dapat ditempatkan di lokasi yang tetap pada memori, dan dapat dieksekusi secara langsung. Program- program kecil dapat dicompile dan dieksekusi sangat cepat, sehingga sangat baik untuk beberapa program yang sifatnya penting.
  • Relocatable Machine Language
    Program yang merupakan Relocatable Machine Language (Object Module) adalah sub program yang dapat di compile secara terpisah. Satu set relocatabe object modules dapat dihubungkan bersama dan diambil dengan cara menghubungkan loader untuk dieksekusi. Dengan sedikit tambahan effort untuk menghubungkan dan loading ini, membuat bahasa ini sedikit lebih memakan waktu, namun kita dapat memiliki lebih banyak fleksibilitas karena dapat mencompile method secara terpisah.
  • Assembly Language
    Program dengan bahasa Assembly sangat mempermudah dalam proses generate code. Kita dapat men-generate instruksi simbolik dan menggunakan keunggulan berupa makro bawaan dari bahasa assembly untuk melakukan generate. Namun kita cukup sulit mengeksekusi pekerjaan yang cukup kompleks dengan menggunakan bahasa assembly.

Contoh:

cth1
cth2
Source : www.binus.ac.id