Membuat Compiler Sendiri – Persamaan Matematis

[tek.kompilasi|t.inf|s.104|pert.9]

Pertemuan yang lalu telah disinggung membuat kompiler yang melakukan operasi perhitungan layaknya menggunakan kalkulator. Di sini dengan Lex and Yacc akan dicoba membuat kompiler yang bisa melakukan perhitungan seperti ini:

Yang belum mempunyai software lex and yacc silahkan klik di sini untuk mengunduhnya dengan ukuran sekitar 20-an Mb. Kebetulan software yang dishare berbasis Windows. Jika ingin yang linux, vendor juga menyediakan aplikasi lex and yacc berbasis linux seperti Ubuntu.

Prinsip Kerja

Generasi saya (kuliah 90-an) hanya mengenal disket dan belum mengenal punch card yang berisi kartu berlubang yang fungsinya sebagai instruksi ke komputer. Bayangkan jika kita diminta menghitung iterasi ratusan kali dengan kalkulator, tentu akan bentol jempol kita. Tapi dengan menginstruksikan agar komputer menghitung iterasi ratusan kali tersebut, sekali jalan langsung selesai. Jika dulu dengan kartu berlubang, saat ini instruksi berbasis teks yang diketik. Jadi komputer harus mampu melakukan scanning agar mengetahui instruksi tersebut sesuai dengan aturan sebelumnya atau tidak, baik dari sisi kata perkata atau logika yang berupa grammar. Jadi Lex and Yacc memiliki dua mesin:

  • Scanning kata per kata dengan mesin Lex (singkatan dari lexical generator), dan
  • Grammar check dengan mesin Yacc (singkatan dari yet another compilers compiler)

Makanya software tersebut dinamakan Lex and Yacc. Jika software sudah diinstal, silahkan pelajari dari situs resminya, yang juga dilengkapi dengan kode sumber untuk praktek kali ini.

Mengkompilasi File Lex

Ada dua file yang diperlukan untuk menghasilkan satu kompiler yaitu file lex (berekstensi *.l) dan yacc (berekstensi *.y). Silahkan masuk ke bab “Practice 2”. Kopi-kan saja ke Flex Windows (software Lex and Yacc versi windows) yang baru kita instal. Masuk ke menu Tools – Lex Compile. Lanjutkan dengan masuk ke menu yang sama: Tools – Lex Build. Maka akan dihasilkan satu file baru lex.yy.c yang merupakan hasil generate ke bahasa c.

Mengkompilasi File Yacc

Jika Lex bertanggung jawab mengecek kata/word yang terdaftar di bahasa pemrograman yang dirancang, Yacc bertanggung jawab terhadap grammatical-nya. Buat kode dengan nama yang sama dengan file Lex, hanya saja untuk Yacc harus berekstensi *.y. Lakukan proses yang sama dengan Lex di menu Tools – Yacc Compile dan dilanjutkan dengan membuild beserta Lex-nya lewat menu yang sama Tools – Lex+Yacc Build. Hasil dari proses kompilasi adalah dua buah file y.tab.c dan y.tab.h yang satu untuk header (di bahasa c dengan kode #include) yaitu y.tab.h dan satu lagi y.tab.c digunakan untuk build Lex+Yacc. Di bagian indikator bawah pastikan tidak ada masalah dan cek di file lokasi penyimpanan (di folder yang sama dengan lex dan yacc) apakah file berekstensi exe dengan nama yang sama dengan lex and yacc ada, misalnya yang saya gunakan calc2.exe.

Menjalankan Bahasa Pemrograman

Ada dua cara menjalankan bahasa pemrograman yang baru dibentuk yaitu dengan mengklik file calc2.exe atau nama lain yang Anda buat, atau dengan menekan Tools – Execute Exe Directly. Hasilnya akan memunculkan jendela di bawah ini, coba dengan melakukan operasi matematis tertentu dengan variabel. Selamat mencoba, semoga bermanfaat.

NOTE: Ada kesalahan di bagian yacc, tambahkan di bagian atas:

  • %{
  • #include <stdio.h>
  • void yyerror(char *);
  • int yylex(void);
  • int sym[26];
  • %}
Iklan

Shift and Reduce Parsing

[tek.kompilasi|t.informatika|s-103|pert.8]

Untuk orang yang non ilmu komputer atau teknik informatika, istilah parsing merupakan istilah asing yang membuat dahi keriput. Bagaimana tidak, hanya menggunakan bahasa pemrograman saja sudah pusing, ini malah diminta membuat suatu bahasa pemrograman. Tapi perlu diingat, salah satu kewajiban pembelajaran adalah “apakah yang kita ajarkan sudah seharusnya yang kita ajarkan?”. Pertanyaan itu merupakan pertanyaan yang harus dijawab. Pertanyaan yang dikeluarkan oleh Mahatma Gandhi ketika India baru merdeka dan ingin segera bersaing dengan negara maju.

Grammar

Kembali ke proses pembuatan bahasa pemrograman. Sebelum bisa membuat suatu bahasa, perlu mengetahui cara kerja suatu bahasa. Bahasa bekerja mengikut grammar yang ada. Chomsky mengusulkan suatu context free grammar yang bebas dari linguistik lokal yang tidak beraturan. Sebagai contoh kita memiliki aturan grammar sebagai berikut:

Apa maksudnya? Di sini ada tiga aturan yang membolehkan pengguna mengoperasikan: 1) variabel ditambah variabel. Variabel di sini diistilahkan dengan non-terminal (bukan titik destinasi akhir), sementara terminal berupa konstanta atau operasi seperti tambah, kurang, kali dan bagi. 2) variabel dikalikan dengan variabel, serta 3) variabel diisi oleh konstanta. Secara singkat, notasi grammar di atas dapat ditulis dalam satu baris: E->E+E|E*E|id. Ekspresi di atas mengikut kaidah Backus Naur Form (BNF) yang terkenal untuk context free language.

Tugas bagian parsing adalah mengecek validitas operasi yang diberikan oleh pengguna apakah sudah sesuai dengan grammar yang ada atau tidak. Sebagai contoh user mengetikan persamaan matematis: E->x+y*z. Parsing akan mengecek apakah sudah sesuai atau tidak dengan grammar.

Shift and Reduce Parsing

Sesuai dengan namanya metode ini mengkombinasikan antara penggeseran dan pengurangan parsing. Contoh sebelumnya jika kita kerjakan maka otak kita lebih mudah mengerjakan lewat mekanisme ‘top down’ sambil melihat grammarnya. Dalam contoh di atas, ada penjumlahan (x+y) dan perkalian (dengan z). Dengan menggunakan left hand first diperoleh urutan berikut ini:

Perhatikan aturan grammar yang diterapkan di dalam kurung di samping kanan proses top-down. Pertama-tama digunakan aturan perkalian yang menghasilkan dua non-terminal E. E yang kanan dengan menerapkan rule no.3 diperoleh konversi dari E ke id (dalam hal ini z). Langkah berikutnya dengan menggunakan aturan no.1 dimana E menurunkan E+E (simbol -> diistilahkan turunan (derrive). Teruskan dengan menggunakan rule no. 3 akan merubah non-terminal menjadi terminal berturut-turut x dan y. Karena hasil akhir sama dengan soal, maka dapat dikatakan instruksi x+y*z dapat diterima parser.

Kita mungkin mudah mengerjakan dengan top-down method ini. Bagaimana dengan komputer? Tentu saja berbeda dengan otak kita. Untuk itulah metode shift and reduce layak diperhitungkan. Cara kerja shift and reduce adalah sebagai berikut:

  • Tulis operasi yang akan dicek grammar-nya
  • Lakukan operasi shift untuk memisahkan non-terminal/variabel yang akan diisikan id.
  • Lakukan operasi reduce untuk mengganti variabel menjadi terminal.

Perhatikan 11 langkah di atas, yang merupakan tipikal operasi shift and reduce. Pada langkah pertama, instuksi akan siap-siap melakukan proses “shift” dimana x bergeser ke kiri. Selanjutnya, x yang telah berada di kiri dikonversi menjadi terminal/variabel E. Berikutnya langkah ke3 dan 4 dua buah proses shift yaitu untuk plus dan y dilanjutkan dengan reduce y menjadi terminal E. Langkah 8, 9, dan 10 bermaksud mereduksi instruksi mengikut grammar sehingga dihasilkan E yang artinya instruksi x+y*z dapat diterima (accepted). Berikutnya akan dicoba lewat perangkat lunak Lex and Yacc, khususnya bagian Yacc yang bertanggung jawab mengurusi Grammar.

Perhatikan saat kompilasi Yacc di bagian komentar. Tampak Yacc menunjukan 4 shift/reduce [1] yang konflik. Ini tipikal dari bagian pengecekan instruksi (dengan shift and reduce). Perhatikan di sini saya iseng mengganti “+” dengan “p” dan “-” dengan “m”. Kira-kira hasil bahasa pemrograman primitif sebagai berikut di bawah ini. Perhatikan, “p” bermakna plus dan “m” bermakna minus. Sekian, semoga bermanfaat.

 

Membuat Bahasa Pemrograman Sendiri

[tek.kompilasi|tek.inf|s-103|pert.7]

Sebelumnya kita kerap melihat program yang dibuat oleh pengembang. Program yang dibuat tersebut diramu dengan bahasa pemrograman tertentu seperti visual basic, c++, pascal, php, phyton, dan lain-lain. Pernahkah berfikir siapa yang membuat bahasa pemrograman tersebut? Apakah sama dengan membuat program? Postingan kali ini sedikit banyak menjelaskan masalah itu.

Compiler atau Interpreter?

Di tahun 80-an atau 90-an waktu SMA saya belajar bahasa basic sebagai bahasa pemrograman. Materi tersebut disisipkan dalam mata pelajaran matematika. Jadi tidak heran di beberapa universitas ilmu komputer merupakan sempalan dari jurusan matematika. Bahasa basic sendiri ketika diprogram hasilnya berupa program executable (*.exe). Proses membentuk source code (format text berekstensi *.bas) menjadi *.exe dikenal dengan istilah kompilasi atau beberapa aplikasi diberi nama deployment. Bagaimana dengan bahasa pemrograman lainnya seperti php?

Berkembangnya website membuat tuntutan terhadap aplikasi yang bisa berjalan di atas platform tersebut. Salah satunya adalah php dengan basis datanya yang terkenal MySQL. Bahasa ini berbeda dengan bahasa berbasis desktop seperti VB, C++, dan sejenisnya karena instruksi tidak dikompilasi menjadi executable, melainkan dijalankan baris per baris di engine PHP. Jadi kode sumber tersimpan dalam server (biasanya apache). Proses penerjemahan kode sumber menjadi eksekusi dikenal dengan istilah interpreter. Perbedaan nyatanya adalah jika program yang di-compile dapat dijalankan hanya dengan mengandalkan sistem operasi, pada program yang dijalankan dengan interpreter membutuhkan engine pembaca, salah satunya browser seperti mozilla, internet explorer, safari dan lain-lain. Salah satu keunggulannya adalah karena berbasis browser maka dapat dijalankan di berbagai platform (windows, linux, dll) atau pun beragam alat seperti PC, laptop, handphone, tablet dan lain-lain yang memiliki browser. Java sendiri sebelumnya memang telah getol mengembangkan kompilernya dengan teknik byte code yang dapat dijalankan diberagam platform dan mesin, asalkan menginstal terlebih dahulu Java Runtime-nya (JRE).

Peran Pembuat Bahasa Pemrograman

Dahulu, pembuat bahasa pemrograman dapat diibaratkan sebagai fardhu kifayah (maksudnya cukup segelintir orang saja yang mengerjakan), yaitu para vendor bahasa pemrograman. Namun saat ini dikala merajalelanya aplikasi berbasis android maka kebutuhan akan bahasa pemrograman yang mudah dan memanjakan programmer mutlak diperlukan. Apalagi saat ini programmer tidak harus dari jurusan informatika dan komputer, jadi peran pembuat bahasa pemrograman banyak diperlukan. Bahkan seoarang anak SD pun saat ini mampu membuat aplikasi android yang canggih berkat bantuan compiler yang spesifik untuk aplikasi tertentu, khususnya di android atau ios.

Aplikasi Pembuat Bahasa

Memang untuk bisa menggunakan aplikasi-aplikasi pembuat bahasa pemrograman diperlukan teori khusus yaitu teori otomata dan bahasa (grammar). Tanpa hal itu dijamin kebingungan menggunakannya. Biasanya aplikasi yang digunakan untuk membuat bahasa adalah aplikasi yang berbasis C++ atau Java. Salah satu yang terkenal dan banyak dijadikan bahan praktek mata kuliah teknik kompilasi adalah Lex and Yacc (lihat pertemuan 6). Bagan dibawah adalah proses pembuatan bahasa pemrograman dengan mengkonversi Lex-file dan Yacc-file menjadi executable.

Di sini dicontohkan dua buah kode sumber (bas.y dan bas.l) yang masing-masing berfungsi sebagai grammar (yacc) dan scanner (lex). Setelah di-build/compile dengan cc, diperoleh file bas.exe yang siap digunakan. Apa maksudnya? Sepertinya masih bingung ya.

Kita ambil contoh sebuah bahasa pemrograman Matlab. Jalankan Matlab.exe (bahasa pemrograman) dan masuk ke Command Window. Ketik 1+1 dan tekan Enter. Apa yang dihasilkan? Matlab akan meng-scan 1+1 dan mengeksekusi menjadi “makna” penjumlahan satu dengan satu dan dihasilkan 2.

Walaupun sederhana banget, toh itu contoh bahasa pemrograman. Perlu diketahui Matlab biasanya berfungsi sebagai interpreter (Matlab harus dibuka untuk menjalankan program m-file) namun bisa juga sebagai compiler (terlebih dahulu mengkompilasi m-file menjadi exe). Di pertemuan berikutnya akan kita coba menggunakan lex and yacc untuk membuat bahasa pemrograman seperti Matlab di atas (walau sederhana) seperti di bawah ini. Terus mengikuti ya.

 

 

Instal Lex and Yacc untuk Praktikum Teknik Kompilasi

[tek.kompilasi|tek.informatika|s.103|pert.6]

Compilers and language atau yang di Indonesia dikenal dengan mata kuliah teknik kompilasi merupakan materi dasar ilmu komputer, teknik informatika atau sistem komputer. Isinya adalah seluk beluk bagaimana compiler bekerja dari saat scanning, parsing, hingga menghasilkan output dalam bahasa mesin (komputer).

Peran Kompiler

Dahulu, teori-teori kompilasi yang berasal dari teori automata dan grammar dapat diibaratkan “fardhu kifayah”. Hanya segelintir yang tertarik, karena fokusnya adalah menciptakan compiler yang handal dan interaktif, dimana tiap kesalahan dapat diketahui letak kesalahannya. Level mahasiswa doktoral yang biasanya mengutak-atik bidang ini.

Namun saat ini dengan makin memasyarakatnya bidang pemrograman, para pemerhati kompiler berusaha membuat compiler yang bahkan mensuport para anak-anak yang tertarik dengan bahasa pemrograman. Munculnya bahasa-bahasa baru seperti Groovy, Rust, Elixir, Go, Swift, Arduino, Kotlin, dan bahasa pemrograman untuk Android. Android sendiri sangat mensuport Kotlin yang merupakan bahasa pemrograman yang dirancang dalam rangka mengisi kelemahan-kelemahan Java.

Lex and Yacc

Lex yang merupakan Lexical Analyzer Generator bermaksud men-scan kode yang ditulis. Sementara pasangannya Yacc (yet another compilers compiler) berfungsi melakukan parsing berdasarkan grammar. Dengan lex and yacc ini kita dapat membuat kompiler sendiri yang akan memerintahkan komputer menjalankan instruksi sesuai keinginan kita. Misalnya jika dalam bahasa pemrograman rata-rata menggunakan kata “if-else”, maka kita bisa saja menggantinya menjadi “jika-maka” setelah mengaturnya dengan Lex and Yacc ini. Silahkan unduh sourcecode nya lewat Google, lalu instal.

Instalasi

Lex and Yacc dapat berjalan di banyak platform. Untuk mudahnya di sini akan kita coba pada Windows 10. Setelah memperoleh kode sumbernya, klik ganda hingga muncul informasi bahwa akan diinstal Lex and Yacc.

Tekan saja Next> untuk lanjut ke menu persetujuan. Tekan saja Agree.

Berikutnya, Lex and Yacc akan meminta folder tempat program diinstal. Arahkan sesuai dengan keinginan, atau biarkan secara default dengan menekan Next>.

Berikutnya instalasi menanyakan lokasi menu folder Lex and Yacc nantinya. Biarkan secara default saja.

Akhirnya setelah menekan tombol Install maka proses instalasi akan berjalan hingga selesai. Hanya butuh satu hingga beberapa menit.

Pastikan instalasi lengkap dan tombol Finish muncul. Centang jika ingin langsung menjalankan aplikasi ini.

Akan muncul konsol dos (CMD) ketika aplikasi ini berjalan. Tunggu sesaat.

Jika sudah muncul tampilan seperti gambar di bawah berarti Lex and Yacc sudah siap untuk digunakan. Silahkan cari tatacara penggunaannya, bahkan ada juga yang menyediakan sampel programnya. Selamat mencoba.