Tahapan Kompiler dengan Contoh: Proses & Langkah Kompilasi

Apa Saja Fase Desain Kompiler?

Penyusun beroperasi dalam berbagai fase, setiap fase mengubah program sumber dari satu representasi ke representasi lainnya. Setiap fase mengambil masukan dari tahap sebelumnya dan meneruskan keluarannya ke fase kompiler berikutnya.
Ada 6 fase dalam kompiler. Masing-masing fase ini membantu dalam mengubah bahasa tingkat tinggi menjadi kode mesin. Fase-fase kompiler adalah:

  1. Analisis leksikal
  2. Analisis sintaksis
  3. Analisis semantik
  4. Generator kode perantara
  5. Pengoptimal kode
  6. Generator kode
Fase Kompiler
Fase Kompiler

Semua fase ini mengubah kode sumber dengan membaginya menjadi token, membuat pohon parse, dan mengoptimalkan kode sumber melalui fase yang berbeda.

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 tersebut menjadi token.
Di sini, aliran karakter dari program sumber dikelompokkan dalam urutan yang bermakna dengan mengidentifikasi tokennya. Itu membuat masuknya tiket yang sesuai ke dalam tabel simbol dan meneruskan token itu ke fase berikutnya.
Fungsi utama fase ini adalah:

  • Identifikasi unit leksikal dalam kode sumber
  • Klasifikasikan unit leksikal ke dalam kelas seperti konstanta, kata khusus, dan masukkan ke dalam tabel berbeda. Ini akan Mengabaikan komentar di program sumber
  • Identifikasi token yang bukan merupakan bagian dari bahasa

Example:
x = kamu + 10

Token

X identifier
= Operator penugasan
Y identifier
+ Operator tambahan
10 Jumlah

Fase 2: Analisis Sintaks

Analisis sintaksis adalah tentang menemukan struktur dalam kode. 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 pemrogram sudah benar atau belum.
Analisis sintaksis didasarkan pada aturan berdasarkan bahasa pemrograman tertentu dengan membangun pohon parse dengan bantuan token. Hal ini juga menentukan struktur bahasa sumber dan tata bahasa atau sintaksis bahasa tersebut.
Berikut adalah daftar tugas yang dilakukan dalam fase ini:

  • Dapatkan token dari penganalisis leksikal
  • Memeriksa apakah ekspresi tersebut benar secara sintaksis atau tidak
  • Laporkan semua kesalahan sintaksis
  • Membangun struktur hierarki yang dikenal sebagai pohon parse

Example

Pengidentifikasi/nomor apa pun adalah ekspresi
Jika x adalah pengenal dan y+10 adalah ekspresi, maka x= y+10 adalah pernyataan.
Pertimbangkan pohon parse untuk contoh berikut

(a+b)*c

Contoh Analisis Sintaks

Di Pohon Parse

  • Node interior: rekam dengan operator yang diajukan dan dua file untuk anak-anak
  • Daun: catatan dengan 2/lebih bidang; satu untuk token dan informasi lain tentang token
  • Pastikan bahwa komponen-komponen program cocok satu sama lain 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 ketidakcocokan Tipe, operan yang tidak kompatibel, fungsi yang dipanggil dengan argumen yang tidak tepat, variabel yang tidak dideklarasikan, dll.
Fungsi fase analisis semantik adalah:

  • Membantu Anda menyimpan informasi jenis yang dikumpulkan dan menyimpannya dalam tabel simbol atau pohon sintaksis
  • Memungkinkan Anda melakukan pemeriksaan tipe
  • Dalam kasus ketidakcocokan tipe, di mana tidak ada aturan koreksi tipe yang tepat yang memenuhi operasi yang diinginkan, kesalahan semantik ditampilkan
  • Mengumpulkan informasi tipe dan memeriksa kompatibilitas tipe
  • Memeriksa apakah bahasa sumber mengizinkan operan atau tidak

Example

float x = 20.2;
float y = x*30;

Dalam kode di atas, penganalisis semantik akan mengetik bilangan bulat 30 menjadi float 30.0 sebelum perkalian

Fase 4: Pembuatan Kode Menengah

Setelah fase analisis semantik selesai, kompiler menghasilkan kode perantara untuk mesin target. Ini mewakili program untuk beberapa mesin abstrak.
Kode perantara berada di antara bahasa tingkat tinggi dan bahasa tingkat mesin. Kode perantara ini perlu dibuat sedemikian rupa sehingga memudahkan untuk menerjemahkannya ke dalam kode mesin target.
Fungsi pembuatan Kode Menengah:

  • Itu harus dihasilkan dari representasi semantik dari program sumber
  • Menyimpan nilai yang dihitung selama proses penerjemahan
  • Membantu Anda menerjemahkan kode perantara ke dalam bahasa target
  • Memungkinkan Anda mempertahankan urutan prioritas bahasa sumber
  • Ini memegang jumlah operan instruksi yang benar

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: Optimasi Kode

Tahap selanjutnya adalah optimasi kode atau kode perantara. Fase ini menghilangkan baris kode yang tidak perlu dan mengatur urutan pernyataan untuk mempercepat eksekusi program tanpa membuang sumber daya. Tujuan utama dari fase ini adalah untuk meningkatkan kode perantara untuk menghasilkan kode yang berjalan lebih cepat dan menempati lebih sedikit ruang.
Fungsi utama fase ini adalah:

  • Ini membantu Anda menentukan trade-off antara kecepatan eksekusi dan kompilasi
  • Meningkatkan waktu berjalan dari program target
  • Menghasilkan kode yang disederhanakan masih dalam representasi perantara
  • Menghapus kode yang tidak dapat dijangkau dan membuang 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: Pembuatan Kode

Pembuatan kode adalah fase terakhir dan terakhir dari kompiler. Ia mendapat masukan dari fase pengoptimalan kode dan menghasilkan kode halaman atau kode objek sebagai hasilnya. Tujuan dari fase ini adalah untuk mengalokasikan penyimpanan dan menghasilkan kode mesin yang dapat direlokasi.
Itu juga mengalokasikan lokasi memori untuk variabel. Instruksi dalam kode perantara diubah menjadi instruksi mesin. Fase ini mencakup kode pengoptimalan atau 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 mengambil masukan dan menghasilkan keluaran yang diharapkan.

Example

a = b + 60.0
Mungkin akan diterjemahkan ke register.

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. Komponen ini memudahkan kompiler untuk mencari catatan pengenal dan mengambilnya dengan cepat. Tabel simbol juga membantu Anda untuk manajemen cakupan. Tabel simbol dan pengendali kesalahan berinteraksi dengan semua fase dan pembaruan tabel simbol secara bersamaan.

Penanganan Kesalahan Rutin

Dalam proses desain kompiler, kesalahan dapat terjadi di semua fase yang diberikan di bawah ini:

  • Penganalisis leksikal: Token salah ejaan
  • Penganalisis sintaksis: Tanda kurung tidak ada
  • Generator kode perantara: Operan yang tidak cocok untuk suatu operator
  • Pengoptimal Kode: Ketika pernyataan tidak dapat dijangkau
  • Kode Generator: Ketika memori penuh atau register yang tepat tidak dialokasikan
  • Tabel simbol: Kesalahan beberapa pengidentifikasi yang dideklarasikan

Kesalahan yang paling umum adalah urutan karakter yang tidak valid dalam pemindaian, jenis urutan token yang tidak valid, kesalahan cakupan, dan penguraian dalam analisis semantik.
Kesalahan mungkin terjadi pada salah satu fase di atas. Setelah menemukan kesalahan, tahap perlu menangani kesalahan tersebut untuk melanjutkan proses kompilasi. Kesalahan ini perlu dilaporkan ke penangan kesalahan yang menangani kesalahan tersebut untuk melakukan proses kompilasi. Umumnya kesalahan dilaporkan dalam bentuk pesan.

Kesimpulan

  • Kompiler beroperasi dalam berbagai fase, setiap fase mengubah program sumber dari satu representasi ke representasi lainnya
  • Enam fase desain kompiler 1) Analisis leksikal 2) Analisis sintaksis 3) Analisis semantik 4) Generator kode antara 5) Pengoptimal kode 6) Pengoptimal kode Generator
  • Analisis Leksikal adalah fase pertama ketika kompiler memindai kode sumber
  • Analisis sintaksis adalah tentang menemukan struktur dalam teks
  • Analisis semantik memeriksa konsistensi semantik kode
  • Setelah fase analisis semantik selesai kompiler, buat kode perantara untuk mesin target
  • Fase optimasi kode menghilangkan baris kode yang tidak perlu dan mengatur urutan pernyataan
  • Fase pembuatan kode mendapat masukan dari fase optimasi kode dan menghasilkan kode halaman atau kode objek sebagai hasilnya
  • Tabel simbol berisi catatan untuk setiap pengidentifikasi dengan bidang untuk atribut pengidentifikasi
  • Penanganan kesalahan rutin menangani kesalahan dan melaporkan selama banyak fase