Kritik Teknis Bahasa Pemrograman Nusa/Nusaptel

Yohanes Nugroho (yohanes [at] gmail.com)

Versi 1.3 (21 Agustus 2008)

Revisi:
Versi 1.0 (16 Agustus 2008): publikasi terbatas

Versi 1.1 (17 Agustus 2008): 
- bagian kesimpulan ditambahkan

Versi 1.2 (19 Agustus 2008): 
- saran ditambahkan 

Versi 1.3 (21 Agustus 2008): 
- Ajakan bagi pendukung Nusa. 
- Atas saran beberapa teman, beberapa hal non teknis yang personal saya hapuskan
  (masih bisa dibaca di versi lama, silakan klik pada nomor versi untuk membaca
  versi lama)

Versi 1.4 (22 Agustus 2008): 
- Tambahan kritik mengenai konsep module pada Nusa

Bahasa Nusa adalah perkembangan dari Bahasa Batak oleh Bernaridho I Hutabarat (selanjutnya akan saya sebut sebagai perancang Nusa). Sampai saat ini saya belum menemukan tinjauan kritis teknis terhadap bahasa ini. Sang perancang bahasa sendiri menyarankan bahwa kita tidak boleh hanya "menerima" apa yang disodorkan (sumber: artikel di sinar harapan). Andaikan NUSA ditulis dalam jurnal internasional yang bisa dirujuk secara ilmiah, maka saya akan mencoba membuat kritik tersebut melalui sebuah paper, namun karena informasi mengenai NUSA tidak bisa dirujuk (hanya ada di beberapa website, dan majalah), maka saya akan menuliskan kritik tersebut di website saya ini. Jika Anda bukan orang teknis, Anda bisa lompat ke bagian kesimpulan.

Masalahnya dengan menulis di website dibanding Jurnal yang ilmiah adalah, di website akan ada banyak orang awam yang langsung berkomentar, tanpa membaca dengan teliti (sebagian besar bukan karena teknis, hanya terdorong nasionalisme saja). Jika Anda bukan orang teknis yang mengerti mengenai bahasa pemrograman, dan tidak ingin membaca dengan detail, silakan skip ke bagian FAQ. Saya membuat bagian tersebut karena dari semua comment yang saya baca di aneka website, misalnya di detik (tapi saat ini sepertinya comment lama sudah dibuang), di blognya pak Budi Rahardjo, dan bernaridho.net, semuanya kira-kira terbagi dalam dua hal pertama yang menyerang bahasa batak/Nusa secara singkat, dan yang lain membela sambil kira-kira menyatakan "Anda sendiri bisa bikin apa nggak?", kalau Anda tipe orang yang kedua (yang tidak mengerti tapi hanya ingin komentar, silakan baca FAQ).

Konsep

Pertama saya ingin menjelaskan dulu bahwa bahasa Nusa sulit dikritik karena belum lengkap. Hal ini juga mungkin merupakan alasan orang lain untuk tidak mengkritik bahasa ini sekarang. Namun menurut saya, kritik itu perlu dalam perkembangan. Jika bahasa sudah dianggap selesai, tapi ternyata fiturnya salah atau jelek, maka lebih sulit untuk kembali dibanding jika kritik dilakukan pada masa di mana bahasa ini masih merupakan konsep.

Bahasa Nusa Belum Lengkap

Perancang Nusa pernah menyatakan menyatakan bahwa konsep bahasa Nusa, yang asalnya dari batak sudah selesai ("Batak sebagai bahasa pemrograman yang utuh sudah rampung sejak tahun 2001" sumber detik.com) setelah dikembangkan sejak 1997. Namun hal tersebut tidak benar, meski sudah dikembangkan bertahun-tahun, masih belum lengkap pada bagian-bagian yang sangat penting. Dari komunikasi pribadi, dinyatakan bahwa ada sebagian (bukan seluruh) konsep yang sudah ada, tapi tentunya karena konsep-konsep tersebut tidak diterbitkan, saya akan menganggap konsep itu belum ada. Saya akan berusaha membahas Nusa secara detail, namun hal ini kadang tidak dimungkinkan karena ketidaklengkapan informasi mengenai bahasa Nusa.

Ketidaklengkapan bahasa ini berarti dua hal:
  1. Mungkin akan ada kritik saya yang tidak lagi valid ketika bahasa ini dikembangkan/dilengkapi.
  2. Bagi Bahasa Nusa: berarti bahasa ini belum layak untuk digembar-gemborkan karena fiturnya belum lengkap
Sesuai dengan pernyataan dari perancangnya Bahasa Nusa ini merupakan penerus bahasa Batak. Saat ini tidak ada yang bisa dijadikan acuan pasti:
  1. Menurut perancangnya sendiri, aneka dokumen yang ada di website tidak/belum lengkap.
  2. Aneka dokumen yang ada isinya kadang bertentangan.
  3. Tidak ada satu set source code lengkap yang menguji semua fitur bahasa.
  4. Aneka contoh source code yang diberikan isinya kadang bertentangan, dan bahkan sebagian salah.
  5. Implementasi compiler yang ada juga masih jauh dari lengkap.
  6. Perancang takut untuk memberikan grammar secara lengkap karena khawatir pihak lain akan mengimplementasikannya lebih dulu dari dia (sumber: komunikasi pribadi).

Bagian bahasa yang belum lengkap, yang sangat penting, yang belum ada hingga saat ini antara lain:

  1. Semantik pass by reference. Tanpa ini, membuat prosedur "swap" pun tidak bisa dilakukan, saat ini Nusa kadang menggunakan by reference (untuk arrray) atau by value (untuk tipe lain).
  2. Semantik array yang lengkap dan jelas. Termasuk juga memory layout untuk array.
  3. Tipe Pointer dan Operasi Pointer, alokasi dinamis, tipe record yang rekursif (untuk pembuatan struktur list/tree).
  4. Semantik lengkap untuk hampir semua operasi yang ada. Misalnya apakah ekspresi untuk break dan continue bisa berupa variabel (bukan literal numerik) dan jika boleh, apa konsekuensinya bila nilai ekspresi melebihi nesting loop?
  5. Variable argument list.
  6. Variant type dan volatile variable (bagian ini perlu karena beliau ingin bahasanya bisa digunakan untuk membuat sistem operasi).

Ketidaklengkapan ini tentunya akan membuat orang sulit/tidak mungkin mengimplementasikan bahasa Nusa. Bisa saja sebagian fitur diimplementasikan, tapi ketika ada bagian lain yang ditambahkan, maka ada kemungkinan banyak bagian yang harus didesign ulang. Dalam engineering yang baik, kita harus menyatakan dengan lengkap sebuah design sebelum implementasi. Bahkan jika Anda awam dalam hal ini, Anda bisa melihat mengenai Software Engineering dan Project Management yang baik dari novel Tom Demarco pada Novel karyanya yang berjudul The Deadline: A Novel About Project Management. Tidak bijaksana bagi perancang untuk mengkritik bahwa tidak ada yang mau bergabung dalam proyek open source yang dimulainya, jika dia sendiri tidak membuka spesifikasi Nusa secara lengkap.

Meskipun tanpa bahasa yang lengkap, tanpa grammar yang jelas, tanpa source code yang benar, dan dengan banyak fitur yang hilang, saya masih menemukan banyak kelemahan dari design bahasa Nusa.

Tidak Orthogonal

Hal yang didengang-dengungkan dari Nusa adalah orthogonalitasnya, jadi hal pertama yang perlu ditanyakan adalah: apakah benar bahasa ini orthogonal. Dari definisi orthogonalitas, saya menemukan aneka contoh di mana bahasa Nusa tidak/kurang orthogonal.

Apa sih Orthogonalitas itu?

Pertama, saya akan mengambil beberapa definisi orthogonalitas sebelum masuk kepada kritik bahwa Nusa tidak orthogonal. Dari arti katanya, orthogonal berarti "Mutually independent, highly separated". Dari wikipedia "Orthogonality guarantees that modifying the technical effect produced by a component of a system neither creates nor propagates side effects to other components of the system". Dalam konteks khusus bahasa pemrograman, saya ambil dari buku Programming Language Pragmatics:

Orthogonality means that features can be used in any combination, the combinations all make sense, and the meaning of a given feature is consistent, regardless of the other features with which it is combined.

Bahasa yang designnya sangat orthogonal adalah ALGOL 68. Bahasa ini sangat orthogonal dan berorientasi expresi. Bahasa-bahasa lain setelah itu (termasuk juga Nusa), masih kurang sukses dalam banyak hal. Dalam bahasa yang orthogonal, tidak banyak hal yang perlu diingat, karena tidak banyak perkecualian dalam bahasa tersebut. Dalam sebuah bahasa yang orthogonal, jika satu hal dapat dilakukan, maka hal lain yang serupa harus dapat dilakukan, tanpa batasan artifisial.

Contoh nonorthogonality di NUSA

Mari kita lihat beberapa contoh hal-hal yang tidak orthogonal di Nusa. Pembahasan ini tidak akan panjang, karena bahasanya belum lengkap. Jika bahasa sudah dinyatakan lengkap oleh pembuatnya (atau setidaknya bisa dinyatakan sebagai rilis publik pertama), saya bersedia menulis lebih panjang dan detail. Tapi hal-hal sederhana ini semoga sudah cukup untuk menunjukkan bahwa Nusa jauh dari orthogonal.

Ekspresi vs statement

Di Nusa i++ adalah ekspresi, sementara i += 1 adalah statement. Pembagian secara strict antara value dan operation ini membuat orang harus mengingat beberapa hal (sehingga tidak orthogonal). Namun meski memiliki perbedaan tersebut, nusa mengadopsi syntax loop for milik C. Hal ini bukan ide yang baik karena C menganggap bahwa assignment adalah ekspresi. Pertama saya jelaskan dulu bagaimana ekpresi dan statement di C.

Dalam C, sebuah ekspresi adalah sebuah statement dan assignment juga dianggap sebagai ekspresi, hal ini membuat banyak hal menjadi fleksibel.

	1+2; /*expression is a statement, valid*/
Assignment adalah expression yang memberikan nilai sesuai dengan yang diassign, sehingga ini juga valid.
	int a, b;
	a = b = 5;
	a = b += 5;

Syntax loop for dalam C adalah for (e1; e2; e3), di mana e1, e2, dan e3 adalah ekpresi. Kita bisa membuat loop seperti ini di C:

	for (i=0;i<10; i++) {
		printf("%d\n", i);
	}


	for (i=0;i<10; i+=2) {
		printf("%d\n", i);
	}

Dalam nusa kita bisa membuat loop yang pertama, tapi tidak yang kedua (dalam nusa, assignment bukanlah ekspresi). Jika refence di Nusa diimplementasikan, maka kita kan bisa membuat loop kedua menjadi inc(i, 2), tapi ini sangat tidak natural karena tidak intuitif, dan berarti ada satu hal lagi yang perlu diingat (tidak orthogonal). Di Nusa pemanggilan fungsi dianggap sebagai ekspresi dan statement (di sini terlihat bahwa nusa tidak orthogonal).

Inisialisasi literal tidak konsisten

Inisialisasi record dengan literal tidak dapat dilakukan, sementara inisialisasi array dan variabel biasa bisa dilakukan. Contoh inisialisasi record dalam C adalah seperti ini (hal yang tidak bisa dilakukan Nusa):

#include <stdlib.h>
#include <stdio.h>

typedef struct {
	int x;
	int y;
} point;

typedef struct {
	point p1;
	point p2;
} line;

int main()
{
	point p = {4, 5};
	line l = {{1,2}, {2,3}};
	printf("point x:%d y:%x\n", p.x, p.y);
	printf("line (%d, %d)-(%d, %d)\n", l.p1.x, l.p1.y,
		l.p2.x, l.p2.y);
	return 0;
}

With statement

Saat ini nusa memiliki with statement, hal ini tidak diperlukan ketika Nusa mendukung pointer. With statement hanya merupakan syntactic sugar agar lebih mudah bekerja dengan struktur record yang panjang (dengan pointer, kita cukup membuat petunjuk ke bagian record yang ingin dimodifikasi). Jika memang ingin memakai with statement yang bukan merupakan syntactic sugar, silakan lihat implementasi With pada Modula-3.

Aneka restriksi yang tidak diperlukan

Sebuah bahasa yang orthogonal seharusnya tidak memberikan restriksi yang arbitrary, karena itu berarti bahwa pemakai bahasa harus mengingat banyak hal. Berikut ini beberapa contoh restriksi yang tidak diperlukan yang ada di Nusa. Menurut saya restriksi-restriksi ini menunjukkan bahwa design Nusa tidak well-thought. Atau meminjam kalimat yang dipakai oleh perancang Nusa sendiri ketika menilai para pembuat bahasa lain: the mind of the designer is flawed (saat ini diremove dari publik, hanya bisa dilihat oleh registered member, local copy is here).

  1. Di modul utama tipe harus segera didefinisikan, sementara di modul lain, tipe boleh dideklarasikan sebagai deferred type, lalu didefinisikan di tempat lain.
  2. Akhir modul utama haruslah operasi main, hal ini memaksa pembacaan bottom up seperti pada Pascal. Restriksi ini harusnya tidak diperlukan karena Nusa mendukung deklarasi fungsi sebelum definisi fungsi.
  3. Tipe dan operasi yang tidak bisa diakses dari luar modul, dan tidak dipakai di dalam modul dianggap sebagai error. Banyak orang yang menulis kode dengan cara menulis satu fungsi, mencoba mengkompilasi (untuk memeriksa sintaks), lalu meneruskan membuat fungsi berikutnya. Nah karena fungsi pertama belum dipanggil siapapun, maka fungsi tersebut dianggap error (kecuali Anda definisikan di Interface section, yang kemudian harus Anda pindah lagi nantinya). Ini juga berarti bahwa jika Anda sedang mengetes modul, dan ingin menghapus satu fungsi dari public, Anda harus mengcomment fungsi/prosedur yang tidak diperlukan hanya agar modul bisa dicompile. Dalam kasus ini, lebih tepat untuk memberikan warning, dan bukan error.
  4. Nama tipe di modul utama harus berbeda dari nama modul utama, tapi nama tipe boleh sama dengan nama modul di modul yang bukan utama.
  5. Meskipun semantik lengkap array belum selesai, tapi semantik yang ada sudah sangat aneh. Array dipass by reference, tapi akan dibuat copynya di tujuan agar ketika dimodifikasi hasilnya tidak dikembalikan ke pemanggil. Tujuan pass by reference adalah supaya tidak ada penyalinan nilai, jadi mem-pass by reference tapi menyalin nilai adalah hal yang amat sangat aneh.
  6. Tipe array saat ini dibatasi berdimensi 3, hal ini sangat aneh, karena jika implementasi bisa sampai 3 seharusnya bisa juga sampai N. Minimum subscript dibatasi antara 1 sampai 65535 (halo???, ini sudah dunia 32 dan 64 bit).
  7. Array 1 karakter tidak diijinkan, karena katanya akan membingungkan dengan char saja (bukan array). Jika Anda membuat algoritma dengan array, tapi karena efisiensi dalam kasus tertentu Anda ingin memproses 1 karakter saja, dalam kasus tersebut Anda harus mengalokasikan lebih dari 1 karakter (misalnya char[2] c, shingga membuang memori) atau membuang semua loop terhadap array of character dan mengubah semua referensi c[i] menjadi c saja (time consuming).

Operasi Write/Writeline

Di Nusa, operasi write dan writeline adalah operasi khusus. Anda tidak bisa membuat fungsi yang berlaku seperti write/writeline, karena fungsi-fungsi user defined tidak boleh memiliki argumen yang panjangnya bervariasi. Kalau kita tengok contoh yang sering diajukan untuk memperlihatkan kehebatan Nusa, maka contoh yang muncul adalah betapa mudahnya membuat hello world. Mari kita tinjau program hello world di Nusa:

program hello;

void main()
{
	writeline('hello world');
}

Jika Anda memprogram sistem operasi atau embedded device, mungkin Anda ingin mengubah output program Anda ke serial port alih-alih ke layar. Namun karena keterbatasan nusa, hal itu tidak bisa dilakukan dengan mudah. Di C, Anda tinggal membuat fungsi printserial, dan mengganti semua fungsi printf menjadi printserial (atau bahkan cukup dengan menggunakan #define printf printserial), maka semua beres. Fungsi printserial dapat diimplementasikan menggunakan variable argument list dan dapat dengan tepat mengemulasikan fungsi printf. Jadi di contoh paling kecil, di mana perancang bahasa menuduh perancang bahasa lain pikirannya flawed (sumber: bernaridho.net namun saat ini hanya bisa dilihat oleh registered member, local copy is here), Nusa sendiri tidak lebih baik. Coba kita lihat contoh lain dalam C#:

using System;

class Hello {

    static void Main(string[] args)
    {
          Console.WriteLine ("Hello");
    }
}

Meski terlihat rumit, fleksibilitas yang diberikan juga tinggi, Anda bisa mengganti using System dengan library yang lain, dan output bisa muncul di file atau di serial port tanpa perlu megubah program. Ataukah maksud penulis adalah dari singkatnya jumlah baris program?, jika ya, maka python jauh lebih singkat:

print "hello world"

Modularitas

Modularitas merupakan kata kunci lain yang sering disebutkan dalam menunjukkan superioritas Nusa, tapi apakah benar ada inovasi baru di sini? modularitas yang ditawarkan sama dengan Pascal. penggunaan kata kunci "module" sudah ada di pascal pada ISO 7185 (tahun 1990), penggunaan "interface" dan "implementation" sudah ada sejak sebelumnya (bahasa serupa, misalnya modula-2 juga menggunakan kata kunci "module"). Satu-satunya hal yang belum saya temukan di bahasa lain (walau mungkin saya salah) adalah bagian tipe private dan public yang deklarasinya boleh dipisahkan, walau saya masih meragukan kegunaan dan semantiknya. Misalnya bagaimana cara menjamin sebuah tipe yang sebagian publik dan sebagian private agar terinisialisasi dengan benar? Di C++ sebuah class bisa memiliki bagian public dan private, dan kita bisa menyatakan konstruktor yang bisa menginisialisasi semua kolom dalam record agar ketika digunakan statenya selalu valid.

Semua dokumentasi dan grammar Nusa tidak menunjukkan apakah Nusa akan mendukung nested module. Berikut ini contoh kecil mengapa nested module dibutuhkan: sebuah modul multimedia biasanya akan terbagi menjadi dua bagian: audio dan video, di bagian audio dan video masing-masing ada abstraksi bagaimana mengakses device di suatu platform, selain itu ada juga codec yang jumlahnya mencapai puluhan (untuk audio: MP3, WAV, dll, untuk video: MPEG, DivX, dll). Tanpa nested module, akan sulit menamai modul-modul tersebut. Jika Nusa mendukung nested module, tidak jelas apakah perlu ada mapping antara path tempat lokasi file modul dengan nama modul (seperti pada Java) atau tidak (seperti pada C++). Kemudian cara melakukan packaging modul yang terdiri atas banyak bagian juga belum disediakan.

Sebuah variabel, fungsi, tipe, atau bagian dari suatu record hanya bisa bersifat publik atau private di Nusa, tidak ada konsep protected seperti pada bahasa-bahasa tertentu. Dalam banyak aplikasi, kadang diinginkan agar suatu variabel/modul hanya bisa diakses oleh modul lain, tapi tidak oleh semua modul, hal itu tidak dimungkinkan menggunakan Nusa saat ini.

Konsep modul yang dipilih juga kurang baik bagi penjual library komersial. Pada bahasa C/C++, pembuat library bisa menjual library dalam bentuk biner, dan memberikah header file kepada programmer. Programmer dapat melihat aneka nilai dan konstanta, serta fungsi dan parameter, tapi tidak melihat implementasi librarynya. Pada bahasa Ada, bagian interface dan implementation sebuah modul bisa ada di file terpisah. Pada Java, tools bernama javadoc disediakan, sehingga para penjual library bisa dengan mudah membuat dokumentasi library tanpa memberikan source codenya (dan tanpa harus mengetik ulang source code untuk membuat dokumentasi produk). Nusa saat ini tidak/belum menyediakan cara bagi pembuat library untuk melakukan hal tersebut.

Fitur bahasa tidak sesuai dengan tujuan

Perancang menyatakan bahwa bahasa ini akan bisa digunakan untuk membuat Sistem Operasi dengan mudah (sumber: majalah Masterweb), dan menulis sistem DBMS dengan mudah (sumber SDA Asia). Dengan tujuan tersebut, maka kita perlu menengok fitur apa saja yang sebaiknya atau seharusnya ada di bahasa yang tujuannya semacam itu. Sebagai catatan, bisa saja kita mengimplementasikan suatu sistem operasi dengan bahasa apapun yang tujuan utamanya bukan untuk membuat sistem operasi, namun dalam tahap tertentu ini justru menambah kompleksitas dan akan sulit digunakan pada dunia embedded device (silakan lihat contoh sistem operasi Singularity dan JNode).

Ada banyak kekurangan Nusa dalam hal fitur low level. Mari kita tinjau dua fitur yang cukup dasar: volatile variable dan variant record.

C dan C++ mengenal volatile variable, akses terhadap variable volatile tidak akan dioptimasi oleh compiler. Nusa tidak mengenal hal tersebut. Variabel volatile banyak dipakai pada pemrograman sistem operasi dan embedded device, terutama pada platform di mana I/O dilakukan tidak dengan instruksi khusus, tapi dengan memory mapping (misal arsitektur ARM).

Variant record di Pascal atau union type di C memungkinkan kita memberi alternatif beberapa field, dan hanya satu yang valid pada saat itu. Variant record digunakan untuk menghemat memori tapi tetap membuat program mudah dibaca. Variant record banyak digunakan pada sistem operasi dan aneka program lain yang menggunakan struktur data secara ekstensif (silakan lihat sendiri bahwa union dipakai hampir di 2000 tempat di source code Linux, dan volatile di lebih dari 5000 tempat).

Type Oriented vs Object Oriented

Kecuali penanganan tipe memiliki sifat magis yang belum saya ketahui sampai saat ini, ada banyak design pattern (terutama dari dunia object oriented) yang akan sulit diimplementasikan menggunakan type oriented approach di Nusa. Beberapa yang terpikir oleh saya: Visitor Pattern dan Observer pattern.

Kelemahan lain dari Type Oriented Programming adalah dalam implementasi Integrated Development Environment (IDE). IDE merupakan salah satu faktor kesuksesan bahasa. Bahasa berbasis OO dapat memiliki editor yang lebih mudah, misalnya jika kita mengetik "p." dan tipe p adalah point, maka semua method sesuai dengan konteks p bisa dimunculkan. Sebagian besar bahasa pemrograman prosedural murni sekarang dikembangkana agar mendukung OOP, sementara Nusa justru bergerak ke belakang. Contoh bahasa yang maju ke OOP: Pascal dengan Object Pascal, PHP sejak versi 4, Perl 6 (Perl 5 mendukung, tapi lebih seperti hack), dll. Alasan lain kenapa OOP dipilih banyak orang adalah kemudahan untuk interoperabilitas dengan aneka sistem yang sudah ada (misalnya COM Object di Windows), aneka komponen di Java/.NET, dan lain-lain.

Dari sisi visual programming, object oriented programming dapat dipetakan dengan mudah ke konsep visual. Para programmer yang memakai IDE visual seperti Delphi atau NetBeans tentu sangat memahami betapa mudahnya pemetaan antara objek visual dengan kode. Akan sulit memetakan type oriented programming ke konsep visual.

Terlalu kuno

Semua bahasa yang modern mendukung multibyte character set, namun Nusa tidak. Jika memang tujuan Nusa adalah bisa terkenal di luar Indonesia, maka sebaiknya bahasa Nusa dirancang untuk mendukung Unicode. Apa maksudnya bahasa mendukung unicode? beberapa contoh kecil adalah: NUL (0) seharusnya tidak menjadi terminator string. Di Unicode 0 bisa muncul dalam byte-byte sebuah string. Panjang string tidak sama dengan panjang array (tergantung pada encodingnya). Saat ini sudah banyak library unicode yang tersedia, jadi implementasinya tidak sulit, namun konsep bahasa perlu diperbaiki.

Nusa sampai saat ini belum mendukung exception handling. Menurut artikel tahun 2002 (sumber: majalah Masterweb): Penelitian masih harus dilakukan pada kekuatan/kelemahan penanganan eksepsi di C++, Java, Eiffel, PL/SQL, beberapa bahasa lain yang sudah dirancang, dan di luar bahasa-bahasa tersebut. Penelitian ini juga harus melibatkan apa perbedaan antara penanganan eksepsi, penanganan kesalahan, dan asersi.

Implementasi

Perancang bahasa Nusa menyatakan bahwa pembuatan compiler itu sulit, dan itu sebabnya mengapa baru sekarang Nusa memiliki implementasi compiler yang sangat dasar. Benarkah demikian? apakah diperlukan programmer yang sangat hebat untuk mengimplementasikan sebuah compiler?.

Membuat Compiler itu Mudah

Cara membuat compiler ada di banyak buku, bahkan menurut Programming Language Pragmatics:

Compilers are among the most well-studied types of computer programs. In a typical compiler, compilation proceeds through a series of well-defined phases.

Langkah-langkah yang ada di sebuah compiler sangat sederhana, dan terdefinisi dengan jelas. Tahap pertama adalah parsing, lalu konversi parse tree ke abstract syntax tree, dan yang terakhir adalah mengoutputkan program ke kode target. Tahap parsing dan pembentukan AST bisa diotomasi menggunakan ANTLR, tools open source yang sangat user friendly (memiliki editor grammar dengan presentasi grammar dalam bentuk grafik). Untuk output kode, ada banyak backend yang bisa dipakai: GCC atau LLVM, bahkan output ke C juga dimungkinkan (seperti masa awal implementasi compiler C++).

Anda juga bisa membaca pengakuan seorang pembuat compiler Laurence Tratt dalam tulisannya yang berjudul How Difficult is it to Write a Compiler:

Recently I was discussing Converge with someone, and mentioned how little time the "core" compiler had taken to implement (no compile-time meta-programming, limited error checking, but a functioning compiler nonetheless) - only a few days.

Apakah harus programmer hebat untuk bisa menulis compiler? Dia menyatakan bahwa

... despite having created a fairly fully featured programming language, I'm no more capable a programmer than the next man...

Jadi tidak dibutuhkan programmer hebat untuk bisa menulis compiler. Laurence Tratt juga menyatakan bahwa bagian tersulit adalah parsing (yang saat ini sudah bisa dengan mudah dilakukan menggunakan ANTLR).

Anda juga bisa membuat compiler sendiri dengan mengikuti tutorial saya di http://yohan.es/compiler/

Implementasi Saat ini

Saat ini compiler Nusa diimplementasikan dengan menggunakan parser grammar komersial ProGrammar, dalam C, dan mengoutputkan program tidak ke dalam assembly, tapi ke dalam kode C yang kemudian dikompilasi oleh GCC. Hal ini sebenarnya bertentangan dengan pernyataan Perancang Nusa di mana katanya Compiler Nusa mengoutputkan dalam assembly, sehingga tidak serumit compiler bahasa pemrograman AYU yang merupakan karya bangsa Indonesia juga.

Ini adalah klaim perancang Nusa yang tidak benar:
Sebagai catatan: dalam kasus Nusa, target programming-language adalah machine-language, yang penguasaannya bisa difasilitasi dengan penguasaan assembly.

Sumber: Majalah PC Media (Agustus 2008)

Implementasi saat ini (terakhir diupload ke yahoogroups tanggal 15 Juni 2008), masih memiliki banyak flaw. Saya sudah menyatakan beberapa flaw tersebut, tapi tidak mendapatkan response yang positif.

Email mengenai implementasi Nusa

Perhatikan beberapa mail berikut ini dan balasan perancang Nusa.

Output C yang tidak memperhatikan keyword C

Compiler Nusa mengoutputkan kode dalam bahasa C, dan dikompilasi dengan GCC. Untuk membuktikannya mudah, coba jalankan linker Nusa di komputer yang tidak memiliki gcc, akan muncul pesan:

error running gcc; errno = 2 No such file or directory

Dan hal yang paling jelas adalah jika file P.nusa dilink menjadi P.interm, lalu dilink, akan muncul file ~P.c yang merupakan source code C yang akan dikompilasi oleh GCC.

Ketika memprogram dengan C, programmer perlu memperhatikan bahwa ada kata-kata yang memiliki makna khusus dalam C yang disebut sebagai keyword, misalnya int dan struct, nama identifier tidak boleh sama dengan nama keyword. Identifier bernama struct dilarang. Dalam Nusa struct bukanlah keyword, sehingga valid bagi user untuk menuliskan "integer struct". Namun compiler nusa (yang sebenarnya adalah translator ke C) akan mengoutputkan kode "int struct", yang tidak valid di C sehingga gagal dikompilasi dengan GCC. Saya berusaha menyatakan fakta itu dengan susah payah, namun responsnya sangat mengecewakan.

Email saya (email lengkap ada di sini)

Kekurangan dari segi implementasi compiler saat ini:

1. Penggunaan backend C tapi tidak mempedulikan keyword C misalnya
deklarasi 'integer struct' akan error ketika dicompile (seharusnya
setiap identifier di Nusa diberi prefix ketika diterjemahkan ke C).

Perhatikan bahwa sebelum angka 1 saya menuliskan Kekurangan dari segi implementasi compiler saat ini. Jawabannya:

There's no such thing as keyword. Anda masih menyebut keyword.  Saya tak sedikitpun
memakai istilah keyword. Pengajaran pemrograman tanpa mengacu keyword, saya pikir
adalah saya yang melakukannya pertama kali di dunia ini.

Nusa sangat memudahkan pengajaran seperti di atas.  Ini adalah kelebihah utama Nusa
dibandingkan bahasa pemrograman lain.  Anda tidak melihatnya sebagai kelebihan?

Untuk apa saya harus ikut cara C?  Kalau saya ikut cara C, tidak perlu ada Nusa.
Think new, think free; as much as possible.  You still cannot free your mind from C & Java.

Perancang Nusa menantang saya untuk mengimplementasikan compiler Nusa. Setelah saya selesaikan sekitar 60% dalam 2 minggu (dan sudah lolos sekitar 80% test case yang dia miliki), Saya coba jelaskan lagi dengan lebih jelas

Saya tadinya agak heran mengapa Anda jadi ngalor ngidul mengenai
"keyword" padahal saya hanya ingin mengatakan bahwa implementasi nusa
tidak mempedulikan keyword dalam C ketika menuliskan output.  Padahal
jelas saya sudah membagi pernyataan saya ke dalam bagian "konsep' dan
"implementasi". Bagian implementasi hanya berisi hal-hal yang
berhubungan dengan implementasi compiler nusa, bukan konsepnya.

Identifier bernama "struct" di nusa ketika diterjemahkan langsung ke
dalam C, akan dianggap sebagai kata yang memiliki makna khusus dalam
C, sehingga akan gagal dikompilasi. Saya hanya menyatakan bahwa
sebaiknya implementasi menambahkan prefix agar nama identifier di nusa
tidak dipetakan ke keyword di C.

Saya tidak peduli apa istilah Anda untuk keyword dalam sebuah bahasa,
tapi menurut standar bahasa C, kata-kata seperti "void", "struct",
"then", dll adalah keyword.

Dan balasannya adalah:

E-mail Anda yang mana yang secara jelas memisahkan hal konsep dengan hal
implementasi?
Anda hanya punya satu heading untuk konsep.  Itu tentang pointer.  Saya
sejak tahun 2001 sudah membut spec tentang pointer.  Seperti sdh saya
katakan, saya hanya kirim 2 dari 4 manual yg sebenarnya finished tahun
2001.  Manual ke 3 berisi ttg pointer.  Setelah membaca komentar Anda
bahwa tidak ada yg menarik dari Nusa, saya tdk minat mengirimnya.

> Identifier bernama "struct" di nusa ketika diterjemahkan langsung ke
> dalam C, akan dianggap sebagai kata yang memiliki makna khusus dalam
> C, sehingga akan gagal dikompilasi. Saya hanya menyatakan bahwa
> sebaiknya implementasi menambahkan prefix agar nama identifier di nusa
> tidak dipetakan ke keyword di C.

Di Nusa tidak ada sesuatupun yang bernama "struct".  Dan adalah bodoh;
bicara dalam term keyword, even itu bicara tentang C dan lain-lain.

> Saya tidak peduli apa istilah Anda untuk keyword dalam sebuah bahasa,
> tapi menurut standar bahasa C, kata-kata seperti "void", "struct",
> "then", dll adalah keyword.

Silahkan tak peduli.  Sayapun tak peduli kalau Anda ngotot untuk memakai
istilah keyword. Belajar programming dengan memakai istilah keyword adalah
cara belajar yang bodoh, tak penting bahwa dengan seperti itu Anda bisa
membuat compiler atau tidak.

Penanganan symbol table yang salah

Saya ingin menyatakan bahwa symbol table handling di kompilator masih salah. Saya memberikan contoh program kecil ini, dengan main (meski ada kurang titik koma di akhir kurung tutup writeline).

4. penanganan symbol table masih kurang benar, misalnya kode ini gagal dilink

Program test;


integer f(integer a)
{

       return (3+a);
}

integer a()
{
       return 4;
}

void main() { writeline(f(1)) }

Karena penanganan namespace untuk parameter integer a di f dengan nama
fungsi a masih kurang benar. Apabila definisi fungsi ditukar posisinya
(a lalu f), maka program sukses di-compile dan link, tapi eksekusi
akan menghasilkan angka yang "kacau" karena kode yang dihasilkan
adalah mengambil alamat fungsi a dan ditambahkan dengan 3.

Dan balasan yang saya terima adalah:

Saya kira design-decision saya dalam hal ini bagus. Operasi a() harus
terlihat lebih dulu. Saya ingin memudahkan kerja pembuat compiler-linker.
Pembuatan compiler-linker ada trade-offs (seperti halnya pembuatan
apapun).

Kalau Anda terlalu memanjakan user, Anda akan memberi beban berlebihan ke
pembuat development tool; dan sebaliknya. Saya berpikir keras untuk tidak
ekstrim ke sisi manapun. Jadi, saya memilih tidak memanjakan user at the
expense of the maker of compiler-linker; at least in this case.

Ternyata masih belum bisa dimengerti, jadi saya tuliskan kembali dengan lebih lengkap, dengan menyatakan bahwa dalam C (yang merupakan bahasa target untuk Nusa), fungsi harus dideklarasikan dulu sebelum digunakan. Saya tidak menuliskan lagi kode main karena pertama saya sudah pernah memberikan di email pertama, dan yang kedua adalah bahwa dipanggil dengan cara apapun fungsi f akan tetap error.

Masalah lainnya adalah dalam contoh yang saya berikan:

program test;

integer f(integer a)
{
       return (3+a);
}

integer a()
{
        return 4;
}

Sekali lagi compiler nusa tidak mempedulikan namespace dari a. Jika
fungsi dideklarasikan sebelum diimplementasikan:

program test;

integer a();

integer f(integer a)
{
       return (3+a);
}

integer a()
{
        return 4;
}

Hasil compiler nusa saat ini juga masih salah, karena deklarasi yang
pertama tidak diterjemahkan menjadi deklarasi dalam C.

Balasannya juga tidak mengenakkan, karena menuduh saya kurang teliti, dan bahkan memposting hal tersebut di bernaridho.net, saat ini memang tidak disebutkan email tersebut dari siapa, tapi ada kemungkinan suatu hari disebutkan nama penulisnya. Saya sudah membalas email tersebut, namun sepertinya tidak dibaca

Ini contoh yang Anda berikan untuk tunjukkan kesalaha compiler-linker Nusa.

program test;
>
> integer a();
>
> integer f(integer a)
> {
>         return (3+a);
> }
>
> integer a()
> {
>          return 4;
> }

Kesalahan-kesalahan Anda

(1) Contoh tidak sertakan operation main(). Seharusnya Anda sertakan.
(2) Jelas bahwa f harus dipanggil dengan 1 operand. Anda terlalu ceroboh
   dengan menyatakan bahwa compiler-linker Nusa tidak beres handle
   namespace.  Kalau Anda call f() tanpa operand, ya jelas error.
(3) Yang Anda mau oleh a yang adalah objek atau a() yg adalah operasi?

   Kalau Anda mau uji pemanggilan operasi a() dari f() -- dan rasanya
   ini yang Anda masalahkan, lihat bahasan tentang urutan kemunculan --
   maka seharusnya Anda membuat statement seperti ini

   return (3+a());

   bukan

   return (3+a);

Anda betul-betul kurang berpikir sebelum klaim sesuatu.

Ini contoh program untuk show bagaimana compiler-linker Nusa mulus handle
namespace.

Program Test2;

integer a();

integer f (integer a)
{
 return (a()+a); // harus bedakan namespace utk a() dengan namespace utk a
}

integer a ()
{ return (4); }

void main()
{
 writeline (f(3));  // harus write 7
}

Saya test, dan hasilnya benar.

Think before you speak/write!

Catatan tambahan:

  1. Untuk pernyataan pertama, saya sudah pernah menyatakan apa main-nya
  2. Untuk pernyataan kedua, main saya memanggil f dengan parameter.
  3. Sudah jelas yang dimau adalah a dari parameter

Saya sudah mengupload kesalahan kompilator nusa dalam kasus ini, dan bisa dilihat di http://www.tinyhack.com/nusaerror.txt. Ada kemungkinan perancang Nusa menggunakan kompilator versi baru, sehingga hasilnya tidak sama, dalam hal ini sebaiknya nasihat Think before you speak/write! diberikan kepada perancang Nusa.

Karena klarifikasi via email tidak dibalas, saya berusaha memberikan comment, tapi comment ini malah dihapus, dan account saya di www.bernaridho.net diblok (Saya masih menyimpan halaman ketika comment saya masih ada di sini (PDF). Aksi tersebut menunjukkan bahwa bahasa Nusa tidak dikembangkan secara terbuka (tidak menerima kritik dan masukan), padahal semua bahasa yang sukses saat ini dikembangkan secara terbuka (atau setidaknya jika implementasinya tidak dibuka, spesifikasinya dibuka, sehingga bisa direview).

Kesimpulan

Bahasa Nusa belum lengkap, tidak seperti klaim perancangnya. Bagian bahasa yang sudah ada tidak seperti tujuan perancangannya (tidak orthogonal, dan memiliki banyak kekurangan). Bahasa Nusa bukan bahasa yang konsepnya sudah dipikirkan dengan matang. Sesuatu design bisa dikatakan acceptable apabila sudah dilakukan peer review terhadap design tersebut, dan bukan hanya sekedar klaim perancangnya. Sayangnya pengembangan Bahasa Nusa tidak terbuka, sehingga tidak bisa direview oleh publik. Hal ini sangat disayangkan karena semua bahasa pemrograman populer saat ini sifatnya terbuka (C#, Java, PHP, Python, Ruby dll).

Implementasi compiler pada tahap ini hanya akan membuang waktu dan sumberdaya karena compiler harus diubah lagi ketika fitur bahasa dilengkapi dan semantiknya diperbaiki. Implementasi sebuah compiler tidak sesulit seperti klaim perancang Bahasa Nusa dan tidak dibutuhkan waktu yang lama atau dana yang besar. Compiler dasar yang lengkap dan membuat output yang benar hanya butuh waktu beberapa bulan. Integrated Development Environment juga bisa dibuat dengan waktu singkat dengan berbasis pada IDE open source yang sudah ada (misalnya Eclipse). Perlu dicatat bahwa Nokia pun menyadari pentingnya memotong waktu development dan menggunakan Eclipse untuk produk IDE-nya yang bernama Carbide.

Saran

Saran saya bagi Perancang Bahasa Nusa adalah agar lebih terbuka dalam perancangannya, lebih mudah menerima kritik, dan lebih berhati-hati bagi implementasinya. Saya juga menyarankan agar bahasa segera dilengkapi, karena yang terbuka untuk publik hanya sekitar 25% (publik tidak bisa menilai yang 75%, apakah sudah selesai atau belum pun tidak ada yang tahu). Saat ini menurut saya tidak perlu membuat artikel khusus untuk menyanggah artikel ini, akan lebih baik jika usaha diberikan untuk membuat spesifikasi bahasa yang lengkap dan implementasi compiler yang baik. Akan lebih baik lagi jika inovasi baru yang diklaim dituliskan di paper nasional ataupun internasional agar mendapatkan penilaian dari pakar yang lain, dan bukan sekedar klaim pribadi.

Saran saya bagi masyarakat umum adalah agar lebih kritis dalam menerima sesuatu dari "pakar", terutama bidang IT. Tanpa ada paper dalam jurnal Nasional ataupun Internasional yang menjelaskan bahasa Nusa, tanpa ada spesifikasi lengkap bahasa Nusa, tanpa ada pendapat dari pakar lain, tanpa ada implementasi kompilator yang sudah berjalan dengan baik, Perancang Nusa sudah dianggap berhasil menciptakan bahasa baru.

Bernaridho yang dikategorikan sebagai Explorer dari kriteria New Thinker dipilih [sebagai pembawa obor olimpiade] karena berhasil menciptakan sebuah bahasa pemrograman yang sangat mudah digunakan (Sumber Kompas)

Dalam bidang non IT, biasanya masyarakat dengan mudah bisa melihat bukti dari suatu prestasi, misalnya seorang petani berpendidikan yang tidak memiliki design sistem pengairan bisa kita nilai hebat jika dia berhasil mengimplementasikan sistem pengairan yang baik. Atau seorang arsitek bisa dengan mudah memperlihatkan designnya (dan mungkin rendering 3D modelnya), meski benda yang dibuatnya belum jadi. Di mata banyak orang, komputer masih merupakan benda yang ajaib. Kiranya pendidikan informatika di Indonesia lebih bisa berfokus pada teori yang benar yang melahirkan pakar-pakar IT yang benar.

Bagi Pendukung Nusa

Saya melihat bahwa cukup banyak orang yang mendukung usaha Perancang Nusa. Jika Anda memang benar-benar mendukung Nusa, jangan hanya berdiam diri. Jangan juga sekedar membela Nusa di forum atau mailing list tanpa alasan teknis yang jelas. Tunjukkan dukungan Anda dengan aksi.

Jika Anda programmer pendukung Nusa, downloadlah manual Nusa, spesifikasi (meski belum lengkap), dan compilernya. Dikatakan bahwa Nusa sangat mudah dipelajari bagi programmer pemula sekalipun, jika Anda programmer yang mendukung Nusa, Anda harus berusaha membuktikan klaim tersebut. Saat ini (21 Agustus 2008) jumlah anggota mailing list Nusatop hanya 32 orang, artinya hanya ada sekitar 31 orang yang pernah mendownload compiler dan aneka manual Nusa (Perancang Nusa tidak dihitung). Jika Anda memahami compiler, dan menurut Anda kritik saya salah, tuliskanlah kritik teknis Anda terhadap tulisan saya.

Jika Anda bukan programmer, saya melihat ada tombol donasi paypal di website Nusa. Jika Anda mendukung Nusa tentunya bisa mendukung dengan dana. Jika Anda merasa layak dan perlu mendukung Nusa, tuliskanlah pendapat Anda di forum terbuka, agar lebih banyak yang mendukung Nusa. Carilah juga informasi yang tepat dan benar mengenai apa yang Anda dukung. Anda akan heran betapa banyaknya orang yang akan mendukung, tanpa tahu benar apa yang sebenarnya didukung.

Saya sendiri tidak berusaha mendiskreditkan karya anak bangsa. Namun jika Anda melihat ada seseorang yang berusaha membangun gedung tertinggi di Indonesia namun Anda melihat designnya jelek, apakah Anda akan berdiam diri dan menunggu bangunan tersebut rubuh?. Menurut saya kritik dan saran itu perlu bagi pengembangan apapun, jadi dalam kasus ini saya mendukung dengan memberi kritik.

Komentar

Anda bisa mengemail saya secara langsung untuk memberi komentar (yohanes at gmail.com) atau Anda bisa menuliskan komentar Anda di sini.

FAQ

Q: Kenapa tidak disampaikan langsung ke perancang Nusa?

A: Sudah, responsnya tidak baik, silakan Anda baca sendiri email-email yang saya sampaikan dan balasannya. Saya berusaha comment di website www.bernaridho.net tapi account saya malah diblok dan comment saya dihapus.

Q: Apakah Anda sendiri sanggup mengimplementasikan compiler Nusa?

A: Ya. Ada ratusan orang Indonesia lain yang bisa, dan puluhan orang saya kenal secara pribadi. Pada email pertama, Pak Bernaridho meragukan kemampuan saya dan meragukan kritik saya dan menantang saya untuk mengimplementasikan compilernya. Saya sudah mengimplementasikan lebih dari 50% (sesuai batasan dokumentasi yang ada) dalam waktu 2 minggu waktu luang saya, bukan full time (saya punya pekerjaan full time). Saya menggunakan grammar Nusa yang dikirimkan pak Bernaridho, dan karena dia mengganggap bahwa grammar itu adalah miliknya, maka saya tidak memposting compiler saya. Jika dia tidak keberatan, saya bersedia memposting source codenya kepada publik.

Anda juga bisa membuat compiler sendiri dengan mengikuti tutorial saya di http://yohan.es/compiler/

Q: Kenapa tidak membuat bahasa sendiri?

A: Sulit mencari inovasi baru dalam general purpose programming language. Masih banyak lahan pada DSL (domain specific language), bidang saya adalah DSL.

Q: Anda cuma omong doang ... (bla bla bla) apa karya Anda?

A: silakan kunjungi yohan.es, untuk melihat karya saya. Saya memang belum bisa memberi kontribusi besar pada dunia ini. Bagaimana dengan Anda sendiri?

Q: Apakah Anda sentimen dengan orang batak?

A: Nama bahasa Nusa dulunya adalah Batak, dan dulu sempat diolok-olok karena terlalu kedaerahan (sumber: arsip mailing list alumni informatika ITB). Saya mengkritik bahasa ini bukan karena masalah suku dan kedaerahan. Istri saya orang Batak, pesta pernikahan saya menggunakan adat batak. Sementara Pak Bernaridho sendiri beristrikan orang Jawa


Copyright © 2008 Yohanes Nugroho.