Donald Knuth, neden assembly dili kullanarak TAOCP yazıyor?


20

Assembly dili kullanmaktan nefret ediyorum, çünkü bazılarımı os kursumda yazdım. Fakat açıkçası, meclis dili soyutlamadan yoksundur, ayrıntılara daha fazla dikkat etmek zorundasınız.

TAOCP yazmak için assembly dili gerçekten gerekli mi?


6
Detaylar şeytanın olduğu yer.
Blrfl

5
@ Blrfl Şeytana inanmıyorum. (Ben detaylara inanıyorum ... titreme )
Jimmy Hoffa

3
TAOCP'nin ilk cildi 1968'de yayınlandı. Daha yüksek seviyeli diller kesinlikle mevcut olmasına rağmen, elle yazılmış montajcı o zamanlar çok daha önemliydi ve ana bilgisayarlardaki kaynakları o zamandan beri hesaplamak 1980'lerin 8-bit mikronlarıyla aynı sırada olabilirdi. Knuth ayrıca bir kez geçişte kalmak için oldukça ciddiyetle tartışıyordu çünkü bazı algoritmalar bazı verimsiz olmadan iç içe kontrol akış yapıları kullanılarak yazılamadı. Aslında IIRC'den erken bile olsa optimizasyonu savunmadı, sadece optimizasyon gerektiğinde kullanılabilecek seçeneği istedi.
Steve314

3
@JimmyHoffa: Oh, peki, sizin durumunuzda, detaylar de Ville'in olduğu yer.
Blrfl

1
Jerry Coffin ne yapmak istediğimi yapmayı başardı, kaynağında baktı ;-). MIX ve MIXAL’ın tanıtıldığı bölümlere baktım, bu ifadeleri bulamadım ... belki bir gün bir elektronik kopya almalıyım. Her neyse, bu durumda cevap etiketinin Jerry'nin cevabı için daha uygun olacağını düşünüyorum.
Thomas,

Yanıtlar:


22

Yalnızca MIX için bir montaj dili olan MIXAL'ı değil, aynı zamanda basit bir bilgisayar için (altmışlarda kullanılan bir model) MIX'i kullanır. Bu, bir dereceye kadar, alanındaki gelişimden bağımsız olduğu öğretimi için bir modeldir.

Başka bir programlama dili kullanmış olsaydı (hangisinin bu arada uygun olacağını düşünürdünüz?), NPL (şık programlama dili), MIX kullanma fikrinden vazgeçmek veya bir bazı bilgisayar dili seçiminin derleyicisi (Cilt 1’de uğraştığından çok daha karmaşık bir şey). Bu şekilde TAOCP değil TAONPLP olacaktı. Birincisi, böyle bir seçimden bağımsızdır ve bu nedenle, programlama hakkında birkaç kitap hiç olmayacak şekilde zamansızdır. İkincisi muhtemelen şimdiye kadar unutulur ...

Ayrıca, bilgisayarlar ilke olarak MIX'in yaptığı gibi çalıştığı sürece, onlarla nasıl çalışılacağını öğrenmekle ilgileniyorsanız, bunu dikkate almak iyi bir şeydir.


"Derleyici teknikleri" resmen Yansıtılan hacminin 7'nin konu olduğunu Not olabilir hala olur ama herkes onun yayınlamaya başlamak için bir derleyici vardı dek Knuth beklemedi memnun olduğunu düşünüyorum.
Kilian Foth

@KilianFoth evet biliyorum. Ancak yapay programlama dillerinin böyle bir kitapta kullanılmasını bekliyorum. Muhtemelen bir MMIX'i hedefliyor (ikinci M yazım hatası :-) tabanlı bir bilgisayar değil. Ve vol ETA. 5, 2020 ...
Thomas,

56

Siz genç kırbaçlayanlar bazen beni şaşırtıyor. Hepinizin okula başlamadan önce bir şey olduğu hakkında hiçbir fikriniz yok. (Aynı sorunu yaşıyorum. Yetişkin bir bakış açısından 15 yılın çok kısa bir süre olduğunu kavramam uzun zaman aldı. Hiroşima'dan Küba Füze Krizi'ne kadar bu kabaca bu oldu. Bana göre, II. Dünya Savaşı sadece tarih, ama babam bununla savaştı ve annem bu sırada ortaokuldaydı.)

TAOCP, cilt. 1, "Temel Algoritmalar", 1. baskı, ilk olarak 1968'de basıldı. Bu, 45 yıl önce. Knuth, daha önce seriyi planlamaya başladı.

Başvuru için: Intel 8086 ilk on yıl sonra 1978'de ortaya çıktı. PASCAL dili ilk 1971 yılında ortaya çıktı; Jensen & Wirth kitabı, dilin ikinci versiyonu hakkında, 1974'te çıktı. C'nin ilk gelişimi 1969-1973 idi: K&R, 1978'de yayınlandı.

Knuth, seriyi alanı kaplamayı hedefliyordu. THEN stilini, THEN uygulayıcıları için faydalı olacak şekilde belirledi. Bu dizinin kelimenin tam anlamıyla hayatının çalışması ya da nihayet bittiğinde yarım asırdan daha iyi olacak olanı kapsaması için yazılmasını beklemiyordu.

Assembly dili, bugün olduğu kadar tartışmasız kritik değil, fakat hala Java / C ++ / Javascript / Python / Perl mavens'in hepinizin inanmasını isteyeceğinden çok daha önemlidir.

Şimdi HUKAYIMI GET!


Knuth, 1960 yılında bir ALGOL derleyicisini uyguladı ve ALGOL, algoritmaların yayınlanması için uygun olması amaçlanmıştı, bu yüzden soruyu gerçekten cevapladığını sanmıyorum.
Peter Taylor

10
Gerçekten, mantığın zamanın mevcudiyeti olduğuna ikna olmadım. LISP, matematik gibi soyutlama düzeyinin yüksek olmasını isterse kullanılabilirdi. Sanırım unvanın ilk sözcüğü yüzünden meclisle gitti; Temel. Hiçbir şey algoritmalar için basit bir aptal makineye adım adım talimattan daha temel değildir; kitapta amacı olmayan, yüksek seviyede bir nedenden ötürü , algoritmayı tamamen yıkmaya zorlar .
Jimmy Hoffa

1
Bu yüzden okulum, bir Altair ve bazı PDP'leri programlayabileceğiniz tarihi bir bilgisayar dersi verdi.
Rig

@Rig - cidden? Şimdi kendimi yaşlı hissediyorum. Her ne kadar HPGL'yi yeni bir işe açıklamak ve bir kalem çizici hiç görmemiş veya duymamışlarsa keşfetmek kadar eski olmasa da!
Martin Beckett

6
Eğlenceli rant yanı sıra ilgili bilgi nedeniyle +1.
kullanıcı lüzgâhı

43

Knuth, akıl yürütmesini Önsöz'de tartışıyor. Birkaç parça ve parçadan alıntı yapacağım:

... ALGOL veya FORTRAN gibi bir cebirsel dil kullanıp kullanmamaya ya da bu amaçla makine odaklı bir dil kullanmaya karar vermem gerekiyordu. Belki de bugünün bilgisayar uzmanlarının çoğu, makine odaklı bir dil kullanma kararıma katılmıyorum, ancak aşağıdaki nedenlerden dolayı kesinlikle doğru seçim olduğuna ikna oldum:

  1. Cebirsel diller, burada ele alınan sayısal olmayan problemlerden daha çok sayısal problemlere daha uygundur. [...]
  2. ... Makine odaklı bir dilde yazarak, programcı çok daha verimli bir yöntem kullanma eğiliminde olacaktır; gerçekliğe çok daha yakın.
  3. İhtiyacımız olan programlar, birkaç istisna dışında, hepsi oldukça kısa ...
  4. Bilgisayarlarla raslantıya ilgi duymaktan daha fazla ilgilenen bir kişi makine dilinde iyi bir şekilde okutulmalı ...
  5. Bazı makine dili yine de gerekli olacak ...

Doğrudan işaret etmese de, ALGOL ve FORTRAN'dan bahsetmesinin, daha da önemli olabilecek bir başka sorunu işaret ettiğini düşünüyorum. Algol'u seçtiğini varsayalım (sayısal olmayan programlara zaten Fortran'dan daha uygun). Algol'un muhtemelen daha da fazla olacağını söylerdim bugünün programcılarının çoğunda seçtiği meclis diline göre yabancı .

Üçüncü baskı için, MIX'i modern işlemcilerle daha yakından uyması için yeniden tasarladı ve kodunu yeniden yazmak zorunda kaldı. Bununla birlikte, daha yüksek bir dil kullanmış olsaydı, yeniden yazma büyük ölçüde daha büyük olurdu - ve verdiği bütün sebepler de aynı kalacaktı.


Ayrıca, derleyiciler o günlerde genellikle pahalıydı. TAOCP cilt 1 çıktıktan yıllar sonra, parayı bir kerede harcamak istemeyen bir yerde (ve dürüst olmak gerekirse, IBM 370 assembler o kadar da kötü değildi) röportaj yaptım ve eşim bir meclis dil dükkanında çalıştı. bundan birkaç yıl sonra.
David Thornley

2
4. noktayı nasıl oylayabilirim?
Javier,

5
@Javier bir kopya almak ve kenarına +1 yazınız.
luser droog

29

Knuth gerekçesini de güncelledi :

Neden bir makine dili var?

Pek çok okuyucu şüphesiz, '`Knuth neden sadece üst seviye bir programlama diline bağlı kalmak yerine MIX'i başka bir makine ile değiştiriyor? Bugünlerde hiç kimse montajcı kullanıyor. ''

Bu tür insanlar fikirlerini almaya hak kazanırlar ve kitaplarımın makine dili bölümlerini okumayı zorlamazlar. Ancak, önsözde 1960'ların başında yazılan Cilt 1'e verdiğim makine dilinin nedenleri bugün geçerli:

  • Kitaplarımın ana amaçlarından biri, üst yapıların makinelerde gerçekte nasıl uygulandığını göstermek değil, sadece nasıl uygulandığını göstermek. Coroutine bağlantıyı, ağaç yapılarını, rasgele sayı üretme, yüksek hassasiyetli aritmetik, radix dönüşümü, verilerin paketlenmesi, kombinasyonel arama, özyineleme vb.
  • Kitaplarımda ihtiyaç duyduğum programlar genellikle o kadar kısadır ki ana noktaları kolayca anlaşılabilir.
  • Bilgisayarlarla raslantıya ilgi duymaktan daha fazla ilgi çeken insanlar, en azından temel donanımın neye benzediği hakkında fikir sahibi olmalıdır. Aksi takdirde yazdıkları programlar oldukça garip olacaktır.
  • Her durumda, açıkladığım yazılım programlarının çıktısı olarak makine dili gereklidir.
  • Makine dilinde sıralama ve arama algoritmaları gibi temel yöntemlerin ifade edilmesi, önbellek ve RAM boyutunun ve diğer donanım özelliklerinin (bellek hızı, boru hatları, çok sayıdaki sorun, bakıcı tamponlar, önbellek bloklarının boyutu, vb.) farklı şemaları karşılaştırırken.

Dahası, eğer yüksek seviyeli bir dil kullansaydım, hangi dil olmalı? 1960'larda muhtemelen Algol K; 1970'lerde, kitaplarımı Pascal kullanarak yeniden yazmak zorunda kalırdım; 1980'lerde kesinlikle her şeyi C olarak değiştirirdim; 1990'larda, C ++ 'a ve sonra muhtemelen Java' ya geçmek zorunda kalırdım. 2000'lerde, başka bir dil şüphesiz de katı olacaktır. Dilleri modaya uygun girip çıktıkça kitaplarımı yeniden yazma zamanı gelemez; diller benim kitaplarımın noktası değil, asıl mesele en sevdiğiniz dilde yapabilecekleriniz. Kitaplarım zamansız gerçeklere odaklanıyor.

Bu nedenle İngilizce'yi TAOCP'de üst seviye dil olarak kullanmaya devam edeceğim ve makinelerin gerçekte nasıl hesapladıklarını belirtmek için düşük seviyeli bir dil kullanmaya devam edeceğim. Sadece bir eklentiyle paketlenmiş algoritmaları görmek isteyen, modaya uygun bir dil kullanan okuyucular başkalarının kitaplarını almalıdır.

İyi haber şu ki, RISC makineleri için programlama, RISC makinesi hoş bir tasarıma sahip olduğunda hoş ve basittir. Bu yüzden, ana noktalardan uzaklaştıran, gizli ve küçük detaylara dikkat etmem gerekmiyor. Bu bağlamda, MMIX, MIX'ten önemli ölçüde daha iyi olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.