Category Archives: Uncategorized

Mencoba Bahasa Dart dan SDK Flutter

Posting ini akan membahas pengalaman singkat saya memakai bahasa pemrograman Dart dan Software Development Kit (SDK) Flutter di sebuah proyek kecil. Flutter merupakan SDK pembuatan user interface (UI) yang membuat Dart jadi dikenal untuk UI Development. Ini seperti seperti Rails yang membuat Ruby jadi terkenal untuk web development (Ruby on Rails).

Dart programming language

Saya akan bahas sedikit mengenai sejarah bahasa Dart ini supaya jelas bahwa: bahasa ini bukan bahasa baru, dibuat perusahaan besar (Google), memiliki standard resmi (ECMA), dan sudah memiliki sejarah cukup panjang.

Sejarah Dart

Bahasa pemrograman Dart diumumkan Google sejak 2011 dan dirilis publik tahun 2013. Tadinya bahasa ini dikembangkan untuk web browser untuk menyaingi Java Script. Awalnya ada kabar bahwa Virtual Machine untuk Dart akan dimasukkan Chrome, tapi rencananya berubah: Dart ditranslasikan (transcompile) saja ke JavaScript, jadi tidak ada VM khusus Dart dalam browser.

Bahasa Dart ini sempat distandardkan dalam ECMA standard 408 tahun 2014, tapi tahun 2018 bahasanya diubah dengan rilis 2.0 sehingga tidak sepenuhnya kompatibel lagi dengan versi sebelumnya. Spesifikasi terbaru saat ini bisa dilihat di sini. Tapi JavaScript juga terus berubah, plus masih ada saingan bahasa lain yang ditranslasikan ke JavaScript (misalnya TypeScript, CoffeeScript, dsb) jadi Dart kurang menonjol.

Selain Dart, Google juga memiliki bahasa lain yang lebih populer: Go. Selama beberapa tahun nasib dan tujuan Dart ini menurut saya kurang jelas, sampai ketika tahun 2015 Flutter diumumkan.

Bahasa Dart

Bahasa Dart ini menurut saya cukup normal, tidak memiliki konsep yang sangat aneh. Menurut saya ini bagus karena beralih dari berbagai bahasa ke Dart tidak sulit.: “the Dart language aims to be unsurprising“. Contoh sederhana hello world seperti ini:

main()
{
       print("hello world");
}

Berbagai konstruksi standar bahasa Dart mirip dengan bahaca lain yang C-like. Misalnya:

  • komentar seperti C/C++: /*block comment*/ dan //line comment
  • sintaks if adalah: if (x) { /*aksi*/ } else { /*aksi lain*/)
  • sintaks for loop: for (int i=0; i < 10; i++) {/* aksi */}
  • sintaks while loop: while(kondisi) { /*aksi*/} atau do { /*aksi*/} while (kondisi)

Sintaks OOP-nya juga tidak terlalu jauh dari bahasa C++/Java/C#. Berbagai konsep dari bahasa modern, misalnya mixin, nullable type, null safety, named parameter, async, dsb juga ada di Dart. Ringkasannya: beralih dari bahasa lain ke Dart ini cukup mudah.

Flutter

Flutter adalah SDK yang untuk membuat aplikasi GUI di Android, iOS, Windows, Linux, Web dan Google Fuschia dari satu kode Dart. Flutter juga memungkinkan kita melakukan “live editing“, jadi begitu kode diubah dan disimpan, user interface juga langsung terupdate. Flutter ini diklaim mampu menampilkan user interface 120fps dengan mudah.

Setelah beberapa tahun sejak diumumkan, akhir tahun 2018, Flutter versi 1.0 dirilis. Tapi ternyata sampai saat ini menurut saya Flutter masih belum matang. Masih banyak breaking changes yang muncul. Ini artinya kode yang Anda tulis sekarang mungkin tidak jalan di versi berikutnya.

Kebetulan ada proyek yang saya kerjakan yang membolehkan saya menggunakan Flutter. Ini sekedar proyek Proof Of Concept, jadi nanti bisa ditulis ulang ke bahasa lain. Salah satu alasan kenapa sebuah perusahaan memilih atau menolak bahasa atau teknologi tertentu adalah: takut tidak ada yang bisa meneruskan.

Aplikasi yang saya buat sederhana, memanfaatkan kamera dan Firebase Machine Learning (Firebase ML). Firebase ML adalah bagian dari platform Firebase untuk memudahkan pemakaian machine learning di aplikasi mobile. Contohnya: kita bisa mendeteksi sebuah wajah, dan mendeteksi apakah sedang tersenyum.

Hal-hal yang sudah bagus

Bahasa Dart cukup menyenangkan dan mudah dipakai. Seperti tujuan designnya, bahasa ini dirancang agar tidak mengejutkan dan menurut saya cukup berhasil. Saya tidak punya keluhan khusus di bahasa Dart-nya sendiri.

Flutter sudah didukung oleh Visual Studio Code dengan baik. Instruksi untuk mulai menggunakan Flutter sangat jelas dan saya bisa membuat Hello World dengan cepat. Untuk target Android, Android Studio juga sudah mendukung Flutter dengan baik. Ada tool command line “flutter doctor” yang bisa membantu mendeteksi beberapa masalah dasar.

Library Dart masih sedikit

Beberapa bahasa dianggap terbaik untuk teknologi tertentu karena ketersediaan librarynya. Contoh: Python dianggap terbaik untuk Machine Learning karena sudah ada banyak library Machine Learning tersedia. Jumlah library Dart/Flutter masih sedikit dibandingkan bahasa lain. Library Dart adalah library yang terpakai untuk Dart dan Flutter, sedangkan library Flutter untuk Flutter saja.

Jika dilihat sekilas, memang sepertinya banyak library Dart/Flutter sudah ada, tapi baru terasa ketika membangun aplikasi tertentu. Kadang librarynya sudah ada, tapi fungsi tertentu tidak tersedia.

Kadang sebuah library hanya berjalan untuk versi OS tertentu saja. Plugin resmi juga sifatnya sebagian masih beta, misalnya WebView dan In App Purchase. Kadang library memiliki bug yang lama belum diperbaiki, misalnya di iOS camera memiliki memory leak sejak 2018.

Perlu dicatat bahwa untuk berbagai aplikasi sederhana, library yang tersedia sudah cukup. Aplikasi yang sekedar memakai form yang tidak terlalu kompleks, mengirim data ke web mudah dibuat dan bisa dibuat lebih cepat dibandingkan memakai teknologi lain.

Flutter Masih berkembang

Sistem plugin flutter untuk Android belum lama ini diupdate (Desember 2019), jadi beberapa plugin versi lama tidak berjalan atau memiliki warning. Untuk yang masih berjalanpun, tidak cepat updatenya ke versi terbaru. Saya juga sempat mendapati masalah dengan contoh dari github yang ternyata masih memakai versi plugin lama dan dicampur dengan plugin lain yang memakai library baru.

Semoga saja tidak ada update penting lagi dari Flutter/Dart, karena jika sering ada update maka semakin banyak plugin yang tidak berjalan. Secara umum ini adalah masalah teknologi baru: masih banyak perubahan yang membuat kode lama menjadi tidak berjalan.

Dart kurang cepat

Dibandingkan C, Dart masih puluhan kali atau ratusan kali lebih lambat lebih lambat. Contohnya jika kita ingin memproses gambar dalam Dart, hasilnya akan butuh beberapa detik. Jadi untuk pemrosesan tingkat rendah, sebaiknya memakai plugin atau kode dalam bahasa C.

Dalam kasus aplikasi kecil saya: stream data dari kamera formatnya adalah YUV, sedangkan image library untuk mengencode JPG/PNG perlu input dalam format RGB. Sudah ada yang memberikan kode ini dalam Dart, tapi memproses jutaan piksel ternyata lambat. Supaya cepat, kita harus memanggil kode dalam C.

Komentar: https://github.com/flutter/flutter/issues/26348#issuecomment-617266911

Ini kasus yang nyata dan penting. Contohnya adalah Issue ini di github yang masih aktif dari awal tahun hingga saat ini: https://github.com/flutter/flutter/issues/26348. Untuk pemrosesan di sisi server yang tidak butuh interaktif, 4 detik mungkin cepat, tapi jika tiap kali mengambil foto kamera berhenti selama 4 detik, maka ini akan membuat pengguna kesal.

Foreign Function Interface (FFI) di Dart masih Beta

Jika sebuah bahasa tidak memiliki library atau fitur untuk melakukan sesuatu, maka biasanya kita perlu memakai library dari bahasa lain. Ada banyak cara untuk melakukan ini, misalnya dengan plugin, tapi cara lain adalah dengan FFI (foreign function interface). Intinya kita ingin menulis dalam bahasa tertentu (biasanya C) lalu dipanggil langsung dengan Dart. FFI ini juga kadang dipakai jika Dart terlalu lambat melakukan hal tertentu.

Masalahnya fitur FFI di Dart masih beta, dan tidak bisa dipakai di Dart rilis stabil terbaru. Dalam kasus github yang saya sebutkan sebelumnya: proses yang lambat (butuh beberapa detik dalam dart) bisa selesai dalam hitungan miliseconds di C. Selain itu masih ada kemungkinan berubah:

As of Dart 2.7, dart:ffi is in beta, and breaking API changes might still happen. If you’re developing a Flutter app, you can get access to dart:ffi by using the Flutter dev channel, as described in the Flutter dart:ffi page.

https://dart.dev/guides/libraries/c-interop

Digabungkan dengan beberapa hal di atas, ini jadi masalah yang cukup serius:

  • Ingin memakai plugin tertentu: ternyata belum ada atau belum diupdate
  • Ingin diimplementasikan dalam Dart, tapi ternyata tidak cukup cepat
  • Ingin memakai kode C: tapi FFI tidak bisa jika tidak memakai versi beta

Library kurang cepat diupdate

Saya berharap library Firebase dari Google untuk Flutter cepat diupdate karena Firebase ini adalah produk Google dan Flutter juga produk Google, tapi ternyata tidak demikian. Flutter ini masih dinomorduakan oleh Google dibandingkan yang lain.

Di awal Juni 2020 Ada update Firebase untuk memisahkan bagian AI offline dari yang online di Firebase, tapi sampai saat ini (akhir Juni) belum juga library flutter di update setelah hampir sebulan.

Penutup

Saya berharap Google lebih memperhatikan Flutter lagi. Untuk sistem operasi Google Fuschia, Google akan perlu bahasa yang cocok untuk development aplikasi GUI. Bahasa Go kurang cocok karena sifatnya yang harus dikompilasi (walau kompilasi cukup cepat), sedangkan Google selalu memliki masalah dengan lisensi Java dengan Oracle (dan Kotlin masih sangat erat dengan Java).

Untuk pengembangan cross platform, masih banyak teknologi cross platform lain yang lebih matang (seperti misalnya React Native atau bahkan Cordova). Tapi Flutter ini menurut saya sangat menarik dan developmentnya cukup fun. Jika perkembangannya lancar, mungkin ini bisa jadi bahasa pilihan untuk pembuatan aplikasi GUI.

Mengenal Bahasa Pemrograman Forth

Di posting ini saya ingin memperkenalkan bahasa pemrograman Forth. Bahasa Forth sudah ada selama 50 tahun dan cukup menarik walaupun saat ini sudah cukup jarang dipakai. Forth memakai notasi postfix, berbasis stack, dan merupakan contoh dari concatenative programming language.

Forth merupakan bahasa yang sangat sederhana dan dapat diimplementasikan di sistem dengan spesifikasi sangat rendah, bahkan juga di microcontroller. Biasanya Forth bisa diprogram secara interaktif (analoginya seperti berada di shell Python/Ruby), tapi bisa juga dikompilasi.

Sifat interaktif Forth ini seperti berbagai bahasa tingkat tinggi. Di sisi lain Forth bisa mengakses mesin secara low level dan tidak memiliki struktur data yang rumit (misalnya hash atau list),hanya dapat mengatur blok memori secara low level (seperti C). Jadi Forth berada antara bahasa tingkat tinggi dan tingkat rendah.

Di mana Forth dipakai?

Dari puluhan ribu bahasa pemrograman di dunia ini, tidak banyak bahasa pemrograman yang memiliki standard ISO, Forth merupakan salah satu bahasa yang memiliki standard ISO. Beberapa contoh bahasa dengan standar ISO adalah: JavaScript, Ruby, SQL, Pascal, C, dan C++, sementara Python, Go, Dart dsb tidak/belum punya standar ISO. Adanya standar sebuah bahasa biasanya membuat bahasa tersebut dapat dipakai di berbagai proyek yang memiliki spesifikasi sangat ketat (misalnya proyek NASA).

Di masa kejayaannya ada banyak sekali program yang ditulis dalam Forth untuk berbagai aplikasi ruang angkasa, misalnya pesawat ruang angkasa Philae yang mendarat di komet. Banyak proyek Forth yang bisa dilihat di sini.  Sebelum Apple beralih ke Intel, komputer Apple memakai Open firmware (seperti BIOS di PC) yang menggunakan Forth.

Saat ini saya belum menemukan daftar terbaru di mana Forth masih dipakai secara komersial atau dalam skala besar. Namun demikian, saya melihat masih banyak proyek open source yang aktif untuk microcontroller dan proyek IOT.

Interpreter/Compiler Forth

Saat ini ada banyak implementasi Forth untuk berbagai sistem baik komersial maupun open source. Untuk implementasi open source, daftar yang cukup lengkap bisa dilihat di Github. Awalnya Forth dirancang untuk berjalan di komputer tanpa operating system, jadi mungkin ada beberapa konsep yang agak membingungkan atau agak aneh jika dilihat dari kacamata sistem operasi saat ini.

Salah satu demo Gforth di Android

Pada artikel ini saya akan menggunakan Gforth yang dapat berjalan di Windows/Linux/OS X dan juga di Android. Saya juga akan membahas sedikit Forth untuk embedded system.

Jika Anda ingin mencoba versi Android, setelah instalasi, pergi ke settings untuk mengaktifkan permision “Storage”. Tanpa permission ini GForth tidak bisa mengekstrak contoh program ke /sdcard/gforth.

Aktifkan permission storage

Hello World

Bentuk hello world sederhana dengan gforth seperti ini.

." Hello World" cr

Perhatikan bawah tidak ada spasi antara . (titik) dan ” (petik), lalu ada spasi sebelum Hello (ini sangat penting ketika mencoba contoh tersebut). Contoh Hello World kurang menunjukkan keunikan Forth, jadi untuk contoh berikut, saya menggunakan mode interaktif Gforth untuk operasi matematika.

Untuk menambahkan dua buah angka dan mencetak hasilnya:

3 4 + .

Dalam contoh di atas, yang terjadi adalah: 3 akan dipush ke stack, 4 akan dipush ke stack, + (plus) akan mengambil 2 angka di stack dan menjumlahkan keduanya dan menaruh hasilnya di stack, . (titik) akan mengambil angka dari stack dan mencetak di layar.

Agar outputnya terlihat terpisah dari baris lain, kita bisa menambahkan cr, seperti ini (akhiri ini dengan menekan ENTER):

cr 3 4 + .

Forth memakai istilah “word” untuk semua simbol dan bilangan yang diparse oleh interpreter/compiler. Di posting ini saya tidak akan menerjemahkan “word” sebagai “kata”, supaya tidak bingung ketika membaca dokumentasi Forth.

Secara umum interpreter Forth bekerja seperti ini: interpreter akan memecah input menjadi word dan menjalankan aksi dari tiap word. Semua simbol dan bilangan yang dipisahkan spasi/enter dianggap sebagai satu word (jadi “123” adalah 1 word, “.” adalah satu word).

Aksi untuk word yang bisa dikonversi mernjadi bilangan adalah memasukkan (push) bilangan ke stack, aksi untuk operasi matematika adalah mengambil isi 2 elemen stack teratas, melakukan operasinya dan menaruh hasilnya di stack. Implementasi Forth ada yang case sensitive dan ada yang tidak. GForth merupakan contoh yang tidak, jadi besar kecil dianggap sama. Dalam Standard Forth, semua word standar harus dalam UPPERCASE.

Operasi matematika ini: (2 + 3) * 5 bisa dituliskan di forth seperti ini:

2 3 + 5 *

Sebagian orang sangat menyukai notasi postfix ini dan dulu ada banyak kalkulator yang memakai Reverse Polish Notation (RPN), bahkan semua kalkulator dari Hewlett Packard versi awal memakai notasi RPN.  Meskipun aneh, tapi notasi seperti ini hemat menekan tombol tidak butuh kurung untuk presedensi operator (seperti pada contoh di atas).

Bagaimana kita tahu apa saja yang ada di stack? kita bisa menginspeksi stack dengan word “.S”, ini akan memprint isi stack, contohnya

1 2 3 .S \ ada 3 isi stack; 1 2 3

Perhatikan backslash  adalah cara untuk membuat komentar (perlu diikuti spasi karena backslash adalah sebuah word) dan saya pakai untuk menjelaskan jadi jika ingin mengikuti contohnya di interpreter abaikan \ dan seterusnya. Untuk contoh di atas, cukup ketik:

1 2 3 .S

Jika kita jumlahkan dua isi stack teratas (2 dan 3) dengan +, lalu kita print lagi isi stacknya:

1 2 3 .S \ isi stack: 1 2 3
+ .S \ isi stack: 1 5

Top of stack menjadi 5.

Di interpreter Forth yang lain ada yang langsung mencetak isi stack di prompt (misalnya PunyForth), jadi kita tidak perlu melakukan apapun.

Ada banyak word yang mengoperasikan stack. Dalam dokumentasi  biasanya operasi dituliskan dalam bentuk komentar kurung buka ‘(‘ isi komentar lalu kurung tutup ‘)’.Komentar akan berisi stack sebelum dan sesudah word tersebut. Contohnya DUP untuk menduplikasi top of stack. Jika tadinya isi stack adalah A maka akan menjadi 2 yaitu A A. Di dokumentasi akan ditulis seperti ini:

DUP ( a -- a a)

Contoh lain, dokumentasi SWAP adalah seperti ini:

SWAP ( a b -- b a )

Dan OVER seperti ini:

OVER ( a b -- a b a )

Ada beberapa word di Forth yang sifatnya khusus, karena tidak mengoperasikan stack atau langsung dieksekusi, tapi akan melihat pada word berikutnya sampai batas tertentu. Kita mulai dari word pertama yang sifatnya khusus yaitu : (titik dua) untuk mendefinisikan word baru sampai ;

Contohnya kita ingin membuat word baru: tambahtujuh yang akan menambahkan 7 pada sebuah bilangan:

: tambahtujuh 7 + ;

Sekarang kita bisa melakukan ini

5 tambahtujuh .

dan hasilnya adalah 12. Untuk Anda yang penasaran dengan implementasi low level: Forth memiliki beberapa stack. Stack untuk data berbeda dengan stack yang dipakai untuk pemanggilan word (subrutin).

Di Forth, programmer mendefinisikan banyak word baru. Ini seperti subrutine/prosedur di sebuah bahasa. Setiap word hanya melakukan sedikit aksi. Dengan membuat word baru berdasarkan word sebelumnya, maka kita bisa membuat program yang terstruktur. Bisa dilihat bahwa di sini pendekatannya adalah bottom up.

Word : (titik dua) merupakan “defining word” dan kadang disebut juga “parsing word”, karena tidak seperti word biasa, word ini akan melihat pada input berikutnya, tidak hanya melihat stack dan mengeksekusi berdasarkan stack. Contoh defining word yang lain adalah adalah VARIABLE.

VARIABLE tanggal \ tanggal adalah variabel
12 tanggal ! \ set nilai tanggal menjadi 12
tanggal @ . \ akses variabel tanggal dan masukkan isinya ke stack, lalu print isi stack
tanggal ? \ langsung print isi variabel tanggal
7 tanggal +! \ tambahkan 7 ke nilai tanggal
tanggal ? \ sekarang tanggal menjadi 19

Konstanta juga bisa didefinisikan dengan CONSTANT.

144 CONSTANT LIMIT \ LIMIT nilainya 144

Loop yang diketahui batasnya bisa dibuat dengan

   FORMULA:
           limit index DO ... LOOP

Contoh untuk memprint kata “Bebek” 10 kali

: 10BEBEK 10 0 DO ." Bebek " CR LOOP ;
10BEBEK

Ada word bernama I (huruf i kapital) yang dipakai untuk menyalin isi stack untuk loop ke stack saat ini.

: 10BEBEK 10 0 DO I . ." Bebek " CR LOOP ; ok
10BEBEK

Jika kita mendefinisikan ulang word yang sudah ada, maka definisi terkhir yang dipakai, tapi definisi awal tidak dibuang.

Tentunya tidak semua hal bisa dikerjakan hanya dengan operasi stack. Forth juga memiliki control flow seperti IF dan LOOP. Bentuk IF di FORTH sintaksnya agak aneh dan tidak seperti di bahasa lain. Bentuknya adalah KONDISI IF AKSI THEN. Perlu diperhatikan bahwa menurut standar Forth semua control flow harus dimasukkan ke dalam definisi word

200 CONSTANT LIMIT 
: lewatbatas LIMIT > IF cr ." Lewat batas" cr THEN ;

Untuk conditional loop kita bisa memakai BEGIN UNTIL jika pemeriksaan dilakukan di akhir aksi (seperti do while{}), atau BEGIN WHILE REPEAT jika pemeriksaan dilakukan di awal (seperti while () {} ). Jika kita ingin menghentikan loop di tengah (break), kita bisa menggunakan  LEAVE.

Berikut ini contoh sederhana dalam satu baris

: bebek 0 counter ! BEGIN counter ? ." Bebek" cr  1 counter +! counter @ 10 > UNTIL ; 

Tapi itu sulit dibaca, jadi biasanya ini akan dituliskan dengan banyak word supaya lebih jelas. Word pertama “reset” untuk mengeset counter menjadi 0, word “full?” akan mengecek apakah counter sudah bernilai lebih dari 10, word “next” akan menambah counter dengan 1.

VARIABLE counter 
: reset 0 counter ! ;
: full? counter @ 10 > ;
: next 1 counter +! ;
: bebek reset BEGIN counter ? ." Bebek" cr next full? UNTIL ;

Literal string  didefinisikan dengan S”, seperti ini S" hello world" dan dicetak dengan type. Sebagai shortcut, kita bisa memakai ." string" untuk mencetak string langsung ke layar.

Kita bisa melihat definisi suatu word dengan “SEE”.

SEE lewatbatas 
: lewatbatas 200 > IF cr .\" Lewat batas" cr THEN ; ok

Yang menarik, pada gforth andaikan kodenya diimplementasikan dalam bahasa mesin, maka bahasa assemblynya akan ditampilkan.

Struktur Data

Saya tidak akan membahas panjang mengenai struktur data di Forth, karena Forth hanya memiliki primitif semacam malloc di C, dan sisanya adalah implementasi oleh programmer.

Forth bekerja dalam satuan CELL. Ukuran satu sel tergantung implementasi, tapi di Standar Forth ditentukan minimal 16 bit. Masalahnya tidak semua tipe data muat dalam 1 sel (misalnya tipe data double butuh 8 byte sedangkan integer 32 bit hanya butuh 4 byte), jadi kadang di Forth kita perlu mengoperasikan sepasang nilai di stack. Segala operasi ini dilakukan dengan Word yang berawalan dengan angka 2, misalnya 2DUP.

Word yang dipakai untuk mengalokasikan memori adalah ALLOT. Setelah memori dialokasikan, maka isinya bisa diakses dengan operasi aritmatika terhadap pointer (seperti di C). Contohnya untuk mengalokasikan Array 4 sel, lalu mengisi sel kedua dengan nilai 5:

VARIABLE a 4 CELLS ALLOT
5 a 1 CELLS + !

Ini mirip di C jika kita menggunakan aritmatika pointer.

a = (int*)malloc(4);
*(a+1) = 5;

Forth untuk embedded system

Karena Forth bisa berjalan langsung di microcontroller — termasuk juga mode interaktifnya — maka Forth memudahkan prototyping. Jika menggunakan C maka kita harus menulis program di desktop, mengcompile programnya (bisa beberapa detik hingga puluhan detik), mentransfer ke microcontroller dan melihat hasilnya. Dengan interpreter interaktif di microcontroller, maka kita bisa langsung menggunakan serial port dan langsung memprogram.

Sebagai catatan, kenyamanan ini dirasakan banyak orang sehingga sekarang ini sudah ada beberapa proyek untuk menjalankan bahasa yang lebih “modern” seperti Lua, Python dan bahkan JavaScript di berbagai microcontroller yang memiliki RAM besar. Tapi dari pengalaman saya, berbagai implementasi yang saya coba cukup lambat karena tidak dirancang dari awal untuk berjalan di embedded system. Bahasa-bahasa tersebut juga tidak dapat dijalankan di sistem yang RAM-nya sangat kecil (misalnya Forth untuk STM8S bisa berjalan dengan RAM satu kilobyte).

Wemos D1 Mini

Jika ingin mencoba Forth di embedded system, mungkin saat ini yang paling mudah dan murah adalah ESP8266, versi Wemos D1 hanya 2.75 USD dan hanya perlu kabel micro USB untuk koneksi ke komputer. Proses memasukkan interpreter Forth dan melakukan koneksi serial tidak perlu hardware lain.

Board STM8S

Board yang paling murah dan bisa menjalankan Forth setahu saya adalah STM8S yang harganya kurang dari 1 USD (termurah saat ini 0.86 USD, harga satuan, sudah termasuk ongkir dari China, bisa lebih murah jika beli banyak). Meskipun paling murah, tapi untuk memasukkan interpreter Forth kali pertama perlu memakai ST-LINK (Sekitar 2 USD) dan untuk memprogram secara interaktif butuh USB to Serial (1 USD). Setelah program berjalan, kedua hardware tersebut tidak dibutuhkan lagi. STM8 eForth bahkan mendukung background task di microcontroller ini.

Penutup

Artikel ini hanya memperkenalkan “kulitnya” Forth saja, banyak hal yang tidak saya jelaskan. Jika Anda ingin membaca lebih lanjut, ada banyak resource di Internet, misalnya bisa mulai dari ini:

 
Bahkan standard Forth juga bisa dibaca. Versi Draftnya (yang katanya 99.9% sama dengan versi finalnya) bisa dibaca di sini. Isi standarnya cukup ringkas, hanya penjelasan word yang termasuk dalam standar yang membuat dokumennya menjadi panjang.

Sebagai tambahan juga, saya menemukan ada juga seseorang di Indonesia yang memakai Forth untuk produknya: https://telinks.wordpress.com/.

Manipulasi bit bagian 4: ekstraksi bit

Ekstraksi bit adalah proses pengambilan satu atau lebih bit dari sebuah bilangan. Saya contohkan dulu dalam sistem desimal sebelum masuk ke sistem biner.

Waktu kuliah, NIM saya adalah 13598054. Angka ini sebagai desimal bisa dibaca menjadi tiga belas juta lima ratus sembilan puluh delapan ribu lima puluh empat. Tapi. NIM itu bukan untuk dibaca sebagai bilangan, NIM itu dibentuk dari kode: 1 adalah jenjang (1=s1, 2=s2, 3=s3) kode 35 adalah jurusan (informatika), 98 adalah tahun masuk dan 054 adalah nomor urut saya. Dengan mengekstraksi digit desimal maka kita bisa mendapatkan makna baru dari sebuah bilangan.

Bagaimana cara mengekstraksi bagian jurusan (35) dari angka tersebut? Dengan manipulasi string, kita bisa melakukannya dengan substr/substring/fungsi sejenis. Tapi konversi ke string tidak efisien. Operasi aritmatika bisa digunakan untuk ekstraksi 2 digit jurusan.

Pertama kita bisa menggeser semua digit tahun masuk dan nomor urut (5 angka), dengan shift right 5 digit alias membagi dengan 100000 dibulatkan ke bawah. Hasilnya adlah 135. Setelah itu kita bisa menggunakan modulus 100 untuk mendapatkan angka 35.

Dalam biner, hal yang sama bisa kita lakukan. Misalnya kita ingin menyimpan tanggal (1-31) bulan (1-12) dan tahun (00-99) dalam satu angka biner. Cara penyimpanan seperti ini memungkinkan kita mengurutkan tanggal dengan mudah dan cepat.

Kita bisa menyimpan tahun dalam 7 bit (0-127) bulan dalam 4 bit (0-15) dan tanggal dalam 5 bit (0-31). Total kita butuh 16 bit.

Misalnya kita akan menyimpan tahun 12 (0001010) bulan 5 (0101) tanggal 17 (10001):

0001010 0101 10001

Atau:

0001010010110001

Jika dipandang sebagai 1 bilangan 16 bit: 5272.

Angka tersebut kelihatan jauh sekali dari angka awal kita (17-5-12).

Untuk mengekstraksi bulan. Kita perlu mengubah 5272 menjadi biner:

0001010010110001

Kita geser ke kanan sebanyak 5 untuk menghilangkan tanggal:

0000000010100101

Sekarang kita bisa menggunakan operator and untuk mengambil 4 digit terakhir:

0000000010100101

And

0000000000001111

Hasilnya

0000000000000101

Jika kita hilangkan digit 0 di depan:

101 = 5 desimal (bulan 5).

Secara umum untuk mengekstraksi bit, kita perlu menggeser ke kanan untuk menghilangkan bit yang tidak kita inginkan, lalu di-andkan dengan deretan bit 1 sebanyak bit yang ingin kita ekstrak (dalam kasus ini: 4 bit).

Posting ini ditulis dengan wordpress for blackberry sambil tiduran di waktu libur.

Manipulasi bit bagian 2: operator bit

Dalam aljabar boolean kita berurusan dengan dua nilai: 0 dan 1 (atau false dan true). Dalam aljabar boolean, ada banyak operasi, tapi biasanya kita hanya peduli pada beberapa operasi dasar: AND, OR, NOT, dan XOR. Jika kita mengkonversi bilangan desimal ke dalam bentuk biner, maka kita akan mendapatkan banyak angka 0 dan 1 (tergantung berapa besar bilangannya).

Dalam operasi bit, kita akan melakukan operasi pada tiap-tiap bit pada posisi yang sama. Jadi jika kita melakukan sebuah operasi pada dua angka 8 bit A dan B, maka: ambil bit pertama dari A, operasikan dengan bit pertama di B, lalu berikutnya ambil bit kedua dari A, lalu operasikan dengan bit kedua dari B, demikian seterusnya.

Di hampir semua bahasa pemrograman, operasi bit dilakukan sekaligus pada semua bit di sebuah register atau variabel. Berikut ini definisi beberapa operator bit yang sifatnya binary (Operasi dilakukan pada posisi bit yang sama di kedua variabel atau register tersebut):

  1. AND: jika ada dua bit di posisi yang sama nilainya 1, maka nilai bit di posisi tersebut menjadi 1, jika tidak maka 0 (1 AND 1 = 1, 1 AND 0 = 0, 0 AND 1 = 0, 0 AND 0 = 0).
  2. OR: jika salah satu bit atau kedua bit nilainya 1 di posisi yang sama, maka nilai bit di posisi tersebut menjadi 1, jika tidak maka 0 (1 OR 1 = 1, 1 OR 0 = 1, 0 OR 1 = 1, 0 OR 0 = 0).
  3. XOR: jika dua bit di posisi yang sama nilainya berbeda, maka nilai bit di posisi tersebut menjadi 1, jika tidak maka 0 (1 XOR 1 = 0, 1 XOR 0 = 1, 0 XOR 1 = 1, 0 XOR 0 = 0).

Ada juga operator unary, yaitu NOT: membalik bit 0 menjadi 1 dan sebaliknya.

Beberapa contoh:

  1. 5 desimal xor 3 desimal : 0101 xor 0011 = 0110 = 6 desimal.
  2. 5 desimal or 3 desimal : 0101 or 0011 = 0111 = 7 desimal.

Contoh lebih lengkap bisa dilihat di Wikipedia.

Mengetahui operator dasar AND sudah cukup untuk memeriksa apakah suatu bilangan sifatnya ganjil atau genap. Jika kita meng-AND-kan suatu bilangan dengan 1 dan hasilnya sama dengan 1 maka bilangan tersebut adalah ganjil, jika nol maka genap.

Di tulisan berikutnya saya akan membahas mengenai bit shift dan rotate.

Mengenal berbagai bahasa

Anda mungkin sering membaca di berbagai buku, kalimat-kalimat semacam ini: “Prolog itu bagus untuk Artificial Intelligence”, “LISP bagus untuk AI”, “Fortran bagus untuk aplikasi numerik”, “C bagus untuk pemrograman sistem”. Tapi biasanya penulisnya tidak mendeskripsikan lebih lanjut apa maksud dari kalimat-kalimat tersebut, dan apa contohnya. Bukankah semua bahasa yang turing complete itu sama saja?. Setelah lulus dari kuliah pun, banyak yang masih belum tahu: apakah pernyataan-pernyataan tersebut benar? kalau salah, yang benar seperti apa? apa contoh aplikasi di mana memprogram dengan Lisp/Prolog/Fortan akan lebih mudah atau lebih baik dari memprogram dengan bahasa lain?

Screenshot_2016-06-11-11-19-27

Ketika orang diperkenalkan pada suatu bahasa, kebanyakan caranya adalah melalui pengenalan sintaks, lalu kemudian membuat aplikasi kecil dalam bahasa tersebut. Jika Anda belajar bahasa yang paradigmanya sama atau mirip, cara ini memang akan berhasil, tapi tidak jika paradigmanya berbeda. Saya contohkan sedikit mengenai Lisp. Kebanyakan orang akan belajar mengenai apa itu atom, apa itu list, lalu operasi terhadap atom dan list (car, cdr, cons, list, dsb). Setelah itu kebanyakan akan membuat program manipulasi list sederhana. Di titik ini sebagian orang akan bertanya: di mana bagusnya Lisp, bagian mana yang membuat ini cocok untuk aplikasi AI?
Continue reading