Anda di halaman 1dari 4

Sebuah compiler umumnya memiliki dua tugas pokok,yaitu:

a. Fungsi analisis,atau biasa disebut dengan tahapan front end.Tugasnya melakukan


dekomposisi/pemecahan program sumber menjadi bagian bagian dasarnya untuk dianalisa.

b. Fungsi sintesis,atau biasa dikenal dengan tahapan back end.Tujuannya adalah untuk melakukan
pembangkitan/reassembly dan optimasi menuju program objek.

Terdapat enam tahapan dalam proses kompilasi,yaitu:

a. Lexical Analyzer

b. Syntax Analyzer

c. Semantic Analyzer

d. Intermediate Code Generation

e. Code Optimizer

f. Code Generator

Lexical Analyzer

Analisa leksikal merupakan tahap pertama dalam proses kompilasi.Tujuan utamanya adalah
mengubah string karakter yang berasal dari program sumber menjadi aliran token dengan
memotong masukan menjadi beberapa potongan dan melewatkan rincian yang tidak relevan.

Komponen dasar dalam analisis leksikal adalah kata kata.Dalam sudut pandang bahasa
pemograman,kata kata merupakan objek seperti nama variabel,angka,kata kunci,simbol
khusus,dll.Kata kata tersebut secara tradisional disebut sebagai token.

Secara umum,token menyatakan suatu kelompok,misalnya kelompok identifier dan kelompok


operator.Sedangkan lexemes merupakan anggota atau himpunan anggota dari token yang
bersangkutan.Selain itu,terdapat komponen lainnya yaitu pattern.Sebuah pattern adalah aturan dari
satu set string dimana token yang sama diproduksi sebagai output.

Sebuah analisis leksikal atau lexer akan menerima masukan/input berupa string karakter yang
diambil dari seluruh source code asal dan membagi string tersebut menjadi token yang masing
masing sesuai dengan simbol dalam bahasa pemograman seperti nama variabel,kata
kunci,nomor,dll.Selain itu,sebuah lexer juga akan menyaring apapun yang memisahkan
token,karakter layout serta komentar didalam source code tersebut.

Tujuan utama dari analisis leksikal adalah untuk memudahkan tahapan analisis selanjutnya,yaitu
analisis sintaksis.Selain itu,analisis leksikal juga berfungsi untuk mengelompokan/menglasifikasikan
token masukan/input ke dalam berbagai jenis seperti misalnya INTEGER dan IDENTIFIER.

Syntax Analyzer

Tahapan selanjutnya dalam proses kompilasi adalah analisa sintaksis atau disebut dengan
parsing.Tujuannya adalah untuk menggabungkan kembali token menjadi sesuatu yang
mencerminkan struktur teks,yang merupakan struktur data berwujud pohon sintaks.
Notasi yang digunakan dalam proses ini adalah context free grammar,yang merupakan notasi
rekursif yang berfungsi untuk mendeskripsikan kumpulan string dan membuat struktur pada setiap
string tersebut.

Parser adalah sutau program yang mengambil string input dari token yang didapat sebagai hasil dari
proses sebelumnya,yaitu analisis leksikal dan menghasilkan output berupa pohon sintaks/parse tree
apabila inputan sesuai dengan context free grammar ataupun pesan kesalahan apabila input yang
ditampilkan tidak sesuai dengan grammar.

Pohon sintaks mencerminkan urutan dari turunan yang digunakan selama proses parsing,yang
pembacaannya dari kiri ke kanan.Pohon ini terdiri dari daun yang merupakan token yang ditemukan
oleh analisis leksikal yang memiliki urutan yang sama dengan teks masukan.Komponen yang penting
dalam pohon sintaks adalah bagaimana daun ini digabungkan membentuk struktur pohon dan
bagaiman node pohon diberi label.Setiap subtree dalam parse tree haruslah sesuai dengan produksi
grammar.

Selain itu,analisis sintaksis juga harus menolak teks yang tidak valid dengan cara melaporkan
kesalahan sintaksis.Jika string tidak valid,pengurai harus mengeluarkan pesan diagnostik yang
menjelaskan identifikasi sifat serta penyebab kesalahan pada string tersebut.

Tujuan utama dari parser adalah untuk menentukan validitas sintaksis dari sebuah string
input,sebuah pohon dibangun untuk digunakan pada tahap selanjutnya dalam proses
kompilasi.Terdapat dua cara untuk mengidentifikasi sebuah subtree,yaitu dengan menurunkan
sebuah string dari non terminal atau dengan mengurangi simbol string ke non terminal.

Semantic Analyzer

Analisis semantik berfungsi untuk menentukan makna dari serangkaian instruksi yang terdapat
dalam program sumber.Untuk dapat mengetahui maknanya,proses ini mungkin akan melakukan tiga
tahapan berbeda yaitu pertama,memisahkan setiap instruksi yang terdapat dalam fungsi pada suatu
kumpulan program.Kedua,memeriksa apakah fungsi yang ada merupakan fungsi yang dikenali atau
tidak dalam sebuah compiler,hal ini biasanya dilakukan dengan cara pengecekan terhadap file
reserved word yang terdapat pada compiler tersebut.Dan ketiga,bedasarkan hasil pengecekan
sebelumnya kemudian akan dilakukan pengecekan terhadap fungsi instruksi yang dimaksud.

Parsing hanyalah memverifikasi bahwa program terdiri dari token yang disusun dalam kombinasi
yang valid secara sintaksis.Dimana dalam analisis semantik akan diperiksa apakah mereka
membentuk serangkaian instruksi yang masuk akal.Agar sebuah program valid secara
semantik,semua variabel,fungsi,kelas,dll haruslah didefinisikan secara benar.Ekspresi dan variabel
harus digunakan sesuai dengan cara yang sesuai dengan tipe sistem.

Analisis semantik merupakan proses terakhir dari tahapan front end dan merupakan kesempatan
terakhir compiler untuk menyingkirkan bagian program yang salah atau tidak sesuai dengan
aturan.Dalam proses ini dipastikan agar program cukup masuk akal untuk dibawa kedalam tahapan
back end.

Sebagian besar jenis analisis semantik terdiri dari tipe sistem,deklarasi dan pengecekan tipe/type
checking.Tipe merupakan seperangkat nilai dan serangkaian operasi yang beroperasi pada nilai
tersebut.Deklarasi merupakan sebuah pernyataan dalam sebuah program yang mengkomunikasikan
informasi tersebut kedalam compiler.Sedangkan pengecekan tipe adalah proses verifikasi bahwa
setiap operasi atau perintah yang dijalankan pada suatu program sesuai dengan tipe sistem dalam
bahasa pemograman serta menetukan apakah program melanggar persyaratan konsistensi tertentu.

Pada sebagian bahasa pemograman,identifier harus dideklarasikan sebelum digunakan.Saat


compiler menemukan sebuah deklarasi baru,ia mencatat jenis informasi yang diberikan pada
identifier tersebut.Kemudian,saat memeriksa keseluruhan program,compiler memverifikasi bahwa
tipe identifier benar dalam hal operasi yang dilakukan.Beberapa analisis semantik mungkin dapat
dilakukan tepat ditengah parsing.Parser dapat memeriksa operand dan memastikan bahwa operand
tersebut dalam tipe data yang kompatibel untuk sebuah statement.

Intermediate Code Generation

Intermediate code adalah hasil dari tahapan analisis yang dibuat oleh kompilator pada saat
mentranslasikan program dari bahasa tingkat tinggi.Terdapat tiga manfaat dari intermediate
code.Manfaat pertama yaitu memperkecil usaha dalam membangun kompilator dari suatu bahasa
pemograman ke mesin,sehingga intermediate code yang dihasilkan dapat juga digunakan pada
mesin lainnya karena intermediate code bersifat machine independent.Manfaat kedua adalah
proses optimasi lebih mudah dilakukan pada intermediate code,bahkan lebih mudah daripada
source code ataupun assembly code.Dan manfaat terakhir adalah program internal dapat dilihat
serta mudah dipahami,bahkan jauh lebih mudah daripada assembly code.

Terdapat tiga cara dalam merepresentasikan intermediate code,yaitu dangan menggunakan syntax
tree,notasi postfix serta three adress code.

Pohon syntax merepresentasikan struktur hirarki dari suatu source program.Sebuah directed acyclic
graph juga menggambarkan informasi yang sama,namun dengan cara yang lebih ringkas karena
adanya subexpressions.

Notasi postfix memiliki bentuk syntax yang meletakkan operator pada bagian akhir,didahului oleh
operand dan menggunakan proses stack untuk membuatnya dari notasi infix.Notasi n-tuple
merupakan jenis dari notasi postfix yang digunakan pada baris instruksi yang memiliki beberapa
tupel.

Three address code terdiri dari triples notation dan quadruples notation.Triples notation merupakan
kebalikan dari notasi postfix,dimana operator selalu ada di awal syntax,diikuti dengan operand yang
bersangkutan.Sedangkan quadruples notation memiliki syntax yang hampir identik dengan triples
notation,tetapi dalam quadruples notation juga menambahkan hasil pada bagian akhir.

Code Optimization

Code optimization merupakan salah satu point inti masalah dalam proses kompilasi.Meskipun
beberapa pengembangan masih berfokus pada metode parsing,sebagian besar pengembangan
menargetkan masalah optimasi ini.Terdapat dua jenis dalam pengoptimalan,yaitu pengoptimalan
kecepatan dan memori.

Pengoptimalan ruang memori merupakan hal yang utama dalam proses optimasi,karena terdapat
sangat banyak kode yang dibutuhkan dalam mengisi memori PC.Sistem operasi mengambil beberapa
megabyte ruang disk,namun sebagian besar terdiri dari grafis,suara dan dokumentasi.Memori virtual
juga berarti bahwa file executable besar tidak memblokir banyak memori.Untuk ukuran tujuan yang
paling praktis tidak merupakan masalah lagi,yang paling penting adalah konsumsi cache instruksi
yang dapat mempengaruhi kecepatan.

Tidak semua program membutuhkan kecepatan,namun pada zaman sekarang ini waktu tunggu
proses akan menjadi suatu hal yang sangat penting.Namun hal ini bukan hanya menjadi porsi
aplikasi itu sendiri untuk dioptimalisasi.Dengan semakin meningkatnya kecepatan prosesor dan
periferal,semakin banyak aplikasi yang akhirnya tidak memerdulikan point kecepatan.Karena apabila
mereka berkutat pada optimasi kecepatan,terdapat beberap faktor yang harus dihadapi,yaitu,hard
disk dan file system,jaringan,kernel sistem operasi,bahasa standar library,jumlah user,memory serta
prosesor.Compiler tidak bisa mempengaruhi semua lini,namun hanya sebagiannya.Karena itu
pengembangan compiler ditujukan terhadap point ini.

Terdapat beberapa teknik dalam optimisasi kode yang dibagi bedasarkan sasaran optimisasinya,yaitu
strength reduction dan pemilihan pola proses terbaik.Kedua jenis teknik tersebut biasanya saling
tumpang tindih satu sama lainnya karena pemilihan pola proses terbaik melibatkan proses strength
reduction.

Beberapa pengoptimalan ini kebanyakan dilakukan pada tahap front end dan sebagian lainnya
dilakukan pada tahap lanjutannya.Dalam proses lanjutannya,biasanya mendekati bahasa assembly
dalam bentuk semantik.Secara umum setiap proses optimisasi berjalan satu per satu.Sebuah
subrutin yang menerapkan optimasi berjalan melalui tree,melakukan beberapa pekerjaan dan
kemudian subrutin lainnya melakukan lebih banyak pekerjaan.

Code Generation

Code generation/pembuatan kode dapat dianggap sebagai tahap terakhir dalam proses
kompilasi.Melalui proses pembuatan kode,proses optimasi dapat diaplikasikan pada kode,tetapi itu
bisa dilihat sebagai bagian dari pembuatan kode itu sendiri.Kode yang dihasilkan oleh compiler
adalah kode objek dari beberapa bahasa pemograman tingkat rendah,seperti bahasa assembly.Kode
sumber yang ditulis dalam bahasa tingkat tinggi diubah menjadi bahasa tingkat rendah yang
menghasilkan kode objek tingkat rendah yang seharusnya memiliki sifat minimum berupa membawa
arti sesungguhnya/logika dari kode sumber dan efisien dalam hal penggunaan CPU serta manajemen
memori.

Anda mungkin juga menyukai