Tahapan Kompiler Beserta Contoh, Proses & Langkah-langkahnya

โšก Ringkasan Cerdas

Fase-fase Kompiler menjelaskan bagaimana kompiler mengubah kode sumber menjadi kode mesin melalui enam tahap: analisis leksikal, analisis sintaksis, analisis semantik, pembangkitan kode perantara, optimasi kode, dan pembangkitan kode, yang didukung oleh manajemen tabel simbol dan penanganan kesalahan di seluruh proses.

  • ๐Ÿ”ค Analisis Leksikal: Fase pertama memindai kode sumber dan mengelompokkan karakter ke dalam token, mengisi tabel simbol.
  • ๐ŸŒณ Analisis Sintaks: Token diperiksa berdasarkan aturan tata bahasa dan disusun menjadi pohon parse.
  • โœ… Analisis semantik: Kompiler memverifikasi kompatibilitas dan makna tipe menggunakan pohon sintaks dan tabel simbol.
  • ๐Ÿ” Menengah Code: Representasi yang tidak bergantung pada mesin, seperti kode tiga alamat, dihasilkan untuk memudahkan penerjemahan.
  • โšก Optimasi: Kode yang berlebihan dan tidak dapat dijangkau dihilangkan untuk membuat program lebih cepat dan lebih kecil.
  • ๏ธ Code Generasi: Fase terakhir mengubah kode yang telah dioptimalkan menjadi kode mesin target, mengalokasikan register dan memori.

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. Code pengoptimal
  6. Code generator
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: 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 dibuat sedemikian rupa sehingga memudahkan untuk menerjemahkannya ke dalam kode mesin target.
Fungsi pada Tingkat Menengah Code generasi:

  • 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: Code Optimization

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: 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.
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
  • Code Pengoptimal: Ketika pernyataan tersebut tidak dapat dijangkau
  • Code 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.

Pertanyaan Umum Demo Slot

Fase analisis (bagian depan) memecah kode sumber melalui analisis leksikal, sintaksis, dan semantik. Fase sintesis (bagian belakang) membangun program target melalui pembuatan kode perantara, optimasi, dan pembuatan kode.

Compiler menerjemahkan seluruh program sumber ke dalam kode mesin sebelum menjalankannya. Interpreter menerjemahkan dan mengeksekusi kode baris demi baris, yang lebih mudah untuk di-debug tetapi biasanya lebih lambat saat dijalankan.

Kode tiga alamat adalah representasi perantara di mana setiap instruksi memiliki paling banyak tiga operan, seperti t1 = a + b. Kode ini mudah dioptimalkan dan mudah diterjemahkan ke dalam kode mesin target.

AI dan pembelajaran mesin membantu kompiler modern dalam pengambilan keputusan optimasi yang lebih cerdas, seperti memilih transformasi loop, inlining, dan alokasi register. Mereka memprediksi optimasi mana yang meningkatkan kinerja untuk program dan target tertentu.

Ya. AI dapat menjelaskan setiap fase dengan contoh, tracJelaskan bagaimana sebuah contoh pernyataan berubah dari token menjadi kode mesin, dan jawab pertanyaan lanjutan. Hal ini membuat desain kompiler lebih mudah dipelajari oleh mahasiswa.

Ringkaslah postingan ini dengan: