Apa itu Desain Kompiler? Jenis, Alat Konstruksi, Contoh
โก Ringkasan Cerdas
Fase-fase Kompilator menjelaskan enam tahapan yang mengubah kode sumber menjadi kode mesin: analisis leksikal, analisis sintaksis, analisis semantik, pembangkitan kode perantara, optimasi kode, dan pembangkitan kode, yang didukung oleh manajemen tabel simbol dan penanganan kesalahan.
Apa Saja Fase Desain Kompiler?
A Penyusun Compiler beroperasi dalam berbagai fase, dan setiap fase mengubah program sumber dari satu representasi ke representasi lainnya. Setiap fase menerima masukan dari tahap sebelumnya dan memberikan keluarannya ke fase compiler berikutnya. Terdapat 6 fase dalam sebuah compiler. Masing-masing fase ini membantu dalam mengkonversi bahasa tingkat tinggi menjadi kode mesin. Fase-fase compiler adalah:
- Analisis leksikal
- Analisis sintaksis
- Analisis semantik
- Generator kode perantara
- Code pengoptimal
- Code generator
Fase Kompiler
Semua fase ini mengkonversi kode sumber dengan membaginya menjadi token, membuat pohon parse, dan mengoptimalkan kode sumber melalui berbagai fase.
Fase 1: Analisis Leksikal
Analisis Leksikal adalah fase pertama, ketika kompiler memindai kode sumber. Proses ini dapat dilakukan dari kiri ke kanan, karakter demi karakter, dan mengelompokkan karakter-karakter tersebut menjadi token.
Di sini, aliran karakter dari program sumber dikelompokkan dalam urutan yang bermakna dengan mengidentifikasi token. Kemudian, token yang sesuai dimasukkan ke dalam tabel simbol dan token tersebut diteruskan ke fase berikutnya.
Fungsi utama fase ini adalah:
- Mengidentifikasi unit leksikal dalam kode sumber.
- Klasifikasikan unit leksikal ke dalam kelas-kelas seperti konstanta, kata-kata yang dipesan, dan masukkan ke dalam tabel yang berbeda. Kode ini akan mengabaikan komentar dalam program sumber.
- Identifikasi sebuah token yang bukan bagian dari bahasa tersebut.
Contoh: x = kamu + 10
| Token | Tipe |
|---|---|
| X | identifier |
| = | Operator penugasan |
| Y | identifier |
| + | Operator tambahan |
| 10 | Jumlah |
Fase 2: Analisis Sintaks
Analisis sintaksis adalah tentang menemukan struktur dalam kode. Analisis ini menentukan apakah suatu teks mengikuti format yang diharapkan atau tidak. Tujuan utama dari fase ini adalah untuk memastikan apakah kode sumber yang ditulis oleh programmer sudah benar atau belum.
Analisis sintaksis didasarkan pada aturan bahasa pemrograman tertentu dengan membangun pohon parse menggunakan token. Analisis ini juga menentukan struktur bahasa sumber dan tata bahasa atau sintaksis bahasa tersebut.
Berikut adalah daftar tugas yang dilakukan pada fase ini:
- Dapatkan token dari penganalisis leksikal.
- Periksa apakah ekspresi tersebut benar secara sintaksis atau tidak.
- Laporkan semua kesalahan sintaks.
- Bangun struktur hierarkis yang dikenal sebagai pohon parse.
Example
Setiap pengidentifikasi/angka adalah sebuah ekspresi. Jika x adalah pengidentifikasi dan y+10 adalah sebuah ekspresi, maka x = y+10 adalah sebuah pernyataan. Perhatikan pohon parse untuk contoh berikut:
(a+b)*c
Dalam Pohon Parse:
- Node internal: catatan dengan bidang operator dan dua bidang untuk anak-anaknya.
- Daun: catatan dengan 2 bidang atau lebih; โโsatu untuk token dan informasi lain tentang token tersebut.
- Pastikan bahwa komponen-komponen program saling terkait secara bermakna.
- Mengumpulkan informasi tipe dan memeriksa kompatibilitas tipe.
- Operan pemeriksaan diizinkan oleh bahasa sumber.
Fase 3: Analisis Semantik
Analisis semantik memeriksa konsistensi semantik kode. Ia menggunakan pohon sintaksis dari fase sebelumnya bersama dengan tabel simbol untuk memverifikasi bahwa kode sumber yang diberikan konsisten secara semantik. Ini juga memeriksa apakah kode tersebut menyampaikan makna yang tepat.
Semantic Analyzer akan memeriksa ketidaksesuaian tipe, operan yang tidak kompatibel, fungsi yang dipanggil dengan argumen yang tidak tepat, variabel yang belum dideklarasikan, dan lain sebagainya.
Fungsi dari fase analisis semantik adalah:
- Membantu Anda menyimpan informasi tipe yang dikumpulkan dan menyimpannya dalam tabel simbol atau pohon sintaksis.
- Memungkinkan Anda untuk melakukan pengecekan tipe data.
- Dalam kasus ketidaksesuaian tipe, di mana tidak ada aturan koreksi tipe yang tepat yang memenuhi operasi yang diinginkan, maka akan muncul kesalahan semantik.
- Mengumpulkan informasi tipe dan memeriksa kompatibilitas tipe.
- Memeriksa apakah bahasa sumber mengizinkan operand atau tidak.
Example
float x = 20.2; float y = x*30;
Pada kode di atas, penganalisis semantik akan mengkonversi tipe data bilangan bulat 30 menjadi bilangan pecahan 30.0 sebelum perkalian.
Fase 4: Menengah Code Generasi
Setelah fase analisis semantik selesai, kompiler menghasilkan kode perantara untuk mesin target. Kode tersebut mewakili program untuk beberapa nilai absolut.tracmesin t.
Kode perantara berada di antara bahasa tingkat tinggi dan bahasa tingkat mesin. Kode perantara ini perlu dihasilkan sedemikian rupa sehingga mudah diterjemahkan ke dalam kode mesin target.
Fungsi-fungsi Perantara Code generasi:
- Hal itu harus dihasilkan dari representasi semantik program sumber.
- Berisi nilai-nilai yang dihitung selama proses penerjemahan.
- Membantu Anda menerjemahkan kode perantara ke dalam bahasa target.
- Memungkinkan Anda untuk mempertahankan urutan prioritas bahasa sumber.
- Ini memuat jumlah operan yang tepat untuk instruksi tersebut.
Example
Sebagai contoh:
total = count + rate * 5
Kode perantara dengan bantuan metode kode alamat adalah:
t1 := int_to_float(5)
t2 := rate * t1
t3 := count + t2
total := t3
Fase 5: Code Optimization
Fase selanjutnya adalah optimasi kode perantara. Fase ini menghapus baris kode yang tidak perlu dan mengatur urutan pernyataan untuk mempercepat eksekusi program tanpa membuang sumber daya. Tujuan utama fase ini adalah untuk meningkatkan kode perantara guna menghasilkan kode yang berjalan lebih cepat dan membutuhkan lebih sedikit ruang.
Fungsi utama fase ini adalah:
- Ini membantu Anda untuk menetapkan keseimbangan antara kecepatan eksekusi dan kecepatan kompilasi.
- Meningkatkan waktu eksekusi program target.
- Menghasilkan kode yang disederhanakan namun masih dalam representasi perantara.
- Menghapus kode yang tidak dapat dijangkau dan menyingkirkan variabel yang tidak digunakan.
- Menghapus pernyataan yang tidak diubah dari loop.
Contoh: Perhatikan kode berikut:
a = intofloat(10)
b = c * a
d = e + b
f = d
Bisa menjadi:
b = c * 10.0
f = e + b
Fase 6: Code Generasi
Code Generasi adalah fase terakhir dan final dari sebuah kompiler. Fase ini menerima masukan dari fase optimasi kode dan menghasilkan kode halaman atau kode objek sebagai hasilnya. Tujuan dari fase ini adalah untuk mengalokasikan penyimpanan dan menghasilkan kode mesin yang dapat dipindahkan.
Selain itu, proses ini juga mengalokasikan lokasi memori untuk variabel. Instruksi dalam kode perantara dikonversi menjadi instruksi mesin. Fase ini mengkonversi kode yang dioptimalkan atau kode perantara ke dalam bahasa target.
Bahasa targetnya adalah kode mesin. Oleh karena itu, semua lokasi memori dan register juga dipilih dan dialokasikan selama fase ini. Kode yang dihasilkan oleh fase ini dieksekusi untuk menerima input dan menghasilkan output yang diharapkan.
Example
a = b + 60.0 mungkin dapat diterjemahkan ke dalam register sebagai:
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Manajemen Tabel Simbol
Tabel simbol berisi catatan untuk setiap pengidentifikasi dengan bidang untuk atribut pengidentifikasi tersebut. Komponen ini memudahkan kompiler untuk mencari catatan pengidentifikasi dan mengambilnya dengan cepat. Tabel simbol juga membantu Anda dalam manajemen cakupan. Tabel simbol dan penanganan kesalahan berinteraksi dengan semua fase, dan tabel simbol diperbarui sesuai dengan interaksi tersebut.
Penanganan Kesalahan Rutin
Dalam proses desain kompiler, kesalahan dapat terjadi di semua fase yang disebutkan di bawah ini:
- Penganalisis leksikal: Token yang salah eja.
- Penganalisis sintaksis: Tanda kurung hilang.
- Generator kode perantara: Operan yang tidak cocok untuk suatu operator.
- Code Pengoptimal: Ketika pernyataan tersebut tidak dapat dijangkau.
- Code Generator: Ketika memori penuh atau register yang tepat tidak dialokasikan.
- Tabel simbol: Kesalahan karena beberapa pengidentifikasi dideklarasikan.
Kesalahan yang paling umum adalah urutan karakter yang tidak valid dalam pemindaian, urutan token yang tidak valid dalam tipe, kesalahan cakupan, dan penguraian dalam analisis semantik.
Kesalahan dapat terjadi di salah satu fase di atas. Setelah menemukan kesalahan, fase tersebut perlu menangani kesalahan untuk melanjutkan proses kompilasi. Kesalahan ini perlu dilaporkan ke penangan kesalahan, yang menangani kesalahan untuk melakukan proses kompilasi. Umumnya, kesalahan dilaporkan dalam bentuk pesan.



