Mengapa Donald Knuth menulis TAOCP menggunakan bahasa assembly?

20

Saya tidak benci menggunakan bahasa assembly, karena saya telah menulis beberapa di kursus os saya. Tapi jelas, bahasa assembly kurang abstraksi, Anda harus lebih memperhatikan detail.

Apakah bahasa assembly benar-benar penting untuk menulis TAOCP?

Lucas Li
sumber
6
Rinciannya adalah di mana iblis berada.
Blrfl
5
@ Blrfl Saya tidak percaya pada iblis. (Saya percaya pada detailnya ... menggigil )
Jimmy Hoffa
3
Volume pertama TAOCP diterbitkan pada tahun 1968. Meskipun bahasa tingkat yang lebih tinggi tentu ada, assembler yang ditulis tangan jauh lebih penting saat itu, dan sumber daya komputasi pada mainframe saat itu dapat dengan urutan yang sama dengan beberapa mikroskopi 8-bit tahun 1980-an. Knuth juga pernah berargumen dengan cukup serius untuk menjaga kebersamaan karena beberapa algoritma tidak dapat ditulis menggunakan struktur aliran kendali bersarang tanpa inefisiensi. Dia sebenarnya tidak menganjurkan optimasi prematur bahkan IIRC, dia hanya menginginkan opsi yang tersedia ketika optimasi diperlukan.
Steve314
3
@ JimmyHoffa: Oh, well, dalam kasus Anda, detailnya adalah di mana de Ville berada.
Blrfl
1
Jerry Coffin berhasil melakukan apa yang ingin saya lakukan, dia mencarinya di sumber ;-). Saya melihat di bab-bab di mana MIX dan MIXAL diperkenalkan, di mana saya tidak menemukan pernyataan seperti itu ... mungkin saya harus mendapatkan salinan elektronik suatu hari nanti. Bagaimanapun, saya pikir tag jawaban akan lebih sesuai untuk balasan Jerry dalam kasus ini.
Thomas

Jawaban:

22

Dia tidak hanya menggunakan MIXAL, bahasa rakitannya untuk MIX, tetapi juga MIX, model untuk komputer sederhana (seperti yang digunakan pada tahun enam puluhan). Ini adalah model untuk mengajar yang dengannya, sampai taraf tertentu, terlepas dari perkembangan di lapangan.

Jika dia menggunakan bahasa pemrograman lain (yang mana, omong-omong, apakah menurut Anda akan cocok?), Katakanlah NPL (bahasa pemrograman yang bagus), ia harus meninggalkan ide untuk menggunakan MIX atau untuk memperkenalkan kompiler dari beberapa bahasa komputer pilihan (yang merupakan hal yang jauh lebih kompleks daripada apa yang dia hadapi di Vol 1). Dengan begitu tidak akan menjadi TAOCP tetapi TAONPLP. Yang pertama tidak tergantung pada pilihan semacam itu dan, karena alasan ini, tidak lekang oleh waktu dalam beberapa buku tentang pemrograman. Yang kedua mungkin akan dilupakan sekarang ...

Juga, selama komputer pada prinsipnya bekerja seperti MIX-nya, adalah hal yang baik untuk memperhitungkannya jika Anda benar-benar tertarik mempelajari cara bekerja dengannya.

Thomas
sumber
Perhatikan bahwa "Teknik kompiler" secara resmi menjadi topik dari volume yang diproyeksikan 7. Itu mungkin masih terjadi, tetapi saya pikir semua orang senang bahwa Knuth tidak menunggu sampai dia memiliki kompiler untuk mulai menerbitkan.
Kilian Foth
@KilianFoth ya saya tahu. Tapi saya berharap bahasa pemrograman buatan dapat digunakan dalam buku seperti itu. Mungkin menargetkan MMIX (M kedua bukanlah komputer berbasis kesalahan ketik :-). Dan ETA vol. 5 adalah 2020 ....
Thomas
56

Kalian para penculik muda terkadang membuatku takjub. Anda terlalu sering tidak tahu bahwa sesuatu terjadi sebelum Anda mulai sekolah. (Saya memiliki masalah yang sama. Butuh waktu lama untuk memahami bahwa 15 tahun sebenarnya adalah waktu yang sangat singkat, dari sudut pandang orang dewasa. Itu kira-kira rentang dari Hiroshima ke Krisis Misil Kuba. Bagi saya, Perang Dunia II hanyalah sejarah, tetapi ayah saya berjuang di dalamnya, dan ibu saya masih di SMP selama itu.)

TAOCP, vol. 1, "Algoritma Fundamental", edisi 1, pertama kali dicetak pada tahun 1968. Itu 45 tahun yang lalu. Knuth mulai merencanakan seri dengan baik sebelum itu.

Untuk referensi: Intel 8086 pertama kali muncul pada 1978, sepuluh tahun kemudian. Bahasa PASCAL pertama kali muncul pada tahun 1971; Jensen & Wirth buku, tentang versi kedua bahasa, keluar pada tahun 1974. pengembangan awal dari C adalah 1969-1973: K & R diterbitkan pada tahun 1978.

Knuth bermaksud seri untuk menutupi lapangan. Dia mengatur gaya, MAKA, untuk berguna bagi para praktisi MAKA. Dia tidak pernah berharap seri itu secara harfiah menjadi karya hidupnya, atau tulisannya untuk merentang apa yang mungkin akan lebih dari setengah abad ketika dia akhirnya selesai.

Bahasa assembly bisa dibilang tidak sepenting hari ini seperti dulu, tetapi masih jauh lebih penting daripada Java / C ++ / Javascript / Python / Perl para pakar ingin Anda semua percaya.

Sekarang, MATIKAN HUKUM SAYA!

John R. Strohm
sumber
Knuth mengimplementasikan kompiler ALGOL pada tahun 1960, dan ALGOL dimaksudkan untuk cocok untuk algoritma penerbitan, jadi saya tidak berpikir ini benar-benar menjawab pertanyaan.
Peter Taylor
10
Saya benar-benar tidak yakin alasannya adalah ketersediaan waktu. LISP tersedia jika dia ingin memiliki abstraksi tingkat tinggi seperti matematika. Saya pikir dia pergi bersama karena kata pertama dari judul; Mendasar. Tidak ada yang lebih mendasar untuk algoritma daripada instruksi langkah demi langkah ke mesin bodoh sederhana; itu memaksa Anda untuk memecah algoritma sepenuhnya daripada untuk alasan tentang itu pada tingkat tinggi, yang bukan tujuannya dalam buku ini.
Jimmy Hoffa
1
Inilah mengapa sekolah saya menawarkan kelas komputasi historis di mana Anda bisa memprogram Altair dan beberapa PDP.
Rig
@Rig - serius? Sekarang saya merasa tua. Meskipun tidak setua menjelaskan HPGL ke karyawan baru dan mengetahui bahwa mereka belum pernah melihat atau mendengar tentang plotter pena!
Martin Beckett
6
1 karena kata-kata kasar yang lucu serta info yang relevan.
luser droog
43

Knuth membahas alasannya di Pendahuluan. Saya akan mengutip hanya beberapa bagian:

... Saya perlu memutuskan apakah akan menggunakan bahasa aljabar seperti ALGOL atau FORTRAN, atau menggunakan bahasa berorientasi mesin untuk tujuan ini. Mungkin banyak ahli komputer saat ini akan tidak setuju dengan keputusan saya untuk menggunakan bahasa yang berorientasi pada mesin, tetapi saya menjadi yakin bahwa itu jelas pilihan yang tepat, karena alasan berikut:

  1. Bahasa aljabar lebih cocok untuk masalah numerik daripada masalah non-numerik yang dipertimbangkan di sini. [...]
  2. ... Dengan menulis dalam bahasa berorientasi mesin, programmer akan cenderung menggunakan metode yang jauh lebih efisien; itu jauh lebih dekat dengan kenyataan.
  3. Program yang kami butuhkan adalah, dengan beberapa pengecualian, semua agak pendek ...
  4. Seseorang yang lebih dari sekadar tertarik pada komputer harus dididik dengan baik dalam bahasa mesin ...
  5. Beberapa bahasa mesin akan diperlukan ...

Meskipun dia tidak menunjukkannya secara langsung, saya pikir penyebutan ALGOL dan FORTRAN menunjukkan masalah lain yang dia hindari yang mungkin lebih penting. Mari kita asumsikan dia telah memilih Algol (jelas lebih cocok untuk program non-numerik daripada Fortran). Saya berpendapat bahwa Algol mungkin akan lebih asing bagi kebanyakan programmer saat ini daripada bahasa assembly yang dia pilih.

Untuk edisi ketiga, ia mendesain ulang MIX agar lebih cocok dengan prosesor modern, dan harus menulis ulang kode untuk itu. Saya berpendapat, bahwa jika dia menggunakan bahasa tingkat yang lebih tinggi, penulisan ulang akan jauh lebih besar - dan semua alasan yang dia berikan akan tetap ada juga.

Jerry Coffin
sumber
Juga, kompiler biasanya mahal pada masa itu. Bertahun-tahun setelah TAOCP volume 1 keluar, saya mewawancarai di suatu tempat yang tidak ingin menghabiskan uang untuk satu (dan, jujur, assembler IBM 370 tidak terlalu buruk), dan istri saya bekerja di sebuah toko bahasa assembly beberapa tahun setelah itu.
David Thornley
2
bagaimana saya bisa meningkatkan poin 4 ??
Javier
5
@Javier mendapatkan salinan dan menulis +1 di margin.
luser droog
29

Knuth juga memperbarui pemikirannya :

Mengapa memiliki bahasa mesin?

Banyak pembaca yang berpikir, `` Mengapa Knuth menggantikan MIX dengan komputer lain alih-alih hanya menggunakan bahasa pemrograman tingkat tinggi? Hampir tidak ada yang menggunakan assembler hari ini. ''

Orang-orang seperti itu berhak atas pendapat mereka, dan mereka tidak perlu repot membaca bagian-bagian bahasa mesin dari buku-buku saya. Tetapi alasan untuk bahasa mesin yang saya berikan dalam kata pengantar Volume 1, yang ditulis pada awal 1960-an, tetap berlaku hingga hari ini:

  • Salah satu tujuan utama buku saya adalah untuk menunjukkan bagaimana konstruksi tingkat tinggi benar-benar diimplementasikan dalam mesin, bukan hanya untuk menunjukkan bagaimana mereka diterapkan. Saya menjelaskan hubungan coroutine, struktur pohon, pembuatan angka acak, aritmatika presisi tinggi, konversi radix, pengemasan data, pencarian kombinatorial, rekursi, dll., Dari bawah ke atas.
  • Program-program yang dibutuhkan dalam buku saya pada umumnya sangat singkat sehingga poin utama mereka dapat dipahami dengan mudah.
  • Orang yang lebih dari sekadar tertarik pada komputer harus memiliki setidaknya beberapa gagasan tentang seperti apa perangkat keras yang mendasarinya. Kalau tidak, program yang mereka tulis akan sangat aneh.
  • Bagaimanapun juga, bahasa mesin diperlukan, karena keluaran dari banyak program perangkat lunak yang saya jelaskan.
  • Mengekspresikan metode dasar seperti algoritma untuk menyortir dan mencari dalam bahasa mesin memungkinkan untuk melakukan studi yang bermakna tentang efek cache dan ukuran RAM dan karakteristik perangkat keras lainnya (kecepatan memori, pipelining, beberapa masalah, buffer lookaside, ukuran blok cache, dll) ketika membandingkan berbagai skema.

Selain itu, jika saya memang menggunakan bahasa tingkat tinggi, bahasa apa yang seharusnya? Pada 1960-an saya mungkin akan memilih Algol W; pada tahun 1970-an, saya kemudian harus menulis ulang buku-buku saya menggunakan Pascal; pada 1980-an, saya pasti akan mengubah segalanya menjadi C; pada 1990-an, saya harus beralih ke C ++ dan mungkin ke Jawa. Pada tahun 2000-an, bahasa lain tidak diragukan lagi adalah de rigueur. Saya tidak punya waktu untuk menulis ulang buku-buku saya karena bahasa keluar-masuk mode; bahasa bukan poin dari buku saya, intinya adalah apa yang dapat Anda lakukan dalam bahasa favorit Anda. Buku-buku saya fokus pada kebenaran abadi.

Oleh karena itu saya akan terus menggunakan bahasa Inggris sebagai bahasa tingkat tinggi dalam TAOCP, dan saya akan terus menggunakan bahasa tingkat rendah untuk menunjukkan bagaimana mesin benar-benar menghitung. Pembaca yang hanya ingin melihat algoritma yang sudah dikemas dengan cara plug-in, menggunakan bahasa yang trendi, harus membeli buku orang lain.

Berita baiknya adalah pemrograman untuk mesin RISC menyenangkan dan sederhana, ketika mesin RISC memiliki desain bersih yang bagus. Jadi saya tidak perlu memikirkan hal-hal kecil, detail kecil yang mengalihkan perhatian dari poin utama. Dalam hal ini MMIX akan jauh lebih baik daripada MIX.

Alan Shutko
sumber