Mari tanya om Gugel: perl6 sucks = 12 ribu result, perl6 rules = 51 ribu result. Jadi: jelas-jelas Perl 6 rules!
(Oke, gak objektif karena “rules” sebetulnya adalah bagian dari spesifikasi regexes/grammar Perl 6, jadi tentu akan sering disebutkan bersama2x.)
Tapi still, menurut saya pribadi, Perl6 rules, terutama bagi programer Perl. Perl 6 berjanji akan memperbaiki “semua” kekurangan2x Perl 5, membuatnya jadi tetap (dan lebih) kompetitif dibandingkan bahasa2x lain yang menjadi saingannya, namun sambil membuat Perl 6 tetap berjiwa Perl. Dan melihat spesifikasi yang ada sejauh ini, keliatannya janji tersebut akan cukup terpenuhi. Di posting-posting blog mendatang, kalo ada waktu dan mood, saya akan mencoba posting beberapa fitur baru dari Perl 6 yang cool banget gitu loh.
Ada 2 argumen paling popular seputar mengapa Perl 6 sucks.
Yang pertama adalah: Perl 6 is a mess. Dan biasanya yang menjadi titik sorot adalah dua aspek: sigil (Perl 6 bukannya menyederhanakan atau menghilangkan sigil alias prefiks $, @, % pada variabel, tapi malah menambah kompleks dengan menambahkan twigil seperti $*, $^, %., dll) dan operator (Perl 6 menambah jumlah operator jadi banyak sekali, totalnya di atas 100!). Sehingga berpotensi membuat line noise yang lebih parah lagi.
Yang kedua adalah: Perl 6 is vaporware. 8 tahun berlalu sudah sejak proyek Perl 6 diumumkan 2000 silam. Sampai sekarang, kita belum melihat ada satupun implementasi Perl 6 yang lengkap. Jangankan itu, beberapa aspek bahasa spesifikasinya pun masih belum ada, contohnya spesifikasi utk security, kompilasi, dan command line interface.
Untuk argumen pertama, saya curiga kebanyakan orang yang meluncurkannya adalah bukan pemakai Perl, atau pemakai Perl yang diam2x berharap bahwa versi berikut Perl akan jadi lebih seperti Python atau Ruby, sehingga mereka kecewa karena kenyataannya tidak sesuai dengan harapan mereka. Di mata mereka, Perl 1 through 5 are a mess anyway.
Sigil & twigil
Sesuai dengan ciri khas Perl, memang Perl 6 mempertahankan keberadaan sigil. Hilangnya sigil sama sekali akan membuat terlalu banyak perubahan visual, sehingga ciri khasnya hilang.
Namun setidaknya Perl 6 membuat sedikit penyederhanaan pada sigil, dengan membuat prefiks sebuah sigil tetap: $ary[0] di Perl 5 kini tetap @ary[0]. $hash{’key’} kini tetap ditulis %hash{’key’}.
Sementara keberadaan twigil sebetulnya amat membantu karena memberi indikasi scope (sigil sendiri memberi indikasi jenis data). Dan karena di Perl 6 ada banyak scope tambahan, keberadaan twigil-twigil ini justru membantu keterbacaan. Contohnya, sekarang kita bisa menandai semua variabel global dengan $*FOO. Sebelumnya, kita harus mengandalkan konvensi huruf besar dan kecil. Lalu untuk membedakan atribut objek, kita dapat menggunakan $.foo (IMHO lebih enak dibaca/diketik ketimbang self.foo). Untuk parameter subrutin, disediakan penanda $^foo dan $:foo. Bahkan untuk POD disediakan variabel-variabel $=foo sehingga kita bisa mengaksesnya dari program.
Tentu saja, twigil tidak harus ditambahkan kecuali jika perlu dan ingin. Jika ada variabel tanpa twigil, scopenya akan dicari sesuai urutan. Keberadaan twigil dapat mengurangi ambiguitas jika diperlukan, dan jika ditambahkan akan meningkatkan keterbacaan.
Operator
Di Perl 6, operator sebetulnya gak lebih dari fungsi yang punya nama aneh (dan biasanya berupa simbol). Jadi, operator adalah shortcut. Untuk membantu programer menjadi lebih produktif, Perl 6 menyediakan banyak shortcut. Shortcut-shortcut ini diciptakan setelah melihat pola pemakaian programer Perl 5 selama bertahun-tahun.
Jumlah operator yang katanya mencapai 100 lebih ini pun sebetulnya merupakan total kombinasi saja. Seperti diketahui, Perl 6 memiliki konsep metaoperator (atau modifier operator), di mana sebuah operator (seperti +, -, *, =, dll) dapat dikombinasikan dengan metaoperator sehingga menghasilkan satu set operator lagi, sehingga total jumlahnya banyak.
Contohnya, untuk grep dan map yang sering sekali dilakukan (dan reduce, yang sebelumnya gak ada builtinnya di Perl 5), kini ada shortcutnya yaitu hyper (meta)operator dan reduction (meta) operator.
Jika di Perl 5 kita menulis:
@c = map { $a[$_] + $b[$_] } 0..$#a;
maka di Perl 6 kita bisa menulis:
@c = @a >>+<< @b;
karena hyperoperator >><< otomatis mengaplikasikan operator + bagi semua elemen list. Sementara metaoperator [] merupakan padanan metode inject seperti di Ruby. Sehingga jika di Perl 5 kita menulis:
$r = 0; for (@ary) { $r += $_ }
atau di Ruby:
[1, 2, 3].inject{|x, y| x+y}
di Perl 6 dapat ditulis:
$r = [+] @ary;
Contoh-contoh lain:
P5: $_++ for @ary;
P5: for (@ary) { $_++ }
P6: @ary >>++;
P5: @min = map { $a[$_] < $b[$_] ? $a[$_] : $b[$_] } 0..$#a;
P6: @min = @a >>min<< @b;
# semua Perl 6
$hasil_kali = [*] @a;
$faktorial = [*] 1..$n;
$sorted = [<] @a; # true if @a[0] < @a[1] < @a[2] < …
$min = [min] @a; $min = [min] @a;
Memang efek samping dari banyaknya operator ini adalah, Perl nampak makin tidak terbaca bagi seseorang yang asing dengan Perl. Tapi what’s wrong with that? Seseorang yang tidak pernah belajar huruf Kanji juga tidak bisa membaca teks Jepang atau Mandarin kan?
Vaporware
Memang untuk yang ini sulit dibuat penyanggahnya, karena saat ini Perl 6 *is* a vaporware. Tapi meskipun tidak bisa disanggah, setidaknya kita dapat memaklumi.
Cobalah menempatkan diri pada posisi Larry Wall. Ciptaan Anda, Perl 5, telah begitu sukses dan terus dipakai 13 tahun setelah pertama kali dirilis (dan kemungkinan akan terus dipakai setidaknya 13 tahun lagi). Sekarang, setelah kemajuan zaman dan hadirnya bahasa2x baru, Anda diharapkan membuat generasi berikutnya yang tentunya diharapkan akan bertahan setidaknya 10 tahun ke depan juga. Tidak hanya bertahan, tapi juga harus kompetitif dan mampu membuat para hacker tertarik memainkan bahasa Anda setidaknya selama beberapa tahun. Andaikan Anda hanya membuat just another Ruby clone atau Perl with Ruby & Python features, kebanyakan orang pasti akan berkomentar, “meh,” dan mungkin akan memakai Python & Ruby saja sekalian.
Tidak, pikir Anda, Anda tentu harus berimajinasi dan memikirkan banyak hal baru dan inovatif untuk dimasukkan dalam bahasa baru Anda ini. Dan Larry Wall + komunitas Perl memang telah banyak mencoba mendesain banyak hal ambisius: seperti mencoba mendesain ulang sintaks regex yang telah puluhan tahun stabil (atau stagnan), memasukkan buanyak fitur2x dari bahasa lain (macro a la lisp, block a la ruby), serta merangkum berbagai paradigma (OO/prosedural/fungsional, static/strict/loose typing, you name it, semua bisa) sambil tetap membuatnya opsional karena tak ingin memaksa user memakainya jika tak ingin.
Di sisi implementasi, berkat Perl 6 efforts, muncul pula proyek Parrot yangjuga ambisius, yaitu membuat virtual machine untuk menjalankan semua bahasa dinamik. Perl 6 sendiri dimaksudkan untuk memiliki banyak implementasi.
Saking ambisiusnya, sampai kini belum ada implementasi Perl 6 yang lengkap (walaupun bulan-bulan terakhir Parrot dan Rakudo mengalami percepatan momentum). Tapi gak masalah. Perl 6 adalah, in some respects, sebuah eksperimen. Perl 6 juga tidak diciptakan melulu untuk menyelesaikan masalah2x yang ada sekarang, melainkan juga masalah2x yang akan lebih relevan 5-10 tahun mendatang (seperti konkurensi dan interoperasi antarbahasa skripting). Untuk masalah2x yang harus dipecahkan sekarang, there’s always production-ready Perl 5 yang tetap dimaintain dan dikembangkan.