Pemrograman dalam Binary Absolut
Programmer pertama menulis dalam binary absolut: setiap instruksi & alamat dalam bit binary yang tidak bersih. Sebuah instruksi mungkin terlihat seperti 01100101 00001010 — kode instruksi & alamat memori dalam binary.
Masalah Kode Spaghetti
Ketika ada kesalahan yang membutuhkan penggunaan instruksi baru, programmer menghadapi dilema. Menempelkan di tempat berarti setiap alamat instruksi berikutnya bergeser satu — membutuhkan programmer untuk memperbarui setiap referensi alamat dalam seluruh program. Kacau.
Solusi: gantikan instruksi sebelum titik pengisian dengan melompat ke memori kosong. Di lokasi kosong tersebut: tulis instruksi yang dihapus, tambahkan instruksi baru, lalu melompat kembali. Ketika kesalahan muncul dalam perbaikan, terapkan trik yang sama lagi menggunakan memori kosong lainnya.
Hasilnya: jalur eksekusi melalui program melompat ke lokasi yang tampaknya acak. Hamming menyebut ini 'sebotol saus spaghetti.' Jalur aliran kendali, yang digambar di kertas, benar-benar terlihat seperti saus spaghetti yang dipintal.
Rute Keluar
Dua peningkatan segera: notasi oktal (mengelompokkan digit binary dalam kelompok 3) dan heksadesimal (kelompok 4, menggunakan A-F untuk nilai di atas 9). Ini mengurangi kesalahan saat menulis tetapi tidak menyelesaikan masalah alamat dasar.
Assembler simbolik (mis. SAP — Symbolic Assembly Program — dan SOAP — Symbolic Optimizing Assembly Program pada IBM 650) memungkinkan programmer untuk menulis nama instruksi (ADD, MOVE) dan label alamat simbolik daripada binary. Assembler ini menerjemahkan ke binary pada waktu input, secara otomatis mengelola pengasihan alamat.
SOAP melakukan optimasi tambahan: mengatur instruksi pada drum berputar sehingga instruksi berikutnya tiba di kepala bacaan saat instruksi sebelumnya selesai — kode latensi minimum. SOAP bahkan mengompilasi diri sendiri: program A diproses sebagai data untuk menghasilkan B, B dijalankan pada A untuk menentukan seberapa baik self-compilation memperbaikinya.
Perpustakaan & Kode yang Dapat Dipindahkan
Hamming menyebutkan bahwa gagasan tentang perangkat lunak yang dapat diulang guna (perpustakaan matematika) datang sangat awal - Babbage telah memikirkannya. Masalahnya: sebuah perpustakaan alamat absolut membutuhkan setiap rutin untuk menempati lokasi memori yang sama setiap kali digunakan. Ketika perpustakaan total terlalu besar, program bersaing untuk alamat yang sama.
Solusi: kode yang dapat dipindahkan. Assembler menghasilkan instruksi yang merujuk pada memori relatif - offset dari alamat dasar - daripada alamat absolut. Pemindai menyelesaikan alamat akhir pada waktu penggunaan.
Laporan publikasi Von Neumann (yang luas) menggambarkan trik-programming yang diperlukan. Buku program pertama (Wilkes, Wheeler & Gill, EDSAC, 1951) mengkodifikasi teknik-teknik ini.
Pecah Desain Bahasa
FORTRAN (1957, IBM) dan ALGOL (1958, komite internasional) mewakili dua filosofi desain yang menghasilkan hasil yang sangat berbeda.
FORTRAN
John Backus memimpin proyek FORTRAN (FORmula TRANslation) di IBM. Tujuan desain: membuat bahasa mudah untuk ilmuwan dan insinyur digunakan. FORTRAN menerima notasi matematika yang terasa alami bagi pengguna: A = B + C * D daripada TAMBAH B, C; SIMPAN T; KALI T, D; SIMPAN A.
FORTRAN bertahan selama 60+ tahun. Ini tetap digunakan aktif dalam komputasi ilmiah, dinamika fluida, modeling iklim, & fisika komputasional. Hamming mencatat ketahanan ini sebagai bukti desain yang sukses.
ALGOL
ALGOL (ALGOrithmic Language) dirancang oleh sebuah komite ahli logika & ilmu komputer yang berfokus pada ketelitian matematis: sebuah bahasa yang bersih logika & definisi secara formal. Notasi Backus-Naur (BNF) untuk mendeskripsikan gramatika diciptakan untuk spesifikasi ALGOL.
ALGOL gagal dalam praktik. Meskipun keindahan logika & pengaruh besar pada desain bahasa berikutnya (Pascal, C, & hampir setiap bahasa modern turunan dari konsep gramatika ALGOL), ALGOL sendiri tidak pernah diadopsi secara luas. Hukuman Hamming: dirancang secara logika, tidak dapat digunakan oleh manusia.
Hierarki Bahasa
Hamming menggambarkan hierarki alami dari kode mesin, melalui assembly, bahasa tingkat tinggi, & akhirnya 'bahasa yang difokuskan pada masalah' yang dekat dengan cara praktisi berpikir tentang domain masalah mereka. Setiap level menambahkan readability manusia dengan biaya efisiensi mesin.
Kriteria Empat Hamming untuk Desain Bahasa
Hamming mengambil pelajaran dari FORTRAN vs ALGOL dan menggabungkannya menjadi empat kriteria untuk bahasa pemrograman sukses:
1. Mudah dipelajari — seorang pemula dapat menjadi produktif dengan cepat
2. Mudah digunakan — tugas rutin membutuhkan upacara minimal
3. Mudah di-debug — kesalahan menghasilkan pesan yang bermakna & lokasi
4. Mudah menggunakan subrutin — penggunaan & abstraksi tidak membutuhkan usaha heroik
Dia menambahkan pengamatan struktural: bahasa manusia mengandung sekitar 60% redundansi; bahasa tertulis sekitar 40%. Bahasa dengan rendah redundansi (seperti APL) menghasilkan satu baris yang indah para ahli yang dianggap mistis oleh pemula — dan yang mengandung kesalahan yang tidak terdeteksi saat satu karakter berubah makna.
Implicasi: sebuah bahasa yang dirancang untuk keindahan logika mengoptimalkan pembaca yang salah. Programmer adalah manusia; manusia membutuhkan redundansi untuk menangkap kesalahan & menyampaikan niat.
Desain Bahasa Psikologis vs Logis
Hamming kembali ke kontras FORTRAN/ALGOL sebagai pelajaran tentang dinamika institusional & manusia, bukan hanya desain bahasa.
FORTRAN dirancang psikologis — untuk manusia yang akan menggunakan itu, khususnya ilmuwan yang berpikir dalam notasi matematis. ALGOL dirancang logis — untuk kebenaran formal & keindahan teoretis.
Paradoks Hamming yang diidentifikasi: bahasa yang benar secara logis yang ditolak manusia gagal; bahasa yang dirancang secara praktis yang diterima manusia sukses, meskipun itu lebih bingung secara logis.
Dia menyebutkan APL sebagai kasus ekstrem: elegan secara logis, dapat dinyatakan dalam satu baris, dengan set karakter khususnya. Ahli suka dengan itu. Programmer normal menemukannya tidak dapat dibaca. Perubahan karakter tunggal dapat dengan sendirinya mengubah arti program. APL memiliki komunitas kecil yang devotion & hampir tidak ada penggunaan mainstream.
Argumen redundansi manusia: bahasa lisan ~60% redundan (konteks yang diulang, kata pengantar, struktur yang dapat diprediksi). Bahasa tertulis ~40% redundan. Redundansi ini melayani deteksi kesalahan - manusia tidak andal, jadi bahasa evolusi untuk membawa informasi yang cukup diulang untuk mendeteksi & memperbaiki kesalahan. Bahasa yang rendah redundansi menghapus jaringan keamanan ini.
Piranti Kompiler Hierarki
Hamming menggambarkan lapisan kompiler/interpreter: program dapat membaca bahasa tingkat tinggi & menerjemahkan ke yang lebih rendah. Letakkan lapisan ini - setiap satu menerjemahkan satu tingkat di bawah. Di atas: bahasa khusus domain yang ahli dalam bidang (biologi, keuangan, fisika) menulis secara alami. Di bawah: kode mesin. Setiap transisi adalah kompiler atau interpreter.
Memprediksi Selamatnya Bahasa
Pada tahun 1993, Hamming telah melihat banyak bahasa berhasil & gagal. FORTRAN (1957) bertahan. ALGOL (1958) gagal. COBOL (1959) bertahan bertahun-tahun dalam komputasi bisnis. LISP (1958) bertahan dalam penelitian AI. PL/I (1964) mencoba menyatukan segalanya & gagal.
Pola yang Kembali
Bab sejarah perangkat lunak Hamming mengandung pola yang kembali:
1. Batasan yang menyakitkan ada (alamat absolut, notasi biner, kode tidak terjaga)
2. Seseorang menciptakan lapisan abstraksi yang menghilangkan batasan tersebut
3. Abstraksi memungkinkan skala yang baru, yang menciptakan batasan yang menyakitkan baru
4. Ulangi
Binary → oktal/heksadesimal → assembly simbolik → FORTRAN → pemrograman berstruktur → bahasa pemrograman berorientasi objek → bahasa khusus domain. Setiap lapisan menangani masalah yang paling parah sebelumnya sementara memperkenalkan kelas masalah baru.
Masalah kode spaghetti (alamat absolut) menyebabkan assembly simbolik. Program assembly yang besar menyebabkan FORTRAN. Program FORTRAN yang besar menyebabkan pemrograman berstruktur dan kemudian orientasi objek. Kuliah Hamming berakhir sebelum transisi-transisi tersebut, tetapi pola tersebut terus berlanjut.
Pelajarannya bagi insinyur: Anda selalu menangani masalah yang diungkap oleh abstraksi sebelumnya. Memahami lapisan yang Anda jalani saat ini membutuhkan pengetahuan mengapa lapisan di bawahnya ada.