Pengenalan Kompilasi Pertemuan ke Enam 1 Bahasa Pemrograman

Pengenalan Kompilasi Pertemuan ke Enam 1

Bahasa Pemrograman Memungkinkan manusia dan komputer saling berinteraksi dan berkomunikasi. Hirarki atau tingkatan bahasa pemrograman berdasarkan pada peningkatan kebebasan mesin adalah sbb: 1. Bahasa Mesin (machine-level language) 2. Bahasa Rakitan (assembly language) 3. Bahsa tingkat tinggi (high-level language / user oriented language) 4. Bahasa beorientasi masalah (problem oriented language) 2

Translator Digunakan untuk menterjemahkan program sumber menjadi program obyek atau program target. Program sumber dalam bahasa rakitan akan diterjemahkan kedalam bahasa mesin dengan menggunakan Assembler. Suatu translator yang mentransformasikan suatu bahasa tingkat tinggi seperti Pascal, Fortran, Cobol kedalam bahasa mesin komputer atau kedalam bahasa rakitan disebut kompilator atau Compiler. 3

Compiler Program Sumber Data kompilator Program Objek Waktu kompilasi Komputer pelaksana Hasil Waktu eksekusi Interpreter Data Program Sumber Interpreter Hasil 4

Model Kompilator Program Sumber Program Objek ANALISIS Penganalisis Leksikal (Scanner) Penganalisis Sintaks (Parser) SINTESIS Penganalisis Semantik Pembentuk kode Pengoptimal kode Tabel Simbol 5

Pengalisis Leksikal Program sumber merupakan input dari penganalisis leksikal atau scanner. Analisis leksikal mempunyai tujuan untuk memisahkan naskah program sumber yang masuk menjadi bagian leksikografis terkecil atau token seperti misalnya konstanta, nama variabel, kata kunci (spt: Do, If, Then) dan operator. Pada dasarnya tugas scanner adalah melaksanakan analisis sintaks tingkat rendah. Untuk alasan efisiensi, pada tiap kelas token diberikan suatu bilangan yang mewakili harga internalnya, secara unik. Misalnya nama variabel diwakili bilangan 1, konstanta diwakili bilangan 2, label diwakili bilangan 3, operator diwakili bilangan 4, dst. 6

Contoh : If A > B Then X = 5; Statement diatas dapat diubah oleh scanner kedalam tabel token sbb : Token Diwakili Oleh Ket. Jenis Token If 20 Kata kunci A 1 Nama variabel > 13 Operator Logika B 1 Nama variabel Then 20 Kata kunci X 1 Nama variabel = 10 Operator pemberi nilai 5 2 Konstanta ; 21 Tanda baca Selanjutnya scanner mengirimkan token pada Parser berupa potongan item yang terdiri dari alamat token pada tabel dan bilangan yang mewakili token. Hal lain yang harus diperhatikan adalah bahwa scanner harus dapat mengenali adanya blank/spasi dan Remark yang merupakan bagian 7 program yang tidak diproses.

Penganalisis Sintaks Fungsinya adalah menerima program sumber (dalam bentuk barisan token) dari scanner, dan selanjutnya penganalisis sintaks akan menentukan struktur secara keseluruhan dari program sumber. Dalam melakukan analisis sintaks, kita memandang kelompok token sebagai kelas sintaks yang lebih besar, seperti ekspresi, statement dan prosedur. Penganalisis sintaks akan menghasilkan pohon sintaks atau sejenisnya. Sebuah Grammar dapat digunakan oleh penganalisis sintaks untuk menentukan struktur dari program sumber. Proses pengenalan ini disebut Parsing dan karena itu, penganalisis sintaks disebut juga Parser. 8

Contoh: statement (A+B) * (C+D) akan menghasilkan pohon sintaks berdasarkan himpunan produksi sbb : <EKSPRESI> →<EKSPRESI><ASOP><SUKU> | <SUKU> → <SUKU><MDOP><FAKTOR> | <FAKTOR> → (<EKPRESI>) | operand <ASOP> →+|<MDOP> → * | div 9

Pohon sintaks dari statement diatas : <EKSPRESI> <SUKU> <MDOP> <FAKTOR> * <EKSPRESI> <ASOP> <SUKU> + <FAKTOR> A <SUKU> <EKSPRESI> <ASOP> <SUKU> + <FAKTOR> B C D 10

Pengalisis Semantik Dengan menggunakan pohon sintaks yang dihasilkan oleh Parser, penganalisis semantik memberi arti atau semantik dari program sumber. Dari contoh diatas, bila parser menemukan operator +, parser akan memanggil Semantic-Routine yang akan menggolongkan aksi apa yang akan dilakukan. Routine ini juga dapat memeriksa bagian deklarasi dari operand dan type operand. Aksi penganalisis semantik mungkin mengandung bentuk intermediate dari kode sumber, yaitu bentuk lain dari penulisan statement yang lebih dekat kepada logika bahasa mesin atau bahasa rakitan. 11

Untuk ekspresi (A+B)*(C+D), bentuk intermediate kode sumber mungkin berupa kuadrupel sbb : (+, A, B, T 1) (+, C, D, T 2) (*, T 1, T 2, T 3) Bentuk intermediate lain adalah yang disebut notasi Polish, yaitu dengan mengkonversi ekspresi infix menjadi Suffixpolish/Postfix-polish. Contoh : (A+B)*(C+D) menjadi AB+CD+* 12

Pembentuk kode / Code Generator Pembentuk kode akan menterjemahkan bentuk intermediate program sumber kedalam bahasa rakitan ataupun bahasa mesin Contoh : dari bentuk kuadrupel (+, A, B, T 1), (+, C, D, T 2), (*, T 1, T 2, T 3) diterjemahkan kedalam bahasa rakitan menjadi, LDA A ADD B STO T 1 LDA C ADD D STO T 2 LDA T 1 MUL T 2 13 STO T 3

Pengoptimal kode/Code Optimizer Gunanya adalah untuk menghasilkan program objek yang lebih efisien. Optimasi Lokal Optimasi pada level lokal dengan melakukan evaluasi ekspresi, evaluasi konstanta, evaluasi penggunaan sifat operator tertentu, seperti sifat asosiatif, komutatif ataupun distributif dan pemeriksaan atau deteksi atas subekspresi yang sama. Dari contoh diatas, karena adanya sifat komutatif perkalian maka kode bahasa rakitan diatas dapat dioptimalkan menjadi : LDA A ADD B STO T 1 LDA C ADD D MUL T 1 14 STO T 2

Optimasi Global Optimasi yang lebih global dapat dilakukan misalnya dengan evaluasi terhadap kemunculan berkali-kali dari suatu subekspresi yang identik, penghapusan (removing) statement yang tertahan dalam loop dan menempatkannya diluar loop. Bentuk optimasi tersebut adalah bentuk yang bebas mesin (mechine independent). Sedangkan untuk bentuk yang tergantung mesin (machine dependent) dapat dilakukan dengan pengalokasian register secara optimal. Suatu optimasi kode yang baik akan menghasilkan kode program yang baik, bahkan lebih baik dari yang dihasilkan seorang programmer bahasa rakitan yang berpengalaman. 15

Interaksi Scanner dan Parser Single Pass Setiap scanner menghasilkan 1 token, lansung dikirim ke parser untuk diproses Separate Pass Scanner menghasilkan semua token dulu dari program sumber, baru kemudian dikirimkan ke parser untuk diproses. Faktor yang mempengaruhi banyaknya pass pada suatu kompilator adalah sbb : 1. Memori yang tersedia 2. Kecepatan dan ukuran kompilator 3. Kecepatan dan ukuran program objek 4. Kelengkapan debugging yang dibutuhkan 5. Deteksi kesalahan (error detection) dan teknik recovery yang diinginkan 6. Jumlah orang dan waktu yang tersedia untuk membuat kompilator 16

Mutu Kompilator Mutu dari sebuah kompilator tergantung kepada beberapa faktor, antara lain : 1. Kecepatan dan waktu proses kompilasi Waktu proses kompilasi dihitung dari saat kita memberi perintah untuk melakukan kompilasi sampai diperoleh hasil kompilasi. Hal ini dipengaruhi oleh : a. Penulisan Algoritma Kompilator Yaitu algoritma yang digunakan untuk menuliskan program kompilator tersebut b. Kompilator pengkompilasi Yaitu sebuah program khusus yang 17 menghasilkan

2. Mutu Program Objek Mutu dari suatu program objek (program hasil kompilasi) ditentukan oleh ukuran dan kecepatan eksekusi dari program objek. Program objek yang lebih efisien akan berukuran lebih kecil dan akan lebih cepat untuk dieksekusi 3. Integrated Environment Merupakan fasilitas terintegrasi yang dimiliki oleh kompilator tersebut, yang memadukan banyak fasilitas yang diperlukan, seperti editing, dubugging, testing, trace, link dsb. Biasanya disebut sebagai Integrated Development Environment (IDE). 18

Pembutan Kompilator Pembuatan kompilator dapat dilakukan dengan : 1. Bahasa Mesin Tingkat kesulitannya sangat tinggi, karena bahasa mesin sangat sulit dipahami oleh manusia dan ketergantungan pada mesin yang tinggi. Digunakan untuk membuat assembler. 2. Bahasa assembler Bisa dan biasa digunakan sebagai tahap awal pada proses pembuatan kompilator. Keuntungan menggunakan assembler adalah akan dapat menghasilkan object code yang berukuran kecil. Kerugiannya instruksinya pendek (tidak mudah dimengerti) dan terbatas. 19

3. Bahasa tingkat tinggi lain pada mesin yang sama Keuntungannya adalah proses pembuatan kompilator akan lebih mudah, karena bahasa tingkat tinggi lebih mudah dimengerti dan fasilitasnya yang lebih baik dibanding assembler. Kerugiannya adalah object code yang dihasilkan berukuran lebih besar. 4. Bahasa tingkat tinggi yg sama pada mesin berbeda Hampir sama seperti no. 3 namun disini diperlukan beberapa tahapan proses kompilasi sebelum didapat kompilator yang diinginkan pada mesin tujuan. Contoh : pembutan kompilator C untuk DOS(PC), berdasar kompilator C pada UNIX (mini atau mainframe). 20

5. Bootstrap Pembuatan kompilator secara bertahap dengan beberapa tingkat bahasa, cara ini diperkenalkan oleh Niclaus Wirth saat membuat kompilator untuk bahasa pemrograman Pascal. 21
- Slides: 21