Pemrograman dalam Biner Absolut
Pemrogram pertama menulis dalam biner absolut: setiap instruksi & setiap alamat dalam digit biner mentah. Satu instruksi mungkin terlihat seperti 01100101 00001010 — kode instruksi & alamat memori dalam biner.
Masalah Kode Spageti
Ketika kesalahan memerlukan penyisipan instruksi baru, pemrogram menghadapi dilema. Menyisipkan di tempat berarti setiap alamat instruksi berikutnya bergeser satu — memerlukan pemrogram untuk memperbarui setiap referensi alamat di seluruh program. Bencana.
Solusinya: ganti instruksi tepat sebelum titik penyisipan dengan lompatan ke memori kosong. Di lokasi kosong itu: tulis instruksi yang ditimpa, tambahkan instruksi baru, lalu lompat kembali. Ketika kesalahan muncul di perbaikan, terapkan trik yang sama lagi menggunakan memori kosong lainnya.
Hasilnya: jalur eksekusi melalui program melompat ke lokasi yang tampak acak. Hamming menyebut ini 'kaleng spageti.' Jalur alur kontrol, digambar di atas kertas, terlihat persis seperti spageti yang kusut.
Rute Pelolosan
Dua peningkatan langsung: notasi oktal (kelompok digit biner dalam set 3) dan heksadesimal (kelompok 4, menggunakan A–F untuk nilai di luar 9). Ini mengurangi kesalahan penulisan tetapi tidak menyelesaikan masalah alamat fundamental.
Rakitan simbolis (misalnya SAP IBM — Symbolic Assembly Program — dan SOAP — Symbolic Optimizing Assembly Program pada IBM 650) memungkinkan pemrogram menulis nama instruksi (ADD, MOVE) & label alamat simbolis bukan biner. Assembler menerjemahkan ke biner pada waktu masukan, secara otomatis mengelola penugasan alamat.
SOAP melakukan optimasi tambahan: ia mengatur instruksi pada drum yang berputar sehingga instruksi berikutnya tiba di kepala pembaca tepat saat instruksi sebelumnya selesai — coding latensi minimum. SOAP bahkan mengompilasi dirinya sendiri: program A diproses sebagai data untuk menghasilkan B, B berjalan pada A untuk mengukur berapa banyak self-compilation meningkatkannya.
Perpustakaan & Kode yang Dapat Dipindahkan
Hamming mencatat bahwa ide perangkat lunak yang dapat digunakan kembali (perpustakaan matematika) datang sangat awal — Babbage telah memikirkannya. Masalahnya: perpustakaan dengan alamat absolut memerlukan setiap rutin untuk menempati lokasi memori yang sama setiap kali digunakan. Ketika perpustakaan total tumbuh terlalu besar, program bersaing untuk alamat yang sama.
Solusinya: kode yang dapat dipindahkan. Assembler menghasilkan instruksi yang mereferensikan memori secara relatif — offset dari alamat dasar — bukan alamat absolut. Penaut menyelesaikan alamat akhir pada waktu muat.
Laporan tidak dipublikasikan Von Neumann (beredar luas) menjelaskan trik pemrograman yang diperlukan. Buku pemrograman pertama yang dipublikasikan (Wilkes, Wheeler & Gill, EDSAC, 1951) mengkodifikasi teknik-teknik ini.
Cabang Desain Bahasa
FORTRAN (1957, IBM) dan ALGOL (1958, komite internasional) mewakili dua filosofi desain yang menghasilkan hasil yang radikalis berbeda.
FORTRAN
John Backus memimpin proyek FORTRAN (FORmula TRANslation) di IBM. Tujuan desain: membuat bahasa mudah digunakan oleh ilmuwan & insinyur. FORTRAN menerima notasi matematika yang terasa alami bagi penggunanya: A = B + C * D bukan ADD B, C; STORE T; MULTIPLY T, D; STORE A.
FORTRAN bertahan 60+ tahun. Tetap dalam penggunaan aktif dalam komputasi ilmiah, dinamika fluida, pemodelan iklim, & fisika komputasi. Hamming mencatat daya tahan ini sebagai bukti desain yang sukses.
ALGOL
ALGOL (ALGOrithmic Language) dirancang oleh komite logika & ilmuwan komputer yang bertujuan untuk ketelitian matematis: bahasa yang secara logis bersih, dapat didefinisikan secara formal. Notasi Backus-Naur Form (BNF) untuk mendeskripsikan tata bahasa ditemukan untuk menentukan ALGOL.
ALGOL gagal dalam praktik. Meski elegan secara logis & pengaruhnya sangat besar pada desain bahasa selanjutnya (Pascal, C, & hampir setiap bahasa modern berasal dari konsep tata bahasa ALGOL), ALGOL itu sendiri tidak pernah secara luas diterapkan. Putusan Hamming: dirancang secara logis, tidak dapat digunakan oleh manusia.
Hierarki Bahasa
Hamming menjelaskan layering compiler/interpreter alami: program dapat membaca dalam bahasa tingkat lebih tinggi & menerjemahkannya ke yang lebih rendah. Tumpuk lapisan ini — masing-masing menerjemahkan satu level ke bawah. Di atas: bahasa yang berorientasi pada masalah dekat dengan cara praktisi berpikir tentang domain masalah mereka. Di bawah: kode mesin. Setiap transisi adalah compiler atau interpreter.
Empat Kriteria Desain Bahasa Hamming
Hamming menyaring pelajaran FORTRAN vs ALGOL menjadi empat kriteria untuk bahasa pemrograman yang sukses:
1. Mudah dipelajari — pemula dapat menjadi produktif dengan cepat
2. Mudah digunakan — tugas rutin memerlukan upacara minimal
3. Mudah di-debug — kesalahan menghasilkan pesan yang bermakna & dapat ditemukan
4. Mudah menggunakan subrutin — reuse & abstraksi tidak memerlukan usaha heroik
Dia menambahkan pengamatan struktural: bahasa manusia membawa ~60% redundansi; bahasa tulisan ~40%. Bahasa dengan redundansi rendah (seperti APL) menghasilkan satu-baris yang elegan yang ahli temukan indah & pemula temukan buram — & yang berisi kesalahan yang tidak dapat dideteksi ketika karakter tunggal mengubah makna.
Implikasinya: bahasa yang dirancang untuk elegansi logis mengoptimalkan pembaca yang salah. Pemrogram adalah manusia; manusia membutuhkan redundansi untuk menangkap kesalahan & mengkomunikasikan niat.
Desain Bahasa Psikologis vs Logis
Hamming kembali ke kontras FORTRAN/ALGOL sebagai pelajaran tentang dinamika institusional & manusia, bukan hanya desain bahasa.
FORTRAN dirancang secara psikologis — untuk manusia yang akan menggunakannya, khususnya ilmuwan yang berpikir dalam notasi matematika. ALGOL dirancang secara logis — untuk kebenaran formal & elegansi teoretis.
Paradoks yang Hamming identifikasi: bahasa yang secara logis benar yang manusia tolak gagal; bahasa yang dirancang secara pragmatis yang manusia adopsi berhasil, bahkan jika lebih berantakan secara logis.
Dia mengutip APL sebagai kasus ekstrem: secara logis elegan, dapat diekspresikan satu-baris, dengan set karakter khususnya sendiri. Para ahli menyukainya. Pemrogram normal menemukan tidak dapat dibaca. Perubahan karakter tunggal dapat diam-diam mengubah makna program. APL memiliki komunitas penggemar kecil & penggunaan arus utama hampir nol.
Argumen redundansi manusia: bahasa lisan ~60% berlebihan (konteks berulang, kata-kata penjelasan, struktur yang dapat diprediksi). Bahasa tulisan ~40% berlebihan. Redundansi ini berfungsi untuk deteksi kesalahan — manusia tidak dapat diandalkan, jadi bahasa berkembang untuk membawa cukup informasi berulang untuk menangkap & memperbaiki kesalahan. Bahasa dengan redundansi rendah menghilangkan jaring keselamatan ini.
Hierarki Compiler
Hamming menjelaskan layering compiler/interpreter: program dapat membaca dalam bahasa tingkat lebih tinggi & menerjemahkannya ke yang lebih rendah. Tumpuk lapisan ini — masing-masing menerjemahkan satu level ke bawah. Di atas: bahasa spesifik domain yang ahli di bidang (biologi, keuangan, fisika) tulis secara alami. Di bawah: kode mesin. Setiap transisi adalah compiler atau interpreter.
Memprediksi Kelangsungan Bahasa
Pada tahun 1993, Hamming telah menonton banyak bahasa berhasil & gagal. FORTRAN (1957) bertahan. ALGOL (1958) gagal. COBOL (1959) bertahan puluhan tahun dalam komputasi bisnis. LISP (1958) bertahan dalam penelitian AI. PL/I (1964) mencoba untuk menyatukan semuanya & gagal.
Pola Berulang
Bab sejarah perangkat lunak Hamming mengandung struktur berulang:
1. Keterbatasan yang menyakitkan ada (alamat absolut, notasi biner, kode yang tidak dapat dipertahankan)
2. Seseorang menemukan lapisan abstraksi yang menyembunyikan keterbatasan
3. Abstraksi memungkinkan skala baru, yang menciptakan keterbatasan yang menyakitkan baru
4. Ulangi
Biner → oktal/heks → rakitan simbolis → FORTRAN → pemrograman terstruktur → bahasa berorientasi objek → bahasa spesifik domain. Setiap lapisan menyelesaikan masalah paling akut pendahulu sambil memperkenalkan kelas masalah baru.
Masalah kode spageti (alamat absolut) menyebabkan rakitan simbolis. Program rakitan besar menyebabkan FORTRAN. Program FORTRAN besar menyebabkan pemrograman terstruktur & kemudian orientasi objek. Kuliah Hamming berakhir sebelum transisi yang lebih lambat ini, tetapi pola terus berlanjut.
Pelajarannya untuk insinyur: Anda selalu menyelesaikan rasa sakit yang diungkapkan oleh abstraksi sebelumnya. Memahami lapisan yang saat ini berada di atasnya memerlukan mengetahui mengapa lapisan di bawahnya ada.