メタ構文変数とは、コンピュータサイエンス、特にコンピュータプログラミングにおいてプレースホルダーとして識別される特定の単語または単語のセットのことです。これらの単語はソースコードによく見られ、実際の使用前に変更または置換されることを意図しています。たとえば、fooとbar は、 HTTP (ウェブ)、TCP/IP、電子メールプロトコルなどのインターネットの基礎技術を定義する文書である 330 を超えるインターネット技術タスクフォースのRequest for Commentsで使用されています。[ 1 ] [ 2 ]
数学的な類推によれば、メタ構文変数は、代数で文字が数値の変数として使われるのと同様に、他の単語の変数となる単語である。[ 1 ]
メタ構文変数は、変数、関数、コマンドなど、正確な同一性が重要ではなく、概念を示すためだけに用いられる実体に名前を付けるために使用され、プログラミング教育に役立ちます。
英語はほとんどのコンピュータプログラミング言語の基礎となる言語、あるいは共通語であるため、英語由来の変数は、他の言語圏のユーザー向けに書かれたプログラムやプログラム例においても一般的に見られる。
特定の文脈で使用される変数は、プログラミング言語を中心に発展するサブカルチャーによって異なる場合がある。
すべてのプログラミング言語で共通して使用されるメタ構文変数には、foobar、foo、bar、baz、qux、quux、corge、grault、garply、waldo、fred、plugh、xyzzy、thudなどがあります。[ 1 ] [ 3 ]これらの単語のうち、plughとxyzzyはゲームColossal Cave Adventureから取られています。[ 4 ]
より詳しい情報は、MIT Press発行の『The Hacker's Dictionary』を参照してください。
日本語では、「ほげ」[ 5 ]や「ふが」という言葉がよく使われ、そのほかに「ぴよ」、「ほげら」 、「ほげほげ」などの言葉がよく使われます。[ 6 ]メタ構文変数としてのhogeの起源は不明ですが、1980 年代初頭に遡ると考えられています。[ 6 ]
フランスでは、 totoという単語が広く使われており、tata、titi、tutuといった派生語が関連する代名詞として用いられています。toto の使用理由としてよく挙げられるのは、Tête à Totoというジョークを言う際に使われるお決まりのキャラクターに由来するという説です。
トルコでは 、hedeとhödö (プログラミング言語のASCIIのみの命名制約のため、通常はhodo と綴られる) という単語は、LeMan のような 90 年代の人気ユーモラス漫画雑誌に由来する、よく知られたメタ構文変数です。これらの単語には意味がなく、まさにその理由で使用されています。これらの用語は、90 年代後半から 2000 年代初頭にかけて、俳優でスタンドアップコメディアンのCem Yılmazによってより広く普及しました。[ 7 ]
イタリアのソフトウェアプログラミング文化では、ウォルト・ディズニーのキャラクターの名前(イタリア語版の番組に登場するもの)を変数として使うことが一般的です。これらの名前は擬似コードによく登場し、ソフトウェアエンジニアリングの授業で参照され、同僚にアルゴリズムを説明する際によく使われます。最もよく使われる名前には、「pippo」(グーフィー)、「pluto」、「paperino」(ドナルドダック)などがあります。[ 8 ]

次の例では、関数名fooと変数名barはどちらもメタ構文変数です。で始まる行は//コメントです。
// foo という名前の関数int foo ( void ) { // bar 変数を宣言し、値を 1 に設定しますint bar = 1 ;return bar ; }さまざまな引数渡しメカニズムの例を含む関数プロトタイプ: [ 9 ]
void Foo ( Fruit bar ); void Foo ( Fruit * bar ); void Foo ( const Fruit & bar );C++言語の関数オーバーロード機能を示す例
void Foo ( int bar ); void Foo ( int bar , int baz ); void Foo ( int bar , int baz , int qux );スパム、ハム、卵は、 Python プログラミング言語で使用される主要なメタ構文変数です。[ 10 ]これは、言語の名前の由来となったモンティ・パイソンの有名なコメディスケッチ「スパム」に由来しています。 [ 11 ] 次の例では、、、、はメタ構文変数であり、で始まる行はコメントです。spamhameggs#
# spam という名前の関数を定義しますdef spam ():# 変数 ham を定義しますham = "Hello World!"# 変数 eggs を定義するeggs = 1戻るIETFのRFCとコンピュータプログラミング言語はどちらもプレーンテキストで記述されているため、メタ構文変数は命名規則によって区別する必要がある。そうしないと、文脈から明らかにならないからである。
以下は、電子メールプロトコルを説明するIETF公式文書からの例です(RFC 772より引用、RFC 3092で参照)。
すべて順調です。これで受信者を指定できます。 S: MRCP TO:<Foo@Y> <CRLF> R: 200 OK S: MRCP TO:<Raboof@Y> <CRLF> R: 553 該当するユーザーは存在しません S: MRCP TO:<bar@Y> <CRLF> R: 200 OK S: MRCP TO:<@Y,@X,fubar@Z> <CRLF> R: 200 OK 「Raboof」の失敗はストレージに影響を与えないことに注意してください。 「Foo」、「bar」宛のメール、または「fubar@Z」に転送されるメール ホスト「X」を介して。
(texinfo のドキュメントでは、メタ変数と、texinfo ファイルでドキュメント化されているプログラミング言語で使用される単なる変数との区別を次のように強調しています。「メタ構文変数を示すには、@var コマンドを使用します。メタ構文変数とは、別のテキストを表すものです。たとえば、関数のドキュメントでは、その関数に渡される引数を説明するためにメタ構文変数を使用する必要があります。プログラミング言語の特定の変数名には @var を使用しないでください。これらはプログラム固有の名前なので、@code が適切です。」[ 12 ] )
上記の例に反映されているもう1つの点は、メタ変数は、与えられたスキーマ内のすべての出現箇所で同じインスタンスに一律に置き換えられるという慣習である。これは、形式文法における非終端記号とは対照的である。形式文法では、生成規則の右側の非終端記号は異なるインスタンスに置き換えることができる。[ 13 ]
ACMEという名前は、 SQLデータベースの例や、教育目的のプレースホルダーの会社名としてよく使われます。「ACME データベース」という用語は、トレーニングやテストのみに使用されるトレーニング用または例専用のデータベース データ セットを意味するのによく使われます。ACME は、SQL の使用例を示すドキュメントでもよく使われ、これはMicrosoftやOracleなどの企業の技術ドキュメントだけでなく、多くの教育テキストでも一般的な慣習となっています。[ 14 ] [ 15 ] [ 16 ]