Prinsip
dasar pembuatan Java
adalah karena C++
ternyata tidak memenuhi
janjisebagai pemrograman berorientasi
objek. Jadi apa yang salah dari
C++ sehingga Java harus dibuat ? Jawabannya sederhana, yaitu Kompatibilitas ke
belakang ( backward compability).
Kompabilitas
kebelakang biasanya dikenal
sebagai kemampuan yang
menjamin keberhasilan dengan membuat programmer belajar dengan
cepat. Java menggunakan hampir semua
konvensi yang identik untuk :
- · deklarasi variabel
- · melewatkan parameter
- · operator
- · pengaturan aliran.
Sehingga
dengan kata lain
Java menambahkan bagian-bagian yang
baik dari C++
dan menghapus bagian-bagian yang jelek dari C.
Java jauh lebih baik dari C++ karena hal-hal
yang tidak dimilikinya, seperti beberapa contoh berikut:
VARIABEL GLOBAL
Para programmer menulis program dalam bahasa
assembly, dan semua program yang disimpan dalan punch card, penghubung alat
pemrograman adalah variabel global, masalahnya, dengan menggunakan variabel
global suatu fungsi
dapat memberikan efek
samping yang buruk dengan mengubah keadaan global. Variabel global
pada C++ adalah tanda sebuah
program yang tidak dirancang
cukup baik untuk enkapsulasi data dengan cara yang masuk akal.
Pada Java, ruang penamaan global hanya hirarki
class. Tidak mungkin menciptakan variabel global diluar semua class. Setidaknya
penentuan keadaan global dibuat lebih jelas dengan enkapsulasi dalam class. Contoh,
system.out.println() sering digunakan dalam program Java.
Ini adalah cara mengakses output standar global
untuk interpreter Java.
GOTO
Beberapa kemampuan yang digunakan sebagai cara
cepat untuk menyelesaikan program tanpa membuat struktur yang jelas adalah
pernyataan goto.
Dalam C++ dikenal sebagai if-then-goto. Sebelum
C++ memasukkan penanganan
eksepsi, goto sering
digunakan untuk membuat perulangan di dalam keadaan eksepsi. Java
tidak memiliki pernyataan goto. Java
menyediakan kata goto
hanya untuk menjaga
agar programmer tidak
bingung menggunakannya.
Java
memiliki bagian break
yang diberi label dan pernyataan continue
yang merupakan bagian dimana goto boleh dipergunakan. Penanganan eksepsi
yang ampuh dan
terdefinisi dengan baik
pada Java menghilangkan kebutuhan perintah goto.
POINTER
Pointer
atau address pada memori adalah
kemampuan C++ yang paling ampuh juga
paling berbahaya. Biasanya kesalahan terjadi
karena “kurang satu tempat” atau
rusaknya data yang disimpan karena
lokasi memori terakhir hancur - susah untuk diperiksa dan ditelusuri. Meskipun penanganan
objek Java menggunakan
pointer, bahasa Java
tidak memiliki kemampuan memanipulasi
pointer secara langsung. Kita tidak
dapat mengubah integer
menjadi pointer, menunjuk
ulang sembarang address memori.
Array merupakan objek yang didefinisikan, tidak
berupa address dimemori. Di Java kita tidak dapat menulis sebelum akhir lokasi
yang disediakan untuk array.
ALOKASI MEMORI
Kemampuan
C++ yang sama
berbahayanya dengan pengolahan
matematis pointer adalah
manajemen memori. Manajemen memori
di C dan C++ diwujudkan dengan
keunggulan dan kelemahan fungsi library
malloc() dan free().
Fungsi
malloc(), mengalokasikan jumlah
tertentu memori (dalam
byte), dan mengeluarkan address blok
tersebut.
Fungsi
free(), mengirimkan blok
yang telah dialokasikan kepada sistem
untuk penggunaan umum. Secara umum dapat menyebabkan
kebocoran memori yang
mengakibatkan program berjalan semakin lama semakin lambat. Java tidak memiliki fungsi
malloc dan free, karena
setiap struktur data yang rumit
adalah objek, maka mereka
dialokasikan dengan operator new,
yang mengalokasikan ruang untuk objek pada ‘heap’ memori.
Memori
yang disediakan disebut ‘heap’
karena kita tidak perlu lagi memikirkannya sebagai penambahan address yang
berstruktur linier. Jadi hanya berupa kumpulan instans (instance) objek. Yang
didapat dari fungsi new bukanlah address
memori, melainkan hanya ‘pegangan’ untuk objek dalam heap.
TIPE DATA YANG RAPUH
C++ mewarisi semua tipe data umum pada C. Tipe-tipe
ini mewakili bilangan
bulat dan pecahan
dengan berbagai rentang
nilai dan ketelitian. Rentang
nilai dan ketelitian
tipe ini bervariasi
bergantung pada implementasi kompilernya.
Java
memecahkan masalah ini
dengan mengambil ukuran
yang sesuai untuk
semua tipe numerik dasar dan
menyatukannya. Arsitektur tertentu
akan mengalami kesulitan
atau bekerja tidak
optimal untuk mengimplementasikan tipe data yang
bergantung hardware secara ketat pada interpreter Java yang diberikan, tetapi
inilah satu-satunya cara untuk menjamin hasil yang dapat dibuat ulang pada platform
hardware yang berbeda.
PEMILIHAN TIPE (TYPE CASTING) YANG TIDAK AMAN
Type Casting
adalah mekanisme yang ampuh dalam C/C++ yang memungkinkan kita untuk mengubah
tipe suatu pointer secara sembarang. Mungkin
kita sering melihat bentuk seperti ini :
memset((void *)p, 0, sizeof (struct p))
Penggunaan ini, walaupun tidak baik, tetapi
cukup aman. Tentu saja dengan menganggap blok memori yang ditunjuk oleh p
sekurang-kurangnya sepanjang sizeof (struct p). Ini harus digunakan dengan
sangat hati-hati karena tidak ada syarat untuk memeriksa apakah kita telah
memilih tipe dengan benar.
Penanganan objek Java mencakup informasi lengkap
tentang class yang menjadi instans suatu objek,
sehingga dapat dilakukan pemeriksaan kompatibilitas tipe selama program berjalan, dan
menghasilkan eksepsi jika terjadi kegagalan.
DAFTAR ARGUMEN YANG TIDAK AMAN
C++ banyak disukai karena kemampuannya melewatkan
pointer dengan tipe sembarang dalam daftar argumen panjang-variabel yang
dikenal sebagai varargs. Varargs adalah tambahan sederhana pada premis yang
menyatakan bahwa sembarang address dapat dipetakan pada sembarang tipe,
tugas pemeriksaan tipe diserahkan kepada programmer.
Sangat menyenagkan jika Java memiliki cara yang
aman terhadap tipe untuk mendeklarasikan dan melewatkan daftar argumen
panjang-variabel, tetapi sampai versi 1.0 belum ada ketentuan seperti itu.
FILE HEADER YANG TERPISAH
Salah satu
kemampuan yang patut dipertimbangkan
adalah file header, dimana kita dapat mendeklarasikan prototipe
class kita dan
mendistribusikannya dengan kode
biner implementasi class yang telah di-compile. Kemampuan ini membuat
lingkungan compiler C++ hampir tidak dapat digunakan. C++ memiliki format file yang bergantung mesin untuk kode yang
telah di-compile, sehingga informasi
header dapat dibuat coresiden.
Karena antarmuka programmer ke class yang di-compile dilakukan melalui
file header-nya, maka kode yang telah di-compile sangat bergantung pada apa
yang ada pada file header tersebut.
Misalkan
programmer yang senang
berpetualang ingin meningkatkan
akses pada beberapa anggota data
private pada class yang telah di-compile.
Yang harus dilakukan oleh orang tersebut adalah mengganti pengubah akses
yang asalnya private menjadi public pada file header dan meng-compile suatu sub
class dari class yang telah di-compile. Pada Java ini tidak mungkin terjadi,
karena di Java tidak
ada file header.
Tipe dan visibilitas anggota class dicompile ke
dalam file class
Java. Interpreter Java
menjalankan pengaturan akses
saat program berjalan, jadi sama sekali tidak ada cara untuk mengakses
variabel private dari luar suatu class.
STRUKTUR YANG TIDAK AMAN
C berusaha menyediakan enkapsulasi data melalui
deklarasi struktur yang disebut struct,
dan polimorfisme dengan mekanisme union.
Dua gagasan ini
menghasilkan batas tipis
antara penyesuaian bergantung mesin yang kritis dan berbahaya dengan
batasan ukuran. Java tidak memiliki konsep struct dan union , sebaliknya Java menyatukan konsep
ini dengan class.
PENG-HACKER-AN PREPROCESSOR
Untuk mewujudkan keinginan memiliki model
yang jelas untuk ditulis
oleh programmer, compiler C dan C++ menggunakan tool yang sama dengan
yang digunakan pada masa-masa MACRO assembler.
Ini menghasilkan preprocessor C yang tugasnya
mencari perintah khusus yang diawali tanda pagar (#). Preprocessor C sering
digunakan untuk membangun program yang sangat sulit dibaca. Java mengatur agar
kita dapat bekerja tanpa preprocessor, hanya bergantung pada kata kunci final
untuk mendeklarasikan konstanta yang sebelumnya dihasilkan dengan #define.
QED
Berasal dari bahasa latin Quod Erat
Demonstrandum, yang berarti “Terbuktikan..!!!”.
No comments:
Post a Comment