Add caption |
Prinsip dasar pembuatan Java adalah karena C++ ternyata tidak memenuhi janji sebagai 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 dan 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 blobal 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. Sebeleum C++ memasukkan penanganan eksepsi, goto sering digunakan untuk membuat perulangan didalam 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.kesalahan ini merupakan salah satu kesalahan yangterburuk yang 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 instan 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 meng-implementasikan 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 sekurang0kurangnya 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 pointerdengan 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 dpata 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.
sumber : imam.staff.gunadarma.ac.id
sumber : imam.staff.gunadarma.ac.id