コンピュータサイエンスにおいて、擬似コードは、プログラミング言語の慣例(代入演算子、条件演算子、ループなど)と、非公式で通常は自己説明的な動作や条件の表記法を組み合わせてアルゴリズムの手順を記述したものです。 [ 1 ] [ 2 ]擬似コードは通常のプログラミング言語と共通の特徴を持っていますが、機械制御ではなく人間が読むことを目的としています。擬似コードは通常、アルゴリズムの機械実装に不可欠な詳細を省略するため、擬似コードは手動でのみ検証できます。[ 3 ]プログラミング言語は、都合の良い場合は自然言語による詳細な説明、または簡潔な数式表記法で拡張されます。擬似コードを使用する理由は、従来のプログラミング言語コードよりも人間が理解しやすく、アルゴリズムの主要な原理を効率的かつ環境に依存しない方法で記述できるからです。擬似コードは、アルゴリズムを文書化するために教科書や科学出版物で、またソフトウェアや他のアルゴリズムの計画でよく使用されます。
擬似コードの構文には、実行可能なプログラムではないため、広く統一された標準は存在しません。ただし、学術的な評価など、限定的な標準はいくつか存在します。擬似コードは、エラーなくコンパイルできるスケルトンプログラムに似ています。フローチャート、ドラコンチャート、UML ( Unified Modelling Language)チャートは、擬似コードのグラフィカルな代替手段と考えることができますが、紙面上でより多くのスペースを必要とします。HAGGISなどの言語は、擬似コードとプログラミング言語で記述されたコードの間のギャップを埋める役割を果たします。
擬似コードは、コンピュータ科学や数値計算に関する教科書や学術論文で、特定のプログラミング言語に精通しているかどうかに関わらず、プログラマーが理解しやすい方法でアルゴリズムを記述するために一般的に用いられています。教科書には、使用されている慣例を説明する序論が含まれていることが多く、擬似コードの詳細さは、形式的なプログラミング言語に匹敵する場合もあります。
プログラマーは、馴染みのないアルゴリズムを実装する際に、まず擬似コードで記述し、それをプログラミング言語に変換しながら、より大きなプログラムに適合させるという手順を踏むことが多い。このトップダウン構造化アプローチは、多くの場合、擬似コードのスケッチから始まり、実行可能なコードへと洗練されていく。擬似コードは標準化にも用いられる。例えば、MPEG規格は形式的なC言語のような擬似コードに基づいており、これらの規格はコードの詳細を理解しなければ理解できない。[ 4 ]
擬似コードは一般的に特定の言語の構文規則に実際には従いません。体系的な標準形式はありません。一部の著者は、従来のプログラミング言語の制御構造からスタイルと構文を借用しますが、これは推奨されません。 [ 5 ] [ 6 ]構文のソースには、Fortran、Pascal、BASIC、C、C++、Java、Lisp、ALGOLなどがあります。変数宣言は通常省略されます。関数呼び出しやループ内のコードなどのコードブロックは、多くの場合、1行の自然言語の文に置き換えられます。
そのため、擬似コードのスタイルは、書き手によって大きく異なり、一方では実際のプログラミング言語をほぼ忠実に模倣したもの、他方では整然とした散文に近い記述となる場合もある。
この柔軟性には大きな利点と欠点の両方があります。良い面としては、実行可能なプログラミング言語は「必要に応じて新しい構造を考案し、非公式な説明から読者にその意味を推測させるという利便性に勝るものはない」という点ですが、悪い面としては、「テストされていないコードは通常間違っている」という点です。[ 7 ]
数値計算において、擬似コードは、行列や集合論などの数学的記法と、従来のプログラミング言語の制御構造、場合によっては自然言語による記述を組み合わせたものとなることが多い。これは、数学の訓練を受けた幅広い人々が理解できる、簡潔で非公式な記法であり、数学的アルゴリズムを記述する方法として頻繁に用いられる。例えば、和演算子(大文字のシグマ表記)や積演算子(大文字のパイ表記)は、forループと選択構造を1つの式で表すことができる。
戻る通常、数式には非ASCII文字による組版が用いられ、例えばTeXやMathMLなどのマークアップ言語、あるいは専用の数式エディタなどが使用されます。
数学的なスタイルの擬似コードは、ピジンコードと呼ばれることもあり、例えばピジンALGOL(この概念の起源)、ピジンFortran、ピジンBASIC、ピジンPascal、ピジンC、ピジンLispなどがあります。
以下は、フォード・ファルカーソンアルゴリズムの数式風擬似コードのより長い例です。
アルゴリズムFord-Fulkerson の入力:フロー容量cを持つグラフG、 ソースノード、 シンクノードtの出力:sからtへの流れfが最大となるような流れf(なお、f (u,v)はノードuからノードvへの流量、c (u,v)はノードuからノードvへの流量容量を表します。)G Eの各辺 ( u , v )に対して、 f ( u , v ) ← 0、 f ( v , u ) ← 0 を実行する。残余ネットワークG f内にsからtへのパスpが存在する間、残余ネットワークG fのフロー容量をc f とする。c f ( p ) ← min{ c f ( u , v ) | ( u , v ) in p } p内の各エッジ ( u , v )について、f ( u , v ) ← f ( u , v ) + c f ( p ) f ( v , u ) ← − f ( u , v )return f自然言語の文法要素をコンピュータプログラミングに取り入れようとする試みがいくつか行われ、HyperTalk、Lingo、AppleScript、SQL、Inform、そしてある程度はPythonといったプログラミング言語が生み出されてきた。これらの言語では、括弧やその他の特殊文字が前置詞に置き換えられ、結果として非常に冗長なコードとなる。これらの言語は一般的に動的型付けであり、変数宣言やその他の定型コードを省略できる。このような言語は、言語の知識がない人でもコードを理解しやすく、場合によっては言語を習得しやすくする可能性がある。しかし、自然言語との類似性は、通常、本質的なものではなく、表面的なものに過ぎない。構文規則は従来のプログラミングと同様に厳格で形式的であり、必ずしもプログラムの開発を容易にするとは限らない。
アルゴリズムのドキュメント作成に、数式擬似コード(集合論の表記法や行列演算を含む)を用いる代わりに、非ASCII文字の数式表記法とプログラム制御構造を組み合わせた形式的な数理プログラミング言語を用いる方法がある。そうすれば、機械がコードを解析・解釈できる。
いくつかの形式仕様記述言語には、特殊文字を用いた集合論的記法が含まれています。例は以下のとおりです。
一部の配列プログラミング言語では、従来の制御構造と混在して、ベクトル化された式や行列演算を非ASCII式として使用できます。例は次のとおりです。
対象プログラミング言語の構文要素を避ける