4.Syahroni Hidayat 5.Yogi Permana What is Compiler ? Compilation is a process that translates a program in one language (the source language) into an equivalent program in another language (the object or target language).
Adalah sebuah program yang membaca suatu program yang ditulis dalam suatu bahasa sumber (source language) dan menterjemahkannya ke dalam suatu bahasa sasaran (target language).
An important part of any compiler is the detection and reporting of errors (Gambar tersebut adalah ilustrasi sebuah penterjemah compiler menterjemahkan source code menjadi object file)
Translator : Compiler Translator : Adalah suatu program dimana mengambil input sebuah program yang ditulis pada satu bahasa program (source language) ke bahasa lain (The object on target language)
Jika source language adalah high level language, seperti cobol, pascal, fortran maka object language adalah low-level language atau mesin language. Translator seperti ini disebut COMPILER
Commonly, the source language is a high-level programming language (i.e. a problem-oriented language), and the target language is a machine language or assembly language (i.e. a machine-oriented language)
Gambar penterjemah sebuah compiler Compiler pada umumnya Compiler membaca sebuah source code dalam bentuk teks, menyatukan karakter-karakter yang berhubungan menjadi token, lalu memeriksa apakah token-token tersebut memenuhi grammar, setelah itu compiler akan memeriksa semantik input, dan membuat output dalam sebuah bahasa (yang umumnya adalah assembly). Jika outputnya adalah assembly maka proses berikutnya adalahassembling yang dilakukan dengan assembler untuk menghasilkan bahasa mesin. Proses terakhir untuk membuat executable filedilakukan oleh linker.
Compiler pada umumnya Intinya kompiler menerjemahkan bahasa pemograman tingkat tinggi yang diketik oleh editor program tersebut ke bahasa yang dipahami oleh komputer yakni bahasa mesin. Karena komputer hanya memahami bahasa mesin. Jadi, ketika software kompiler rampung menerjemahkan ke bahasa mesin dengan menjadikan file bahasa tingkat tinggi menjadi file exe, com, dll, dst, maka user bisa testing program tsb secara mandiri untuk mengeksekusi program tersebut, tanpa perlu adanya bahasa pemograman tingkat tinggi di komputernya lagi. Tahap Kompilasi 1. Pertama source code (program yang ditulis) dibaca kememori computer). 2. Source code tersebut diubah menjadi objek code (bahasa Assembly). 3. Objek code di hubungkan dengan liberary yang dibutuhkan untuk membentuk file yang bisa dieksekusi.
Komplier memerlukan waktu untuk membuat suatu program dapat di eksekusi oleh computer, program yang dieksekusi oleh compiler adalah dapat berjalan lebih cepat dibanding program yang diperoduksi oleh interpreter, disamping itu juga bersifat independen. The Phases of a Compiler The process of compilation is split up into six phases, each of which interacts with a symbol table manager and an error handler. This is called the analysis/synthesis model of compilation. 1. analisa : program sumber dipecah-pecah dan dibentuk menjadi bentuk antara (inter-mediate representation) 2. sintesa : membangun program sasaran yang diinginkan dari bentuk antara SOURCE PROGRAM LEXICAL ANALYSIS (SCANNER) SYNTAX ANALYSIS (PARSER) INTERMEDIATE CODE CODE OPTIMATION CODE GENERATION OBJECT CODE T A B L E
M A N A G E M E N T E R R O R
H A N D L I N G SEMANTIC ANALYSER Lexical Analysis (Scanner) Sering juga disebut dengan Scanner (Pemindai) Tugas LA ini untuk mendekomposisi program sumber menjadi bagian bagian kecil. membaca program sumber, karakter demi karakter. Sederetan (satu atau lebih) karakter dikelompokkan menjadi satu kesatuan mengacu kepada pola kesatuan kelompok karakter (token) yang ditentukan dalam bahasa sumber. Setiap token yang dihasilkan disimpan di dalam tabel simbol. Sederetan karakter yang tidak mengikuti pola token akan dilaporkan sebagai token tak dikenal (unidentified token)
Syntax Analyzer memeriksa kesesuaian pola deretan token dengan aturan sintaks yang ditentukan dalam bahasa sumber. Sederetan token yang tidak mengikuti aturan sintaks akan dilaporkan sebagai kesalahan sintaks (sintax error). Secara logika deretan token yang bersesuaian dengan sintaks tertentu akan dinyatakan sebagai pohon parsing (parse tree) Syntax Analyzer Bertugas memeriksa kebenaran dari urutan dari token token yang terbentuk oleh LA Pengelompokan token token kedalam class syntax (bentuk syntax) seperti procedure, statement, dan expression Grammar : Sekumpulan aturan aturan untuk mendefinisikan bahasa sumber. Grammar dipakai oleh syntax analyzer untuk menentukan struktur dari program sumber. Proses deteksinya (pengenalan token) disebut dengan Parsing. Maka Syntax Analyzer (SA) sering disebut PARSER. Pohon sintaks yang dihasilkan digunakan untuk Semantics Analyser yang bertugas untuk menentukan maksud dari program sumber, misalnya operator penjumlahan maka semantics analyzer akan mengambil aksi apa yang harus dilakukan. Terdapat statement : ( A + B ) * ( C + D ) Akan menghasilkan bentuk sintaksis : <factor>, <term> & <expression>
Example of Syntax Tree <expression>
<term>
<term> * <factor>
<factor> ( <expression> )
( <expression> ) <expression> + <term>
<Expression> + <term> <term> <factor> <term> <factor> <factor> D <factor> B C A
Semantic Analyser Proses ini merupakan proses kelanjutan dari proses kompilasi sebelumnya, yaitu analisa leksikal (scanning) dan analisa sintaks (parsing) Bagian terkahir dari tahapan analisis adalah analisis semantik Memanfaatkan pohon sintaks yang dihasilkan dari parsing Proses analisa sintaks dan analisa semantik merupakan dua proses yang sangat erat kaitannya dan sulit dipisahkan. Contoh : A:= ( A + B) * ( C +D) Parser hanya akan mengenali simbol simbol :=, +, dan *, parser tidak mengetahui makna dari simbol simbol tersebut. Untuk mengenali makna dari simbol simbol tersebut, compiler memanggil routine semantics.
Semantic Analyser Tugasnya adalah memeriksa token dan ekspresi dari batasan-batasan yang ditetapkan. Batasan-batasan tersebut misalnya : a. panjang maksimum token identifier adalah 8 karakter, b. panjang maksimum ekspresi tunggal adalah 80 karakter, c. nilai bilangan bulat adalah -32768 s/d 32767, d. operasi aritmatika harus melibatkan operan-operan yang bertipe sama
Semantic Analyser Untuk mengetahui makna, maka routine ini akan memeriksa : Apakah variable yanga da telah didefinisikan sebelumnya Apakah variable variable tersebut tipenya sama Apakah operand yang akan dioperasikan tersebut ada nilainya, dst Menggunakan tabel simbol Pemeriksaan bisa dilakukan pada tabel identifier, tabel display dan tabel block
intermediate code (Pembangkit Kode Antara) membangkitkan kode antara (intermediate code) berdasar-kan pohon parsing. Pohon parse selanjutnya diterjemahkan oleh suatu penerjemah yang dinamakan penerjemah berdasarkan sintak (syntax-directed translator). Hasil penerjemahan ini biasanya merupakan perintah tiga alamat (three-address code) yang merupakan representasi program untuk suatu mesin abstrak. Perintah tiga alamat bisa berbentuk quadruples (op, arg1, arg2, result), tripels (op, arg1, arg2). Ekspresi dengan satu argumen dinyatakan dengan menetapkan arg2 dengan - (strip, dash)
intermediate Code (Pembangkit Kode Antara) Syntax-Directed Code Generation. In essence, code is generated by recursively walking through a parse (or syntax) tree, and hence the process is referred to as syntax-directed code generation. For example, consider the code fragment: z := x * y + x and its syntax tree (with lexemes replacing tokens) Code Optimation melakukan optimasi (penghematan space dan waktu komputasi), jika mungkin, terhadap kode antara.
An optimiser attempts to improve the time and space requirements of a program. There are many ways in which code can be optimised, but most are expensive in terms of time and space to implement.Common optimisations include: removing redundant identifiers, removing unreachable sections of code, identifying common subexpressions, unfolding loops and eliminating procedures.
Example. Consider the TAC code: Consider the TAC code: temp1 := x temp2 := temp1 if temp1 = temp2 goto 200 temp3 := temp1 * y goto 300 200 temp3 := z 300 temp4 := temp2 + temp3 Removing redundant identifiers (just temp2) gives temp1 := x if temp1 = temp1 goto 200 temp3 := temp1 * y goto 300 200 temp3 := z 300 temp4 := temp1 + temp3 Removing redundant code gives temp1 := x 200 temp3 := z 300 temp4 := temp1 + temp3 Code Generation The final phase of the compiler is to generate code for a specific machine. In this phase we consider: memory management, register assignment and machine-specific optimisation. The output from this phase is usually assembly language or relocatable machine code.
Penggunaan Otomata
Manfaat otomata sebagai pengenal (RECOGNIZER) digunakan untuk pengenalan string-string suatu bahasa yang sebagai masukan dari otomata,ini biasanya digunakan di tahap-tahapan awal pada proses kompilasi seperti pada tahap Lexical Analyzer = Scanner, Syntax Analyzer ,Semantic Analyser karena pada tahapan ini berhubungan langsung dengan bahasa dan mendekomposisi program sumber menjadi bagian bagian kecil. Fungsi automata sebagai pembangkit (GENERATOR) berfungsi pada tahapan intermediate code (representasi program untuk suatu mesin abstrak), Code generation dan code optimazation adalah merupakan fungsi synthesis yang berfungsi melakukan pembangkitan/pembuatan dan optimasi program (object program)
Example View dari programmer Mesin View Keterangan id adalah token untuk identifier. Tiga lexeme untuk token ini adalah position, initial, dan rate. penganalisa semantik secara logika membangkitkan pohon parse. penganalisa semantik mendeteksi mismatch type. Perbaikan dilakukan dengan memang-gil procedure inttoreal yang mengkonversi integer ke real. quadruples dari : temp2 := id3 * temp1 adalah (*,id3,temp1,temp2), id1 := temp3 adalah (assign,temp3,-,id1), temp1 := inttoreal(60) adalah (inttoreal,60,-,temp1). pembangkit kode dalam contoh ini menghasilkan kode dalam bahasa mesin.