Kamis, 30 Desember 2010

Lirik dan Kunci Gitar Kotak - Pelan - Pelan Saja


[intro] C F

C     Em     F         G
ku tahu kamu pasti rasa
 C        F   G
apa yang ku rasa
C     Em      F          G
ku tahu cepat atau lambat
   Am    Dm     G
kamu kan mengerti

C  Em      F      G
hati bila dipaksakan
    C     F    G
pasti takkan baik
C     Em       F       G
pantasnya kamu mencintai
       Am     Dm  E  Am
yang juga cintai dirimu
  F      G
 cinta kamu

[chorus]
          F G      C     
lepaskanlah ikatanmu
        Dm G      C         Em 
dengan aku  biar kamu senang
       F  G       C    Am
bila berat melupakan aku
F         Dm   C
pelan-pelan saja


C    Em      F      G
tak ada niat menyakiti
 C     F    G
inilah hatiku
C    Em        F      G
pantasnya kamu mencintai
       Am     Dm  E  Am
yang juga cintai dirimu
 F      G
cinta kamu

[chorus]
          F G      C     
lepaskanlah ikatanmu
        Dm G      C         Em  
dengan aku  biar kamu senang
       F  G       C    Am
bila berat melupakan aku
F         Dm   C
pelan-pelan saja

[solo] Am G F E
       Am G F E
       Am G F

Dm      G     C
pelan-pelan saja


[chorus]
          F G      C     
lepaskanlah ikatanmu
        Dm G      C         Em 
dengan aku  biar kamu senang
       F  G       C    Am
bila berat melupakan aku

Dm       Em   F
pelan-pelan saja
Dm      G     C
pelan-pelan saja

[ending] C F C

F              C
pelan-pelan saja

Teknik Kompilasi


Merupakan Teknik dalam melakukan pembacaan suatu program yang ditulis dalam bahasa sumber, kemudian diterjemahkan ke dalam suatu bahasa lain yang disebut bahasa sasaran.

Dalam melakukan proses penerjemahan tersebut, sudah barang tentu kompilator akan melaporkan adanya keanehan-keanehan atau kesalahan yang mungkin ditemukannya. Proses penerjemahan yang dilakukan oleh kompilator ini disebut proses kompilasi (compiling).

Bila dipandang sepintas lalu, maka akan timbul beranekaragam kompilator yang dapat dibuat,
- Bahasa Sumber seperti bahasa FORTRAN, PASCAL, C dan juga bahasa-bahasa lainnya yang sifat dan pemakaiannya agak spesifik atau khusus, seperti bahasa untuk program DBASE, SPSS dan lain sebagainya.
- Bahasa Sasaran dapat berupa bahasa sumber lain seperti C, FORTRAN dan lain sebagainya atau Bahasa Mesin (Machine Language) yang digunakan oleh suatu prosessor mikro atau sumber komputer besar maupun komputer super.

Sejarah perkembangan suatu kompilator sudah dimulai sejak lama, yaitu pada saat mulai ditemukannya komputer pada awal 1950-an.

Sejak waktu tersebut teknik dan cara pembentukan suatu kompilator telah berkembang dengan sangat pesat dan pembentukkan suatu kompilator dapat dilakukan makin mudah.

Demikian pula program bantu (tools) untuk membuat suatu kompilator sudah dapat diperoleh sehingga pembentukan suatu kompilator dapat dilakukan dengan cepat.

Kompilator pertama yang dibuat adalah kompilator untuk bahasa FORTRAN yang pada saat itu dikembangkan dengan memakan sejumlah tenaga ahli yang setara dengan pekerjaan yang dilakukan oleh 18 orang.

Dengan adanya program bantu dan tata cara pembentukan yang sistematis dan tertata dengan baik serta pendefinisian struktur bahasa yang cermat, maka suatu kompilator untuk bahasa yang terstruktur seperti PASCAL atau C dapat dikembangkan.


Proses kompilasi dari suatu kompilator pada dasarnya dapat dibagi ke dalam 2 bagian utama yaitu bagian analisis dan bagian sintesis.

- Tahap analisis program yang ditulis dalam bahasa sumber dibagi dan dipecah ke dalam beberapa bagian yang kemudian akan dipresentasikan ke dalam suatu bentuk antara dari program sumber.
Operasi-operasi yang dilakukan oleh program sumber ditentukan dan dicatat dalam suatu struktur pohon (tree) yang disebut dengan nama pohon sintaks (sintax tree) Dalam hal ini setiap nodal pada tree tersebut menyatakan suatu operasi, sedangkan anak dari nodal (titik) tersebut memberikan argumen yang diperlukan
Secara umum proses dalam tahap analis terdiri dari 3 bagian utama, yaitu
a. Proses analisis leksikal
b. Proses analisis sintaktik
c. Proses analisis semantik

- Tahap sintesis yang berikutnya program sasaran dibentuk berdasarkan representasi antara yang dihasilkan pada tahap analisis.
Untuk tahap sintetis terdiri dari 2 bagian utama, yaitu
a. Proses yang menghasilkan kode (code generator)
b. Proses optimasi kode (code optimizer)

Sebelum Bahasa sasaran dapat dihasilkan, dalam melakukan ini tiap bagian utama akan berhubungan dan berkomunikasi dengan suatu berkas tabel yang disebut tabel simbol (symbol table) yaitu suatu tabel yang berisi semua simbol yang digunakan dalam bahasa sumber.

Selain kompilator masih diperlukan beberapa program lainnya sebelum dapat dibentuk bahasa sasaran yang dapat dijalankan. Seperti suatu bahasa sumber dapat dituliskan dalam beberapa modul yang terpisah dan disimpan dalam beberapa file yang terpisah.

Untuk menanggulangi hal ini, maka suatu program khusus yang disebut dengan suatu praprosesor digunakan untuk mengumpulkan modul-modul yang saling lepas ini ke dalam suatu program baru. Praposesor dapat pula melengkapi singkatan-singkatan atau ungkapan-ungkapan maupun kependekan-kependekan yang digunakan dalam bahasa sumber seperti pendefinisian makro dan lain sebagainya.






Analisis Leksikal

Analisis Leksikal/Analisis Linier/Pembacaan Sekilas (Scanner)

Dalam kaitan ini aliran karakter yang membentuk program sumber dibaca dari kiri ke kanan dan dikelompokkan dalam apa yang disebut token yaitu barisan dari karakter yang dalam suatu kesatuan mempunyai suatu arti tersendiri.

Analisis ini melakukan penerjemahan masukan menjadi bentuk yang lebih berguna untuk tahap-tahap kompilasi berikutnya.

Analisis Leksikal merupakan antarmuka antara kode program sumber dan analisis sintaktik (parser). Scanner melakukan pemeriksaan karakter per karakter pada teks masukan, memecah sumber program menjadi bagian-bagian disebut Token.

Analisis Leksikal mengerjakan pengelompokkan urutan-urutan karakter ke dalam komponen pokok: identifier, delimeter, simbol-simbol operator, angka, keyword, noise word, blank, komentar, dan seterusnya menghasilkan suatu Token Leksikal yang akan digunakan pada Analisis Sintaktik.

Model dasar untuk membentuk suatu Analisis Leksikal adalah Finite-State Automata.

2 aspek penting pembuatan Analisis Leksikal adalah:
- Menentukan token-token bahasa.
- Mengenali token-token bahasa dari program sumber.

Token-token dihasilkan dengan cara memisahkan program sumber tersebut dilewatkan ke parser

Analisis Leksikal harus mengirim token ke parser. Untuk mengirim token, scanner harus mengisolasi barisan karakter pada teks sumber yang merupakan 1 token valid. Scanner juga menyingkirkan informasi seperti komentar, blank, batas-batas baris dan lain-lain yang tidak penting (tidak mempunyai arti) bagi parsing dan Code Generator.

Scanner juga harus dapat mengidentifikasi token secara lengkap dan membedakan keyword dan identifier. Untuk itu scanner memerlukan tabel simbol. Scanner memasukkan identifier ke tabel simbol, memasukkan konstanta literal dan numerik ke tabel simbol sendiri setelah konversi menjadi bentuk internal.

Analisis Leksikal merupakan komponen kompilasi independen yang berkomunikasi dengan parser lewat antarmuka yang terdefinisi bagus dan sederhana sehingga pemeliharaan analisis leksikal menjadi lebih mudah dimana perubahan-perubahan terhadap analisis leksikal tidak berdampak pada pengubahan kompilator secara keseluruhan.

Agar dapat memperoleh fitur ini, maka antarmuka harus tidak berubah. Kebanyakan kode yang menyusun analisis leksikal adalah sama untuk seluruh kompilator, tidak peduli bahasa.

Pada analisis leksikal yang dituntun tabel (table-driven lexical analyzer), maka satu-satunya yang berubah adalah tabel itu sendiri.

Kadang diperlukan interaksi analisis leksikal dan analisis sintaktik yang lebih kompleks. Sehingga analisis leksikal harus dapat menganggap string sebagai token bertipe, bukan identifier.

Untuk itu perlu komunikasi tingkat lebih tinggi yang biasanya dilakukan suatu struktur data dipakai bersama seperti tabel simbol.

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.


Tugas-tugas Analisis leksikal

1. Konversi Program Sumber Menjadi Barisan Token
Mengubah program sumber yang dipandang sebagai barisan byte/karakter menjadi token

2. Menangani Kerumitan Sistem Masukkan/Keluaran
Karena analisis leksikal biasanya berhubungan langsung dengan kode sumber yang diwadahi file, maka analisis leksikal juga bertindak sebagai benteng untuk komponen-komponen lain di kompilator dalam mengatasi keanehan-keanehan sistem masukkan/keluaran sistem operasi dan sistem komputer.

Optimasi perlu dilakukan agar analisis leksikal membaca karakter degan sekaligus membaca sejumlah besar bagian file.

Perangkat masukkan/keluaran benar-benar diisolasi agar tidak terlihat oleh parser dan komponen-komponen kompilator yang lain.


Tugas-tugas tambahan Analisis Leksikal

1. Penghilangan komentar dan whitespace (tab,spasi,karakter lainnya)
Tindakan housekeeping dilakukan scanner sehingga mengisolasikan dari parser dan komponen-komponen kompilator lain.

Peran ini menyederhanakan perancangan parser (dan grammar bahasa pemrograman).

Scanner juga mencatat nomor baris saat itu sehingga penanganan kesalahan yang cerdas dapat mengirim pesan kesalahan dengan lebih akurat.

2. Konversi literal/konstanta numerik menjadi tipe data tertentu
Analisis leksikal dapat mengirim token, dan nilainya. Nilai ini biasa disebut atribut.

Namun demikian, bila analisis leksikal ditambahin dengan tugas-tugas tambahan yang terlalu banyak juga akan menjadi tidak baik. Karena itu membatasi analisis leksikal hanya untuk melakukan tugas pengenalan pola token (ditambah membuang komentar) adalah mempermudah pemeliharaan.


Tahap Pelaksanaan Analisis Leksikal
- Pada single one pass
Terjadi interaksi antara scanner dan parser. Sacnner dipanggil saat parser memerlukan token berikutnya. Pendekatan ini lebih baik karena bentuk internal program sumber yang lengkap tidak perlu dibangun dan disimpan di memori sebelum parsing dimulai.

- Pada separate pass
Scanner memproses secara terpisah, dilakukan sebelum parsing. Hasil scanner disimpan dalam file. Dari file tersebut, parsing melakukan kegiatannya.

Scanner mengirim nilai-nilai integer yang mempresentasikan bentuk internal token, bukan nilai-nilai string.

Keunggulan cara ini adalah ukurannya kecil dan tetap. Parser sangat lebih efisien bekerja dengan nilai integer yang mempresentasikan simbol daripada string nyata dengan panjang variabel.


Implementasi Analisis Leksikal

1. Pengenalan Token
- Scanner harus dapat mengenali token
- Terlebih dahulu dideskripsikan token-token yang harus dikenali

2. Pendeskripsian Token
- Menggunakan reguler grammar. Menspesifikasikan aturan-aturan pembangkit token-token dengan kelemahan reguler grammar menspesifikasikan token berbentuk pembangkit, sedang scanner perlu bentuk pengenalan.

- Menggunakan ekspresi grammar. Menspesifikasikan token-token dengan ekspresi reguler.

- Model matematis yang dapat memodelkan pengenalan adalah finite-state acceptor (FSA) atau finite automata.

3. Implementasi Analisis Leksikal sebagai Finite Automata
Pada pemodelan analisis leksikal sebagai pengenal yang menerapkan finite automata, analisis leksikal tidak cuma hanya melakukan mengatakan YA atau TIDAK. Dengan demikian selain pengenal, maka analisis leksikal juga melakukan aksi-aksi tambahan yang diasosiasikan dengan string yangsedang diolah.

Analisis leksikal dapat dibangun dengan menumpangkan pada konsep pengenal yang berupa finite automata dengan cara menspesifikasikan rutin-rutin (aksi-aksi) tertentu terhadap string yang sedang dikenali.

4. Penanganan Kesalahan di Analisis Leksikal
Hanya sedikit kesalahan yang diidentifikasi di analisis leksikal secara mandiri karena analisis leksikal benar-benar merupakan pandangan sangat lokal terhadap program sumber.

Bila ditemui situasi dimana analisis leksikal tidak mampu melanjutkan proses karena tidak ada pola token yang cocok, maka terdapat beragam alternatif pemulihan. yaitu:

- "Panic mode" dengan menghapus karakter-karakter berikutnya sampai analisis leksikal menemukan token yang terdefinisi bagus

- Menyisipkan karakter yang hilang

- Mengganti karakter yang salah dengan karakter yang benar

- Mentransposisikan 2 karakter yang bersebelahan.

Salah satu cara untuk menemukan kesalahan-kesalahan di program adalah menghitung jumlah transformasi kesalahan minimum yang diperlukan untuk mentransformasikan program yang salah menjadi program yag secara sintaks benar.


Input Buffering

Perancangan analisis leksikal seharusnya dapat membuat buffering masukkan yang membantu mempercepat proses pembacaan dari file serta mempunyai fleksibelitas yang tinggi agar analisis leksikal tidak bergantung platform sehingga mempunyai portabilitas yang tinggi.



Analisis Sintaktik

Analisis Sintaktik/Analisis Hirarki/Parsing

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.

Analisis Sintaktik selalu bekerja bergantian dengan Analisis Semantik.
- Pertama, Analisis Sintaktik mengidentifikasikan urutan Token Leksikal seperti ekspresi, statement, subprogram, dan lainnya.
- Analisis Semantik kemudian dipanggil untuk proses unit ini.

Analisis Sintaktik berfungsi menghasilkan pohon sintaks program sumber yang didefinisi grammar.

Simbol terminal pohon sintaks adalah token-token yang dihasilkan scanner.

Analisis Semantik

Analisis Semantik

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.


Code Generation

Code Generator/Pembentukan Kode

Dimana dalam tahap ini dibentuk antara dari bahasa sumber yang berupa suatu pohon sintaks diterjemahkan ke dalam suatu bahasa assembler atau bahasa mesin

Bentuk antara yang diperoleh biasanya merupakan suatu perintah 3 alamat atau suatu kuadrupel (3-address code atau quadruples), sedangkan bahasa mesin yang dihasilkan adalah suatu bahasa assembler yang merupakan suatu perintah 1 alamat, 1 akumulator.

Code Optimizer

Code Optimizer/Optimasi Kode

Hasil pembentukan kode yang diperoleh kemudian dibuat kompak lagi dengan melakukan beberapa teknik optimasi supaya dapat diperoleh program yang lebih efesien.

Dalam hal ini dilakukan beberapa hal seperti pendeteksian suatu ekspresi yang sering terjadi, sehingga pengulangan tidak perlu terjadi dan lain sebagainya.


Praposesor

Praposesor

Adalah suatu program khusus menanggulangi terjadinya beberapa modul yang terpisah saat melakukan penulisan bahasa sumber menjadi beberapa file ke dalam suatu program baru.

Suatu Praposesor menghasilkan suatu input bagi suatu kompilator. Hal ini mungkin dilakukan oleh suatu kompilator antara lain:

- Pemroses Makro
Makro yang merupakan kependekan dari suatu bagian program yang lebih panjang memungkinkan penulis program untuk memperpendek program yang ditulisnya.
Dalam hal ini perlu dilakukan dua hal

a. Mendefinisikan makro yang digunakan.
Parameter yang didefinisikan pada makro disebut dengan parameter formal

b. Melakukan pemanggilan makro yang mungkin juga mengandung beberapa parameter.
Sedangkan parameter yang digunakan untuk memanggil makro disebut dengan paramater aktual

- Pengikutsertaan berkas (File Inclusion)
Suatu Praprosesor memungkinkan diikutsertakannya beberapa berkas program yang telah ditulis sebelumnya ke dalam program yang sedang ditulis.
Biasanya berkas program yang ditulis sebelumnya merupakan segmen program yang sekali digunakan, banyak manfaatnya dan sering terjadi sudah merupakan bagian dari sistem bahasa yang digunakan
Misalnya pada bahasa C, isi dari berkas global.h dapat diikutsertakan dalam program yang sedang ditulis dengan menggunakan perintah #include global.h

- Praposesor Rasional
Praprosesor ini memberikan kemampuan baru dari suatu bahasa dengan fasilitas pengendalian aliran (flow-of-control) atau struktur data yang lebih baik.
Misalnya dengan menambahkan kemampuan perintah while, if-then-else pada bahasa yang pada mulanya tidak mempunyai fasilitas tersebut.
Hal ini biasanya dilakukan dengan menggunakan makro yang sudah ada dalam bahasa tersebut.

- Perluasan Bahasa
Praprosesor ini memungkinkan suatu bahasa untuk berinteraksi dengan sistem atau bahasa lainnya.
Misalnya pada bahasa C yang ditambahkan kemampuannya untk dapat mengakses data dalam suatu database.
Untuk itu praprosesor memungkinkan menggunakan tanda ## yang menyatakan bahwa bagian ini bukan merupakan bagian dari bahasa C, tetapi berhubungan dengan sistem suatu paket database lain yang sudah baku.
Dengan demikian bagian ini akan diterjemahkan kedalam pemanggilan procedure untukmelakukan akses database.

Token

Token

Token merupakan unit atau elemen dasar bahasa komputer (seperti 'kata' di bahasa manusia), dimana unit tersebut tidak terbagi lagi.

Token merupakan bagian hasil dari pemecahan sumber program yaitu penerjemahan lexeme pada saat melakukan scanner.


Token mereprentasikan nama :

- identifier -> nama variabel, fungsi, tipe atau nama yang didefinisikan pemakai.

- keyword

- literal string

- operator

- label

- simbol tanda -> tanda kurung, koma, titik koma.
Lexeme
Lexeme

Lexeme adalah string yang merupakan masukan dari analisis Leksikal.



Single One Pass

Single One Pass

Suatu kompilator dapat dibuat hanya dengan melakukan 1 kali pembacaan program sumber.

Tetapi kompilator yang demikian biasanya tidak dapat melakukan optimasi kode dengan baik.

Namun demikian kebanyakan kompilator untuk bahasa yang terstruktur melakukan beberapa kali pembacaan untuk :
- dapat melakukan deteksi kesalahan
- menemukan kembali kesalahan yang telah diperoleh
- melakukan proses debugging

Rancangan kompilator ini dimaksudkan untuk menerjemahkan suatu ekspresi matematika yang ditulis dalam notasi infix menjadi notasi yang ditulis dalam notasi postfix.

Penekanan yang diberikan hanya pada bagian depan dari proses kompilasi yang dilakukan yaitu:
- Analisis Leksikal
- Penguraian (parser)
- Pembentukan Kode Antara

Suatu penerjemahan berdasarkan sintaks merupakan kombinasi dari proses Analisis Leksikal dan Pembentuk Kode Antara

UGLE GIRL


Beautiful girl wherever you are
I knew when I saw you you had opened the door
I knew that I´d love again after a long long while
I´d love again.
You said "hello" and I turned to go
But something in your eyes left my heart beating so
I just knew that I´d love again after a long long while
I´d love again.

Refrain : It was destiny´s game
For when love finally came on
I rushed in line only to find
That you were gone.

Whenever you are I fear that I might
Have lost you forever like a song in the night
Now that I've loved again after a long long while
I´ve loved again.
Repeat Refrain
Beautiful girl I´ll search on for you
'Til all of your loveliness in my arms come true
You've made me love again after a long long while
In love again
'And I´m glad that it´s you
'Hmm beautiful girl
[intro] G

G                       Em
aku ingin engkau ada di sini
                 Am
menemaniku saat sepi
                 D
menemaniku saat gundah

G                       Em
berat hidup ini tanpa dirimu
                   Am
ku hanya mencintai kamu
                  D
ku hanya memiliki kamu

[chorus]
 G          E                Am
aku rindu setengah mati kepadamu
    Cm                 G
sungguh ku ingin kau tahu
  D/F#  Em            Am D  
aku rindu setengah mati


G                           Em
meski tlah lama kita tak bertemu
                     Am
ku selalu memimpikan kamu
                     D
ku tak bisa hidup tanpamu

[chorus]
 G          E                Am
aku rindu setengah mati kepadamu
    Cm                 G
sungguh ku ingin kau tahu
  D/F#  Em            Am D  
aku rindu setengah mati

       G           C  D
aku rindu setengah mati

 G          E                Am
aku rindu setengah mati kepadamu
    Cm                 G
sungguh ku ingin kau tahu
  D/F#  Em            Am D  
ku takbisa hidup tanpamu
       G
aku rindu