大学やアルゴリズムの教科書では、教師と著者が制御コードを疑似コードで説明することは非常に一般的です。 PythonやHaskellなど)のような表現力豊かな言語の登場により、大学がこれらの言語のいずれかを介してアルゴリズムを説明するように切り替えることは理にかなっていますか?
私が考えることができる疑似コードの唯一の利点は、それがおそらく言語に依存しないということです。そうではありません。一部の疑似コードは命令型アプローチを使用し、他の疑似コードは機能的に見えます。著者は、使いやすいプログラミング言語からセマンティクスを借用するか、またはさらに悪いことに、セマンティクスを自然言語で記述するだけです。それで、疑似コードが実際に言語に依存しない場合、それを使用する利点は何ですか?既存の言語をそのまま使用した方がいいのではないでしょうか。
いいえ。疑似コードの要点は、コンパイルする必要がないことです。関係のない詳細をすぐに確認できます。対照的に、一見すると疑似コードのように見える言語でさえ、アルゴリズムを損なうだけの非常に非直感的な詳細を持つ可能性があります。 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:]
の意味を説明する必要はありません。
Pythonの例では実際にyield
を使用する必要があることを指摘する賢い学生は避けます。
Haskellは、ハッシュテーブル、RBツリーなどの変更可能なデータ構造を説明するのが面倒です。
アルゴリズムを表現するために複雑なレコードが必要になると、物事は言語固有のものになり始めます。例えば。 Pythonのオブジェクトシステムには、気を散らすいくつかの驚きがあります。
そうは言っても、疑似コードに加えてこれらの言語の1つを使用することは非常に価値があるかもしれません。
番号。
疑似コードの全体的な目的は、個々の言語の詳細と複雑さを抽象化して、プログラムが実行する方法ではなく、プログラムが実行することに焦点を当てることです。擬似コードを使用すると、実際の言語のように実際の実装要件に準拠する必要はなく、現在の実際のトピックの要件にのみ準拠する任意のルールを作成できます。
さらに、あなたが(学生として)できないファイルにコピーして貼り付け、コンパイルして実行するようにロジックが提示されている場合、ソリューションを自分で実装する必要があります。ソリューション自体が説明されていても。これは個人の考えコピー/貼り付けの不正行為を助長します。
本当の意味は何ですか?
Realはインタプリタに対してのみ定義されているためです。
マンダリンは英語よりも本物ですか?
したがって、リアルは問題ではありません。言い換えましょう:
正式言語の代わりに疑似コードが使用される理由
単純なVENNダイアグラムで問題を簡単に強調できます。英語および北京語話者であるすべての人間のセットは、英語または北京語話者のサブセットです。どの言語でも上手になるには努力が必要なため、共通部分は一般に共用体よりもはるかに小さくなります。
プログラミングの教科書では、少なくとも1つの自然言語(教科書が書かれている言語)を理解していると想定できます。それ以外の場合は、より読みやすい別の教科書が選択されているため、これを想定しても一般的に安全です。結局のところ、1つの言語を学ぶのは十分に難しいです。
これは、疑似コードを使用する最初の理由です。それは本を簡単に読むことができる聴衆を最大にします。これは、すでに自然言語で見られる確立された言語規則に従うことによって行われます。料理、数式などからレシピを言ってください。ギャップは、自然言語による簡単な説明で埋めることができます。または、写真付きの視覚システムに最後の手段を講じることで失敗することもあります。
なぜ共通言語がプログラミング言語になれないのかについては。おなじみのプログラミング言語の例を使って書かれたプログラミングに関する本を読んで、どれだけマンダリン(またはまだ話していない言語)を学んだかについては、皆さんにお任せします。
教科書が達成するもの
2番目の理由については、教科書が達成しなければならないことを考慮してください。
なぜプログラムなのか
本のほとんどは、なぜあなたがこの異星人の言語や類似の言語を学び、使いたいのかについてあなたを納得させる必要があります。これは、プログラミング自体の本質を議論することを意味します。
これのほとんどはマシン自体とは何の関係もありませんが、ほとんどの場合、プログラムを実現するためにミートウェアがどのように動作すべきかについての議論です。人間の宇宙の目標をリンクして、宇宙の問題をプログラムし、それらの解決に努める理由を示す必要があるため、これはかなり複雑です。
プログラムの説明
2番目の教科書の成果は、言語の説明です。現在、ほとんどのプログラミング言語は、文法といくつかの意味規則で記述できます。浅い端には [〜#〜] json [〜#〜] のような言語があり、これは3ページ程度でかなり完全に定義できます。より複雑な言語はより大きな仕様を必要としますが、有用であるために大部分は完全に理解する必要はありません。ただし、これらの説明は疑似コードです。彼らは自然言語の観点から正式な言語を指定します。違いは、これらの疑似コードが事前に指定されていることです。
正式言語でさえそれ自体(実行可能)擬似コードであることを考えると、問題はアルゴリズムを記述するときに最も重要なものは何ですか? 次に大きいコンテキスト
アルゴリズムが記述されている言語は重要ではありません。どちらかと言えば、アルゴリズムの成功にとって重要な操作はほんのわずかです。したがって、質問は次のようになります。
言語の学習が難しいことを考えると、読者はアルゴリズムを理解するために言語を学習/学習している必要があります。教科書の著者として、読者に何を尋ねればよいでしょうか。
私はここで細かいことに反対し、そうだと主張します。本やチュートリアルでは、まったく新しい疑似コード構文を発明するのではなく、実際の高級言語に基づく疑似コードを使用するべきです。
ただし、このコンテキストで使用する場合、これは実際の言語の疑似バージョンである必要があること、および言語の構文と制限に従うことに厳格すぎないように注意する必要があることも、すべての作成者と読者に警告します。代わりに、作成者は、スニペットと通信しようとしているものについて慎重に検討し、選択された基本言語に慣用的な完全で実際にコンパイル可能な実装やコードを探すのではなく、関数呼び出しやコメントの背後にある無関係な詳細を隠す必要があります。 。
より正確なセマンティクスを求めている人が言語のドキュメントを参照したりフォールバックしたりできるように、言語の基本だけを知っている人でもスニペットの要点を理解できるように、著者は言語についていくつかの創造的な自由を得る必要があります。詳細を記入するための言語に関する彼らの予備知識。