Definisi dan Tujuan Kompiler
Sebuah compiler adalah program yang yang menerjemahkan manusia-dibaca kode sumber ke dalam komputer-eksekusi kode mesin. Agar berhasil, kode yang dapat dibaca manusia harus mematuhi aturan sintaksis dari bahasa pemrograman mana pun yang ditulis. Kompiler hanya sebuah program dan tidak dapat memperbaiki kode Anda untuk Anda. Jika Anda membuat kesalahan, Anda harus memperbaiki sintaksnya atau itu tidak akan dikompilasi.
Apa yang Terjadi Ketika Anda Menyusun Kode?
Kompleksitas kompiler tergantung pada sintaks bahasa dan seberapa banyak abstraksi yang disediakan oleh bahasa pemrograman . Kompiler AC jauh lebih sederhana daripada kompiler untuk C ++ atau C #.
Analisis Leksikal
Saat mengkompilasi, kompiler pertama kali membaca aliran karakter dari file kode sumber dan menghasilkan aliran token leksikal. Misalnya, kode C ++:
mungkin dianalisis sebagai token ini:
- ketik "int"
- variabel "C"
- sama dengan
- braket kiri
- variabel "A"
- waktu
- variabel "B"
- braket kanan
- plus
- literal "10"
Analisis Sintaksis
Output leksikal pergi ke bagian penganalisis sintaksis dari kompiler, yang menggunakan aturan tata bahasa untuk memutuskan apakah input tersebut valid atau tidak. Kecuali variabel A dan B dideklarasikan sebelumnya dan dalam ruang lingkup, kompiler mungkin mengatakan:
- 'A': pengidentifikasi yang tidak diumumkan.
Jika mereka diumumkan tetapi tidak diinisialisasi. kompiler mengeluarkan peringatan:
- variabel lokal 'A' digunakan tanpa diinisialisasi.
Anda tidak boleh mengabaikan peringatan kompiler. Mereka dapat memecahkan kode Anda dengan cara yang aneh dan tidak terduga. Selalu perbaiki peringatan kompiler.
Satu Pas atau Dua?
Beberapa bahasa pemrograman ditulis sehingga kompiler dapat membaca kode sumber hanya sekali dan menghasilkan kode mesin. Pascal adalah salah satu bahasa tersebut. Banyak kompiler membutuhkan setidaknya dua lintasan. Terkadang, ini karena deklarasi fungsi atau kelas yang diteruskan .
Dalam C ++, sebuah kelas dapat dideklarasikan tetapi tidak didefinisikan sampai nanti. Kompiler tidak dapat menghitung berapa banyak memori yang dibutuhkan kelas hingga ia mengkompilasi tubuh kelas. Itu harus membaca ulang kode sumber sebelum menghasilkan kode mesin yang benar.
Membuat Kode Mesin
Dengan asumsi bahwa kompiler berhasil menyelesaikan analisis leksikal dan sintaksis, tahap terakhir adalah menghasilkan kode mesin. Ini adalah proses yang rumit, terutama dengan CPU modern.
Kecepatan kode yang dapat dieksekusi yang dikompilasi harus secepat mungkin dan dapat sangat bervariasi sesuai dengan kualitas kode yang dihasilkan dan berapa banyak optimasi yang diminta.
Sebagian besar kompiler memungkinkan Anda menentukan jumlah optimasi — biasanya dikenal untuk kompilasi debugging cepat dan optimisasi penuh untuk kode yang dirilis.
Code Generation Is Challenging
Penulis kompiler menghadapi tantangan saat menulis generator kode. Banyak prosesor mempercepat pemrosesan dengan menggunakan
- Instruksi pipelining
- Cache internal .
Jika semua instruksi dalam satu loop kode dapat disimpan dalam cache CPU , maka loop itu berjalan lebih cepat daripada ketika CPU harus mengambil instruksi dari RAM utama. Cache CPU adalah blok memori yang dibangun ke dalam chip CPU yang diakses lebih cepat daripada data dalam RAM utama.
Caches and Queues
Sebagian besar CPU memiliki antrian pra-pengambilan di mana CPU membaca instruksi ke dalam cache sebelum menjalankannya. Jika cabang bersyarat terjadi, CPU harus memuat ulang antrian. Kode harus dibuat untuk meminimalkan ini.
Banyak CPU memiliki bagian terpisah untuk:
- Hitung bilangan bulat (bilangan bulat)
- Aritmatika titik mengambang (angka pecahan)
Operasi ini sering dapat berjalan secara paralel untuk meningkatkan kecepatan.
Compiler biasanya menghasilkan kode mesin ke file objek yang kemudian dihubungkan bersama oleh program linker.