web-dev-qa-db-ja.com

なぜDonald Knuthはアセンブリ言語を使用してTAOCPを記述するのですか?

私は自分のosコースでいくつか書いたので、私はアセンブリ言語の使用を嫌いではありません。しかし、明らかに、アセンブリ言語には抽象化が欠けているため、詳細にもっと注意を払う必要があります。

TAOCPを記述するためにアセンブリ言語は本当に必要ですか?

20
Lucas Li

彼はMIXAL(彼のMIXのアセンブリ言語)だけでなく、シンプルなコンピューター(60年代に使用されたようなコンピューター)のモデルであるMIXも使用しています。これは、彼がある程度、フィールドの開発から独立している教育のモデルです。

彼が別のプログラミング言語(ちなみに、どれが適していたと思いますか?)、たとえばNPL(気の利いたプログラミング言語)を使用したとしたら、彼はMIXの使用をやめるか、または選択したコンピューター言語のコンパイラー(これは、Vol 1で扱っているものよりもはるかに複雑です)。そうすれば、それはTAOCPではなくTAONPLPになるでしょう。最初のものはそのような選択とは無関係であり、このため、プログラミングに関する本がほとんどないという点で時代を超えています。 2番目のものはおそらく今では忘れられるでしょう...

また、コンピュータが原則的に彼のMIXと同じように機能している限り、コンピュータの操作方法を本当に学びたい場合は、それを考慮することをお勧めします。

22
Thomas

若いwhiippersnappersは時々私を驚かせます。学校に行く前に何かが起こったという手がかりはほとんどありません。 (私も同じ問題を抱えています。大人の視点から見ると、15年は実際には非常に短い時間であると理解するのに長い時間がかかりました。それは、広島からキューバのミサイル危機までのスパンです。私にとって、第二次世界大戦は歴史、しかし私の父はその中で戦った、そして私の母はその間中学生だった。)

TAOCP、vol。 1、「Fundamental Algorithms」、初版は1968年に最初に印刷されました。それは45年前です。クヌースはそれよりずっと前にシリーズの計画を始めました。

参考までに:Intel 8086は、10年後の1978年に初めて登場しました。 Pascal言語は1971年に最初に登場しました。 Jensen&Wirthの本は、言語の2番目のバージョンについて1974年に出版されました。Cの初期の開発は1969〜1973年でした。K&Rは1978年に出版されました。

クヌースはシリーズをフィールドをカバーすることを意図しました。彼はスタイルTHENを実践者THENに役立つように設定しました。彼は、そのシリーズが文字通り彼の人生の仕事になることや、彼が最後に終了するときのおそらく半世紀をはるかに超えるものに及ぶその執筆を期待することは決してありませんでした。

おそらくアセンブリ言語は今日ほど重要ではありませんが、Java/C++/Javascript/Python/Perlの専門家が皆さんに信じてほしいよりもはるかに重要です。

さあ、私の芝生から降りてください!

56
John R. Strohm

クヌースは序文で彼の推論を議論します。ほんの少しだけ引用します。

... ALGOLやFORTRANなどの代数言語を使用するか、この目的で機械指向言語を使用するかを決定する必要がありました。おそらく、今日のコンピューター専門家の多くは、機械指向言語を使用するという私の決定に反対するでしょうが、以下の理由から、それが間違いなく正しい選択であると確信しました。

  1. 代数言語は、ここで検討する非数値問題よりも数値問題に適しています。 [...]
  2. ...機械指向言語で書くことにより、プログラマーははるかに効率的な方法を使用する傾向があります。それは現実により近い。
  3. 私たちが必要とするプログラムは、いくつかの例外を除いて、すべてかなり短いです...
  4. コンピュータに何気なく興味がある人は、機械語で十分に教育されるべきです...
  5. とにかくいくつかの機械語が必要になるでしょう...

彼はそれを直接指摘していませんが、彼がALGOLとFORTRANについて言及したことは、彼が回避したさらに重要な問題を指摘していると思います。彼がALGOLを選択したと仮定しましょう(とにかくFortranよりも非数値プログラムに適しています)。 ALGOLはおそらくmore彼が選択したアセンブリ言語よりも今日のほとんどのプログラマにとって異質であると私は推測します。

第3版では、彼はMIXを再設計して最新のプロセッサーにさらに近づけ、コードを書き直さなければなりませんでした。しかし、彼がより高いレベルの言語を使用していれば、書き換えは大幅に大きくなり、彼が出したすべての理由もそのまま残ると私は考えます。

43
Jerry Coffin

Knuthは 根拠 も更新しました:

なぜ機械語があるのですか?

多くの読者は間違いなく、「なぜKnuthは高水準のプログラミング言語にこだわるのではなく、MIXを別のマシンに置き換えるのですか?最近、だれもアセンブラを使用することはほとんどありません」

そのような人々は彼らの意見を得る権利があり、彼らは私の本の機械語の部分をわざわざ読む必要はありません。しかし、1960年代初頭に書かれた第1巻の序文で述べた機械語の理由は、今日でも有効です。

  • 私の本の主な目標の1つは、単純にそれらがどのように適用されるかを示すだけでなく、高レベルの構造が実際に機械に実装される方法を示すことです。コルーチンリンケージ、ツリー構造、乱数生成、高精度演算、基数変換、データのパッキング、組み合わせ検索、再帰などを根本から説明します。
  • 私の本で必要なプログラムは一般的に非常に短いので、その主なポイントを簡単に理解できます。
  • コンピュータに何気なく興味がある人は、少なくとも基本的なハードウェアがどのようなものかについてある程度知っている必要があります。そうでなければ、彼らが書くプログラムはかなり奇妙なものになるでしょう。
  • 私が説明する多くのソフトウェアプログラムの出力として、いずれにせよ機械語が必要です。
  • 機械語で並べ替えや検索を行うアルゴリズムなどの基本的な方法を表現することで、キャッシュとRAMサイズとその他のハードウェア特性(メモリ速度、パイプライン処理、複数の問題、ルックアサイドバッファー、キャッシュブロックのサイズなど)。

また、高級言語を使用した場合、どの言語にする必要がありますか? 1960年代には、おそらくALGOL Wを選択しました。 1970年代には、Pascalを使用して自分の本を書き直す必要があったでしょう。 1980年代には、きっとすべてをCに変更したでしょう。 1990年代には、C++に切り替えてから、おそらくJavaに切り替える必要があったでしょう。 2000年代には、さらに別の言語が間違いなく間違いなく使われるようになるでしょう。言語が流行ったり時代遅れになったりするのに合わせて、本を書き直す時間はありません。私の本の目的は言語ではなく、好きな言語でできることです。私の本は時代を超えた真実に焦点を当てています。

したがって、私はTAOCPの高水準言語として英語を使用し続け、マシンが実際に計算する方法を示すために低水準言語を使用し続けます。トレンディな言語を使用して、プラグインの方法ですでにパッケージ化されているアルゴリズムだけを見たい読者は、他の人の本を購入する必要があります。

良いニュースは、RISCマシンがすっきりとしたデザインである場合、RISCマシンのプログラミングは快適でシンプルなことです。だから、私は難解で細部にまでこだわる必要はありません。この点で、MMIXはMIXよりもはるかに優れています。

29
Alan Shutko