TEKNIK KOMPILASI
PEKANBARU
Disusun Oleh :
Ervina andriani
Fitri Andriani
Nonie Githa Andriani
Nurhayati
Sandy Eka Nugroho
Dengan menyebut nama Allah yang Maha Pengasih lagi Maha Penyayang, kami
Panjatkan puja dan puji syukur atas kehadirat-Nya, yang telah melimpahkan rahmat, hidayah,
dan inayah-Nya kepada saya, sehingga saya dapat menyelesaikan laporan rangkuman
Pertemuan Ke-15 materi Teknik Kompilasi ini.
Laporan ini berisikan hasil dari rangkuman Pertemuan Ke-15 materi ”Teknik Kompilasi”
yang dapat diselesaikan dengan baik dan tepat waktu. Adapun tujuan penulisan laporan ini
adalah untuk memenuhi persyaratan dalam menyelesaikan rangkuman Pertemuan Ke-13
materi Teknik Kompilasi.
Penulis
A. Liveness
B. Tabel Deskriptor
Gambar .2 Transfer data (a) mode seri , dan (b) mode parallel
Dalam metode seri, bit-bit dipindahkan secara berurutan satu per satu : b0, b1, b2, dan
seterusnya. Dalam mode paralel, bit-bit dipindahkan secara serempak sesuai dengan cacah
jalur paralel (empat jalur untuk empat bit) secara sinkron dengan sebuah pulsa clock.
Ada empat cara dimana register dapat digunakan untuk menyimpan dan
memindahkan data dari satu bagian ke bagian sistem yang lain :
1. Serial input paralel output ( SIPO )
2. Serial input serial output ( SISO )
3. Paralel input parallel output ( PIPO )
4. Paralel input serial output ( PISO )
Beberapa tipe flip-flop dapat digunakan untuk membuat suatu register. Jika D FF
digunakan untuk membentuk register memori 4-bit, susunannya dapat dilihat pada
gambar 3.
Pada gambar 3 ditunjukkan sebuah register memori 4 bit yang terdiri dari 4 buah D
FF. Data input dimasukkan secara paralel pada terminal A, B, C, dan D. Data pada input akan
di transfer ke output setiap ada pulsa clock secara paralel juga. Karena data input masuk
secara paralel dan output juga secara paralel maka rangkaian di atas disebut sebagai Paralel
Input dan Paralel Output (PIPO).
Data yang disimpan pada rangkaian 8.3 tidak dapat digeser dari satu D FF ke D FF
yang lainnya. Jika output QA dihubungkan ke input B, data akan di geser dari kiri ke kanan
yang dikenal sebagai shift register, seperti ditunjukkan pada gambar 4. Misalkan QA dan QB
diset awal ke 0. Bit pertama dimasukkan ke input flip-flop A, jika ada clock pertama, bit
tersebut akan di transfer ke output QA. Bit pertama sekarang telah tersambung ke input B,
dan bit ke dua dari data input terhubung ke input flip-flop A. Jika ada pulsa clock kedua, bit
pertama berpindah ke output QB dan bit kedua berpindah ke output QA. Proses perpindahan
data akan berlanjut sampai 4-bit. Data dapat dibaca secara paralel dari QA, QB, QC, dan QD
secara simultan, dikenal sebagai Serial Input Serial Output (SISO).
Shift register juga dapat disusun dari SR FF atau JK FF, dengan penambahan fasilitas
Preset dan Clear. Rangkaian dapat digunakan untuk serial input maupun paralel input.
Untuk paralel input dan paralel output dapat ditunjukkan pada gambar 8.5
D. Membangkitkan Kode
Tahapan Kompilasi
a. Analisa Lexical
Merupakan tahap dasar dari suatu kompilasi yang membaca program sumber,
karakter demi karakter. Sederetan (satu atau lebih) karakter dikelompokkan menajadi
satu kesatuan mengacu kepada pola kesatuan kelompok karakter (token) yang
ditentukan dalam bahasa sumber. Analisa lexical mengerjakan pengelompokan
urutan karakter ke dalam komponen pokok: identifier, delimiter, simbol operator,
angka, keyword, noise word, blank, komentar, dan seterusnya. Pengelompokan ini
akan menghasilkan lexical token (lexeme) yang akan digunakan pada tingkatan
selanjutnya. Setiap token yang dihasilkan disimpan di dalam tabel simbol. Sederetan
karakter yang tidak mengikuti pola token akan dilaporkan sebagai token tak dikenal
(unidentified token).
Contoh :
Agar dapat memperoleh fitur ini, maka antarmuka harus tidak berubah.
Kebanyakan kode yang menyusun analisis leksikal adalah sama untuk seluruh
kompilator, tidak peduli bahasa.
b. Analisa Syntactic
Tahap kedua dari kompilasi adalah analisa syntactic atau sering disebut parsing. Disinilah
struktur program yang lebih besar diidentifikasi (statemen, deklarasi, ekspresi, dan
lainnya) menggunakan lexical token yang dihasilkan oleh lexical analyzer. Tahap ini
memeriksa kesesuaian pola deretan token dengan aturan sintaks yang ditentukan dalam
bahasa sumber. Deretan token yang tidak sesuai aturan sintaks akan dilaporkan sebagai
kesalahan sintaks (syntax error). Secara logika deretan token yang bersesuaian dengan
sintaks tertentu akan dinyatakan sebagai pohon parsing (parse tree). Analisa syntactic
selalu bekerja bergantian dengan analisa semantic. Pertama, syntactic analyzer
mengidentifikasikan urutan lexical token seperti ekspresi, statemen, subprogram, dan
lainnya. Semantic analyzer kemudian dipanggil untuk memproses unit ini.
Contoh :
Ekspresi if a2 < 9 then adalah ekspresi sesuai sintaks, sementara ekspresi if then a2B < 9
atau if a2 < 9 do tidak sesuai. Perhatikan bahwa contoh ekspresi terakhir juga
mengandung token yang tidak dikenal. Analisis Sintaktik dapat memasukkan string ke
tabel simbol, mengidentifikasi sebagai Type atau typedef, sehingga analisis leksikal dapat
memeriksa tabel simbol untuk menentukan apakah lexeme adalah tipe token atau
identifier. Dalam tahap ini karakter atau token yang diperoleh pada analisis leksikal
disusun dan dikelompokkan dalam suatu hirarki tertentu yang secara keseluruhan
mempunyai arti tertentu. Disinilah struktur program yang lebih besar diidentifikasi
(statement, deklarasi, ekspresi, dan lainnya) menggunakan token leksikal yang dihasilkan
Analisis Leksikal.
c. Analisa Semantic
Disini dilakukan pengecekan pada struktur akhir yang telah diperoleh dan diperiksa
kesesuainnya dengan komponen program yang ada.
Merupakan pusat dari tahapan translasi, struktur sintaktik yang dikenali oleh Analisis
Sintaktik diproses, dan struktur objek eksekusi sudah mulai dibentuk. Analisis
Semantik kemudian menjadi jembatan antara analisis dan sintesis dari translasi.
Analisis Semantik menghasilkan suatu kode objek yang dapat dieksekusi dalam
translasi sederhana, tetapi biasanya bentuk dari kode objek yang dapat dieksekusi ini
merupakan bentuk internal dari final program eksekusi, yang kemudian dimanipulasi
oleh tahap optimisasi dari translator sebelum akhirnya kode eksekusi benar-benar
dihasilkan.
Tahap ini memeriksa token dan ekspresi dengan acuan batasan-batasan yang
ditetapkan, misalnya:
• Pendeteksi Error
Semantic analyzer tidak hanya mengenali error “umum” yang muncul dan
memunculkan pesan error yang tepat, tetapi juga menentukan cara yang tepat untuk
melanjutkan dengan analisa syntactic pada sisa program.
• Macro Processing
Macro merupakan bagian dari teks program yang didefinisikan secara terpisah dan
disisipkan ke dalam program pada waktu translasi ketika ada macro call di program
sumber. Dengan demikian, macro dapat juga disebut subprogram. Namun berbeda
dengan subprogram yang lain, macro ditransalsikan secara terpisah dan dipanggil
pada waktu run-time. Ketika macro diperbolehkan maka semantic analyzer harus
mengidentifikasi pemanggilan macro dalam program sumber dan mempersiapkan
body macro untuk pemanggilan.
• Compile-time Operations
Intermediate code adalah representasi perantara antara bentuk bahasa tingkat tinggi
dengan bahasa mesin. Karena pada level berikutnya masih akan dilakukan optimasi,
maka perlu dibuat representasi yang memudahkan optimasi, yang bukan merupakan
bahasa mesin.
temp1 := inttoreal(60)
temp2 := id3 * temp1
temp3 := id2 + temp2
id1 := temp3
Dalam tahap ini bentuk antara dari bahasa sumber yang berupa suatu pohon sintaks
diterjemahkan ke dalam suatu bahasa assembli atau bahasa mesin. Tahap ini
membangkitkan kode antara (intermediate code) berdasarkan pohon parsing. Pohon
parsing selanjutnya diterjemahkan oleh suatu penerjemah, misalnya penerjemah
berdasarkan sintaks (syntax-directed translator). Hasil penerjemahan ini biasanya
merupaka perintah tiga alamat (three-address code) yang merupakan representasi
program untuk suatu mesin abstrak. Bahasa mesin yang dihasilkan adalah bahasa
assembli yang merupakan suatu perintah 1 alamat, 1 akumulator. Perintah tiga alamat
bisa berbentuk quadruples (op, arg1, arg2, result), triples (op,arg1,arg2). Ekspresi
dengan satu argumen dinyatakan dengan menetapkan arg2 dengan – (strip,dash).
Code Optimization
Hasil pembentukan kode yang diperoleh kemudian dibuat lebih kompak lagi
dengan melakukan beberapa teknik optimasi supaya dapat diperoleh program yang
lebih efisien. Dalam hal ini dilakukan beberapa hal seperti pendeteksian suatu
ekspresi yang sering terjadi, sehingga pengulangan tidak perlu terjadi dan lain
sebagainya. Pada tahap ini melakukan optimasi (peghematan space dan waktu
komputasi) jika mungkin terhadap kode antara. Semantic analyzer biasanya
menghasilkan suatu output program executable yang sudah ditranslasi yang
berbentuk intermediate code, yang kadangkala merupakan kode yang buruk atau
tidak efisien. Sebagai contoh, statemen:
A=B+C+D
(a) temp1 = B + C
(c) A = temp2
Dimana sebenarnya merupakan suatu kode yang tidak efisien:
2. Add C ke register
5. Add D ke register
8. Store register di A
Instruksi 3 dan 4 sama seperti instruksi 6 dan 7 yang berarti adalah redundant, ketika
semua data dapat disimpan di register sebelum penyimpanan hasil di A.
Optimalisasi diperlukan pada kasus ini untuk menghilangkan inefisiensi kode.
Optimalisasi akan mengubah kode yang tidak efisien menjadi kode yang efisien.
Code Generator
Tahap akhir kompilator adalah pembangkitan kode target/objek dan biasanya kode
mesin atau assembly yang dapat direlokasi. Pembangkitan kode sangat bergantung
pada mesin yang dipakai, misal :
MOVF id3, R2
MULF #60.0, R2
MOVF id2, R1
ADDF R2, R1
MOVF R1, id1