BNF記法:プログラム言語の設計図
ITを学びたい
先生、「BNF」って、何のことですか?なんか難しそうです…
IT専門家
BNFは、簡単に言うと、プログラミング言語などで、文法を表現するための規則のことだよ。たとえば、日本語の文法で言うと、「主語+述語」のようなルールを決めたりするのに使われるんだ。
ITを学びたい
日本語の文法みたいに、プログラミング言語にも文法があるんですか?
IT専門家
そうだよ。プログラミング言語でコンピュータに命令を伝えるときも、コンピュータが理解できる書き方のルールがあるんだ。そのルールを明確に表すためにBNFが使われるんだよ。だから、プログラミング言語を作る上ではとても重要なものなんだ。
BNFとは。
「情報技術」に関する用語「ビーエヌエフ」(バッカス・ナウア記法。「Backus-Naur form」の頭文字から。バッカス・ナウア記法を参照のこと)について
記法の由来
「バッカス・ナウア記法」は、略して「ビーエヌエフ記法」と呼ばれ、プログラムを書き表す言葉の文法をきちんと決めるための特別な書き方です。この名前は、この書き方を考えたジョン・バッカスさんとピーター・ナウアさんにちなんで付けられました。バッカスさんは「アルゴル」というプログラムの言葉を作ることに携わっていました。ナウアさんは、バッカスさんの考え方を発展させて、「アルゴル60」という言葉の文法を書き表すのに使いました。
この書き方を使うと、プログラムの言葉の規則を分かりやすく、簡潔に書き表すことができます。そのため、プログラムを機械の言葉に翻訳する「翻訳機」や、プログラムを直接実行する「実行機」を作るのに欠かせない道具となっています。私たち人間が使う言葉では、あいまいな表現がよくありますが、この書き方を使うことで、機械が理解できるはっきりとした規則を作ることができます。これにより、プログラムの言葉の設計と、実際に使えるようにすることが大きく変わりました。
ビーエヌエフ記法は、ただの書き方ではありません。プログラムの言葉の設計の考え方を具体的にしたものなのです。その影響は、今の計算機科学に深く関わっています。言葉の構造をはっきりさせることで、プログラムを作る人がその言葉を理解しやすくなるだけでなく、翻訳機を作る作業も簡単になりました。ビーエヌエフ記法は、プログラムを作る人にとって分かりやすいだけでなく、機械にとっても分かりやすい言葉を作るための重要な役割を果たしているのです。
項目 | 説明 |
---|---|
正式名称 | バッカス・ナウア記法 |
略称 | BNF記法 |
由来 | ジョン・バッカスとピーター・ナウアにちなむ |
目的 | プログラムを書き表す言葉の文法を定義する |
特徴 | 分かりやすく、簡潔にプログラムの規則を記述できる |
用途 | 翻訳機や実行機の開発に不可欠 |
利点 | あいまいな表現をなくし、機械が理解できる明確な規則を作成可能 |
影響 | プログラム言語の設計と実装に大きな変化をもたらした |
意義 | プログラム言語設計の考え方を具体化し、現代計算機科学に深く影響 |
記法の構成要素
文法を表現するための方法であるビーエヌエフ記法は、いくつかの基本的な部品を組み合わせて複雑な規則を記述します。大きく分けて、何を定義するかを示す部分、どのように定義するかを示す部分、そしてこれらを結びつける記号の三種類の部品から成り立っています。
まず、何を定義するかを示す部分は、プログラムの部品を表す名前です。例えば、プログラムの中で使われる「変数」や計算を行う「式」など、プログラムを構成する様々な要素がこれにあたります。具体的な例として「変数」という要素を定義したい場合は、「変数」という名前を用います。
次に、どのように定義するかを示す部分は、具体的な定義の内容を表します。例えば、「変数」は「英字」で始まり、その後に「英数字」が続く、といったように定義します。この部分は、定義される要素がどのような規則で構成されるのかを示す役割を果たします。
最後に、これらの部品を結びつける記号として、「=」や「|」といった記号が使われます。「=」という記号は、「左側の要素は右側の内容で定義される」という意味を表します。例えば、「変数 = 英字」と書けば、「変数」は「英字」で定義されるという意味になります。また、「|」という記号は「または」という意味を表し、複数の選択肢がある場合に使用します。例えば、「変数 = 英字 | 変数 英数字」と書けば、「変数」は「英字」または「変数」の後に「英数字」が続くもので定義される、つまり「英字」で始まり「英数字」が続くものと定義できます。
このように、ビーエヌエフ記法では、限られた種類の記号を用いて複雑な文法規則を表現できます。例えば、整数を「数字」または「整数」の後に「数字」が続くものと定義することで、再帰的な定義も可能です。これは「整数 = 数字 | 整数 数字」と書けます。このような再帰的な定義も、ビーエヌエフ記法の重要な特徴の一つです。
構成要素 | 説明 | 例 |
---|---|---|
定義対象 | 何を定義するかを示す。プログラムの構成要素名。 | 変数、式、整数など |
定義内容 | どのように定義するかを示す。具体的な定義規則。 | 英字で始まり、英数字が続く |
記号 | 定義対象と定義内容を結びつける。 |
|
実際の例
たとえば、整数を足し合わせる計算式を規則として書き表してみましょう。この書き表し方の方法を「バッカス・ナウア記法」といいます。この記法では「式 = 整数 ‘+’ 整数」のように表します。これは「式」というものは、「整数」と「+」という記号、そしてもう一つの「整数」を組み合わせたものという意味です。ここで「=」は「~で定義される」という意味で使われます。さらに「整数」自身は数字がいくつか並んだものと考えることができます。そして、「数字」は0から9までのいずれかの文字で表されます。
このように、バッカス・ナウア記法を使うと、複雑な文の組み立て方を段階的に分けて、わかりやすく書き表すことができます。この足し算の例はとても単純ですが、実際のプログラムを動かす言葉では、色々なものが複雑に組み合わさっています。例えば、箱の中に値を入れておく「変数」、計算を行うための「演算子」、計算の順番を操作する「制御構造」などです。
バッカス・ナウア記法を使うことで、これらの要素を整理して、厳密な定義を与えることができます。これはプログラムを動かす言葉の設計や、実際にコンピュータで動くようにする作業の支えとなっています。たとえば、皆さんが普段使っているアプリや、見ているウェブサイトの裏側では、このバッカス・ナウア記法を元にして作られたプログラムが動いているのです。一見単純な計算式でさえ、バッカス・ナウア記法で厳密に定義することで、コンピュータが正しく理解し、実行できるようになります。このようにバッカス・ナウア記法は、私たちがコンピュータとやりとりする上で、なくてはならない重要な役割を担っているのです。
拡張BNF記法
拡張バッカス・ナウア記法(EBNF)は、バッカス・ナウア記法(BNF)を土台として、より多くの表現ができるようにした記法です。BNFで文法を記述する際には、繰り返しや任意の要素の記述が複雑になりがちでしたが、EBNFでは、これらの表現を簡潔に記述するための工夫が凝らされています。
例えば、ある要素が何回も繰り返されることを表す場合、BNFでは同じ記述を何度も繰り返す必要がありました。しかし、EBNFでは「*」という記号を使うことで、「0回以上の繰り返し」を簡単に表現できます。同様に、「+」という記号は「1回以上の繰り返し」を、「[]」という記号は「あってもなくてもよい要素」を表します。これらの記号のおかげで、複雑な文法規則をコンパクトに記述できるようになりました。
具体例として、プログラムの中で名前として使われる「識別子」を考えてみましょう。識別子は、一般的に、先頭は英字で始まり、その後ろには英字、数字、または記号「_」が続きます。これをBNFで記述しようとすると、非常に複雑な表現になってしまいます。しかし、EBNFを使えば、「識別子 = 英字 { 英数字 | ‘_’ }」のように簡潔に記述できます。これは、「識別子は英字で始まり、その後に英数字または「_」が0回以上続く」という意味です。
このように、EBNFはBNFの表現力を高め、より実用的な文法記述を可能にしています。EBNFは、様々なプログラム言語の文法を記述する際に広く使われており、現代のプログラム言語開発においてなくてはならないものとなっています。
記法 | 意味 | BNFでの表現 | EBNFでの表現 |
---|---|---|---|
0回以上の繰り返し | 要素が0回以上繰り返される | 複雑な繰り返し表現 | * |
1回以上の繰り返し | 要素が1回以上繰り返される | 複雑な繰り返し表現 | + |
あってもなくてもよい要素 | 要素が存在しても存在しなくても良い | 複雑な条件分岐 | [] |
識別子 | 英字で始まり、英数字または「_」が0回以上続く | 非常に複雑な表現 | 識別子 = 英字 { 英数字 | ‘_’ } |
記法の意義と影響
計算機に指示を出すための言葉、つまりプログラムを書き記すための規則を定めたものを、プログラム言語と言います。そのプログラム言語を作る際に、どのような単語や文の並び方が正しいのかを、厳密に書き表す方法が必要です。そこで登場したのが、「バッカス・ナウア記法」と呼ばれる、プログラム言語を記述するための方法です。
この記法が登場する以前は、プログラム言語の書き方は、普段私たちが使っている言葉で説明されていました。しかし、普段使っている言葉では、どうしても意味があいまいになってしまうことがあります。そこで、数学のように厳密な記号を用いることで、プログラム言語の構造を明確に表現できるようになりました。
この厳密な表現のおかげで、プログラム言語を理解し、実行するプログラムを作るのが、以前よりもずっと簡単になりました。プログラムを作る道具を「翻訳機」や「実行機」と呼ぶならば、バッカス・ナウア記法は、高性能な翻訳機や実行機を作るための設計図のようなものです。設計図が正確であれば、翻訳機や実行機も正確に動作し、プログラムの間違いを減らし、異なる種類の計算機でも同じように動くプログラムを作ることが容易になります。
バッカス・ナウア記法は、プログラム言語の研究にも大きく役立ちました。プログラム言語が持つ、文章としての構造や意味を研究する分野に、大きな進歩をもたらしました。プログラムの文法を分析したり、意味を理解したりする研究に、なくてはならない道具となったのです。
バッカス・ナウア記法は、単なる書き方の提案ではなく、プログラム言語の設計そのものを大きく変えました。そして、現代の計算機科学において、バッカス・ナウア記法とその仲間たちは、プログラム言語を作る上で欠かせない道具として広く使われています。この記法の影響は、これからのプログラム言語の発展にも、間違いなく続いていくでしょう。
バッカス・ナウア記法とは | メリット | 役割 | 影響 |
---|---|---|---|
プログラム言語を記述するための厳密な方法 | プログラム言語の構造を明確に表現できる プログラムの理解・作成が容易になる プログラムの間違いを減らせる 異なる計算機でも同じように動くプログラム作成が容易になる |
高性能な翻訳機・実行機を作るための設計図 プログラム言語の研究における必須ツール |
プログラム言語の設計を大きく変えた 現代の計算機科学において必須の道具 今後のプログラム言語の発展にも影響 |