プログラミングができるといいと聞くことがある。
人間の言語は、コンピュータには理解できなく、理解できるのは0と1の羅列で表現される機械語だけである。
しかし、0と1だけの機械語を人間が読み書きするのは困難である。
そんな機械語を人間の言語に近づけた言語がプログラミング言語であり、プログラミング言語を使用して作成された指令書をプログラムという。
もっと具体的にいうと、プログラムとはコンピュータに実行してほしい作業の指令のことだ。
プログラミングとは、このプログラムを作成することをいう。
このプログラミングができるようになると、論理的思考ができるようになるということだ。(だから、できると良いのだろう)
今回は、プログラムについてみてみよう。
構文解析
プログラムは、0と1の羅列であるビット列や文字列の集合体であるが、それは規定の記述ルールに従ってないと機能しない。
この記述ルールどおりかどうかを調べる構文解析という処理がとても重要なのである。
構文解析にはいくつか種類がある。
オートマトン
オートマトンは、入力から計算を実行し結果を出力して停止する、という処理手順を数学的に表現したモデルである。
よく用いられるのが、各入力に対する動作が一意に定まる有限オートマトンである。
有限オートマトンは、初期状態と最終状態に加え、有限個の状態と入力される有限個の記号、状態遷移関数によって構成される。
有限オートマトンの表現には、状態遷移図や状態遷移表などが用いられる。
状態遷移図の例だと、例えば0111というビット列はS1→S2→S2→S2となって受理される。
ところが、これが1100というビット列だと、S2→S2→S1→S1となり受理されないのである。
状態遷移表は遷移図を表形式で書き換えたものだ。
オートマトンは、文字入力などにより状態を遷移させて検査するモデルである。
BNF(バッカス記法)
BNFは、プログラム言語の文法を定義するための記述法である。
記述法はとてもシンプルで、3つの記号で表現される。
::= | 「定義」を表す。 |
| | 「または」を表す。 |
< > | 名詞や名詞句など「非終端記号」を表す。 |
非終端記号(< >)は、定義(::=)に従って、文字や数字などの終端記号(それ以上変換できない要素)になるまで変換される。
例えば、
<識別子>::=<英字>|<識別子><英字>|<識別子><数字>
<英字>::=a|b|c|・・・|z|A|・・・|Z
<数字>::=0|1|2|・・・|9
これらの意味するところは、識別子は英字であること、又は、識別子は識別子と英字の連続であること、又は、識別子は識別子と数字の連続であることを示している。
ここで識別子は英字であるわけだから、識別子・英字の連続は英字・英字であり、識別子・数字の連続は英字・数字の連続である。
なお、aや0などの各文字は終端記号を表している。
逆ポーランド記法
逆ポーランド記法は、数式の記述方法で、演算子(+−など)を被演算子(計算される対象)の後に記述する表記法である。
A+Bであれば、A B+となる。
また、X=A+B×(C+D)だと、X A B C D+×+=
であり、最も優先順位の低い(最後に作用する)演算子から後ろにもっていくとよいのである。
人間には分かりづらいが、コンピュータにとってはこの記述の方が理解しやすいらしい。
具体的には、5×(4+3)という数式を逆ポーランド記法に直してみると、5 4 3 + × となる。
その原理を図にしたのが下記である。
優先度の低い演算子を前に持ってくる理由が分かりそうである。
プログラムの制御構造
プログラムは命令文の集合体であり、この制御の流れを規定した制御構造に従って実行される。
構造化定理では、制御構造は、順次、選択、繰り返しの三つで構成される。
これらの構造の他に、プログラムを簡潔に記述するために副プログラムを用いる。
副プログラムは手続き(procedure)と関数(function)の総称であり、副プログラムを用いることにより、まとまった手順を共通化でき、簡潔なプログラムを記述することが可能になる。
手続きと関数は、いくつかの命令をひとまとめにして、プログラムの他の部分から呼び出せるようにしたものである。
手続きは、処理結果を返却しないのに対し、関数は値(引数)を与えると結果(戻り値)を返す。
記憶域の管理
プログラムは補助記憶装置に記憶され、主記憶装置に配置されて実行される。
プログラム実行時には、記憶域がどのように管理され、それにより変数(データを入れる箱)や引数の振る舞いがどのように異なるか把握しておく必要となる。
ここで変数という単語が登場する。
プログラムにおける変数とは、数値や文字列などの値を入れたり出したりする箱のことである。
自由に名前をつけることができて、使用するには宣言が必要である。
変数は大きく分けると、大域変数(グローバル変数)と局所変数(ローカル変数)とがあり、それぞれ扱いが異なる。
大域変数は、プログラム内のどこからでも読み取りや書き換えが可能な変数のことである。
大域変数の領域はコンパイル時(プログラム言語を機械語に翻訳)に確保され、すべての副プログラムから同じ名前で参照される。
引数を使用しないで複数の副プログラムから参照もできる。
局所変数は、プログラム(関数)ごとに用意され、そのプログラム内だけで有効となる変数である。
一般的な局所変数は、プログラム実行時にスタック領域(後入れ先出し)が確保される。
そしてプログラムの実行が終了するとスタック領域も解放される。
引数の記憶域範囲
副プログラムに情報を渡す方法として引数を用いる方法がある。
引数とは、プログラム中に関数などに渡す値のことである。
副プログラムの呼び出し方法には、引数の与え方によって、値呼出しと参照呼出しとがある。
値呼出しとは、実引数として値を指定し、仮引数として局所変数を用意する。
実引数として渡す値は変数、定数、式など仮引数の型と合致していれば、どのような形式でもよい。
局所変数は、他の副プログラムからは参照することはできないので、副プログラムは戻り値を返す命令を用いて呼出し元に値を返す必要がある。
これに対して、参照呼出しでは、呼出し元が変数の記憶場所(参照方法)を副プログラムに引き渡す。
このとき、仮引数と実引数の変数名が一致している必要はないが、仮引数は実引数を参照してるため、仮引数の値を変更すれば実引数の値も変数されてしまう。
値呼出しは値渡し、参照呼出しは参照渡し、ともいう。
後者の呼び方の方がイメージがつかみやすい。
プログラム言語
プログラム言語には、以下のような種類がある。
低水準言語
人間よりもコンピュータの表現形式に近い。
機械語やアセンブラが該当。
高水準言語
人間の表現形式に近い。手続き型と非手続き型とがある。
手続き型・・処理手続きを逐一記述する。C言語やCOBOLなどが相当する。
非手続き型・・処理手続きを順を追って記述するようなことはせず、扱う問題やデータの構造や性質を記述していくなどの手法でプログラムを記述。これをコンパイラなどがコンピュータが実行可能な低水準言語の手続きに変換して実行される。JAVAなどが相当する。
非手続き型言語で、特によく耳にするのがJavaである。
Javaはオブジェクト指向型のプログラム言語である。
Javaで記述したプログラムは、Java仮想マシン(JavaVM)という実行環境で、1行ずつ解釈・実行される。
これにより、仮想マシンさえあればコンピュータのアーキテクチャに依存せず実行できるため、移植性が高いという特徴を持つ。
比較的簡素な文法体系をもつプログラム言語をスクリプト言語という。
スクリプト言語は、アプリケーションソフトウェア作成のための簡易的なプログラム言語の一種である。
代表的なものに、JavaScript、PHP、Pythonなどがある。
そのなかのJavaScriptは、HTMLファイル内に処理を記述するとWebブラウザによって解釈・実行されるスクリプト言語である。
JavaScriptは、ブラウザに入力されたデータの検査や動的なWebページの作成を行うことができる。
マークアップ言語
<title>のように < と > で文字列を囲んだタグを用いて文書やデータの構造を記述するための言語をマークアップ言語という。
タグは構造を表現するための情報であり、文書やデータの内容とはみなされない。
マークアップ言語の代表的なものに、文書の論理構造などを表現するためのSGML(Standard Generalized Markup Language)がある。
SGMLの発展型にXML(eXtensible Markup Language)やHTML(HyperText Markup Language) がある。
HTML
HTMLは、Webページ(ハイパテキスト)を記述するための言語である。
<p>と</p>で囲んだ部分がひとつの段落となるなど、Webページの文書構造などを指定するためのタグが規定されている。
また、Webページの文字の大きさやフォントといった見栄えについては、スタイルシートとよばれる情報で定義し、これをWebページが適用することが一般的である。
スタイルシートを定義するための言語には、CSS(Cascading Style Sheets)がある。
XML
XMLは、文書の見た目や構造を記述するためのマークアップ言語で、インターネット上でのデータ交換を効率よく行うことを目的としている。
ユーザが独自のタグを定義して使用できるので、業務要件に適した様式を定義し、企業間でやり取りすることが容易になる、
後記
いよいよ東京オリンピック開幕間近である。
選手村のある晴海ふ頭は立ち入り禁止となっているため、そこに本当に人がいるのか見当もつかないが、近所の高層マンションの住人の話だと外人だらけらしい。