Pada tingkat abstrak, Anda dapat memasukkan apa pun yang Anda inginkan dalam bahasa yang Anda desain.
Pada level implementasi, tidak terhindarkan bahwa beberapa dari hal-hal itu akan lebih mudah untuk diimplementasikan, beberapa akan rumit, beberapa dapat dibuat cepat, beberapa pasti akan lebih lambat, dan sebagainya. Untuk menjelaskan hal ini, desainer sering harus membuat keputusan dan kompromi yang sulit.
Pada tingkat implementasi, salah satu cara tercepat yang kami lakukan untuk mengakses suatu variabel adalah dengan mengetahui alamatnya dan memuat konten dari alamat itu. Ada instruksi khusus di sebagian besar CPU untuk memuat data dari alamat dan instruksi itu biasanya perlu tahu berapa byte yang mereka perlu muat (satu, dua, empat, delapan, dll) dan di mana harus meletakkan data yang mereka muat (register tunggal, register pasangan, register yang diperluas, memori lain, dll). Dengan mengetahui ukuran suatu variabel, kompiler dapat mengetahui instruksi mana yang harus dipancarkan untuk penggunaan variabel tersebut. Dengan tidak mengetahui ukuran variabel, kompiler harus menggunakan sesuatu yang lebih rumit dan mungkin lebih lambat.
Pada tingkat abstrak, titik subtipe adalah untuk dapat menggunakan contoh dari satu jenis di mana jenis yang sama atau lebih umum diharapkan. Dengan kata lain, kode dapat ditulis yang mengharapkan objek dari tipe tertentu atau apa pun yang lebih diturunkan, tanpa mengetahui sebelumnya apa sebenarnya ini. Dan jelas, karena lebih banyak tipe turunan dapat menambah lebih banyak anggota data, tipe turunan tidak harus memiliki persyaratan memori yang sama dengan tipe dasarnya.
Pada tingkat implementasi, tidak ada cara sederhana untuk variabel ukuran yang telah ditentukan untuk menyimpan instance ukuran yang tidak diketahui dan diakses dengan cara yang biasa Anda sebut efisien. Tetapi ada cara untuk memindahkan barang-barang sekitar sedikit dan menggunakan variabel untuk tidak menyimpan objek, tetapi untuk mengidentifikasi objek dan membiarkan objek itu disimpan di tempat lain. Cara itu adalah referensi (misalnya alamat memori) - tingkat tipuan ekstra yang memastikan bahwa variabel hanya perlu menyimpan beberapa jenis informasi ukuran tetap, selama kita dapat menemukan objek melalui informasi itu. Untuk mencapai itu, kita hanya perlu memuat alamat (ukuran tetap) dan kemudian kita dapat bekerja seperti biasa menggunakan offset dari objek yang kita tahu valid, bahkan jika objek itu memiliki lebih banyak data di offset yang tidak kita ketahui. Kita bisa melakukan itu karena kita tidak
Pada tingkat abstrak, metode ini memungkinkan Anda untuk menyimpan (referensi ke a) string
ke dalam object
variabel tanpa kehilangan informasi yang membuatnya menjadi string
. Tidak masalah bagi semua tipe untuk bekerja seperti ini dan Anda mungkin juga mengatakan itu elegan dalam banyak hal.
Namun, pada tingkat implementasi, tingkat tipuan ekstra melibatkan lebih banyak instruksi dan pada kebanyakan arsitektur itu membuat setiap akses ke objek agak lambat. Anda dapat mengizinkan kompilator memeras lebih banyak kinerja dari suatu program jika Anda memasukkan dalam bahasa Anda beberapa tipe yang umum digunakan yang tidak memiliki tingkat tipuan ekstra (referensi). Tetapi dengan menghapus tingkat tipuan itu, kompiler tidak dapat lagi memungkinkan Anda untuk mengetikkan kembali dalam cara yang aman memori. Itu karena jika Anda menambahkan lebih banyak anggota data ke tipe Anda dan Anda menetapkan ke tipe yang lebih umum, setiap anggota data tambahan yang tidak sesuai dengan ruang yang dialokasikan untuk variabel target akan dipotong.