本文へ移動
試験

  1. 高校情報
  2. 読んで分かる ITパスポート・基本情報
  3. 基礎理論
  4. 第4章 情報・符号と言語の理論

基礎理論 第4章 テクノロジ系・大分類:基礎理論

情報・符号と言語の理論

情報量とデジタル化、符号と文字コード、論理的な推論、形式言語とオートマトン、プログラム言語の仕組み。

4-1情報量とデジタル化

火曜の朝、通販の注文確認メールの控えを見ていたミナトは、手を止めました。宛名が「?橋 様」になっています。注文したお客さんの名前は「髙橋」で、はしごのような形の「髙」の字でした。同じ日の別の注文では、住所の欄が「譯懊′荳」のような、意味の通らない漢字の列に変わっていました。店長は画面をのぞき込み、心配そうに言います。「メールが途中で壊れたのかな。お名前を間違えるなんて、お客さんに失礼だよ」。ミナトは相棒に打ち込みました。「メールの文字って、そもそもどうやって送られてるの?」

パン屋の事務机で、ノートパソコンに宛名が「?橋 様」になった注文確認メールが映り、店長が心配そうにのぞき込み、ミナトが相棒に質問を打ち込んでいる
図:宛名の「髙」が「?」になって届いた注文確認メール

相棒の返事は、文字の話から始まりませんでした。「コンピュータの中では、文字も写真も音も、全部が数として入っている。まず、その数の単位から見てみよう」。コンピュータが扱うのは、電気が流れているかいないか、のような2つの状態の並びです。この2つを0と1で表した1けたぶんをビット(bit)と呼び、情報の量を数える最小の単位にします。

1ビットで表せるのは2通りだけなので、ふつうは8ビットをひとまとめにして扱います。この8ビットのまとまりがバイト(byte)です。8ビットの0と1の並べ方は2の8乗で256通りあるので、1バイトで256種類のものを区別できます。英字や数字なら1字が1バイトに収まりますが、漢字は数千字あるので、1字に2バイト以上を使います。

注文確認メールは1通でおよそ3,000バイト、新作パンの写真は1枚で2,000,000バイトほどになります。0が多くて読みにくいので、単位の前にSI接頭語を付けて、3kB(キロバイト)、2MB(メガバイト)のように書きます。SI接頭語は国際単位系で決められた、10のべき乗倍を表す記号です。大きい方はk(キロ、10の3乗)、M(メガ、10の6乗)、G(ギガ、10の9乗)、T(テラ、10の12乗)、P(ペタ、10の15乗)と、1,000倍ずつ上がります。小さい方はm(ミリ、10のマイナス3乗)、μ(マイクロ、10のマイナス6乗)、n(ナノ、10のマイナス9乗)、p(ピコ、10のマイナス12乗)で、コンピュータの処理にかかる時間を「5ns(ナノ秒)」のように表すときに使います。

ここから基本情報!情報量の考え方

メールの中の0と1の並びは、それだけではただのデータです。受け取った人がそれを読み、判断や行動を変えるときに、データは情報になります。「明日は雨で客足が落ちそうだ」というデータは、店長が焼く数を減らすと決めたときに、店にとっての情報として働いたことになります。

情報の量は、その知らせが起こる確率で決まると考えます。起こる確率がpの出来事を知ったときの情報量は、log₂(1/p)ビットです。こむぎ堂が8種類のパンから「今日のおすすめ」を同じ確率で1つ選ぶとすると、どれが選ばれたかを知らせる情報量は log₂8 = 3ビットになります。3ビットあれば000から111まで8通りを区別できるので、計算と数え方が一致します。反対に、ほぼ毎日起こる出来事を知らされても、得られる情報量はほとんど0です。めったに起こらない知らせほど、情報量は大きくなります。

基本情報の範囲ここまで

数として扱えるのは、文字だけではありません。店の留守番電話に残ったお客さんの声も、コンピュータに入れるときには数の並びになります。声は空気の振動で、その強さは時間とともに切れ目なく変わります。このように連続して変わる量で表すことをアナログ、とびとびの数値で表すことをデジタルといいます。デジタルのデータは、何度コピーしても劣化せず、コンピュータで計算や加工ができます。

アナログの信号をデジタルの数値に変えることをA/D変換(Analog to Digital)と呼び、3つの手順で行います。最初の手順が、波を一定の時間間隔で区切り、その時点の値を取り出す標本化(サンプリング)です。次に、取り出した値を決まった段階のどれかに当てはめて整数にする量子化を行います。最後に、その整数を0と1の並びに直す符号化で、デジタルのデータができあがります。

なめらかな音の波に、等しい間隔の縦線で値を取り出す標本化、取り出した値を横線の段階に合わせる量子化、各段階の数を0と1の列にする符号化の3つが左から順に並んでいる
図:A/D変換の3つの手順。標本化、量子化、符号化

留守番電話の声を、1秒に8,000回標本化し、1回の値を256段階(8ビット)で量子化したとします。1秒ぶんのデータは 8,000回 × 8ビット = 64,000ビットで、バイトに直すと8,000バイトです。1分のメッセージなら 8,000バイト × 60秒 = 480,000バイト、つまり480kBになります。

標本化の回数を増やし、量子化の段階を細かくするほど、元の声に近い音を再現できます。その代わりにデータ量が増えます。量子化では値を近い段階に丸めるので、元の波との間にわずかな差が必ず残ります。標本化の回数については、元の信号に含まれるいちばん高い周波数の2倍より多い回数で標本化すれば、元の波形を再現できることが知られています(標本化定理)。

4-2符号理論

月末、ミナトは1か月ぶんの注文の記録を、税理士さんにメールで送ることになりました。ファイルが大きすぎて添付できないので、ZIP形式に圧縮すると、大きさは4分の1ほどになりました。受け取った税理士さんが開くと、記録は1件も欠けずに元どおりです。「小さくしたのに、中身が減らないのはどうして?」と店長が聞きます。

データを0と1の並びに直すやり方は、1通りではありません。同じ注文の記録でも、並びを工夫すれば短く表せますし、反対にわざと余分なビットを足して、途中でビットが変わったことに気づけるようにもできます。データを短くして送る量を減らすこと(効率)、届いたデータの誤りを見つけること(信頼性)、そして第三者に読まれないようにすること(安全性)は、どれもデータを0と1にする段階での工夫です。安全性のための暗号は、セキュリティの単元で扱っています。

ここから基本情報!短くする符号と、誤りに気づく符号

ZIPのように、データに含まれるむだ(同じ並びのくり返しや、出てくる回数のかたより)を取り除き、中身を失わずに短く表すことを情報源符号化といいます。データ圧縮のことです。

情報源符号化の代表がハフマン符号です。よく出てくる記号に短い符号を、あまり出てこない記号に長い符号を割り当てます。こむぎ堂の通販で、1か月の注文のうち食パンが50%、クロワッサンが25%、バゲットとあんぱんが12.5%ずつだったとします。4種類なので、全部に同じ長さの符号を付けるなら2ビットずつ(00、01、10、11)が要ります。

パン注文の割合同じ長さの符号ハフマン符号
食パン50%000
クロワッサン25%0110
バゲット12.5%10110
あんぱん12.5%11111

ハフマン符号の平均の長さは、0.5×1 + 0.25×2 + 0.125×3 + 0.125×3 = 1.75ビットです。1,000件の注文なら、同じ長さの符号の2,000ビットに対して1,750ビットで済みます。符号の作り方は、出てくる割合の小さい2つを1組にまとめる操作をくり返し、まとめた順に0と1を割り当てていくものです。

長さがばらばらの符号を区切りなしに並べても、読み間違えることはありません。どの符号も、ほかの符号の頭の部分と一致しないように作ってあるからです。たとえば「0100110」は、前から読むと 0|10|0|110 としか区切れず、食パン、クロワッサン、食パン、バゲットの順だと決まります。

反対に、送る途中で生じる誤りに気づいたり直したりできるように、データにわざと余分なビットを足すことを通信路符号化といいます。データを短くする情報源符号化とは、向きが逆の工夫です。7ビットのデータに1ビットを足して「1の数がいつも偶数になる」ようにしておけば、1ビットだけ反転して届いたときに1の数が奇数になり、誤りに気づけます。この足したビットをパリティビットと呼び、くわしい仕組みは第6章で見ます。

基本情報の範囲ここまで

店長の問いに戻ると、ZIPで小さくなった記録が元どおりに開けるのは、むだを取り除いただけで、中身そのものは捨てていないからです。一方で写真や音声には、人が気づきにくい細かい部分を捨てて、元には戻らない代わりに大きく縮める圧縮も使われています。注文の記録のように1字の違いも許されないデータには、元どおりに戻せる圧縮を使います。

4-3文字の表現

ミナトは、化けた注文確認メールの「ソース」を開いてみました。本文の前に、送った側の設定が英字で並んでいます。その中に「charset=ISO-2022-JP」という1行がありました。相棒は「charsetは、このメールの文字をどの表で数に直したか、という宣言だよ」と教えてくれます。

コンピュータは、文字を1字ずつ番号に置きかえて記録し、送ります。どの文字に何番を割り当てるかを決めた表が文字コードです。英大文字の「A」は、多くの文字コードで65番(16進数で41)です。送る側と読む側が同じ表を使っていれば、番号から同じ文字が復元されます。表が食い違えば、同じ番号から別の文字が出てきます。これが文字化けです。

ここから基本情報!英数字の文字コード

多くの文字コードのもとになっているのが、アメリカで標準化されたASCIIコードです。1字を7ビットで表し、英字・数字・記号と、改行などの制御文字を合わせた128字を収めています。「A」が65番になっているのは、このASCIIコードの割り当てです。

IBMの大型コンピュータ(メインフレーム)では、EBCDIC符号(エビシディック)という8ビットの文字コードが使われてきました。こちらでは「A」が16進数でC1番になり、ASCIIコードとは番号の並びがまったく違います。メインフレームのデータをほかのコンピュータに移すときは、番号を変換する必要があります。

基本情報の範囲ここまで

日本語には、かなと数千の漢字があるので、1バイトの表では足りません。日本の漢字の表の基本は、日本産業規格(JIS)の JIS X 0208 です。この表の文字を使う文字コードには、使われてきた場面ごとに、いくつかの方式があります。

JISコードは、JISが定めた日本語の文字コードです。英数字の部分と漢字の部分を、エスケープシーケンスという決まった記号の並びで切りかえながら表す方式で、メールで長く使われてきました。ミナトが見た「ISO-2022-JP」は、このJISコードをメールで使うために決めた方式の名前です。

シフトJISコードは、JISコードの漢字の番号をずらして(シフトして)、ASCIIコードの英数字や半角カタカナと番号が重ならないようにした方式です。英数字は1バイト、漢字は2バイトで、切りかえの記号を使わずに混ぜて書けます。Windowsなどのパソコンで広く使われてきました。

ここから基本情報!UNIXの日本語

UNIX系のOSでは、日本語などの文字を表すのにEUC(Extended UNIX Code、拡張UNIXコード)が使われてきました。日本語用のものはEUC-JPと呼ばれます。漢字を2バイトで表し、どちらのバイトも一番上のビットを1にしておくことで、上のビットが0になるASCIIコードの英数字と区別します。

基本情報の範囲ここまで

ここで「髙」の字に戻ります。この字は JIS X 0208 の表にありません。Windowsで使われているシフトJISコードには、メーカーが独自に足した文字として「髙」や「﨑」が入っています。お客さんのパソコンでは問題なく入力できたのに、通販の仕組みがメールをJISコードに直そうとしたとき、表に番号が無いので「?」に置きかえてしまった、というわけです。

こうした食い違いをなくすために作られたのがUnicodeです。世界中の文字に、重なりのない番号を1つずつ割り当てます。「髙」はU+9AD9、「A」はU+0041という番号です。番号をバイト列に直す方式にはいくつかあり、いま最も広く使われているのがUTF-8です。UTF-8は英数字をASCIIコードと同じ1バイトで表し、日本語の文字の多くを3バイトで表します。住所の欄が「譯懊′荳」になったのは、UTF-8で書かれた住所を、読む側がシフトJISコードだと思って読んだためでした。

同じ「橋」の字でも、方式が違えば別のバイト列になります。

方式「橋」のバイト列(16進数)おもに使われてきた場面
JISコード(ISO-2022-JP)36 36(前後に切りかえの記号が付く)メール
シフトJISコード8B B4Windowsなどのパソコン
EUC-JPB6 B6UNIX系のOS
UTF-8(Unicode)E6 A9 8BWebページ、いまのメールやアプリ

ここから基本情報!国際規格の文字の表

世界中の文字を1つの表に収めることを目指した国際規格の文字の集まりをUCS(Universal Coded Character Set)といいます。規格は ISO/IEC 10646 で、日本では JIS X 0221 として取り入れられています。UnicodeはUCSと番号をそろえて作られているので、同じ文字には同じ番号が付きます。

基本情報の範囲ここまで

4-4述語論理と推論

原因の見当はつきましたが、化けたのが髙橋さんの1通だけとは限りません。ミナトは過去3か月の注文確認メールを見直しました。宛名が化けていたのは、髙橋さん、山﨑さん、德永さんの3通です。どの名前の字も、ふだん目にする形とは少し違います。

ミナトが3通から考えたことは、筋道の立て方で3種類に分けられます。最初に宛名の「?」を見たとき、ミナトは「メールの文字コードに、その字の番号が無いのではないか」と考えました。このように、目の前の結果をうまく説明できる原因を思いつく推論を仮説形成(アブダクション)といいます。思いついた原因は、まだ確かめていない仮説です。

次に、3通に共通することを探しました。髙・﨑・德は、どれもWindowsのシフトJISコードに独自に足された字でした。そこから「独自に足された字を含む名前は、メールで化ける」という決まりを引き出しました。具体的な例をいくつか集めて、そこから一般的な決まりを導く推論が帰納推論です。帰納推論の結論は、例が増えれば確かになっていきますが、必ず正しいとはいえません。4通めに、決まりに合わない例が見つかるかもしれないからです。

最後に、相棒と一緒に仕組みの側から確かめました。「JISコードで送るメールには、JIS X 0208 に無い字は載せられない」「髙は JIS X 0208 に無い」。この2つが正しければ、「髙はJISコードのメールに載せられない」は必ず成り立ちます。一般的な前提から、決まった手順で必ず成り立つ結論を導く推論が演繹推論です。前提が正しい限り、結論が外れることはありません。

こうした推論は、記号を使ってはっきり書き表せます。「髙橋さんの宛名は化けた」は、正しいか正しくないかが決まる文(命題)です。ここで名前の部分を変数xに置きかえると、「xの宛名は化けた」という形になります。このような、対象を入れると正しいか正しくないかが決まる式を述語と呼び、述語に「すべてのxについて」「あるxについて」という量の言い方を加えて推論を扱うのが述語論理です。「すべてのxについて、xの名前に独自に足された字があるならば、xの宛名は化ける」と書けば、帰納推論で得た決まりを一つの式で表せます。

述語論理の考え方は、こむぎ堂の注文の記録にもそのまま使われています。注文の記録は、注文番号・名前・住所・商品を列にした表の形で保存されています。データをこのような表(関係)の形で持ち、表どうしを結び付けて扱うしくみを関係データベースと呼びます。表から「名前に独自に足された字を含む注文」だけを取り出すとき、その条件は「xの名前に独自に足された字がある」という述語そのものです。関係データベースの理論は、述語論理と集合の考え方をもとにして作られています。ミナトはこの条件で表を検索し、お詫びのメールを送る相手の一覧を作りました。

4-5形式言語

お詫びのメールには「注文番号を問い合わせフォームに入れてください」と書きました。ところが届いた入力は、「K0123」「k0123」「K0123」「K-0123」とばらばらです。こむぎ堂の注文番号は、通販ならK、予約ならYの1字に、数字が続く形と決まっています。ミナトは、どの文字列を注文番号として受け付けるのかを、コンピュータに分かる形で書く必要に迫られました。

人どうしなら「Kのあとに数字」で通じます。しかしコンピュータに判定させるには、どの文字列が正しく、どれが正しくないかを、あいまいさの残らない決まりで書かなければなりません。文字列の決まりを書く方法には、記号の並びで書く方法と、図で書く方法があります。

ここから基本情報!文字列の決まりを書く記法

使ってよい文字(K、Y、0〜9)を決め、それを並べた文字列のうち、決まりに合うものだけを集めたものを言語と考えます。このように、文法の規則によって厳密に定められた文字列の集合を形式言語といいます。日本語や英語のような自然言語と違って、ある文字列がその言語に含まれるかどうかが、規則から必ず決まります。プログラム言語も形式言語の一つです。

文法の規則を書く記法の代表がBNF(Backus-Naur Form、バッカス・ナウア記法)です。「::=」の左の記号を、右の並びに置きかえてよい、という規則を並べて書きます。「|」は「または」を表します。こむぎ堂の注文番号は、次の4つの規則で書けます。

規則読み方
<注文番号> ::= <種別> <数字列>注文番号は、種別のあとに数字列が続いたもの
<種別> ::= K | Y種別はKかYのどちらか
<数字列> ::= <数字> | <数字> <数字列>数字列は、数字1つか、数字のあとにまた数字列が続いたもの
<数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9数字は0から9のどれか

3行めの規則は、右側に自分自身(数字列)が入っています。このように規則を自分自身で定義すると、何けたの数字でも表せます。「K0123」は、種別K、数字0、そのあとの数字列「123」と規則を当てはめていけるので、注文番号です。「K-0123」は、Kのあとの「-」がどの規則にも当てはまらないので、注文番号ではありません。

BNFの規則は、どれも左側が山かっこの記号1つだけです。このように、左側が1つの記号だけで、前後に何があっても同じように置きかえられる文法を文脈自由文法と呼びます。多くのプログラム言語の文法は、文脈自由文法で書かれています。「開きかっこと閉じかっこが正しく対応している」のような入れ子の決まりも書けます。この種の決まりは、あとで見る正規表現では書けません。

同じ決まりを、図で表すこともできます。規則の名前を四角、そのまま書く文字を丸で囲み、左から右へ矢印でつなぎ、選べる道を分かれ道で、くり返しを戻る矢印で描いたものが構文図式です。注文番号なら、Kの丸とYの丸の分かれ道を通ったあと、数字の四角を1回以上くり返して通り抜ける図になります。

決まりをもっと短く書く方法が正規表現です。文字の並びの型を、特別な意味を持つ記号(メタ文字)で表します。注文番号は [KY][0-9]+ と書けます。[KY] は「KかYのどちらか1字」、[0-9] は「0から9のどれか1字」、+ は「直前のものを1回以上くり返す」という意味です。問い合わせフォームの入力の点検や、文書の中の検索・置きかえによく使われます。

基本情報の範囲ここまで

決まりを書き下ろしてみると、「k0123」の小文字や「K0123」の全角を受け付けるかどうかも、決めなければならないことが分かります。ミナトは、入力された英字を大文字に、全角の英数字を半角にそろえてから判定することにしました。

ここから基本情報!式の書き方とスタック

問い合わせフォームでは、注文の合計金額も計算し直して表示します。180円のパンと220円のパンを2組なら、ふだんの書き方では (180 + 220) × 2 です。演算子を数の間に置くこの書き方は、かっこが無いと計算の順序が決まりません。そこで、演算子を2つの数のあとに置く逆ポーランド表記法(後置記法)で書くと、180 220 + 2 × となり、かっこが要らなくなります。

逆ポーランド表記法の式は、スタック(最後に入れたものを最初に取り出す入れ物)を使って、左から順に読むだけで計算できます。数が来たらスタックに積み、演算子が来たら上の2つを取り出して計算し、結果を積み直します。

読んだものすることスタックの中(右が上)
180積む180
220積む180, 220
+220と180を取り出し、180 + 220 = 400を積む400
2積む400, 2
×2と400を取り出し、400 × 2 = 800を積む800

最後にスタックに残った800が答えです。式を後ろから見直したり、かっこの対応を探したりせずに済むので、コンピュータが式を計算する方式としてよく使われます。

基本情報の範囲ここまで

4-6オートマトンと計算量

注文番号の決まりは書けましたが、フォームに入った文字列を、実際にどうやって判定するのでしょう。相棒は「1文字ずつ読んで、いまどこまで読めたかだけを覚えておけばいい」と言い、紙に丸を4つ描いて矢印でつなぎました。

文字列を先頭から1字ずつ読み、読んだ字に応じて「いまの状態」を切りかえていけば、決まりに合うかどうかを判定できます。覚えておくのは、全体の文字列ではなく、いまの状態だけです。この考え方は、自動販売機や信号機のように、決まった手順で動く機械の設計にも使われます。

ここから基本情報!状態と遷移で判定する

いくつかの状態と、入力によってどの状態に移るかの規則で、動きを表す数学的なモデルをオートマトンといいます。そのうち状態の数が有限個のものが有限オートマトンです。正規表現で書ける決まりは、有限オートマトンで判定できます。

注文番号を判定する有限オートマトンは、4つの状態でできています。何も読んでいない「はじめ」、種別の1字を読んだ「種別あり」、数字を1つ以上読んだ「受理」、決まりから外れた「誤り」です。読み終えたときに「受理」の状態にいれば、注文番号として受け付けます。状態を丸、移り方を矢印で描いた図を状態遷移図と呼びます。

「はじめ」「種別あり」「受理」「誤り」の4つの丸が矢印でつながり、K・Yで「はじめ」から「種別あり」へ、数字で「受理」へ進み、「受理」では数字のたびに自分に戻り、それ以外の文字は「誤り」へ向かう状態遷移図
図:注文番号を判定する有限オートマトンの状態遷移図

同じ内容を、いまの状態と読んだ字の組み合わせから、次の状態を引ける表にしたものが状態遷移表です。

いまの状態KかYを読んだ数字を読んだそれ以外を読んだ
はじめ種別あり誤り誤り
種別あり誤り受理誤り
受理誤り受理誤り
誤り誤り誤り誤り

「K0123」を読むと、はじめ → 種別あり → 受理 → 受理 → 受理 → 受理と進み、受理で読み終わります。「K-0123」は、2字めの「-」で誤りに移り、そのあと何を読んでも誤りから出られません。

判定の仕組みができたら、次はかかる時間です。アルゴリズムの処理にかかる時間が、入力の大きさに応じてどう増えるかを表したものを時間計算量といいます。上の有限オートマトンは1字につき1回状態を移るだけなので、文字列が長くなれば、その長さに比例して時間がかかります。

受け付けた注文番号で、注文の記録を探す処理も考えます。n件の記録を前から順に見ていくと、最悪でn回比べます。記録を注文番号の順に並べておき、真ん中と比べて半分ずつ探す範囲を狭める二分探索なら、最悪でもおよそ log₂n 回で済みます。1,000件なら、前からでは1,000回、二分探索では10回です。100万件になると、前からは100万回、二分探索は20回です。

この増え方の違いを、細かい係数を省いて表す書き方がオーダー記法です。前から順に探すのはO(n)、二分探索はO(log n)と書きます。処理の回数が 3n² + 5n + 2 回になる手順なら、nが大きくなると n² の項がほかを圧倒するので、O(n²) と表します。

基本情報の範囲ここまで

4-7コンパイラと機械語

ミナトは、通販の仕組みを作った業者に、メールの文字コードをUTF-8に変えてほしいと連絡しました。返事は「プログラムの設定を書きかえて、作り直します。週末には入れかえられます」。店長は首をかしげます。「設定の1行を書きかえるだけなのに、どうして作り直しになるの?」

業者が書いているのは、人が読める英単語や記号でできたプログラムです。ところが、コンピュータの中で命令を実行するCPUは、この文字のままのプログラムを読めません。CPUが直接読んで実行できるのは、0と1の並びで書かれた命令だけです。この形のプログラムを機械語(バイナリコード)といいます。

そこで、人が書いたプログラムを機械語に翻訳する作業が要ります。プログラムを実行する前に、全体をまとめて機械語に翻訳しておくソフトウェアがコンパイラです。業者の言う「作り直し」は、書きかえたプログラムをコンパイラでもう一度翻訳し、できた機械語を入れかえることでした。これに対して、プログラムを1行ずつ読みながら、その場で解釈して実行するやり方もあり、そのためのソフトウェアをインタプリタと呼びます。

ここから基本情報!コンパイルの手順

コンパイラが翻訳する元のプログラムを原始プログラム(ソースプログラム)、翻訳してできる、コンピュータが実行できる形のプログラムを目的プログラム(オブジェクトプログラム)といいます。翻訳は、次の順に段階を踏んで進みます。

  1. 字句解析:文字の並びを、変数名・数・記号などの意味のある最小のかたまり(字句)に区切ります。注文番号の判定と同じように、有限オートマトンの考え方が使われます。
  2. 構文解析:字句の並びが、言語の文法(BNFなどで書かれた規則)に合っているかを調べ、文の組み立てを木の形に表します。
  3. 意味解析:文法には合っていても意味の通らないもの、たとえば宣言していない変数の使用や、数と文字の足し算のような型の食い違いを見つけます。
  4. 最適化:同じ結果になるまま、速く動く、または小さくなるように命令を組みかえます。
  5. コード生成:最後に、目的のCPUの機械語を作ります。

意味解析を終えた段階で、コンパイラは原始プログラムと機械語の中間にあたる表現をいったん作り、最適化はその上で行います。この翻訳の途中で作られる言語を中間言語といいます。中間言語をはさむと、CPUの種類ごとに違うのはコード生成の部分だけになり、同じ最適化を使い回せます。Javaのように、中間言語の形で配布し、実行するコンピュータの上で動かす言語もあります。

基本情報の範囲ここまで

翻訳には時間がかかりますが、一度機械語にしておけば、実行のたびに翻訳し直す必要はありません。たくさんの注文を毎日処理する通販の仕組みは、前もって翻訳しておくほうが速く動きます。

4-8プログラム言語の種類

作り直しを待つ間に、ミナトは業者の担当者と電話で話しました。メールを送る部分と在庫を数える部分は別の言語で書かれていて、問い合わせフォームの点検にはまた別の言語を使っているそうです。「目的によって、書きやすい言語が違うんですよ」と担当者は言いました。

プログラム言語には、処理をどう書き表すかの考え方の違いで、いくつかの種類があります。同じ「注文の合計金額を出す」処理でも、手順を一つずつ指示するのか、計算の式として書くのか、データのまとまりに仕事を任せるのかで、書き方が変わります。

ここから基本情報!4つの考え方

処理の手順を、上から順に実行する命令の並びとして書く言語を手続型言語といいます。「合計を0にする。注文を1件ずつ取り出し、金額を合計に足す。最後に合計を表示する」のように、変数の値を書きかえながら進めます。C言語やCOBOLが代表です。

計算を、関数に値を渡して結果を受け取ることの組み合わせとして書く言語が関数型言語です。「合計金額は、すべての注文の金額を足し合わせる関数の結果」と書き、変数の値を途中で書きかえることを避けます。同じ入力にはいつも同じ結果が返るので、プログラムの正しさを確かめやすくなります。LispやHaskellが代表です。

事実と規則を書いておき、問いを与えると、処理系が推論して答えを見つける言語が論理型言語です。述語論理にもとづいていて、Prologが代表です。「髙は独自に足された字である」という事実と、「独自に足された字を含む名前は化ける」という規則を書いておけば、「髙橋さんの名前は化けるか」という問いに、処理系が演繹推論で答えます。

データと、そのデータを扱う操作をひとまとめにした「オブジェクト」を単位にプログラムを組み立てる言語がオブジェクト指向言語です。「注文」というオブジェクトが、自分の金額や宛名と、合計を出す操作や確認メールを作る操作をまとめて持ちます。JavaやC++が代表です。

種類書き表すもの代表的な言語
手続型言語命令を実行する順序C言語、COBOL
関数型言語関数の適用の組み合わせLisp、Haskell
論理型言語事実と規則(答えは推論で求める)Prolog
オブジェクト指向言語データと操作をまとめたオブジェクトJava、C++

いまの多くの言語は、1つの種類だけに収まりません。オブジェクト指向言語に関数型の書き方を取り入れたものもあり、種類は「その言語がおもに支えている考え方」として見ると分かりやすくなります。

基本情報の範囲ここまで

週末、新しいプログラムに入れかわった通販の仕組みから、試しの注文確認メールが届きました。ミナトがソースを開くと、charsetの行は「UTF-8」になっています。宛名には「髙橋 様」と、はしごの形の字がそのまま出ていました。店長は画面を指さして、ほっとした顔で言います。「メールが壊れていたわけじゃなかったんだね」

火曜の朝の「?橋 様」は、メールが途中で壊れたのではありませんでした。お客さんのパソコンでは「髙」に番号があり、メールを送るJISコードの表にはその番号が無かった。2つの表の食い違いが、「?」という形で見えただけです。住所が読めない漢字の列になったのも、UTF-8のバイト列をシフトJISコードの表で読んだ食い違いでした。文字は、送る側と読む側が同じ表を使ってはじめて、同じ文字として届きます。

ただ、店長には気になることが残っています。「渡邊さんの『邊』には、細かく形の違う字がいくつもあるって聞いたよ。UTF-8にすれば、その違いまで全部正しく届くの?」。文字コードが番号を付けているのは字の種類で、細かな字形の違いまでは区別しきれないことがあります。ミナトは、その答えをまだ調べきれていませんでした。

この章のふりかえり

この章で太字にした用語は、暗記カードで覚えられます。

ITパスポートの範囲(15語)を暗記カードで覚える 基本情報まで(40語)を暗記カードで覚える

カードの「カテゴリ」は、この章の節の名前です。同じボタンでもう一度取り込んでも、復習の進み具合は消えません。