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


20

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

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


6
詳細は悪魔のいる場所です。
Blrfl

5
@Blrfl私は悪魔を信じていません。(私は詳細けれども...信じ震え
ジミー・ホッファ

3
TAOCPの最初の巻は1968年に発行されました。高レベルの言語は確かに存在していましたが、手書きアセンブラーははるかに重要で、当時のメインフレームのコンピューティングリソースは1980年代の8ビットマイクロと同じオーダーでした。Knuthはまた、gotoを保持することについて非常に真剣に議論しました。これは、一部のアルゴリズムは、非効率性なしにネストされた制御フロー構造を使用して記述できないためです。実際、彼はIIRCでも時期尚早の最適化を提唱しませんでした。最適化が必要なときに利用できるオプションを望んでいました。
Steve314

3
@ジミーホッファ:ああ、まあ、あなたの場合、詳細はド・ヴィルの場所です。
Blrfl

1
ジェリー・コフィンは私がやりたかったことをすることに成功しました、彼はそれを情報源で調べました;-)。MIXとMIXALが紹介されている章を調べましたが、そのような記述は見つかりませんでした...たぶん、いつか電子コピーを入手する必要があります。とにかく、この場合の回答タグはジェリーの返信により適していると思います。
トーマス

回答:


22

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

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

また、コンピューターが基本的に彼のMIXと同じように機能している限り、コンピューターの操作方法を学ぶことに本当に興味がある場合は、それを考慮するのが良いことです。


「コンパイラー手法」は公式に予測された第7巻のトピックであることに注意してください。それでも起こる可能性がありますが、Knuthがコンパイラーを公開するまで待たなかったことは誰もが喜んでいると思います。
キリアンフォス

@KilianFothはい、知っています。しかし、私はそのような本で人工プログラミング言語が使用されることを期待しています。おそらくMMIX(2番目のMはタイプミスではありません)ベースのコンピューターを対象としています。そして、巻のETA。5は2020年です
トーマス

56

あなたの若いwhippersnappersは時々私を驚かせます。学校を始める前に何かが起こったという手がかりがあまりにも多くあります。(私は同じ問題を抱えています。大人の観点から見ると、15年は実際には非常に短い時間であると理解するのに長い時間がかかりました。私の父はそれで戦いました、そして、私の母はそれの間に中学生でした。)

TAOCP、vol。1、「Fundamental Algorithms」、第1版は、1968年に最初に印刷されました。それは45年前です。Knuthはその前にシリーズの計画を開始しました。

参考:Intel 8086は、10年後の1978年に初めて登場しました。PASCAL言語は1971年に初めて登場しました。C言語の最初の開発は1969年から1973年までで、K&Rは1978年に公開されました。

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

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

今、私の法律を下車してください!


Knuthは1960年にALGOLコンパイラを実装しました。ALGOLはアルゴリズムの公開に適したものであったため、この質問に本当に答えるとは思いません。
ピーターテイラー

10
私はその理由がその時間の利用可能性であると確信していません。LISPは、数学のように高レベルの抽象化が必要な場合に利用できました。彼はタイトルの最初の言葉のために集会に行ったと思う。基本。単純な愚かなマシンへのステップバイステップの指示ほど、アルゴリズムにとって基本的なものはありません。アルゴリズムを高レベルで推論するのではなく、完全に分解するように強制しますが、これは本での彼の目的ではありません。
ジミー・ホッファ

1
これが、私の学校が歴史的なコンピューティングクラスを提供して、AltairといくつかのPDPをプログラムできる理由です。
リグ

@Rig-まじで?今、私は老いを感じています。HPGLを新入社員に説明し、ペンプロッターを見たことも聞いたこともないことを発見するほど古くはありませんが!
マーティンベケット

6
面白い暴言と関連情報のために+1。
luserはドローグ

43

Knuthは序文で彼の推論を議論します。ほんの一部を引用します。

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

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

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

第3版では、彼はMIXを再設計して最新のプロセッサにより密接に適合させ、コードを書き直さなければなりませんでした。しかし、彼がより高いレベルの言語を使用していれば、書き直しはかなり大きくなったはずであり、彼が与えたすべての理由も同様に残るだろうと思います。


また、当時のコンパイラは一般的に高価でした。TAOCPボリューム1がリリースされてから数年後、私はお金をかけたくない場所でインタビューしました(そして、正直なところ、IBM 370アセンブラーはそれほど悪くはありませんでした)。それからかなり数年後。
デビッドソーンリー

2
どうすればポイント4に投票できますか?
ハビエル

5
@Javierはコピーを取得し、マージンに+1を書き込みます。
luserはドローグ

29

Knuthは彼の理論的根拠も更新しました。

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

多くの読者は、「Knuthがなぜ高レベルのプログラミング言語に固執するのではなく、別のマシンにMIXを置き換えるのですか?最近ではほとんど誰もアセンブラを使用していません」

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

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

さらに、高級言語を使用した場合、どの言語を使用する必要がありますか?1960年代には、おそらくAlgol Wを選択したでしょう。1970年代には、Pascalを使用して本を書き直さなければなりませんでした。1980年代には、すべてをCに変更していたはずです。1990年代には、C ++に切り替えてから、おそらくJavaに切り替える必要がありました。2000年代には、さらに別の言語が間違いなくde rigueurになるでしょう。言語が流行になったり流行から外れたりするにつれて、私は自分の本を書き直す時間を買う余裕がありません。言語は私の本のポイントではなく、むしろあなたの好きな言語でできることです。私の本は時代を超越した真実に焦点を当てています。

したがって、TAOCPの高レベル言語として英語を使い続け、マシンが実際に計算する方法を示すために低レベル言語を使い続けます。すでに流行の言語を使用してプラグイン方式でパッケージ化されているアルゴリズムのみを見たい読者は、他の人の本を買うべきです。

良いニュースは、RISCマシンのデザインがすっきりしている場合、RISCマシンのプログラミングは快適でシンプルなことです。だから私は、要点から気を散らす難解で面倒な小さな詳細にこだわる必要はない。この点で、MMIXはMIXよりも大幅に優れています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.