Kompilasi dan interpretasi
| English | Bahasa Indonesia |
|---|---|
| compiler/kəmˈpaɪlə/ | compiler |
| interpreter/ɪnˈtɜːprɪtə/ | interpreter |
| lexical analysis/ˈleksɪkl əˈnæləsɪs/ | analisis leksikal |
| tokens/ˈtəʊkənz/ | token |
| syntax analysis/ˈsɪntæks əˈnæləsɪs/ | analisis sintaks |
| abstract syntax tree/ˈæbstrækt ˈsɪntæks triː/ | pohon sintaks abstrak |
| syntax error/ˈsɪntæks ˈerə/ | kesalahan sintaksis |
| semantic analysis/səˈmæntɪk əˈnæləsɪs/ | analisis semantik |
| code generation/kəʊd ˌdʒenəˈreɪʃn/ | pembuatan kode |
| code optimisation/kəʊd ˌɒptɪmaɪˈzeɪʃn/ | optimisasi kode |
Kesalahan yang menelan sebuah pesawat luar angkasa, ditemukan oleh koma
- Mariner 1 NASA hancur 293 detik setelah peluncuran pada tahun 1962. Kegagalan ini sering disalahkan pada satu karakter salah dalam perangkat lunak panduan.
- Cerita ini diceritakan begitu sering karena itu adalah ketakutan yang diketahui setiap programmer: sebuah kompiler dengan senang hati menerjemahkan program yang mengatakan sesuatu yang tidak Anda maksud.
- Sebuah kompiler bukan satu proses tetapi lima, dan masing-masing menangkap kelas kesalahan yang berbeda. Mengetahui tahap mana menangkap apa memberi tahu Anda dari mana kesalahan tertentu berasal.
- Pelajaran ini adalah bagaimana interpreter menjalankan program tanpa menghasilkan apa pun, dan lima tahap yang dilalui kompiler.
Bagaimana interpreter menjalankan program
- Interpreter menerjemahkan dan menjalankan sumber pada waktu yang sama, satu pernyataan per satu.
- Untuk setiap pernyataan, ia membaca baris, menganalisisnya, memeriksa tipe, lalu menjalankan tindakan segera, dan berpindah ke berikutnya.
- Ia tidak menghasilkan file eksekusi: terjemahan hanya ada di memori dan dibuang. Itu adalah poin pasti kurikulum, bahwa ia dapat menjalankan program tanpa menghasilkan versi terjemahan.
- Ia melaporkan kesalahan saat mencapai baris yang bermasalah dan biasanya berhenti, yang memberikan umpan balik cepat selama pengembangan. Setiap pemrosesan menerjemahkan ulang, sehingga lebih lambat, dan baik sumber maupun interpreter harus hadir.

Terjemahkan sekali dan simpan, atau terjemahkan dan jalankan lalu lupakan
Sebuah interpreter:
Ia bekerja baris demi baris, melaporkan error saat menemukannya; tidak ada yang disimpan sebagai file eksekusi, dan umumnya lebih lambat.
Interpreter dapat menjalankan program tanpa menghasilkan versi terjemahannya.
Terjemahan hanya ada di memori, pernyataan demi pernyataan, dan dibuang. Itulah sebabnya interpreter harus hadir setiap kali program dijalankan.
Tahap 1: analisis leksikal
- Analisis leksikal mengelompokkan karakter individu dari sumber menjadi token: kata kunci, pengenal, operator, dan literal.
- Spasi putih dan komentar dibuang, karena tidak memiliki makna bagi kompiler, dan pengenal dimasukkan ke dalam tabel simbol.
- Jadi
total ← count * 2menjadi urutan token pengenal, penugasan, pengenal, operator, literal. Pengekstrak token tidak tahu atau peduli apakah itu masuk akal.
Analisis leksikal (lexer) mengubah:
Lexer mengelompokkan karakter menjadi token dan membuang spasi putih/komentar; parsing kemudian membangun pohon.
Analisis leksikal mengelompokkan karakter sumber menjadi ____ dan membuang spasi putih serta komentar.
Kata kunci, pengenal, operator, dan literal. Lexer tidak membuat penilaian apakah urutan tersebut merupakan program yang valid.
Tahap 2: analisis sintaksis
- Analisis sintaksis, atau parsing, memeriksa apakah urutan token sesuai dengan tata bahasa bahasa tersebut, dan membangun pohon sintaks abstrak yang merepresentasikan struktur.
- Kurung kurawal yang hilang,
ENDIFyang hilang, atau kata kunci di tempat yang salah ditangkap di sini: itulah yang disebut kesalahan sintaksis, dan itulah sebabnya kompiler dapat melaporkannya tanpa pernah menjalankan program.

Tata bahasa yang dicek oleh parser
Tahap 3: analisis semantik
- Analisis semantik memeriksa apakah program yang valid secara sintaksis benar-benar masuk akal: setiap variabel dideklarasikan sebelum digunakan, tipe di kedua sisi penugasan kompatibel, fungsi dipanggil dengan jumlah argumen yang benar.
total ← "seven" * 2adalah sintaksis yang sangat baik dan omong kosong total. Hanya tahap ini yang menangkapnya.- Ini adalah perbedaan yang diuji dalam ujian: sintaksis adalah bentuk, semantik adalah makna.
Manakah dari berikut ini yang dicek oleh analisis semantik alih-alih analisis sintaks?
Kurung adalah tata bahasa, jadi sintaks; spasi putih adalah lexer; register adalah pembuatan kode. Deklarasi dan tipe adalah makna.
Tahap 4 dan 5: generasi kode dan optimisasi
- Generasi kode menjelajahi pohon dan mengeluarkan kode mesin target, memilih register dan menyusun data.
- Optimisasi kode meningkatkan kode tersebut tanpa mengubah apa yang dilakukan: menghilangkan pekerjaan redundan, menghitung ekspresi konstan pada waktu kompilasi, dan mengurutkan ulang instruksi agar sesuai dengan pipeline.
- Outputnya adalah program eksekusi mandiri yang berjalan tanpa kehadiran kompiler.

Lima tahap, dan masing-masing menangkap sesuatu yang sebelumnya tidak bisa
Fase-fase kompilasi
Ikuti langkah-langkah yang dilakukan compiler pada sumber Anda. Setiap fase menyerahkan outputnya ke fase berikutnya — karakter menjadi token, token menjadi pohon, pohon menjadi kode mesin yang dioptimalkan.
Cocokkan setiap fase compiler dengan tugasnya.
Setiap fase mengubah program satu langkah lebih jauh: token, lalu pohon, lalu diperiksa, lalu kode yang dioptimalkan.
Urutkan tahap-tahap compiler.
Leksikal → sintaks → semantik → pembuatan kode → optimisasi.
Optimisasi kode bertujuan untuk:
Optimisasi meningkatkan kode yang dihasilkan (lipatan konstanta, menghilangkan redundansi, pengurisan ulang untuk pipeline).
Contoh kerja: tahap mana menangkap kesalahan mana
x ← 5 +: token tidak sesuai tata bahasa, operator tanpa operand kanan, jadi analisis sintaksis.x ← y + 1di manaytidak pernah dideklarasikan: bentuknya bagus tetapi maknanya tidak, jadi analisis semantik.IF a > b THEN OUTPUT atanpaENDIF: analisis sintaksis lagi.- Program yang berjalan dan mencetak rata-rata yang salah: tidak ada tahap yang menangkapnya. Itu adalah kesalahan logika, dan hanya pengujian yang menemukannya. Sebutkan tahap dan mengapa tahap sebelumnya membiarkannya lolos.
Cocokkan setiap baris yang salah dengan tahap compiler yang men tangkapnya.
Sintaks adalah bentuk, semantik adalah makna, dan kesalahan logika valid dalam keduanya tetapi salah dalam niat.
Contoh kerja: bandingkan dua penterjemah
- Berikan dua perbedaan antara cara kompiler dan interpreter menangani program. [4]
- Kompiler menerjemahkan seluruh program sebelum dijalankan dan menghasilkan program eksekusi, yang kemudian berjalan tanpa kompiler; interpreter menerjemahkan dan mengeksekusi satu pernyataan pada satu waktu dan menghasilkan tidak ada program eksekusi, sehingga interpreter harus hadir setiap kali dijalankan.
- Kompiler melaporkan semua kesalahan bersama-sama setelah terjemahan; interpreter melaporkan kesalahan pertama saat mencapai baris tersebut dan kemudian berhenti.
- Setiap nilai adalah pasangan: katakan apa yang dilakukan satu dan apa yang dilakukan yang lain sebagai gantinya.
⟦⟧ Nilai yang sering terlewat
- Interpreter menghasilkan tidak ada versi terjemahan. Itu adalah frasa yang digunakan kurikulum dan nilai yang diberikan.
- Pengekstrak token menghasilkan token dan membuang spasi putih serta komentar; ia tidak memeriksa apakah program tersebut valid.
- Sintaksis adalah bentuk, semantik adalah makna. Variabel yang tidak dideklarasikan adalah kesalahan semantik, bukan kesalahan sintaksis.
- Optimisasi tidak boleh mengubah apa yang dilakukan program, hanya seberapa cepat atau ringkas program itu melakukannya.
Anda telah memahaminya
- Interpreter menerjemahkan dan mengeksekusi satu pernyataan pada satu waktu, menghasilkan tidak ada program eksekusi, melaporkan kesalahan pertama di barisnya, dan menerjemahkan ulang pada setiap pemrosesan
- analisis leksikal menghasilkan token dan mengabaikan spasi serta komentar; analisis sintaks memeriksa tata bahasa dan membangun pohon sintaks abstrak, menangkap kesalahan sintaks
- analisis semantik memeriksa makna: deklaratif, tipe, jumlah argumen
- pembuatan kode menghasilkan kode mesin dan optimisasi meningkatkan kodenya tanpa mengubah perilaku, memberikan executable mandiri