Convert Python file to Exe File

Mahasiswa jaman dulu sudah mengenal kompilasi program menjadi file executable. File jenis ini tidak bisa langsung dilihat kode programnya, sehingga lebih aman dari ‘penggunaan kembali’ oleh orang lain. Postingan ini khusus untuk pengguna windows, platform yang bisa menjalankan langsung dile EXE.

Pertama-tama siapkan dahulu file python yang akan dikonversi dilanjutkan dengan menuju ke lokasi foldernya. Klik kanan dan pilih Open in Terminal. Atau bisa masuk langsung ke Command lalu arahkan ke folder aplikasi.

In the past, students were already familiar with compiling programs into executable files. This type of file cannot be directly viewed as source code, making it safer from being reused by others. This post is specifically for Windows users, a platform that can directly run EXE files.

First, prepare the Python file that will be converted, then navigate to its folder location. Right-click and select “Open in Terminal.” Alternatively, you can directly go to the Command Prompt and navigate to the application folder.

A. Install Pyinstaller

Setelah masuk ke command prompt, install library untuk konversi ke executable, yakni pyinstaller. Ketik kode:

After entering the Command Prompt, install the library for converting to an executable, which is pyinstaller. Type the following code:

pip install pyinstaller

B. Run Pyinstaller

Setelah pyinstaller terinstall, jalankan untuk mengkonversi file py menjadi exe. Ketikan instruksi:

After pyinstaller is installed, run it to convert the .py file to .exe. Type the following command:

pyinstaller –onefile -w process.py

Proses kompilasi berjalan dengan lama tergantung kompleksitasnya. Untuk program contoh, cukup lama prosesnya (sepeminuman the). Setelah selesai, pada folder dist tampak process.exe sudah terbentuk. Selanjutnya saya pindahkan ke folder tempat akan dieksekusi. Ukurannya fantastis, 500-an Mb, dibanding dengan sebelumnya yang 1 Kb. Mungkin akibat memasukan library-library yang digunakan. Salah satunya adalah tensorflow.

The compilation process takes time depending on its complexity. For the example program, it took quite a while (around a few minutes). Once it’s done, you will see that the process.exe file is created in the “dist” folder. Next, you can move it to the folder where you want to execute it. The size of the executable file is significantly larger, around several hundred megabytes, compared to the original file size of 1 KB. This increase in size is likely due to the inclusion of the libraries used in the program. One of them is TensorFlow.

C. Cek Hasil Konversi

Berikutnya kita uji dengan menjalankan file EXE. Kebetulan di sini file exe akan diakses oleh file PHP (maaf, rumit ya). Sebelumnya diakses dengan kode pada process.php sebagai berikut:

Next, we will test the executable file by running the EXE file. In this case, the EXE file will be accessed by a PHP file (apologies for the complexity). Before accessing it, use the following code in process.php:

Kemudian di sini process.py akan kita ganti dengan process.exe yang baru saja kita konversi. Ganti menjadi sebagai berikut.

Then, here we will replace process.py with the newly converted process.exe. Change it as follows:

Untuk memastikan bukan file process.py yang dipakai, ganti saja (rename), misalnya xprocess.py. Setelah itu jalankan file phpnya dengan kode:

To ensure that the file being used is not process.py, simply rename it, for example, to xprocess.py. After that, run the PHP file with the following code:

php -S localhost:8000

Atau gunakan cara biasa dengan XAMPP setelah memindahkan file aplikasi ke htdocs (lihat pos yang lalu).

Alternatively, you can use the conventional method with XAMPP after moving the application files to the htdocs directory (as mentioned in the previous post).

Dengan memasukan 4 input, file html tersebut menjalankan file process.php yang menangkap inputan, selanjutnya mengakses file process.exe yang sebelumnya python. Jadi, jika ingin kode rahasia Anda tidak bisa dibuka karena file .py maka dengan .exe akan lebih aman. Lebih jelasnya lihat video youtube berikut:

By entering 4 inputs, the HTML file executes the process.php file, which captures the inputs and then accesses the previously Python file, process.exe. So, if you want to protect your secret code from being easily accessed, using .exe files instead of .py files will provide more security. For more clarity, please refer to the following YouTube video:

Iklan

Permasalahan Pada Google Colab

Salah satu tools untuk pemrograman dengan Python yang terkenal saat ini adalah Google Colab. Tools ini sangat praktis karena cukup dengan sebuah browser dengan disertai akun Google sudah bisa menjalankan kode dalam bahasa Python yang berat. Bahkan Google colab juga menyediakan hardwarenya yang berupa Graphic Processing Unit (GPU) dan Tensor Processing Unit (TPU).

Dalam praktiknya ternyata banyak kendala-kendala yang kerap dialami peneliti dalam memanfaatkan fasilitas canggih milik Google tersebut. Beberapa masalah akan dibahas dalam postingan ini, tentu saja berdasarkan pengalaman yang terjadi. Mungkin banyak hal lain yang tidak dibahas dalam postingan ini yang butuh share juga dari pembaca lewat kolom komentar. Selain membahas masalah-masalah yang muncul, dibahas pula cara-cara penyelesaiannya.

Kompatibilitas

Banyak kode-kode yang dishare di internet dalam bentuk Google Colab ketika dijalankan tidak bisa/error. Hal ini kerap terjadi karena Google Colab sudah mengupdate ke versi terbaru dan tidak bisa lagi menjalankan versi-versi yang lama. Langkah terbaik untuk penyelesaiannya adalah mengembalikan Google Colab ke versi sebelumnya.

Ternsor Flow

Beberapa aplikasi terkadang masih menggunakan tensorflow versi 1.x yang lama, sedangkan Google Colab saat ini sudah menggunakan yang versi 2. Oleh karena itu perlu sebuah instruksi untuk mengembalikan ke versi tersorflow yang lam.

Simbol “%” biasanya digunakan untuk setting library pada Google Colab. Memang ada baiknya mengkonversi program Python kita dengan versi yang terbaru, namun ada kalanya karena keterbatasan waktu, cara tersebut layak untuk dipertimbangkan.

TIdak Semua Library Tersedia

Beberapa library seperti NumPy, Pandas, dan sejenisnya sudah disiapkan oleh Google Colab. Namun library tertentu yang jarang dipakai perlu dipasang pada Google Colab. Caranya tentu saja tidak bisa dengan cara konvensional pada command prompt dengan “PIP”, melainkan dengan running pada Cell Google Colab lewat tanda “!” di awal.

Sebagai contoh di atas adalah library “rasterio” yang sering digunakan untuk menampilkan network Deep Learning berupa gambar yang jelas. Namun yang menjengkelkan adalah ketika Google Colab dishutdown dan dihidupkan kembali, kita harus menginstal ulang, berbeda jika menggunakan Jupyter Notebook yang cukup sekali menginstall Library.

Perlu Mencabut Instalasi Library

Ternyata bukan masalah belum terinstal saja yang muncul, sudah diinstal pun terkadang perlu dicabut karena tidak sesuai dengan kondisi sebelumnya. Misalnya ketika dahulu kita men-training dengan library tertentu pada Deeplearning, ketika hasil training tersebut akan digunakan ternyata tidak kompatibel dengan library terkini, alhasil perlu dilakukan proses training ulang yang terkadang memakan waktu.

Cara paling gampang adalah mencabut library Google Colab terkini dilanjutkan dengan instal versi sebelumnya yang tepat ketika proses training berlangsung.

Sebelumnya akan ada proses konfirmasi apakah akan dicabut library terkininya? Ketik saja y dan proses uninstall akan berjalan. Lanjutkan dengan menginstall versi yang kompatibel dengan yang lampau agar hasil pelatihan dapat berjalan.

Kode di atas terjadi ketika Deeplearning dilatih, versi h5py menggunakan versi yang lama. Alhasil dengan versiyang baru tidak dapat dipanggil dan dikompilasi dengan networknya. Setelah uninstall dan diinstal dengan versi yang cocok, barulah dapat dimanfaatkan hasil pelatihan/training Deeplearning yang telah dilakukan dahulu.

File Terhapus Ketika Shutdown

Problem yang sering terjadi adalah ketika suatu file diupload di Google Colab maka file tersebut sejatinya adalah sementara. Artinya ketika Google Colab ditutup maka file tersebut otomatis hilang. Untungnya Google Colab menyediakan fasilitas terkoneksi ke Google Drive, sehingga fila akan tersimpan permanen di Google Drive. Hanya saja perlu setting tambahan seperti berikut ini.

Google Colab akan meminta kode tertentu (cukup dengan copas) dari Google Drive. Pastikan folder di Google Drive dapat diakses pada Google Colab. Kalau hanya berukuran beberapa kilobyte sih tidak masalah, repotnya jika filenya berukuran besar mendekati 1 Gb, tentu saja menjengkelkan. Jadi melakukan akses ke Google Drive wajib dilakukan.

Waktu Akses Terbatas

Jika proses memerlukan waktu yang lama, maka Google akan memutus proses itu, dalam waktu 1×24 jam (mirip pesan pak RT untuk para tamu). Selain itu terkadang jika Google melihat tidak ada aktivitas pada sesi Google Colab terkadang akan direset prosesnya.

Butuh Koneksi Internet

Tentu saja karena Google Colab menggunakan browser. Ada baiknya Anda menggunakan Jupyter Notebook karena lebih fleksibel. Ketika kode bisa dirunning, akan terus bisa dirunning, kecuali Versi Library Anda rubah.

Hal-hal di atas merupakan permasalahan yang harus dipahami oleh pengguna Google Colab. Mungkin banyak hal-hal lain yang belum disebutkan di atas. Oiya, untuk pemrograman hal-hal rahasia, sensitif, dan sejenisnya ada baiknya tidak menggunakan fasilitas cloud seperti Google Colab.

Normalisasi Tabel

Dalam mata kuliah basis data, ada satu materi yang cukup berat, yaitu normalisasi tabel. Prinsip dasarnya adalah database relasional dimana ada aturan-aturan tertentu yang mengharuskan database designer mengikuti standar yang baku. Postingan berikut sedikit berdiskusi apa saja yang perlu diperhatikan dalam menormalisasi sebuah tabel.

Multivalue

Ini merupakan prinsip dasar database relasional dimana satu field/kolom dalam satu record tidak boleh berisi lebih dari satu item. Misalnya tabel transaksi pembelian barang, tidak boleh ada satu field, misalnya barang, yang berisi item-item barang yang dibeli. Di sini lah letak perbedaan basis data relasional dengan objek. Dalam basis data objek, isi field (diistilahkan dengan atribut) bisa multivalue dalam bentuk array.

Functional Dependency & Transitive Dependency

Dalam tabel transaksi terdapat dua ketergantungan yakni ketergantungan fungsi dan transitif. Jika Unnormalize Form (UNF) berisi field-field dalam transaksi (termasuk yg multivalue), dan 1NF yang berisi para kandidate key, 2NF berisi tabel-tabel yang mendukung ketergantungan fungsi, misalnya dalam pembelian barang, tabel yang terkait adalah tabel penjualan, detil penjualan dan barang.

Sementara itu ketergantungan yang sifatnya transitif, misalnya pelanggan, suplier, kasir/teler, dan lain-lain dipecah dalam 3NF. Ada level yang lebih rumit dan khusus, diberi nama Boyce-Code Normal Form (BCNF), biasanya terjadi ketika suatu field misalnya harga barang yang mengikuti wilayah cabang tertentu, padahal wilayah bukan merupakan primary key.

Surrogate Key

Dalam detil transaksi, misalnya detil pembelian, terkadang dibuat suatu surrogate key yang agar praktis dibuatkan/di-generate secara otomatis oleh sistem (increment). Mengapa harus dibuatkan surrogate key, silahkan simak video yang merupakan materi kuliah berikut. Semoga sedikit membantu.

Menghitung Kompleksitas Algoritma

Saat ini dimana komputer sudah canggih terkadang pengguna tidak terlalu memperhatikan seberapa kompleks sebuah algoritma. Tinggal jalankan, jika proses terasa lama dan berat, maka algoritma yang diterapkan dalam sebuah bahasa pemrograman berarti “boros” perhitungan. Sedikit memanipulasi dan kemudian dijalankan ulang maka diketahui apakah modifikasi menghasilkan eksekusi yang lebih baik atau tidak. Hal ini tidak dapat dijumpai ketika jaman dahulu dimana komputer belum secanggih saat ini yang bahkan sebuah kalkulator pun belum diciptakan. Dalam mata kuliah algoritma selalu dibahas bagaimana menghitung biaya sebuah algoritma yang diistilahkan dengan time complexity, atau terkadang disebuh kompleksitas saja.

Kalang (Loop) dan Rekursif (Recursive)

Ada dua jenis proses terkenal yang ditemukan oleh pakar-pakar algoritma. Yang pertama adalah kalang dalam sebuah iterasi. Jenis proses ini merupakan jenis yang paling banyak diketahui atau dinalar oleh mahasiswa yang belajar algoritma karena alurnya yang mudah dicerna. Tinggal mensimulasikan tiap iterasi, diketahui hasilnya. Biasanya untuk kasus yang rumit dalam skripsi/tugas akhir, mahasiswa hanya diminta menjalankan satu atau dua iterasi saja sekedar membuktikan bahwa yang bersangkutan memahami proses kerja algoritmanya dan selanjutnya tinggal eksekusi pada komputer yang meneruskan.

Sebagai ilustrasi, misalnya kita memiliki sekumpulan data sebanyak tiga buah, a={1,3,5}. Di sini n menyatakan jumlah data, yaitu tiga buah. Algoritma sederhana penjumlahan seluruh data dengan kalang ditunjukan oleh gambar berikut:

Kolom paling kiri menunjukan algoritma penjumlahan (Sum) data “a” sebanyak “n”. Jadi jika dijalankan akan terjadi perhitungan 0+(1+3+5)=8. Angka 1 di kolom berikutnya merepresentasikan “sekali eksekusi”. Di sini tidak dalam bentuk berapa detik atau milidetik karena tergantung prosesor yang dimiliki sehingga hanya dinyatakan dengan satuan eksekusi/step. Dimulai dari inisialisasi “s” yang dihitung satu step, kalang “for” sebanyak n+1 dengan “+1” perlu ditambahkan mengingat n=0 pun tetap dihitung satu step. Operasi di dalam kalang (akumulasi s) dihitung sebanyak “n” data. Akhir sebuah fungsi, yaitu “return” dihitung sekali. Jadi total 2n+3 langkah. Untuk contoh kasus kita adalah 2(3)+3 atau sebesar 9 langkah. Nah, untuk yang rekursif agak ribet sedikit.

Rekursif adalah fungsi yang memanggil diri sendiri. Untuk contoh penjumlahan data, rekursif di kolom kiri menyatakan fungsi RSum yang menambahkan sebuah data ke-n dengan data sebelumnya (n-1) dan berhenti ketika n nol atau negatif. Untuk data a={1,3,5} di atas operasi yang dilakukan algoritma rekursif adalah (((0)+1)+3 )+5)=8. Di sini perlu variabel x yang berisi kompleksitas (n-1). Tanpak jika n=0 (tidak ada data) jika dieksekusi tetap dibutuhkan 2 step (if dan return). Untuk contoh kita maka kompleksitasnya berarti 2+(2+(2+(2))) atau sebesar 8 langkah dimana kurung menyatakan proses rekursifnya. Atau secara sederhana berarti (n+1)*2. Pastikan dengan n lain yang lebih besar, misalnya 100 untuk memastikan mana yang lebih sedikit langkahnya. Untuk kalang: 2(100)+3=203 dan rekursif: (100+1)*2=202. Contoh lain yang lebih rumit misalnya untuk penjumlahan matriks berikut ini:

Untuk matriks a dan b berukuran misal m=2 baris dan n=3 kolom memiliki kompleksitas 2(2)(3)+2(2)+1 atau sebesar 17 langkah.

Ringkasan

Singkatnya, untuk kondisi if, total step adalah 1 baik ada atau tidak ada data. Return stepnya 1 jika tidak kosong. Kalang for (atau while) membutuhkan n+1 step dengan +1 perlu ditambahkan karena data kosong pun tetap dihitung 1 step. Contoh di atas diambil dari buku karya Ellis Horowitz (Computer Algorithms). Sekian, semoga bermanfaat.

Memanggil Fungsi Eksternal Pada Python

[Hari|Matkul|Jur|Dosen: Rabu.13.05.2020|Logika-prt.9|AK|Rahmadya,PhD]

Sebelumnya telah dibahas bagaimana menggunakan fungsi pada bahasa pemrograman Python (lihat pos yang lalu). Terkadang fungsi-fungsi tertentu digunakan oleh program-program Python lain sehingga perlu dibuat satu file terpisah agar tidak perlu menulis kode fungsi di tiap-tiap program. Misalnya kode pembelian barang berikut berisi kode yang ada di dalamnya fungsi yang dibutuhkan, didefinisikan dengan keyword “def”.

print(" ———Toko Amanah Jaya———")
def total(harga,jumlah):
	"""fungsi untuk menghitung Total bayar"""
	return harga*jumlah
def diskon(harga):
	""" fungsi menghitung diskon """
	if (harga >= 500000):
		potongan=harga*0.1
	else:
		potongan=harga*0.05
	return potongan
def bayar(harga,potongan):
	""" fungsi menghitung total bayar """
	return harga-potongan

#input data
harga= int(input("masukan harga barang: "))
jumlah= int(input("masukan jumlah baju yang dibeli: "))
Total=total(harga,jumlah)
potongan=diskon(Total)
tagihan=bayar(Total,potongan)
print("Total Harga = ", "Rp.",Total)
print("Diskon", "Rp.", potongan)
Bayar=int(input("Jumlah Nominal Uang =" ))
Kembalian= (Bayar-tagihan)
print("Uang Kembalian = ", "Rp.",Kembalian)

Bagaimana cara memindahkan fungsi tersebut ke file lain? Caranya mudah saja. Pertama cek dulu apakah program sudah berjalan sesuai dengan spesifikasinya. Jika sudah tidak ada masalah, tinggal “cut” saja dan buat file baru, di sini saya beri nama “diskon.py” dan letakan di folder yang sama. Jika dengan Google Colab, upload saja file tersebut di menu “upload file”. Untuk memanggil file tersebut gunakan instruksi “from” dan “import” di program utama berikut ini.

from diskon import total,diskon,bayar
print(" ———Toko Amanah Jaya———")
#input data
harga= int(input("masukan harga barang: "))
jumlah= int(input("masukan jumlah baju yang dibeli: "))
Total=total(harga,jumlah)
potongan=diskon(Total)
tagihan=bayar(Total,potongan)
print("Total Harga = ", "Rp.",Total)
print("Diskon", "Rp.", potongan)
Bayar=int(input("Jumlah Nominal Uang =" ))
Kembalian= (Bayar-tagihan)
print("Uang Kembalian = ", "Rp.",Kembalian)

Jalankan program dan pastikan berjalan seperti sebelumnya (tanpa file eksternal). Perhatikan juga penggunaan “if-else” pada python di file “diskon.py” tersebut.

Untuk jelasnya silahkan buka link youtube saya berikut ini.

Program Sederhana Python dengan Fungsi

[Hari|Matkul|Jur|Dosen: Rabu.29.04.2020|Logika-prt.7|AK|Rahmadya,PhD]

Jika pada pertemuan yang lalu program menggunakan input, proses dan output seperti biasa, pada pertemuan kali ini menggunakan sebuah fungsi. Setelah data diterima, fungsi dipanggil untuk memproses data tersebut. Hasilnya ditampilkan lewat perintah print.

print(" ———Toko Amanah Jaya———")
def total(harga,jumlah):
"""fungsi untuk menghitung Total bayar"""
return harga*jumlah
#input data
harga= int(input("masukan harga barang: "))
jumlah= int(input("masukan jumlah baju yang dibeli: "))
Total=total(harga,jumlah)
#diskon 5% tiap pembelian di atas Rp.100rb
if Total>100000:
Total=Total-0.05*Total
print("Total Harga = ", "Rp.",Total)
Bayar=int(input("Jumlah Nominal Uang =" ))
Kembalian= (Bayar-Total)
print("Uang Kembalian = ", "Rp.",Kembalian)

Baris kedua sampai keempat menunjukan fungsi perhitungan total yang harus dibayarkan. Kata kunci yang menyatakan sebuah fungsi adalah def dilanjutkan dengan tab segai indikator bahwa statemen tersebut adalah fungsi. Pada baris ke-10 dan ke-11 diperkenalkan cara menggunakan if untuk pengecekan kondisi tertentu, misalnya apa perlu diberi diskon atau tidak.

Untuk jelasnya dapat dilihat pada link berikut ini. Lihat postingan berikutnya tentang memanggil fungsi eksternal (file lain). Sekian, semoga bermanfaat.

Metaheuristic Optimization – Advanced

Metaheuristic pengertiannya telah sedikit diulas pada postingan yang lalu. Di sini sedikit diulas metode-metode yang dapat dikatakan advanced. Namun di sini advanced tidak serta-merta untuk tingkat lanjut melainkan sekedar memberitahukan metode-metode terbaru berdasarkan artikel-artikel jurnal yang sudah diterbitkan.

Metode heuristik terkini dapat diklasifikasikan berdasarkan aliran algoritma pencariannya, antara lain:

  • Mengambil inspirasi dari sifat-sifat alami (nature)
  • Mengambil inspirasi dari sifat-sifat fisika

Sifat-sifat yang diambil dari hukum alam telah banyak diteliti di metaheuristik, tetapi yang terkini dapat dirinci sebagai berikut:

  • PSO, bersasarkan sekolompok binatang dalam mencari makan
  • Dolphin     Echolocation (DE), berdasarkan teknik sonar yang dimiliki oleh lumba-lumba
  • Big Bang-Big Crunch (BB-BC), berdasarkan teori evolusi alam
  • Cuckoo Search (CS), berdasarkan sifat burung
  • Imperialist Competitive Algorithm (ICA)

Sementara itu ada algoritma-algoritma yang diambil dari sifat fisika, antara lain:

  • Charged System Search (CSS) dan Magnetic Charged System Search (MCSS), berdasarkan hukum Coulomb dan Newton
  • Colliding Bodies Optimization (CBO), berdasarkan tumbukan satu dimensi partikel
  • Ray Optimization (RO), berdasarkan hukum refraksi cahaya (snell)

Demikian kira-kira metode advanced metaheuristic yang bisa dibaca dari literatur-literatur baik jurnal maupun buku. Sekian informasinya, mudah-mudahan bisa dijelaskan lebih detil pada postingan berikutnya.

Mengambil File Microsoft Word dan Indexing Pada Matlab

[inf.retrievalt.komputer|lab.software|pert.9]

Salah satu langkah perolehan informasi yang penting adalah pembuatan indeks. Indeks merupakan salah satu kunci untuk pencarian informasi. Untuk menghasilkan pengindeks yang baik perlu menggunakan teknik-teknik yang ada pada pemrosesan teks. Postingan kali ini bermaksud mengetahui cara pembuatan indeks dengan file yang diambil dari microsoft word.

Mengambil File Ms Word

Banyak informasi yang memberikan cara bagaimana mengambil file word agar bisa diproses lebih lanjut pada Matlab. Biasanya file yang langsung bisa digunakan adalah file berekstensi txt, namun karena banyaknya file berformat DOC atau DOCX maka perlu mengetahui cara pengambilan file bertipe itu agar bisa diolah lebih lanjut pada Matlab. Agar lebih nyaman, ada baiknya membuat Graphic User Interface (GUI) agar lebih mudah digunakan atau disimpan agar mudah digunakan nantinya.

Masuk ke callback Ambil File dan isikan kode berikut menggunakan uigetfile yang mengeluarkan form ambil file. Akhiri dengan membuat variabel agar bisa digunakan nantinya lewat mekanisme handles.

  • [a,b]=uigetfile(‘*.docx’)
  • handles.a=a;
  • handles.b=b;
  • guidata(hObject,handles)

Sementara pada callback Pra-Proses diisi dengan kode-kode berikut dimulai dari mengambil data dari word:

  • word = actxserver(‘Word.Application’);
  • file=strcat(handles.b,handles.a)
  • wdoc = word.Documents.Open(file);
  • sometext = wdoc.Content.Text;

Variabel “file” merupakan string yang diambil dari instruksi “uigetfile” pada pushbutton sebelumnya yang kemudian disimpan dalam variabel sometext. (Lihat penjelasannya di buku Text Mining dengan Matlab karya Bachs).

  • temp = sometext
  • temp = lower(temp)
  • temp = regexprep(temp,'</verse>’,’ S ‘)
  • temp = regexprep(temp,'<.*?”‘,”)
  • temp= regexprep(temp,’ ‘,”’,”’)
  • temp = regexprep(temp,’\W’,’ ‘)
  • temp = strtrim(regexprep(temp,’\s*’,’ ‘))
  • temp=regexprep(temp,’ ‘,”’,”’)
  • eval([‘wordsofverses={”’,temp,”’};’]);
  • limits = [0,find(strcmp(wordsofverses,’S’))]
  • for k=1:length(limits)-1
  • verses(k).vocab = unique(wordsofverses(limits(k)+1:limits(k+1)-1));
  • end;

Variabel “temp” berisi hasil pemrosesan yang dimulai dari lower untuk mengecilkan seluruh huruf hingga mengkonversi string word tersebut menjadi cell dalam variabel wordsofverses. Hasilnya kira-kira sebagai berikut. Semoga bermanfaat.

Lex and Yacc via Konsol (DOS Prompt)

[t.kompilasi|t.informatika|s.103|pert.11]

Jika yang lalu telah dibahas membuat kompiler lewat GUI Lex and Yacc, terkadang perlu mencoba lewat mode console karena jika bisa dengan mode ini, akan mudah jika menggunakan versi linux-nya. Coba masuk ke folder Lex and yacc di folder Flex Windows. Untuk memastikan file lex and yacc lengkap coba ketik “yacc –help”. Jika muncul seperti gambar berikut berarti tersedia.

Siapkan dulu file lex dan yacc contoh misalnya calc.l yang tersedia sebagai latihan. Ketik:

yacc –d –y calc2.y

Instruksi di atas akan menghasilkan dua file yaitu y.tab.h dan y.tab.c yang masing-masing adalah berturut-turut file header dan file bahasa c (bukan c++). Untuk yang LINUX (dengan nama aplikasi bison) sepertinya tidak perlu menggunakan –y (langsung yacc –d calc2.y saja). Tekan “dir y.tab*.*” untuk melihat kedua file tersebut.

Jalankan instruksi berikutnya:

lex calc2.l

Pastikan muncul file baru lex.yy.c yang akan digunakan untuk compile dan linking sehingga dihasilkan output calc.exe. Di sini linking antara lex.yy.c dengan y.tab.c hasil yacc sebelumnya.

cc lex.yy.c y.tab.c –ocalc2.exe

Hasilnya adalah file calc2.exe yang jika dijalankan dengan mengetik “calc2.exe” pada command prompt akan dihasilkan kalkulator berikut. Ketik 1+2 dan ketika ditekan enter muncul angka 3.

Oiya, postingan ini sekedar menginformasikan teknik pembuatan kompiler lewat aplikasi lex and yacc mode konsol yang biasanya jika menggunakan linux. Untuk yang dengan GUI lebih mudah lagi. Selamat mencoba.

Membuat Sebuah Interpreter dengan Lex and Yacc

[t.kompilasi|t.informatika|s.103|pert.10]

Jika pada pertemuan yang lalu dibahas bagaimana cara membuat kompiler yang berisi persamaan matematis dengan satu variabel keluaran, misal variabel x maka pada pertemuan kali ini akan diilustrasikan bagaimana membuat interpreter (yang berisi eksekusi baris-perbaris). Saat ini interpreter paling banyak digunakan mengingat aplikasi berbasis web yang paling banyak digunakan, misalnya php yang menerapkan prinsip interpreter.

Tutorial Lex and Yacc

Software Lex and Yacc memanfaatkan fasilitas yang dimiliki bahasa pemrograman c++. Hasilnya adalah sebuah kompiler baru yang sesuai dengan keinginan programmer. Untuk tutorial dapat dilihat di situs resminya yang disertai juga dengan contoh kode program yang akan digunakan pada postingan kali ini.

File-File yang Dibutuhkan

Seperti biasa file berekstensi *.l dan *.y diperlukan. Masing-masing berfungsi sebagai lexical generator (lex) dan semantic (yacc). Untuk sampel (silahkan unduh di sini), dua file utama adalah calc3.l dan calc3.y diperlukan selain satu buah file header, calc3.h. Ada satu buah file tambahan untuk interpreter (calc3a.c) yang menjalankan satu listing kalang/loop “while” sementara dua lainnya (calc3b.c dan calc3g.c). Lakukan proses kompilasi dan build pada calc3.l dan calc3.y.

Bagaimana cara menggunakan calc3a.c yang berfungsi sebagai interpreter? Tidak ada penjelasan detil pada situs resminya, sementara saya mengkopi isi dari calc3a.c di bawah instruksi “Include …” dan diletakan di bagian bawah calc3.y sebelum mengkompilasi file tersebut (akan menghasilkan y.tab.c dan y.tab.h). Jalankan file exe hasil build lex+yacc hingga menghasilkan interpreter di bawah. Untuk yang compiler dan graph sepertinya butuh penjelasan yang lebih rinci lagi di postingan yang akan datang.

 

Praktek Longest Common Subsequence (LCS) dengan C++ Online

[algoritma|t.informatika|r.408|pert.11]

Longest Common Subsequence (LCS) merupakan rentetan string dari dua string yang dibandingkan. Misalnya string1: a-b-d-a-c-e dan string2: b-a-b-c-e.

Di sini b-a-c-e merupakan LCS. String a tidak boleh dengan a pada string 1 karena berbenturan dengan koneksi b-b antara string 1 dan string 2. Salah satu metode yang efisien adalah dengan pemrograman dinamis dengan cara:

  • Membuat tabel
  • Mengekstrak LCS

Tabel berisi arah panah (kiri, atas, atau diagonal) disertai nilai tertentu yang gunanya untuk mengekstrak LCS.

Dari tabel diketahui LCS yang berwarna pink yaitu b-a-c-e.

Implementasi Dalam Bentuk Program

Banyak situs-situs ok yang menyediakan kode sumber untuk algoritma mencari LCS lewat pemrograman dinamis. Untungnya juga banyak situs-situs yang menyediakan compiler beberapa bahasa pemrograman, misalnya bahasa C++. Jadi tidak perlu khawatir jika di komputer tidak terinstal kompiler C++. Bahkan bisa dijalankan lewat handphone. Situs yang jalan untuk kode program sampel berikut adalah onlinegdb. Hapus semua lembar kerjanya (berisi contoh program mengeprint: “hello word”) copy dan paste kode berikut:

Program tersebut mencontohkan mencari LCS dari dua string AGGTAB dan GXTXAYB yang menghasilkan string LCS: GTAB. Tekan tombol RUN dan lihat hasilnya di bagian bawah jendela onlinegdb. Atau ganti dengan contoh di atas Char X[]=”ABDACE” dan Char Y[]=”BABCE” yang hasilnya berikut:

Untuk mengetahui prinsip kerja dasarnya dapat dilihat di video sederhana berikut. Sekian semoga bermanfaat.

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];
  • %}

Pemrograman Dinamis – Konsep Memoization

[algoritma|tek.inf|r408|pert.8]

Salah satu materi algoritma standar adalah pemrograman dinamis (Dynamic Programming). Walaupun ada kata “programming”-nya ternyata tidak ada hubungannya dengan kode/script. Ternyata istilah pemrogramannya karena teknik yang biasanya digunakan untuk optimalisasi ini memanggil suatu fungsi diri sendiri (rekursif) sebelum menentukan hasil-hasil yang optimal. Optimal di sini bisa maksimal atau minimal.

Pemotongan Batang (Rod Cutting)

Kasus ini contoh proses pemotongan bilah batang panjang agar dihasilkan margin keuntungan yang optimal. Misalnya batang baja sepanjang 10 inchi yang akan dipotong dengan potongan kelipatan 1 inchi.

Kombinasi dari ukuran potongan ternyata sangat menentukan keuntungan berdasarkan harga per potongnya. Misal, untuk baja sepanjang 4 inchi memiliki keuntungan dengan komposisi dua buah batang berukuran 2 inchi.

Selain dua buah potongan berukuran 2 inchi, panjang potongan menghasilkan harga 4, 7, dan 9. Sementara dua buah potongan 2 inchi menghasilkan harga 10 (tentu saja ini kasus bagi penjual, kalau pembeli tentu lebih menguntungkan beli potongan-potongan kecil satu inchi).

Memoization

Istilah ini saya fikir salah tulis, harusnya memorization, ternyata tidak. Istilah ini berasal dari kata “memo”, yaitu secarik surat/infor singkat. Misal untuk tiap-tiap panjang bilah akan dihasilkan nilai optimal sebagai berikut:

Perhatingan untuk baja sepanjang 1 sampai 3 inchi, optimalnya adalah tanpa dipotong, masing-masing berharga $1, $5, dan $8. Baja 2 in ada dua kemungkinan yaitu 1+1 atau 2 in tanpa dipotong. Karena 1in+1in menghasilkan hanya $2 maka yang dipilih 2 in tanpa dipotong, yaitu $5. Untuk baja berukuran 4 in ada beberapa kemungkinan seperti gambar batangan di atas dan dihitung semua kemungkinannya hingga diperoleh maksimal adalah dua potongan @2in. Pseucode-nya sebagai berikut:

Keterangan: baris ke-4 sampai 6 menghitung komposisi potongan baja. Misal untuk i=1, maka akan dicari maksimal dari 1 dan (n-1)-nya. Jika batang 4 in, maka 1 dan 3, berikutnya 2 dan 2 (dari n-2) dan seterusnya. Untuk kasus contoh di atas diperoleh nilai maks 10 (ketika i=2 dan satu potongan lainnya 2 in juga).

Karena potongan 2in sudah dihitung dari sebelumnya (batang ukuran 2in) maka ketika menghitung 4in tidak perlu menghitung kembali yang 2in hanya menggunakan riwayat yang lalu, alias dari “memo” sebelumnya. Di sinilah muncul istilah memoization, atau dalam bahasa Indonesianya mungkin memoisasi.

Top Down Memoization

Dengan rekursif, beberapa perhitungan dihitung berulang kali sehingga tidak efisien (naif). Oleh karena itulah pemrograman dinamis diterapkan untuk menggantikan proses rekursif berulang tersebut. Jadi sekali telah dihitung, maka jika akan menghitung proses yang sama hanya me-ngintip (lookup) hasil perhitungan yang lampau.

Untuk dengan memoization, ditambahkan arrah yang berisi nilai yang sudah dihitung dengan suatu routine yang disebut helper “Memouzed-Cut-Rod-Aux” (simbol minus tak hingga artinya unknown dan perlu dihitung):

Baris 1-3 mengecek apakah nilai sudah ada di array hasil perhitungan atau tidak. Jika tidak ada (else) masuk ke q yang unkhown (minus tak hingga) dengan baris 7 yang berisi maksimal komposisi-komposisi yang maksimal. Hanya saja di sini rekursif yang bekerja dengan mengecek hasil hitungan sebelumnya jika sudah ada di array hasil, langsung mengkopi saja tidak perlu menghitung lagi nilai r-nya (lihat r1 sampai r10 di contoh paling atas postingan ini untuk batang sepanjang 10 in).

Buttom Up Memoization

Teknik buttom up lebih sederhana karena tidak membutuhkan mekanisme rekursif, hanya dengan menghitung maksimal potongan-potongan dari terkecil hingga terbesarnya.

Keterangan: Seperti biasa array hasil dipersiapkan. Variabel j merupakan hasil optimal komposisi potongan yang bergerak dari kombinasi i dengan pasangannya. Misal ketika j=4 maka i bergerak dari i=1 dan r(3) mana yang lebih maksimal dibanding komposisi lainnya misal i=2 dan r(2), dan seterusnya. Baik buttom up ataupun top down memiliki running time yang kuadratik. Sekian, semoga bermanfaat.

Referensi:

Cormen, dkk. “intro to algorithms”, MIT Press: 2009.

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.

 

Â