Membandingkan Fitur Bahasa Pemrograman

Semalam terpikir untuk melakukan pekerjaan iseng, membandingkan bahasa pemrograman (yang pernah saya pakai). Tingkat perbandingannya pun yang ringan-ringan saja karena baru pada tingkat leksikal, sedikit semantik, dan ditambah beberapa penilaian dari perspektif pribadi. Bahasa yang menjadi korbannya adalah LISP, BASIC, Pascal, C/C++, JAVA, Python (beberapa bahasa lain seperti turunan ECMAscript (javascript, action script) dan PHP dibuang dari daftar kecuali untuk fitur-fitur khusus).

fitur-fitur yang dipilih untuk diperbandingkan diantaranya :

  • Komentar
  • Kenihilan
  • Analisa Kasus
  • Kepulangan
  • Cakupan


Komentar
Fitur untuk membuat komentar atau bagian dari kode sumber yang tidak diinterpretasi oleh kompilator biasanya dimanfaatkan sebagai dokumentasi kode yang hanya dimengerti oleh manusia atau mesin dalam taraf tertentu (auto-dokumentasi) atau sebagai alat bantu dalam proses debugging. Menurut saya komentar seharusnya mudah ditambahkan maupun dikurangi tanpa membuat kerepotan. Komentar pada umumnya dapat dikelompokkan menjadi dua buah kelompok yaitu satu baris dan beberapa baris.

Simbol penanda komentar dari kandidat berikut :

# (python)
// (C/C++, Delphi)
' (BASIC)
; (Assembly)

saya cenderung lebih suka menggunakan simbol pagar (#) karena satu dan lain hal diantaranya cukup mudah diakses dengan satu tangan (kelingking kiri pada tombol shift dan jari tengah tangan kiri pada tombol angka 3) dan makna ‘pagar’ yang sesuai dengan definisi dari simbol ini yaitu ‘memagari’ bagian yang tidak perlu diinterpretasi.

Kalau untuk simbol penanda komentar beberapa baris sekaligus, kandidatnya :


{ } (pascal)
(* *) (pascal)
/* */ (C/C++)
""" """ (python)

Pilihan saya jatuh pada pascal yang pertama. Alasannya sederhana saja, paling sedikit yang perlu diketik😛. Simbol kurung kurawal ini digunakan untuk menyatakan cakupan di C/C++.

Kenihilan
Dalam bahasa pemrograman yang memiliki representasi terhadap kondisi ada dan tiada (misalnya untuk reference objek, atau pointer ke alamat memori). ada berbagai macam nama sebagai simbol ketiadaan. Ada nil di pascal dan LISP, NULL di C atau null di JAVA, None di python, adajuga Nothing dan undefined (Action Script). Walaupun secara makna yang paling dekat dengan yang dimaksud adalah undefined (tidak terdefinisi, bukan berarti tidak ada), saya cenderung memilih nil karena tidak terlalu spesifik dengan pengucapan bahasa (bandingkan dengan null) dan tidak terlalu panjang (bandingkan dengan Nothing atau undefined).

Analisa Kasus
Analisa kasus yang saya maksud bukan untuk kasus biner seperti if-then melainkan kasus jamak. Analisa kasus jamak memiliki banyak bentuk, beberapa digunakan hanya untuk kasus yang khusus seperti hanya untuk tipe data tertentu (case-of hanya untuk tipe ordinal (integer, set) di pascal) atau yang cukup generik sehingga sering dimanfaatkan juga sebagai penghemat dari rantai if-then-else-if-dst.


(* PASCAL *)
case X of
   [value1]:;
   [value2]:begin
   end;
end;

/* C/C++, ECMA, PHP */
switch(X){
   case [value1]:
          break;
   default:
}

'BASIC
SELECT CASE X
   CASE[value1] 
   CASE[value1] 
END SELECT

#LISP
(cond
 ((= X [value1]) )
 ((= X [value1]) )
)

Untuk hal ini saya masih bingung. Saya suka dengan sifat generik dari cond (atau depend-on dalam kuliah pemrograman fungsional) tetapi kadang merepotkan kalau memang yang dibandingkan adalah objek yang sama (apalagi terlalu banyak tanda kurungnya) sehingga mekanisme di atasnya lebih memudahkan. Sebetulnya analisa kasus di BASIC cukup enak mengingat tidak perlu adanya penghenti cakupan kasus (tidak menggunakan break, atau menggunakan pencakup begin-end yang menurut saya agak mengotori kode) seandainya saja tidak perlu ada term CASE setelah term SELECT dan Mekanisme pencakupan yang boros keyword (akan dibahas dalam fitur berikutnya). Pascal dan C/C++ sebetulnya cukup singkat kecuali untuk kekurangan pada pascal (perlu adanya begin-end) dan kekurangan keluarga C/C++ (break dan pencakupan kurung kurawal). Sepertinya untuk analisa kasus jamak belum ada yang bisa dibilang paling bagus.

Kepulangan
Fitur ini berkaitan dengan fitur yang lebih besar yaitu dekomposisi program menjadi rutin-rutin kecil yang sering dipanggil agar mengurangi redundansi kode dan kemungkinan tidak konsistennya kode yang ditulis berulang. Hal yang menjadi sorotan adalah dua mekanisme umum yang diwakili oleh Pascal/Delphi (menggunakan nama fungsi atau result)dengan C/C++ (menggunakan return). Kasus uji yang dibandingkan antara lain nilai kembalian dan berhenti sebelum waktunya.

Kasus nilai kembalian (return value) untuk fungsi dari kedua mekanisme di atas cukup berbeda cara penanggulangannya. Penggunaan nama fungsi atau variabel lokal bernama result sangat membantu sebagai ‘kotak standar yang harus diisi’ sedangkan pada C/C++ kita perlu menggunakan variabel sementara atau ekspresi langsung. Pada C/C++ nilai kembalian ‘dititipkan’ ke mekanisme untuk keluar dari rutin (return) sedangkan pada Pascal mekanisme ini dipisahkan (menggunakan exit). Kedua mekanisme ini menurut saya cukup setara. Saya masih bingung mekanisme mana yang dipilih jika diminta untuk memutuskan (kalau keduanya ada dalam satu bahasa sepertinya akan membingungkan dan cukup boros keyword yang harus diingat).

Cakupan
Cakupan (scoping) merupakan mekanisme yang selama ini dimanfaatkan sebagai aggregasi ataupun sebagai pembatas dalam ruang penamaan (namespace). Banyak pandangan tentang cakupan yang selama ini saya temui. Ada yang berpendapat bahwa penggunaan simbol yang baku dapat mempermudah untuk urusan namespace sementara pandangan lain bahwa simbol baku untuk pencakupan menyebabkan kode menjadi sulit dibaca. Saya akan menyoroti secara lebih umum yaitu membuat menjadi dua kelompok :

  • Pencakupan eksplisit, menggunakan simbol (kurung, kurung kurawal)atau kata kunci khusus (begin-end, X-END X, do-od/if-fi) sebagai pembatas cakupan
  • Pencakupan implisit, menggunakan satu simbol penanda dan simbol kontrol seperti pada python

Setelah ditulis di sini saya jadi agak bimbang. Saya cenderung menyukai mekanisme python yang secara tidak langsung juga mengatur bagaimana kode disusun dan tampil walaupun mekanisme ini seringkali menyulitkan bagi orang yang baru belajar pemrograman. Pencakupan yang eksplisit sepertinya terlalu banyak dilatarbelakangi pandangan subjektif sedangkan saya sendiri tidak terlalu peduli dengan mana yang paling bagus diantara mekanisme-mekanisme pencakupan ekspisit.

Penutup
sebetulnya masih ada fitur lain yang ingin saya bahas tetapi sepertinya terlalu panjang kalau ingin dimasukkan di tulisan ini. Jadi sebaiknya nanti saja dibahas dalam tulisan berikutnya. Fitur lainnya yang ingin saya bahas antara lain :

  • Deklarasi tipe, apakah lebih baik di awal (C/C++, JAVA), di akhir (Pascal, ActionScript 2.0), atau sistem weak-typing
  • Signature,
  • Traversal loop
  • Primitives, dilema string

4 comments

  1. glubot · Juli 17, 2008

    lelucon dari teman tentang reference dan komentar

    int main(){
    int d;
    int b = 7;
    int *a = &b; /*variabel a pointer ke addressb*/
    *a = 800; /*mengisi nilai yg diacu a dengan 800*/
    d = 1600/*a; /*variabel d dibagi nilai yg diacu a*/
    printf(“Nilai d = %d”, d); /*ngeprint nilai d*/
    return 0;
    }

    sedikit memperlihatkan bahwa komentar yg dari delphi atau pascal memang lebih enak.

  2. Adhi Hargo · Desember 1, 2008

    Berkat komentar Anda di blog saya, saya jadi ketemu salah satu blog IT paling informatif dan orisinal di Indonesia. Keep on _not_ regurgitating!

    Penggunaan multiline string sebagai multiline comment untuk fungsi dalam Python atau Common Lisp bukannya penyalahgunaan sintaks? Parser membaca string dan menjadikannya data field “docstring” dari identifier yang diikat oleh “def” (Python) atau “defXXX” (Lisp). Komentar diabaikan oleh scanner, namun docstring tetap memiliki nilai semantik dalam listing program. Meski yakin Anda tahu, saya hanya ingin menekankan saja.

    Yang memancing saya berkomentar di sini adalah bahasan Anda tentang “scoping”. Anda sepertinya mencampur-adukkan “lexical scoping” dengan “statement grouping”/”blocking”: yang pertama menentukan wilayah aktifnya perikatan satu identifier dengan nilai tertentu, yang kedua terkait instruction sequencing. Keduanya belum tentu sama, contohnya versi-versi awal Lisp yang menggunakan dynamic scoping, di mana perikatan sebuah identifier tidak ditentukan oleh posisinya dalam blok listing program (statis), melainkan posisinya dalam kode pemanggil (dinamis):

    (defun bar () 100)
    (defun foo () (bar))

    (let ((bar (lambda () 999)))
    (foo)) ; hasilnya 999, kecuali di Lisp modern spt CL

    Saya juga sempat suka cara Python menentukan blok, tapi tidak lagi setelah tahu mekanisme inilah yang mengebiri “lambda” sampai tidak lagi pantas disebut lambda.

  3. pebbie · Desember 1, 2008

    @Adhi: thx udah mampir ke sini😀

    great comment!thanks a lot!
    i’ve been waiting for comment like this since the first blog post is written..

    there are just too many of people who just want free lunch but cannot even differentiate “syntax”, “snippet”, and “full source-code executable”

    mengenai scoping. ah ya, my bad.. my bad.. gw pake istilah scoping padahal mau membahas blok.

    *baru baca ttg lambda di python*..😀 sepertinya memang python mengebiri lambda cuma dalam artian “one line representation of function” untuk mempertahankan mekanisme blok.

  4. pebbie · Desember 1, 2008

    oiya lupa.. thx tutorial TkInter-nya.. bener2 membantu waktu belajar python😀

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s