教科書が実際の言語ではなく疑似コードを使用するのはなぜですか?


8

大学やアルゴリズムの教科書では、教師と著者が疑似コードで制御フローを説明することは非常に一般的です。PythonやHaskellなどのより表現力のある言語の出現により、大学がこれらの言語のいずれかを介してアルゴリズムを説明するように切り替えることは合理的ですか?

私が考えることができる疑似コードの唯一の利点は、それがおそらく言語に依存しないということです。そうではありません。一部の疑似コードは命令型アプローチを使用し、他の疑似コードは機能的に見えます。著者は、使いやすいプログラミング言語からセマンティクスを借用するか、またはさらに悪いことに、セマンティクスを自然言語で記述します。では、疑似コードが実際に言語に依存しない場合、それを使用する利点は何ですか?既存の言語をそのまま使用した方がよいのではないでしょうか。


5
「私は特定のマシンXの言語を選択できたかもしれませんが、マシンXを所有していない人は、この本はXの人向けだと思います。さらに、マシンXにはおそらく、この本の資料はまだ説明が必要です。2年後には、マシンXの製造元がマシンX + 1またはマシン10Xを出し、マシンXは誰にとっても興味がなくなります。」(ドナルドクヌース、TAOCP)
キリアンフォス

@KilianFothニース。Knuthはまた、プログラムが英語で記述され、空白で区切られる(ソースを見つけることができない)将来を予測すると述べたと思います。機能の正式なサブセットは許容されます。
アスタリスク

1
@アスタリスクあなたは文芸的プログラミングを考えています「自然言語プログラミング」の愚かさについても、EWD667を読んでください。ダイクストラによって。また、句読点、大文字、スペルの一貫した英語の規則に従う質問をここで作成する難しさも指摘しておきます。散文プログラミングを書くとき、私はこれらの人々が同じようなスタイルに従ってコードを書くという考えに身震いします。

1
「降臨」?これらの言語はどちらも20年以上前のものです。そして少なくともHaskellの前には、ほぼ同じ構文を持っていたMirandaが先行しており、私は現在30歳だと思います。
ジュール

@Julesまあ、これらは疑似コードに適していると思われる最も簡潔で最も簡潔な構文であるため、これらに名前を付けました。どちらも、過去10年間で(または過去5年間で)より大きな牽引力を獲得しています。PythonがPyPlとHaskellのトップ10を50歳未満でクラック。他の言語も(何らかの理由で)成長していますが、構文が多く、機能が奇妙です。業界はまだ50%がC ++とJavaであり、次にJavaScriptがあります(これは逆に設計された言語のようです。最初に機能を追加してから、ルールと制約を定義します)。
アスタリスク

回答:


18

いいえ。疑似コードのポイントは、コンパイルする必要がないことです。関係のない詳細についてはすぐに説明できます。対照的に、一見すると疑似コードのように見える言語でさえ、アルゴリズムを損なうだけの非常に非直感的な詳細を持つ可能性があります。HaskellのQuicksortの例を見てみましょう:

qs :: Ord a => [a] -> [a]
qs [] = []
qs (pivot:xs) = (qs smaller) ++ pivot:(qs larger)
  where smaller = [x | x <- xs, x <= pivot]
        larger  = [x | x <- xs, x > pivot]

またはPythonで同じ:

def qs(array):
  if not array:
    return []
  pivot = array[0]
  xs = array[1:]
  smaller = [x for x in xs if x <= pivot]
  larger  = [x for x in xs if x > pivot]
  return qs(smaller) + [pivot] + qs(larger)

どちらの場合も利点は、これが実行可能コードであるため、学生がテスト、タイプチェック、およびいじることができることです。ただし、どちらも混乱を招く構文の詳細が含まれています。学生は通常、実装の詳細ではなく、アルゴリズムの意図を示す疑似コードを提供するほうがよいでしょう。

algorithm QUICKSORT(array)
  return [] if array is empty
  pivot  array[0]
  xs  array[1, ...] -- the rest of the array without the pivot
  smaller  [x | x  xs, x <= pivot] -- all smaller or equal elements
  larger  [x | x  xs, x  > pivot] -- all larger elements
  return [QUICKSORT(smaller)..., pivot, QUICKSORT(larger)...]

顕著な違い:

  • 私はむしろ、Pythonが持っている理由を説明するよりルックスは数学が好きなことをリスト内包構文を作ることができますforし、ifここに。

  • リストの連結のためにその言語の構文を説明する必要はありません。なぜPythonは+加算を使用するのですか?:Haskellには何がありますか?要点をより明確にする構文を選択するだけです。

  • 型シグネチャOrd a => [a] -> [a]は単なる実装の詳細です。この場合は役立つ可能性がありますが、Haskellが必要とする場合がある型シグネチャは不条理になる可能性があります。

  • Pythonが空のコレクションをfalseと見なす理由array[1:]と、その意味を説明する必要はありません。

  • 私は本当にyieldPythonの例で使用するべきだと指摘する賢い生徒を避けます。

  • Haskellは、ハッシュテーブルやRBツリーなどの可変データ構造を説明するのが面倒です。

  • アルゴリズムを表現するために複雑なレコードが必要になると、物事は言語固有のものになり始めます。たとえば、Pythonのオブジェクトシステムには、気を散らすいくつかの驚きがあります。

とは言っても、疑似コードに加えてこれらの言語のいずれかを使用することは非常に価値があります。


9
私はあなたに概ね同意しますが、あなたの例はあなたの議論のいくつかと矛盾します-あなたの疑似コードとPythonの例は非常によく似ています。私見は、Python言語が「常識」を完全に含んでいる結果です。
Doc Brown

2
言語機能/ APIのサブセットのみが使用されている場合、それは疑似コードの本質と同期しています。ただし、特定の言語でそれを達成するための最善の方法または最も難解な方法を詳しく検討し始めると、注意散漫になります。アルゴリズムを説明した科学者たちは、セット理論に非常によく似た独自の表記法を思い付きました。チューリングマシンのアイデアが確立され、C、Fortran、Lispがそれらからアイデアを借り始めた疑似コードが登場した後
アスタリスク

2
コードを「そのまま」コンパイルできる場合、「学生はカット&ペーストを使用し、何も学習しない」という非常に現実的なリスクがあると付け加えます。
ブレンダン

3
あなたは主張しましたが、何が何を意味するのか誰も理解できなかったので、コメントでI don't have to explain ... what array[1:] is supposed to mean.説明array[1, ...] -- the rest of the array without the pivotしなければならなくなりましたarray[1, ...](疑似コード配列は0または1ベース、それらの省略記号は一体何を意味するのかなど)。疑似コードの構文を学習する必要はなく、実際の言語のドキュメント/チュートリアルを簡単に示すことができるため、疑似コードの基礎として実際の言語を使用するのが実際に有利だと思います。
リーライアン

1
@amon良くも悪くも、数学表記はプログラミング言語ほどよく定義されていません。また、シーケンスでの省略記号の使用には特定の意味はありません。時々それは算術シーケンスであることを意味し、時々それは幾何学的であることを意味し、時々それは作者が話している任意のシーケンスの次のアイテムを意味し、あなたはそれを拾うためにコードから5段落離れて読む必要があります。スライス表記には明確な意味が1つあり、あいまいではありません。また、省略記号が一般的に使用されている場合もありますが、シーケンスが大括弧とどのように相互作用するかはまだ指定していません。
リーライアン

10

番号。

疑似コードの全体的な目的は、個々の言語の詳細と複雑さを抽象化して、プログラムが実行する方法ではなく、プログラムが実行することに焦点を当てることです。疑似コードを使用すると、実際の言語のように実際の実装要件に準拠する必要はなく、現在の実際のトピックの要件にのみ準拠する任意のルールを作成できます。

さらに、あなたが(学生として)単にファイルにコピーして貼り付け、コンパイルして実行できない方法でロジックが提示されている場合、ソリューション自体が記述されている場合でも、ソリューションを自分で実装する必要がありますあなたのために。これは、コピー/貼り付けの不正行為に対する個人の考えを奨励します。


0

リアルとは?

なぜなら、Realインタープリターの定義にすぎません。

マンダリンは英語よりも本物ですか?

  • 確かに北京語は英語を話す人にとって特に有用ではありません
  • 同様に、英語は北京語を話す人にとってはとてもナンセンスです
  • 彼らが両方を話さない限り。

したがって、リアルは問題ではありません。言い換えましょう:

形式言語の代わりに疑似コードが使用されるのはなぜですか?

単純なVENNダイアグラムは問題を簡単に強調できます。英語および北京語話者であるすべての人間のセットは、英語または北京語話者のサブセットです。どの言語でも習熟するのに努力が必要なため、共通部分は通常、共用体よりもはるかに小さくなります。

プログラミングの教科書では、少なくとも1つの自然言語(教科書が書かれている言語)を理解していると想定できます。それ以外の場合は、より読みやすい別の教科書が選択されているため、これを想定しても安全です。結局のところ、1つの言語を学ぶことは十分に難しいです-2つはより難しいです。

これは、疑似コードを使用する最初の理由です。それは本を簡単に読むことができる聴衆を最大にします。これは、自然言語ですでに見られる確立された言語規則に従うことによって行われます。料理、数式などからレシピを言ってください。ギャップは、自然言語による簡単な説明で埋めることができます。または、写真付きの視覚システムへの最後の頼りにしないこともできます。

なぜ共通言語がプログラミング言語になれないのかについては。おなじみのプログラミング言語の例を使って書かれたプログラミングに関する本を読んで、どのくらいマンダリン(またはまだ話せていない言語)を学んだかを考えてみましょう。

教科書が達成するもの

2番目の理由については、教科書が達成しなければならないことを考慮してください。

  • 彼らが自然言語を使用するだけでなく、外国語を学ぶのに煩わしい理由を説明します。
  • 外国人の言語を読者が自分で話せるように説明する。

なぜプログラム

本のほとんどは、なぜあなたがこの外国語や類似の言語を学び、使用したいのかについてあなたを納得させる必要があります。これは、プログラミング自体の本質を議論することを意味します。

  • どのように問題を特定しますか
  • どのように問題を分解しますか
  • データをどのように構築するか
  • プロセスをどのように設計しますか
  • 依存関係をどのように管理しますか
  • 障害をどのように特定しますか
  • もっと

これのほとんどは、マシン自体とは何の関係もありませんが、主に、プログラムを実現するためにミートウェアがどのように動作すべきかについての議論です。人間の宇宙の目標をリンクして、宇宙の問題をプログラムし、解決するために努力する理由を示す必要があるため、これはかなり複雑です。

プログラムの説明

2番目の教科書の成果は、言語の説明です。現在、ほとんどのプログラミング言語は、文法といくつかの意味規則で記述できます。浅い端には、JSONのような言語があり、3ページ程度でかなり完全に定義できます。より複雑な言語にはより大きな仕様が必要ですが、役立つために大部分は完全に理解する必要はありません。ただし、これらの説明は疑似コードです。彼らは自然言語の観点から正式な言語を指定します。違いは、これらの疑似コードが事前に指定されていることです。

正式言語でさえ、それ自体が(実行可能)疑似コードであることを考えると、アルゴリズムを説明するときに最も重要なのは何でしょうか。次に大きいコンテキスト。

  1. アルゴリズムには、そのコンテキストで妥当な目標があります。
  2. そのコンテキストにはいくつかの制約があります
  3. アルゴリズムは、目標を達成しながらこれらの制約を処理する方法の説明です。

どの時点でも、アルゴリズムが記述されている言語は重要ではありません。どちらかと言えば、アルゴリズムの成功にとって重要な操作はほんのわずかです。したがって、質問は次のようになります。

  • アルゴリズムを理解するために、C ++ / C#/ Python / etcなどの形式言語の完全な仕様を解釈できるミートウェアプログラムについて説明する方が良いですか?
  • または、アルゴリズムを理解するために必要な4つ程度のプリミティブを定義するだけです。

言語の学習が難しいことを考えると、読者はアルゴリズムを理解するために言語を学習/学習している必要があります。教科書の著者として、読者に何を尋ねればよいですか。


0

私はここで細かいことに反対し、そうだと主張します。本やチュートリアルでは、まったく新しい疑似コード構文を発明するのではなく、実際の高水準言語に基づく疑似コードを使用するべきです。

ただし、このコンテキストで使用する場合、これは実際の言語の疑似バージョンである必要があること、および言語の構文と制限に従うことに厳格すぎないように注意する必要があることを、すべての作成者と読者にも警告します。代わりに、作成者は、スニペットと通信しようとしていることを慎重に検討し、選択された基本言語に慣用的な完全で実際にコンパイル可能な実装やコードを探すのではなく、関数呼び出しやコメントの背後にある無関係な詳細を隠す必要があります。 。

より正確なセマンティクスを求めている人が言語のドキュメントを参照したりフォールバックしたりしながら、言語の基本だけを知っている人でもスニペットの要点を理解できるように、著者は言語についていくつかの創造的な自由を得る必要があります。詳細について記入するための言語に関する彼らの予備知識。

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