BAB I PENDAHULUAN
1.1 Latar Belakang Masalah Sebesta (2002) memaparkan kriteria evaluasi terhadap sebuah bahasa pemrograman, yaitu readability, writability, dan reliability. Sebesta juga mendaftar karakteristik-karakteristik
yang
mempengaruhi
ketiga
hal
tersebut,
yakni
simplisitas-ortogonalitas, struktur kendali, tipe data dan struktur, disain sintaks, dukungan terhadap abstraksi, ekspresivitas, type checking, exception handling, dan aliasing. Yang menjadi topik skripsi ini adalah masalah simplisitas-ortogonalitas dan disain sintaks, tanpa mengabaikan karakteristik-karakteristik yang lain. Permasalahan pertama adalah simplisitas. Bahasa pemrograman yang memiliki terlalu banyak fitur primitif akan menjadi terlalu kompleks untuk dipelajari. Sebagai akibatnya, mungkin seorang pemrogram akan mempelajari sebagian saja dari bahasa tersebut yang sering digunakannya, sedangkan pemrogram yang lain mungkin mempelajari sebagian yang lain. Ketika pemrogram yang pertama hendak menganalisis program yang dibuat oleh pemrogram yang kedua, ia akan mengalami kesulitan. Hal ini dikatakan oleh Sebesta sebagai berikut: “Pemrogram yang harus menggunakan sebuah bahasa yang besar cenderung mempelajari hanya sebagian dari bahasa tersebut dan mengabaikan fitur-fitur yang lain. Pola ini seringkali dimanfaatkan untuk mengijinkan banyaknya komponen-komponen sebuah bahasa, tetapi argumen ini tidak sah. Masalah readability muncul ketika pembuat program
1
2 telah mempelajari bagian yang berbeda dari bagian yang sudah akrab dengan pembaca program.”
Dengan demikian akan lebih baik jika sebuah bahasa pemrograman dibuat sedemikian rupa sehingga cukup sederhana untuk dipelajari seluruhnya. Selain masalah simplisitas, juga terdapat masalah ortogonalitas. Sebesta mengatakan: “Sebagai contoh mengenai kurangnya ortogonalitas dalam bahasa pemrograman tingkat tinggi, yang terwujud dalam berbagai bentuk pengecualian, adalah aturan-aturan dalam bahasa C. Walaupun C memiliki dua jenis tipe data terstruktur, yaitu array dan record (struct), record dapat dikembalikan melalui fungsi, sementara array tidak. Anggota dari sebuah struktur dapat berupa sembarang tipe data kecuali void atau struktur itu sendiri. Elemen array dapat berupa sembarang tipe data kecuali void atau fungsi. Parameter dikirim by value, kecuali jika parameter-parameter itu berupa array, akan dilakukan by reference (karena penyebutan nama array tanpa subskrip dalam program C diterjemahkan sebagai alamat dari elemen pertama array tersebut). Ekspresi penambahan sederhana seperti a+b biasanya berarti nilai dari a dan b diambil dari memori dan dijumlahkan. Jika a adalah pointer, nilai dari b dapat berubah sebelum operasi penambahan dilakukan. Misalnya, jika a menunjuk pada nilai yang berukuran 2 byte, nilai b akan dikalikan dengan 2 sebelum penambahan dilakukan. Tipe dari a, yang merupakan konteks kiri dari +b mengharuskan nilai b diubah sebelum ditambahkan kepada a.”
Bahasa C (termasuk C++) tidaklah sederhana. Banyak fitur-fitur primitif yang tidak ortogonal satu sama lain. Membuat bahasa yang sederhana dan ortogonal berarti memperkecil jumlah fitur primitifnya, sementara masing-masing fitur primitif dapat dikombinasikan bersama-sama untuk membangun program yang lebih kompleks. Adapun, bahasa C#, C++, Object Pascal dan Java membuat dikotomi antara kelas dan tipe data. Sekalipun dalam bahasa Java tersedia wrapper object (Newman,
3 1996) bagi masing-masing tipe data primitif, tetapi tetap terjadi ketidakkonsistenan. Terutama dalam menentukan apakah suatu variabel merupakan objek ataukah sebuah instance dari tipe data. Hal ini mengurangi simplisitas, yang akhirnya mengurangi readability dari bahasa-bahasa tersebut. Bahasa yang lebih murni object-oriented, Smalltalk, samasekali tidak membuat diskriminasi antara objek dan data. Semuanya adalah objek, dan operasi-operasi dilakukan hanya melalui pengiriman pesan antar objek. Bahkan struktur kontrol pun merupakan mekanisme pengiriman pesan. Sayangnya, bahasa Smalltalk tampak kurang natural. Lebih mudah untuk memahami potongan program C++ berikut: if (x==0) Y=1; else Y=-1;
daripada potongan program Smalltalk berikut: x=0 ifTrue: [y <- 1] ifFalse: [y <- 0-1 ]
karena walaupun keduanya melakukan tugas yang sama, yang pertama tampak lebih natural daripada yang kedua. Hal ini, walaupun tidak berkaitan dengan simplisitas-ortogonalitas, tetapi berkaitan dengan masalah disain sintaks, yang mempengaruhi readability suatu bahasa program. Bagaimana pun, Smalltalk, seperti telah disebutkan sebelumnya, telah memperlakukan struktur kontrol sama
4 dengan mekanisme pemanggilan pesan. Hal ini dapat meningkatkan simplisitas dan ortogonalitas. Berdasarkan latar belakang permasalahan seperti telah dijelaskan sebelumnya, dirancang sebuah bahasa pemrograman baru yang untuk saat ini diberi nama DOGI, yang diharapkan dapat mengatasi permasalahan-permasalahan di atas, dengan menekankan karakteristik simplisitas dan ortogonalitas.
1.2 Ruang Lingkup Perancangan dalam skripsi ini adalah perancangan bahasa pemrograman. Dengan demikian titik beratnya adalah pada perancangan bahasanya, dan bukan teknik kompilasinya. Pembatasan-pembatasan sehubungan dengan hal ini antara lain adalah: • Perancangan kompiler bahasa DOGI tidak menerjemahkan semua sintaks bahasa DOGI sekalipun sintaks tersebut ada dalam spesifikasi bahasanya. Hal ini dilakukan mengingat keterbatasan waktu dan kompleksitas pengerjaan program. Beberapa sintaks yang tidak akan diterjemahkan oleh kompiler tersebut adalah: a. String escape character ascii, unicode, dan perulangan b. Interface c. Property d. Indexer e. Package import dan export
5 • Untuk
penyederhanaan
perancangan
kompiler,
kompiler
DOGI
digabungkan dengan pengeksekusi kode antara, tidak dipisahkan seperti halnya Java. Dengan demikian program yang ditulis dalam bahasa DOGI akan dikompilasi oleh program dan langsung dieksekusi. Komponen bahasa pemrograman yang tidak termasuk ke dalam bahasa DOGI dalam skripsi ini adalah exception handling.
1.3 Tujuan dan Manfaat 1.3.1 Tujuan Tujuan dari perancangan ini adalah menghasilkan sebuah bahasa pemrograman bernama DOGI yang memiliki sifat-sifat berikut ini, disebutkan bersama karakteristik yang diwakili oleh sifat-sifat tersebut: • Object oriented (abstraksi) • Memiliki hanya satu kelas induk (simplisitas-ortogonalitas) • Tipe data adalah kelas (simplisitas-ortogonalitas) • Operator merupakan method (ekspresivitas, disain sintaks) • Struktur kontrol merupakan method (struktur kontrol, disain sintaks) Tentu saja perancangan bahasa DOGI juga harus disertai dengan kompiler agar dapat diterapkan. Kompiler DOGI akan mengkompilasi kode sumber menjadi kode antara (semacam bytecode pada Java maupun MSIL pada .NET), yang akan dieksekusi oleh DOGIVM (DOGI Virtual Machine).
6 1.3.2 Manfaat Bahasa DOGI hanyalah sebuah bahasa yang baru dilahirkan. Pemanfaatannya secara langsung tentu saja tidak banyak. Agar dapat dimanfaatkan secara maksimal seperti halnya bahasa-bahasa pemrograman yang lain, DOGI perlu dikembangkan lebih lanjut. Walaupun demikian, DOGI beserta kompilernya sudah dapat dimanfaatkan untuk mengimplementasikan algoritma-algoritma yang cukup kompleks. Misalnya, dengan ortogonalitas yang dimiliki DOGI, dapat dibuat implementasi stack, queue, tree, graph, dan lain-lainnya untuk menyelesaikan berbagai permasalahan, dan sebagainya. Tentu saja kecepatan eksekusi tidak dapat terlalu diharapkan, mengingat DOGIVM samasekali tidak dioptimalkan.
1.4 Metodologi Spesifikasi bahasa DOGI ditulis dalam bentuk BNF (Backus-Naur Form). Kompiler DOGI dibuat dengan menggunakan program Flex dan Bison, dikompilasi menggunakan kompiler C++. Flex untuk membuat scanner berdasarkan sejumlah ekspresi reguler, dan Bison untuk membuat parser, berdasarkan aturan-aturan produksi yang ditulis dengan BNF. DOGIVM dibuat dengan C++, menggunakan stack untuk eksekusi setiap perintahnya.