体系的に学ぶコンピュータ言語 [プログラミング]
2004年に刊行されたコンピュータ言語の進化をまとめた本。
第1章コンピュータ言語の歴史と概要
2001年をすぎてもHAL9000のような知能をもったコンピュータは夢物語。
コンピュータはプログラムという手順書に記述された内容の通りに動作することしかできない単純な機械のまま。
しかし、人間とコンピュータとの隔たりをなくすために、コンピュータ言語が開発され研究されてきている。
コンピュータ言語は人間がコンピュータに指示をあたえるためのもの。
あいまいさは一切ない。
コンピュータが理解できるのは機械語(マシン語)だけなので、
それ以外ならコンピュータ内の翻訳機を使う。
多彩なアプリがでてくるとコンピュータを操作するのはプログラミング言語だけではなくなってくる。
代表的なものは、Officeアプリケーションで使うマクロ言語、リレーショナルDBで使うSQLなど。
「完璧なコンピュータ言語」は存在していない。
現在のコンピュータ言語には万能なものがなく、用途に応じてつかうようにしている。
ハードやソフトの進化、社会情勢にあわせて言語が設計されてきた。
これまでの研究目的や課題
・もっとプログラミングが楽にならないか
・複雑な科学技術計算を数式で記述できないか
・後から見てもわかりやすいプログラムにできないか
・もっと高速に動作するプログラムにならないか
・論理記述をわかりやすく記述できる方法はないか
・他のコンピュータへ簡単に移植できないか
・初心者でも理解できるようなコンピュータ言語は作れないか
・プログラミングの教育用として適した言語はないか
・複数のプログラマにおけるチーム開発で、もっと開発効率を向上できないか
・GUIの画面設計をビジュアルにできないか
・データを簡単かつ確実に扱う構造を用意できないか
最初のコンピュータは一般的にはペンシルバニア大学「ENIAC」といわれている。
真空管とリレー、定航コンデンサ、スイッチ、ネオン管などでつくられた2.5×0.9×24の大きさ。
昔はその用途が弾道計算や暗号解読だったので、存在自体があまりあきらかにされなかった。
実際には「ENIAC」よりアイオワ州立大学の「ABC」がはやかったといわれている。
真空管をつかっており、メモリとしてコンデンサを設置したドラムをモーターで回転させていた。大きさは机程度。
「ENIAC」は敗戦でプログラミングしていた。
ノイマンが提唱するメモリにプログラムを内蔵するノイマン型コンピュータが開発され主流になっていく。
これがハードウェアからソフトウェアが分離するきっかけになった。
「EDVAC]はプログラムをメモリに搭載するようになったが、
後継の「EDSAC」が世界初のノイマン型コンピュータといわれている。
ノイマンは現在コンピュータの父といわれている。
コラムにパスカルの歯車式計算機が紹介されていた。
アラン・M・チューリングが開発して、暗号解読に活躍した「Colossus」は
プログラムが本体にくみこまれており、一部がプラグの差し替えで変更できるようになっていた。
「Baby」は、マンチェスター大学で開発され、Colossusの延長線上で開発された、
ウィリアムス管と名付けられた新しいメモリシステムで当時としては比較にならないくらい早いメモリアクセスを実現。
プログラムもメモリの中にとりこめるようになっており、現在のコンピュータに近い。
大きさは部屋いっぱいのビッグサイズだった。
コンピュータとコンピュータ言語の歴史が表になっていた。
1940年代→コンピュータの黎明期
軍事目的主体。アーキテクチャを模索中。プログラミンは物理配線などハードウェアに密接している。
言語は機械語のみ
1950年代から60年代→大型コンピュータの時代
時代を明確にきるのは困難。科学技術計算用にFORTRAN、事務用にCOBOLが使われた。
コンパイラの研究が盛んになる。
1970年代→パーソナルコンピュータの創世期
LSIの登場で数多くの部品を集積することが可能になり、コンピュータが小型化。
パソコンの原形ができる。マイクロソフトのBASICが多くのコンピュータに搭載され標準OSとしても利用される。
1980年代→標準化OSの時代
パーソナルコンピュータが多くのメーカーから発売され、計算だけでなくワープロや表計算ソフトらのアプリがのり、
企業が導入するようになる。
ソフトウェア資産の効率利用が考えられるようになる。
標準OS、CP/MやMS-DOS,UNIXなどの登場。
IBMのパーソナルコンピュータの標準機 PC/AT互換機で動作するソフトを標準ソフトとして売る動き。
アーキテクチャからアプリケーション中心にシフト。
プログラマがさまざまなコンピュータ言語を選択可能になる。
C言語のようなポピュラーな言語は各ソフト会社から機能の異なるものが発売される。
開発環境として発達して、のちのGUIで画面デザインできる統合開発環境ができる。
1990年代後半~→インターネットの時代
クライアントコンピュータに仕様を満たすWebブラウザがあれば、プログラムやサービスはインターネットから供給できるようになった。これまでとは異なる実行形態。
インターネットを利用したクライアント/サーバ型分散システムでは、速度が要求されるインターフェースをクライアントが担当。サーバで処理の重いデータを処理し、入力受付、計算、データ配信をするだけになった。このことから簡易的コンピュータ言語「スクリプト言語」が幅広く利用されることになる。
Webページの生成用の、PHPやVBScriptなどもうまれてきた。
パーソナルコンピュータの性能向上により、ついに余剰スペックが生まれる時代になった。
Javaha仮想マシン上で動作するコンピュータ言語は、こうした余剰スペックによって利用可能になったのである。
コンピュータ言語は様々あるが、コンピュータは機械語(マシン語)しかわからない。
どのコンピュータ言語で書かれたプログラムも最終的には機械語の命令に翻訳される。
機械語プラグラムは、人間にとって16進数で記述された記号の集まりにしかならない。
機械語の仕様はCPUによって異なる。
Z80 → NEDPC-8001など
8086→PC9801 、Pentiumの源流
PowerPC→Macintosh
同じ系列のCPUでもレジスタや命令が増えているなどの違いがあったりする。
機械語を簡単に記述するために「ニーモニック」という記述方法を使用することがある。
これをコンピュータで機械語に変換するソフトを「アセンブラ」という。
アセンブラは機械語に1対1で変換可能なコンピュータ言語。
プログラマはCPUの命令表から解放された。
機械語では命令の追加で移動先のアドレスが変わるたびに、
それぞれの移動先のアドレスを変更する必要があったが、
ラベルが使えるようになって効率がよくなった。
アセンブラの種類によっては、定数を指定できる、変数や構造体を宣言できる、
条件判断や反復処理を記述するなど、プログラミングを補助する機能が装備されていた。
アセンブラの問題
・データ型をもつ変数を使用できない。
・計算式をアセンブラに翻訳した形で記述しなければならない→「x=a*x+b」は記述できない
・プログラム制御の流れがわかりにくい。
「コンパイラ」は、より人間に理解しやすい形でかかれたプログラムのソースコードを機械語に変換する。
(現在のコンパイラは違う)
当時のコンピュータの利用方法は数値解析が主力だったので、
人間が理解しやすい形で、プログラム中に数式を記述したいというニーズが高かった。
1956年にIBMが開発した世界初の高級言語「FORTRAN]はこのニーズに答えたもの
計算を<変数>=<式>と表現できた。
可読性があがり、制御の流れもだいぶ理解しやすくなった。
もうひとつのニーズ、コンピュータに依存しないプログラムを記述したい、も
高級言語とコンパイラの開発を後押しした。
ターゲットのマシンに合わせたコンパイルをすることで、
一つのソースコードで異なるコンピュータで動作するようになることが期待された。
高性能なコンピュータが安価に入手できるようになったのは、1980年代後半からで、
それまではコンピュータの価格はプログラマの人件費よりずっと高かった。
そこで、処理時間が短く、コンピュータに負荷をかけないプログラミング技術が要求された。
コンピュータの性能があがると、コンピュータのとユーザの対話的な処理に、CPUの利用時間を割り当てられるようになった。
「インタプリタ」は、基本的に実行中にプログラムを1行ずつ解釈して実行する。
「コンパイラ」より速度は遅いが、プログラマが実行ファイルを作成すると意識しなくてもいい、
ソースコードと実行ファイルが同じで管理しやすいという利点がある。
代表はBASIC、現在のVisualBasicはインタプリタではなくコンパイラで動作する。
GUI・・・Grahical User Interface
現在のWindowsやMAC OSに搭載されているインターフェイス
プログラムやドキュメントを管理するウィンドウ、イメージで表現するアイコン、
画面上のオブジェクトを直接指定できるマウスなどで構成される。
こうした見た目の良さや直感的な操作の為にコンピュータの資源を割り当てられるのは
コンピュータが高速化したため。
GUIの登場で処理単位の開発→画面単位の開発に推移
多くのコンピュータ言語がフォームを作成するデザイン機能を搭載するようになった。
1970-1980年代にコンピュータ言語を表す際に高級言語と低級言語という表現が使われた。
人間に近いのを高級言語、コンピュータに近いのを低級言語という。
当時コンピュータの資源は限られていたので、高級言語は資源を多く必要とするため
コンピュータの資源をあまり使わず、能力を最大に引き出す低級言語もよく使われた。
しかし、コンピュータが安価になると、人間の資源を節約するほうが効率的になり、
高級言語で人間にわかりやすくプログラムを記述されるほうが重視されるようになった。
チューリング・テスト・・・コンピュータの父とよばれるアラン・M・チューリングが考えたテストで、人間の前に2つのディスプレイをおき、一方は人間が応答、一方はコンピュータが応答する、ディスプレイの前の人間が、ちがいがわからなければコンピュータが知性をもったとすることができるというもの。
人工知能の研究用に開発されたのがLISPとProlog
LISPは1958年にMITのジョン・マッカーシーが開発。
開発時期自体はFORTRANやCOBOLと変わらない。
ハードウェアが進化すると、ソフトウェアの有用性が社会的に認められ、利用範囲が拡大してきた。
ソフトウェアの機能は増え、プログラムやサイズが大きくなっていった。
複数のプログラマが共同で作業することも多くなり、大規模なプログラムを効率よく、間違いなく
開発することが求められるようになってきた。
1960年代末にエドガー・ダイクストラが『構造化プログラミング」を提唱。
それまで多用されていたgoto文を使わず、入り口と出口が一つのプログラムなら、順接(successive)、
分岐(conditional)、反復(repetition)で記述できると提案した。
初めて構造化プログラミングを導入したALGOL60の設計にもかかわった。
現在のほとんどのプログラミング言語に構造化の概念と命令がくみこまれている。
それまで必須だったフローチャートよりも、きれいに整備されたソースコードを読む方がわかりやすくなった。
ただし、goto文を使ったほうがわかりやすくなる場合もあると今日ではいわれていて、
その機能を持つ命令として、break文やcontinue文を実装しているプログラミング言語が多い。
1980年代、コンピュータの利用目的が、数値計算から蓄積されたデータの処理に移行する。
そこで「オブジェクト指向」という概念が登場する。
多くの研究者が様々な手法を発表しているが、共通するのは、データとデータに対する処理をひとまとまりにすること。
JavaやC++が有名なオブジェクト指向言語。
オブジェクト指向では、データの構造を変更しても、参照や変更がひとまとめになっていて修正しやすい。
そして、プログラマは本質的な部分に集中できることになる。
このような考え方はめずらしくなく、優秀なプログラマはどの言語を使っても、ある程度オブジェクト指向の概念を取り入れているものである。
現在の一般的なオブジェクト指向言語では、オブジェクトを「クラス」で定義、属性を「プロパティ」、処理を「メソッド」と呼び、クラスから「インスタンス」と呼ばれるオブジェクトを生成して操作する。
GUIでプログラムの操作体系は大きく変化した。
GUIプログラムを記述するために生み出されたのが、オブジェクト指向とイベント駆動型プログラムに対応したプログラミング言語。
それらではフォームのデザインがグラフィカルにできるようになっている。
そしてフォームに配置されたオブジェクト(テキストボックスやコマンドボタン)に対する数多くのイベントが発生する。
イベント駆動型プログラムでは、そのようなオブジェクトが発動するイベントに応じたプログラムを記述する。
このようなプログラム開発を補助するのが、イベント駆動型プログラミングに対応したオブジェクト指向言語。
本では、GUIで作った顧客登録フォームと、コマンドラインで同様の情報を入力する例をあげて、違いを解説していた。
以前はアプリケーションの中にデータベース機能を記述していたが、今では汎用のデータベースを使うことが一般的。
本来はデータベースはデータの集まり、それを管理するのをデータベース管理システムというが、いまではひとくくりにデータベースということが多い。
データベースではデータを高速に処理できるようにするために、データの格納方法に様々な工夫がされている。
代表的なモデル
・階層型データモデル
・ネットワーク型データモデル
・リレーショナルデータモデル
リレーショナルデータモデルが現在最も広く用いられている。データを実体(entity)という単位で格納して、
実体間の関係をリレーションとして論理的に定義する。データベースに格納されたデータは、関係代数演算および集合演算によって取得する。
Oracl、SQL Server、DB2などすべてリレーショナルデータベース。
SQL(Structured Query Language)・・・データベースに対する問い合わせや指示を文章に近い感覚で操作できるように設計されたもの。
SQLで記述された命令文をSQLステートメントと呼ぶ。
ストアドプロシージャ・・・SQLを拡張した簡易言語、変数の定義、分岐や反復といった構造化処理機能がある。コンピュータ言語がなくてもデータベースを処理できる。
SQは標準はあるもののデータベース毎に、仕様がちがうことがある。
ストアドプロシージャはデータベース管理システムによって違う。
プログラムからこれらデータベースを扱うのは一般的なことであり、コンピュータ言語の他にデータベース操作言語を習得するのは必須になりつつある。
第2章 コンピュータ言語の種類(動作による分類)
2.1 アセンブラ
コンピュータが扱えるのは機械語だけ。機械語は人間には簡単にわからないので、ニーモニックという表記法が考え出された。ニーモニックは、機械語の命令に対して内容にあったシンプルな単語の省略形を割り当てたもの。
プログラマにとって処理内容が連想しやすくなった。
ハンドアセンブルの方法が図解されていた。
アセンブラにはニーモニックの他に、ラベルの使用、分割アセンブル、メモリに対する名前の割り当て、マクロ機能が塔歳された。
ラベルをつけることで、分岐の先の行番号がかわってもプログラムを記述しなおさなくてよくなった。
機能ごとに分割したソースコードを別々にアセンブルできるようにして、時間を短縮できる。
アドレスのままでは目的がわからなくなるが、名前をつけると連想しやすい。
頻繁に使用される一連の処理を、一か所に記述しておく、アセンブラではそれをソースの置き換えで解釈してくれる。
2.2 コンパイラ
定義がかわってきている。
広義・・・ある言語で記述されたプログラムを別の言語のプログラムに変換するソフト。
一般的・・記述されたプログラムを実行用のプログラムに翻訳するソフト。
Javaでは「バイトコード」と呼ばれる中間コードを出力している。このようなタイプもある。
クロスコンパイラ・・コンパイル作業を行っている機種とは異なる機種用のオブジェクトコードを出力するもの
コンパイラの処理
・構文チェック、データ型チェック
・意味解析、コード生成
・最適化
コンパイラにより、変数に型を定義できるようになった。通常は整数、浮動小数点、文字列など。コンパイルの段階で型をチェックしてくれるので、ミスが減った。
代数式をそのまま記述できるようになった。
2.3 インタプリタ
プログラムに記述された命令を順番に逐次解釈する方法。
処理は主に、プログラムを解釈する部分と実行する部分にわけられる。
処理中にエラーが発生するとプログラムを停止させる。
一般的にコンパイラの言語より遅い。構文ミスを事前チェックできない。実行には専用の実行環境が必要。
BASIC、LISP、Perl、Ruby、PHPなどがインタプリタ言語。
スクリプト言語も、実行形態としてはインタプリタ型言語。
BASICは逐次解釈、Perlは実行前にコードを読み込んで内部コードに変換する。
逐次解釈では、ループなどは同じ作業が繰り返されることになる。
データ型はインタプリタ型コンピュータ言語でも使える。実行時に型検査を行っている→動的型検査
コンパイラとインタプリタの境目はだんだんなくなっている。Javaha中間コードをつくり(コンパイラ)、Java仮想マシン上で動作させている(インタプリタ)。
2.4 スクリプト
簡潔な記述で目的を達成できるように設計されたインタプリタ型の簡易言語。
インタプリタ言語とスクリプト言語の区別は明確ではない。
実行ファイルを生成しない簡易的開発言語や、Webページ上でHTMLに組み込んで実行できる言語をスクリプト言語と呼ぶことが多い。
・Webページに組み込めるもの
VBScriptとJavaScript、PHPなど。
JavaScriptはWebブラウザ上でアニメーションや簡単なプログラムを実行することが目的。
PHPはデータベースの操作に長けた言語、サーバーサイドで動作させると、Webシステムを簡単に構築できる。
・簡易開発に適した言語
テキスト処理が得意なPerlやawk、オブジェクト指向のRuby。
通常の言語と同等の機能を保有しているが、実行ファイルは生成せず、コマンドラインからプログラム入力やファイルを指定して実行できる機動性の良さが特徴。
他にUNIXのシェルスクリプト(sh BASH)、MS-DOSのバッチファイルなども一般的なコンピュータ言語より機能的には劣るが、スクリプトに含まれる。
2.5 マクロ
エディタや表計算ソフト、データベースなどのアプリケーションにおいて、ユーザが行う一連の操作を自動化する機能や、そのような目的で記述されたプログラムのこと。
機能が豊富なアプリケーションの中には、ユーザの行う一連の操作を自動化するために、指定したメニュー操作やキー操作の組み合わせを登録できる機能を提供している。もともとのマクロ機能とはこのこと。
最近のアプリケーションでは、メニューやキー操作だけでなく、通常のコンピュータ言語と同等の変数定義機能を装備したり、反復処理や分岐処理を可能にしたものが増えている。
マイクロソフト社のExcel5.0から搭載されたVBA(Visual Basic for Application)は、言語としての機能は通常のコンピュータ言語に劣らない。
第3章 コンピュータ言語の分類(設計概念による分類)
3.1 代表的なコンピュータ言語の分類
手続き型、関数型、論理型の3種類に分類した表があった。
ほとんどの言語が手続き型で、関数型はLISP、Scheme、Standard ML、LOGO、論理型はPrologのみ。
手続き型言語は、コンピュータ言語を用いて記述した命令とコンピュータの動作との対応がわかりやすいからと説明していた。
3.2 手続き型言語
一般的に利用されているコンピュータ言語のほとんど。
一つのコンピュータ言語を覚えれば、他のコンピュータ言語を習得するのは比較的容易といわれる理由。
手続き型言語の特徴
・命令の逐次実行→指定された行から順番にプログラムを実行してく
・変数への破壊的代入→同じ変数に何度も値を代入すること
作業手順を記すのが手続き型言語の書き方ともいえる。
メモリの値を変更しながらプログラムが動作すると、コンピュータにとっても自然で高速なプログラムになる、しかし、実行時における変数の値を追跡して全体的な動きを捉えることが困難であるという特徴がある。このため、プログラムの誤りを訂正したり、プログラムが正しく動くことを証明したりしなければならないとき、手間がかかる言語といえる。
3.3関数型言語
手続き型言語で作成されたプログラムはコンピュータの動きに近い。
手続き型言語が、本当に人間が考えやすいプログラムを記述できるかについては結論がでていない。
コンピュータ言語にとっては、人間の思考をそのまま記述できるかどうかが大切という考え方がある。
ラムダ記法・・・プリンストン大学の論理学者アロンゾ・チャーチが提案した関数の表記法。関数の引数として関数を渡したり、関数の計算式を関数に返したりするような計算式を、あいまいな点をなくして記述することができる。 従来の関数の表現方法、「f(x)」は、f(x)という関数なのか、引数xに関数fを適用したのかわからないという欠点がある。これを、「f(x)=x+1」という関数を定義するときは、ラムダ記法で「λx.(x+1)」と表記する。
チューリングマシン(現代のコンピュータのこと)で計算可能なことは、ラムダ計算で計算可能なことがチャーチによって示されている。
純粋な関数型言語は、同じ変数に何度も値を代入すること(破壊的代入)を許可していない。これによってプログラムの解析が容易になり、拡張、修正しやすくなる。しかし多くの関数型言語では、実行効率のために破壊的代入を許可している。
関数型言語は構造上、再帰的に関数を定義することが多くなるので、実行速度が遅い。
再帰呼び出しはコンピュータに大きな負荷がかかる。(末尾再帰の最適化が可能なら問題ないが)
命令を手順通り実行する必要がないので、記述されたプログラムを効率よく処理するコードに変換するのは困難。いまではかなり克服されていると主張する人たちもいる。
関数型言語の特徴
・多相型(Polymorphism)
C言語のテンプレートに似た機能。
型宣言部分を省力してプログラムを記述し、使用するときに具体的な型に適用できる。
自動的に肩を推論する機能をもつものもある。
・遅延評価(Lazy Evaluation)
関数の引数について、必要になった時点で評価をする
・高階関数(Higher Order Functiton)
計算結果として関数を返したり、実引数として関数をとることができる関数を「高階関数」という。
C言語では関数へのポインタを使用することで、この動作をある程度模倣できるが、制限があるし、記述が不自然になる。
関数型言語では、構造上メモリーリークを解消するためのガベージコレクションという機能が必要になる。
これはLISPで導入された機能で、最近では手続き型言語でも導入されている。
3.4 論理型言語
述語論理の定理証明を自動化したいという要求から生まれた言語。
プログラムを論理に沿って記述する。
通常の論理型言語でで用いられる論理は「述語論理式」と呼ばれる論理。
プログラマは論理のみを記述し、論理を満たす解をコンピュータが探索するという形で開発される。
述語とは真偽値を返す関数で、物事の関係や物事の性質をあらわすのにも使用する。
例 太郎と花子は夫婦である。→夫婦(太郎,花子)
論理記号(∀∧∨⇒)をつけて論理を記述する。
⇒はホーン節で、B⇒AでBならばAが成り立つ、B and C ⇒ A BかつCならば、Aが成り立つとなる。
Prologでの記述方法を解説し、太郎と花子は夫婦であると定義して、太郎の妻を探すという例で解説していた。
最初に定義を入力していき、「|?-fufu(taro, Wife)」ときくとPrologが「Wife=hanako」と返す。
他にも夫婦や親子関係を定義して、定義してない親子関係を、夫婦関係から求める例があがっていた。
3.5 クイックソートプログラムの例
手続き型言語Pascal、関数型言語LISP,論理型言語Prologによるクイックソートプログラムの記述例をあげ、
記述の比較を行っていた。
LISPでは配列を使うと手続き型言語と似てしまうのでリストを使っていた。
Prologで空でないリストが整列している関係を表す述語を定義していた。
第4章 コンピュータ言語の技術
4.1 コンピュータ言語に対する要求と技術
一般的な手続き型言語に焦点をあてて、これまでの技術を解説。
コンピュータは汎用的な演算処理を実現する夢のような機械で、必要な処理を行うプログラムを記述さえすれば、どのような処理も可能になると思われていた。
実際にはプログラミングという作業が予想したほどは簡単ではなかった。
ソフトウェアの規模の拡大により、過去の資産継承や、プログラマの共同作業の難しさなどの問題をかかえている。
そのような状況を脱却するため、プログラミング言語の技術に関する様々な研究がれ、提案がされてきた。
多くは、コンピュータの能力を最終的なプログラムの実行時に使用するだけでなく、ソフトウェア開発支援にも利用することにより、生産性の向上をはかるためのもの。
4.2 構造化プログラミング
コンピュータ言語では、常に何らかの制御構造が提供されている。
エドガー・ダイクストラは「一つの入り口から出口に向かう適正なプログラムであれば、連接、分岐、反復3種類の基本混蔵の組み合わせで記述することが可能である」と提唱した。
連接は順番通りに処理を実行すること。
分岐とは、条件の成立と不成立によって実行する命令群を制御するためのもの。
If...then...else命令、select文、switch文など。
構造化機能のないBASICと、構造化されたVisual Basicで記述の違いの例をあげていた。
コンピュータの最大のメリットは単純な命令を大量に実行することが得意なこと。
それぞれのコンピュータ言語には、指定された命令群を繰り返し処理するための構文が何らかの形で用意されている。
for...next、do...loopなど。
現在のコンピュータ言語に装備されている反復の命令は、ループを終了するための条件の指定方法によって、いくつかの反復制御命令が用意されている。
・カウンタを利用して、開始値から終了値まで繰り返す方法
・終了条件を満たすまで繰り返す方法で、条件判定がループの最後
・同上で、判定条件がループの先頭
4.3 オブジェクト指向
本来プログラムを作成するという行為は、実世界の対象を抽象化し、コンピュータの世界にモデリングすることを意味する。そこで、人間位取っ手自然なモデリングを可能にする、モデリングの結果をそのままプログラミングできる技術が研究された。その結果考え出されたのがモデル化する対象をオブジェクトとして定義できる「オブジェクト指向」と呼ばれる技術。
現在のコンピュータ言語には、洗練されたオブジェクト指向技術として、情報隠ぺいやモジュール化といった機能が盛り込まれている。
しかし、概念自体は古くからあり、経験豊富なプログラマなら実現していた考え方である。
オブジェクト指向という技術は、従来から提案されている数多くの開発技法をまとめあげて、プログラムの中で対象データを簡単にモデル化したり、操作することを可能にした機能。
オブジェクト化
オブジェクト指向のもっとも大事な概念は、処理対象を「オブジェクト」として捉えること。
それぞれのオブジェクトには状態を表す「属性=プロパティ」と「手続き=メソッド、メンバー関数」がある。
例では「円」というオブジェクトを定義して説明。
オブジェクトの属性を変数のように指定することができるが、実装方法としてはこれまでのコンピュータ言語で実現されていた共通変数や共通関数を応用した考え方である。
情報隠ぺい
オブジェクト化によって、整理した属性と手続きを、他のプログラムから不要な参照や変更をうけないようにするための機能。
JavaやC++、Visual Basicでは[private」で指定するとオブジェクトを外部から参照できなくなる。
プログラマが注意して、不要な参照や変更をしないように気をつけるよりも、確実にミスをなくせる。
クラスとインスタンス
同じ属性と同じ手続きを備えたオブジェクトが複数必要になるときがある。
このとき、同じ種類のオブジェクトを生成するために用意された考え方がクラスによるインスタンスの生成。
クラスはオブジェクトのひな形で、クラスから必要なオブジェクトを生成するのをインスタンス化といい、生成されたオブジェクトをインスタンスという。
継承
新しいクラスを定義するときに既存のクラスを指定して、新しいクラスが元の暮らすとまったく同じ機能を持つようにすること。
このとき既存のクラスと継承したクラスは、基底クラスー派生クラスまたは親クラスー子クラスと呼ばれる。
クラスに同じナメの手続きが定義されたときには、新しく定義された手続きが有効になる(オーバライド)
オーバライドを使うと、以前のクラスが保有していた動作を新たな動作に変更することができるようになる。
この機能がないと、元のクラスのコードをすべて複製して変更や拡張を行うことになり、個々のオブジェクトの区別がつきにくくなる可能性があるのと、元のクラスにバグがあった場合、すべてのクラスを修正する必要がでてくる。
機能の、追加、変更、拡張がやりやすくなる。
動的束縛
静的束縛・・・処理対象のオブジェクトの構造が確定している場合には、オブジェクト内の手続きの位置(関数のアドレスなど)がコンパイル時に決定される。関数呼び出しはアドレスで処理できる。
動的束縛では処理するオブジェクトがどのようなものかコンパイル時は決定していない。関数呼び出しが成功するかは、実際に関数を実行してみないとわからない。
静的束縛より速度は遅くなるが、柔軟なプログラムがかける。
例として、スタックのクラスを作成しそこにスタックの中身を横方向に出力する関数を記述。継承したクラスで出力方向が縦方向になる関数を記述。最初のスタッククラスと、後のスタッククラスをそれぞれ生成して結果を出力させるプログラムがのっていた。
4.4 イベント駆動型プログラム
1973年、ゼロックス社のパロ・アルト研究所のアラン・ケイが「Alto」を開発。
ユーザインターフェースとして、ウィンドウシステム、アイコン、ビットマップ、マウスという概念を使ったもので、今日GUIと呼ばれるもの。
GUIはユーザにはわかりやすいが、プログラム開発をするほうは面倒なもの。
どこでイベントが発生するかわからないので、すべてを記述することはできない。
GUIにおけるフォームの処理を簡単に記述できるようにするために、イベント駆動型という技術が発明された。
イベントはフォーム上のコントロールなどに対して、「選択された」「キーが押された」といった状態の変化で発生。
イベントハンドラは、そのイベントが発生したときに実行する処理を(プログラム)を関数の形で記述。イベントとイベントハンドらの対応付けはイベントループに登録する。
イベントループが発生したイベントを監視して、イベントハンドらに登録されているイベントが発生した場合にはイベントに対応づけられたプログラムを実行する。
イベントループはコンピュータ言語(開発環境)が解決してくれるので、プログラマはコントロールに対するイベントの指定のみを行うだけになる。
この仕組みでイベント数の増大によるプログラムの複雑さの増加を防ぐことができる。
コンピュータ言語がイベント駆動型プログラムに対応してGUIのイベント処理は飛躍的に簡単になった。
ただし、どの順番でイベントが発生しても適切に処理がおこるように記述する注意が必要。
4.5 実行時コード生成
インタプリタ形式で実行するプログラムに対して使用する高速化技法。
繰り返し実行する命令列がキャッシュに生成されていなければ生成するようにすること。
バイトコードを解釈して命令に該当する処理を実行するのではなく、機械語の命令を生成して機械語の命令を実行することで実現。
1970年代後半に開発されたSmalltaikに実装されている。
最近ではJavaがJITコンパイラ(Just-In-Time Compiler)という名前で同等の機能を実現している。
4.6 ガベージコレクション
プログラムが動的に確保したメモリは、プログラムが解放しなければならないが、このような処理は、使用中のメモリを誤って解放したり、解放作業を忘れるというバグの原因になりやすい。
不要になったメモリを検査し、自動的に廃棄する機能をコンピュータ言語が支援する機構が考え出された、これがガベージコレクション。
1960年に開発されたLISPにすでに実装されていた。(動的メモリで動くの必須だった)
ガベージコレクション=GCはコンピュータに負荷がかかる思い処理で、昔は数十秒システムが停止することもあった。
現在のコンピュータに採用されている主なGCの方式
・マークアンドスイープ方式
LISPで採用、セルに参照している先のポイントが格納されている。
GCはこれをたどって、参照されているセルにマークをつけていき、
次にルートから順番にマークの無いセルを回収する。
セルの大きさ一定でなくてはならず、間をつめる処理(コンパクション)をしない。
Rubyなど
・コピー方式
メモリ領域を二つにわけ、一方の領域が満杯になると
GCはルートから参照されていいるセルをたどり(循環参照は辿らない)、
必要なセルをもう一方にコピーしていく、最後までたどったら元の領域を消す。
セルの大きさは一定でなくてよい、コンパクションできるがメモリが半分しか使えない、
ゴミが多いときは高速に動作する。
・リファレンスカウント方式
セルの中にカウンタを保持し、他のセルから参照されたらカウンタを増やし、
他のセルが参照をやめたら減らす。カウントが0になると、そのセルを廃棄する。
プログラムの処理全体にGCが分散できる。不要になったセルが即座に廃棄できるメリットがある。
循環参照しているゴミが廃棄できない、リファレンス管理に手間がかかる。
Perlなど
・世代別GC・・・次の法則を利用
・新しく作られたデータはゴミになりやすい。
・ある程度生き残ったセルは、そのまま残ることが多い
・新しいセルから古いセルへの参照が多い
・寿命が短いデータほど量が多い
ある程度長く使用されているセルを特殊なセルとして特別な領域に移す。
そしてこれらの旧世代のオブジェクトが格納されているセルをGCの処理対象から除外することで、
何度も無駄な処理を実行するのを避ける。
Javaなど
いずれの方式も、使用しているメモリはルートと呼ばれる領域から辿る。つまりルートから辿ることができるセル(メモリ領域を一定の大きさに分けたもの)が使用されているかどうかをみている。
Pythonは、通常はリファレンスカウント方式、数回に1回マークアンドスイープ方式をとっている。
C言語やC++にはない。
4.7 ダイナミックリンクライブラリ
関数・・・プログラム記述する単位と定義(DDL)
ライブラリ・・・頻繁に実行する処理を関数の形であらかじめ作成し、まとめ上げたもの。
コンパイラがソースコードをつくるときに、ライブラリから必要な関数を選択して結合。(静的結合)
欠点、アプリケーションごとに結合されるので、メモリ領域が無駄になる。実行ファイル内に関数が格納されてしまうので、ライブラリ内の関数にバグがあると、すべてリンクしなおさないといけない。
ダイナミックリンクライブラリはこれらの欠点を解消するため、プログラムを実行するときにライブラリを結合する。
実行速度がおそくなるという欠点がある。
4.8 最適化技術
プログラムからオブジェクトコード(実行ファイル)を作成するとき、実行速度を向上させるために、元のプログラムと同じ処理を実現するオブジェクトコードに変換する機能。
わかりやすくするために、本来は機械語レベルの話を高級言語レベルに置き換えて説明
・技術1・・・ループの外に出す。
ループ内で変化しない部分をループの外に出してしまう。
・技術2・・・末尾再帰の最適化
階乗を求めるプログラムを例に、末尾再帰の関数が関数呼び出しをジャンプ命令に置き換えることができるのを説明。
・技術3・・定数の畳み込み
見た目をわかりやすくするための表記を最適化表記にする。
例 menseki=(jouteiLkatei)*10/2→menseki=(joutei+katei)*5
定数の畳み込みは、複数の式に定数の値を伝播させて処理を最適化する方法もある。
この場合は、最適化されて削除された変数が、後のプログラムで使われないのが条件になる。
4.9 正規表現
テキスト処理に長けたコンピュータ言語ではサポートしていることがある。
対象となる文字列を表すための表記方法のことで、検索や置換における文字列の指定に使用する。
文字列の先頭イッチヤ部分一致といった単純な文字列指定に比べて、文字列のパターンの指定により、取得した文字列をチェックするプログラムを記述しなくて細やかな文字列を指定することが可能になる。
元はUNIXやLinuxなどのOS上のgrepやegrep、sed、awkといったツールで使用されていた。
現在ではPerlやRuby、PHPといったテキスト処理を得意とするコンピュータ言語でも使用できるようになっている。JavaやC言語でもライブラリを用意すると正規表現を利用するのが可能になる。
正規表現のすべての機能を覚える必要はないが、使いこなせると便利さが増す。
サポートされている書式にはツールや言語で違いがあるので注意が必要。
・ワイルドカード指定→佐藤.*子だと、佐藤子、佐藤裕子、佐藤由香子、佐藤さんちの子などが照合
・文字クラス指定→[0-9][0-9][-/][0-9][0-9]で日付表示、10-21や10/22などの日付表示。-は範囲指定の他に文字としても指定するが、そのときは先頭に記述する必要がある。[a-zA-Z]→すべてのアルファベット。
・繰り返し→「*」で0回以上の直前の文字の繰り返し「XY*」なら、「X」「XY」「XYY」など
・選択→コーヒー豆と珈琲豆両方を表すなら、「コーヒー豆|珈琲豆」、または「(コーヒー|珈琲)豆。
・繰り返しと選択の応用→佐藤[あ-ん][あ-ん]*(子|美)→佐藤ひろ美、佐藤ゆみ子に照合
・先頭一致と行末一致・・・「^」段落の先頭、「様$」様で終わる
正規表現は便利だが、記述方法は簡単とはいえない、言語によっては簡単に記述できる独自の表現法を提供している。Perlの表記法を紹介していた。
4.10 連想配列
配列・・・同じ型の変数をメモリの連続領域に割り当てて、添え字を用いてアクセスすること。
連想配列は添え字に文字列を使用できる配列のこと。
awkで有名になり、その後PerlやRubyといったテキスト処理を得意とする多くのスプリクト言語に移植された。
商品名と販売価格の表から、商品名ごとに合計金額と販売台数を求めるプログラムを作成する例で、
通常だと、商品名を配列にわりあてて、商品名に割り当てた番号を得る処理が必要なところを、
商品名でそのまま取り出すプログラムがのっていた。
実装上非常に効率がよくないので、PerlやRubyではハッシュ関数を用いて添え字に使用する文字列を数値に変換してから格納している、それでこれらの言語では連想配列はハッシュと呼ばれている。
第5章 プログラム開発環境
5.1 一般的な開発環境
現在使用されているプログラム開発時におけるツールの一覧表
エディタ、フォームデザイナー、アセンブラ、コンパイラ、インタプリタ、リンカ、デバッガの説明
VisualBasicやDelphiはコンピュータ言語自体が開発環境に完全に埋め込まれているので切り離せない。
5.2 エディタ
テキストを記述できる機能をもつ、プログラムを作成するためのツール。
最近の補助機能、自動インデント、自動構文チェック、自動構文生成、色分け表示、命令や関数の入力補助機能
目的は、プログラムを見やすくすること、間違いのないプログラムを記述すること。
それぞれについてVisual Studio.NETを例に説明していた。
5.3 コンパイラ
記述されたソースコードを実行用のオブジェクトコードに変換するためのソフト。
コンピュータ言語の本体に相当するもの、統合開発環境を持たない言語ではコマンドから実行するのが一般的。
現在のコンパイラには、オブジェクトコードの生成以外に、構文チェック、変数の型チェック、最適化処理、デバッグ用のコード挿入などの機能がある。
5.4 リンカ
コンパイラで生成した実行用のオブジェクトコードを基にして、コンピュータで直接実行できるファイルを生成する機能。
コンパイラで生成したオブジェクトコードとライブラリを結合して、プログラムのアドレスを割り当てる。
最近はコンパイラと一体になっているものも多い。
Visual Studio.NETではビルドという名前で一体になっている。
5.5 デバッガ
プログラムに含まれるバグを発見し、取り除く作業を補助するツールの包括的呼び名。
代表的機能、ブレークポイントの設定、プログラムのステップ実行、変数のウォッチ、関数の実行履歴
それぞれについて開発環境の画面を乗せながら説明。
5.6 フォームデザイナ
RADツール(Rapid Application Development)に装備されているGUIのフォーム作成機能。
統合開発環境で新しいプログラムを作成すると、自動的に新規フォームが作成されて、フォームデザイナによる作業から開始できるようになっている。
多くの統合開発環境において、フォームデザイナで作成されたフォームはオブジェクトのプロパティをソースファイル内に保存し、テキスト情報として閲覧、編集できるようになっている。
5.7 オブジェクト指向への対応
オブジェクト指向の概念が取り入れられたコンピュータ言語では、オブジェクトのプロパティやメソッドの操作を補助するために、プロパティエディタ、オブジェクトブラウザといった機能が装備されている。
第6章 アセンブラで見るコンピュータの動作
コンピュータの動作を仕組みを考える場合は、プログラムがコンピュータにもっとも近いところでどのように動作するか知っておくことが大切。
アセンブラにおけるプログラムの動作を知ることは、高級言語が実現しているプログラムの処理に対する認識を深めることに役立つ。
6.1 アセンブラの基本的な動作
この章では現在のPentiumシリーズの元になった8086CPUのアセンブラで解説。
実際にはアセンブラはCPUによって違うので、注意すること。
6.2 8086CPUにおけるアセンブラの主な命令
どのCPUでも、データ転送、算術演算、論理演算など同種の命令が用意されている。
一つのCPUを習得すると、他のCPUでも推測がつくようになる。
3ページにわたって命令の一覧表がのっていた、上の基本命令の他に、比較、ジャンプ、ループ、コール/リターン命令、スタック操作命令、入出力、割り込み、その他の命令がのっていた。
一般的なコンピュータ言語より命令が非常に少なく、体系が異なる。変数の定義やデータ型の定義がない。
算術演算などの命令のオペランドに1バイト、2バイトの値しか指定できない。
ifのような判定用の命令はなくCMPだけ、関数はサブルーチンの呼び出しだけ。
高級言語で記述されたプログラムも、これらの組み合わせで実現されている。
6.3 2進数と16進数
コンピュータでは信号のオン・オフを利用するので2進数が便利なので使われるようになった。
コンピュータの高速化で人間の計算する処理に近い形での値の操作が可能になってきたが、創世期の名残がそこここに残っている。
2進数、8進数、16進数の説明。
6.4 四則演算
8086CPUでは、加算、減算、乗算、除算の4つの計算が行えるようになっている。
ただし引数には2バイトまでしかとれいない。
2バイトのデータおける四則演算を説明。
汎用レジスタ4種類を使い、MOVでAXレジスタに一方をいれて、それとADDするなど。
コラムでDEBUGコマンドによるアセンブルとプログラムの実行を解説。
3つの数の加算は、AXレジスタに加算を繰り返すことで行われる。アセンブラには式がない。
乗算はAL、DLレジスタを使って行われる、16ビットのときは8ビットに分解して行われる。
除算はこれに似ている。
インクリメント命令(INC)とデクリメント命令(DEC)は加算や減算よりメモリを使わないので、高速化のために用意されている。
6.5 大きな数の計算
16ビットより大きな数をプログラムで処理する方法。
キャリーフラグにより桁上げが行われたことがわかるようにしてADC命令を使って処理している。
実例が解説されていた。
6.6 負の数の計算
8ビットの場合は、最上位のビットを符号して使用する。取り扱えるのは-128~+127となる。
こういう取り扱いは-10+5などの計算で便利。
符号付加算ではキャリーフラグは無視できる。
符号付乗算と除算はIMULとIDIVという命令がある。
符号付の乗算と除算の命令をもたないCPUでは2の歩数を捕って、一度正の値に変換してから計算を行い、最後に符号だけを別によs里するような方法をとる必要がある。
6,7 小数の格納
小数はコンピュータが処理できないのでプログラムで処理している。
高級言語における小数の格納方法は「IEEE754」で規定されている。
単精度floatは4バイトでデータの格納方法は符号1ビット、指数部8ビット、仮数部23ビットとなる。指数の基数は2。10進数で1234.567だと、1.23456×10の3乗、2進数で1011.011=10進数の11.375は、1.011011×2の3乗となる。
仮数部は常に先頭桁が1なので値として格納しない。
6.8 メモリとのやりとり
本来の機械語には変数という概念はないので、アセンブラにもない。
メモリの領域に名前を付けておくことで、コード内で変数のように使用することができる。
データはあくまでバイト単位が基本。
配列という概念もなく、メモリの領域を連続的に確保しておくことで最初のメモリの場所を起点としてデータを書く方する方法で配列を取り扱う。
16ビットのアドレスでメモリの場所を指定する。命令はMOVを使う。MOV AL,12H MOV [0100H],ALこれで
12H を0100Hアドレスに格納したことになる。
BXレジスタを使う方法。
メモリにデータを格納し、それを使って演算を行う方法解説。取り扱うときはALレジスタを仲介。
メモリはCPUの外、レジスタは中、レジスタに格納するほうが高速。
配列のようにデータを格納して取り扱う例。BP=ベースポインタ、SI=ソースインデックス、DI=ディスティネーションインデックスを使う方法。実際には同じ機能をもつレジスタに割り当てるだけだが、機能がわかりやすいように、このように命名するのが一般的。
6.9 条件分岐
フラグとジャンプ命令を組み合わせて条件分岐を行う。
8086CPUに装備されているフラグ
OF(オーバーフローフラグ)符号付演算で桁あふれが発生した状態
DF(ディレクションフラグ)ストリング命令で増減の方向を指定する
など
フラグの状態はDEBUGコマンドでレジスタの内容を表示しているときに右下の欄で確認できる。
例としてZF(ゼロフラグ 演算の結果が0であることを表す)を使った分岐が解説されていた。
ジャンプ命令には無条件で指定したアドレスに移動するものもある。フラグと条件ジャンプ、無条件ジャンプの組み合わせでselect...case...end selectのような機能も実現している。
6.10 論理演算
アセンブラのプログラムではビットの処理が増える分だけ、論理演算を使用する機会が増える。高級言語のような論理値がないことも影響している。アセンブラでは値の判定処理より、ビット演算を使う方が高速で自然。
AND,OR、XOR,NOT,NEG(2の補数をとる)、TEST(AND演算を行うがフラグだけたてて値は変化させない)最後の二つは8086特有。
使い方は加算や減算と同じ。
偶数と奇数の判定ではビットの右シフトを使うのが一般的、最下位ビットのみの判定でよいので。
6.11 繰り返し処理
LOOP命令を使ってCXレジスタが0になる指定されたアドレスにジャンプするという処理で、繰り返し機能を実現している。
6.12 サブルーチンの呼び出し
サブルーチンの呼び出しにCALL、元のアドレスに戻るRETが用意されているのみ。
引数も戻り値もない。
アセンブラではすべのメモリ領域がプログラム内で共有されている。
そのため、プログラムが大規模になるとわかりにくくミスの元になる。
第7章 さまざまなコンピュータ言語と開発環境
7.1 原始的なコンピュータ言語
機械語
機械語はCPUが直接実行できる唯一のコンピュータ言語。
2進数で格納され、通常は16進数で表記されるデータの塊。プログラムとデータが格納されている。
人間がプログラムを作成するときには、機械語と1対1のニーモニックという記述を使用する。
CPUの種類ごとに機械語は異なる。高級言語と違って命令の種類は少ない。
計算ではレジスタを使用し、8086CPUの場合汎用レジスタは4種類。通常アキュムレータと呼ばれるレジスタが中心的に使われる。
レジスタとメモリには整数値しか格納できないので、小数などを使用するときはプログラマが自分有に値の構造を定義して使う。
高速で、ハードウェアのスペックをもっともひきだせる。
プログラム例としてコラッツ予想がのっていた。
コラッツ予想・・・ある自然数nに対して、それが奇数なら3倍して1を加え、偶数なら2で割る、これを繰り返すと、どのよう自然数からはじめても最後は1→4→2→1の繰り返しになる。とういもの、まだ証明はされていない。
アセンブラ
ニーモニックより人間に近い言語表現で、プログラミングを補助する機能として、メモリ領域に名前をつけることができる、定数を定義できる、ラベルをつけられる、文字列を記述できることなどが追加された。
データ型を指定した宣言はできない。
コンピュータに接続されているデバイスドライバなどはアセンブラを使っているものも多い。
コラッツ予想のプログラム例を紹介。機械語と共通。
クロスアセンブラ・・・最終的にプログラムを実行するハードウェアと異なるハード魚エアで機械語のプログラムを開発するためのもの。
逆アセンブル・・アセンブラを機械語に戻すこと。
MASM・・・・マクロアセンブラ、WindowsDDK(ドライバ開発キット))に含まれている。
7.2 初期のコンピュータ言語
FORTRAN
1954年IBMのジョン・バッカスが数式で記述されたプログラムを解釈して機械語にコンパイルできるコンピュータ言語を考案した。これがFORTRAN。
世界で初めての高級言語。高級言語の研究開発のはじめとなった。
他の処理系の機能をとりいれて、本の自転でFORTRAN90が最新で、自由カラム、ポインタ、モジュールなどが組み込まれた。
スーパーコンピュータなどで使われている。数多くの数値計算用ライブラリが充実しており、言語仕様が数値演算処理に最適化した構造であること、さまざまなメーカーが処理系に対して積極的に最適化技術をとりいれていることから、現在でも科学技術計算に使用されている。
FORTRAN77は特に多くのプログラマに利用された。パンチカードを使っていたころの名残が固定カラム方式にあらわれている。
条件分岐と繰り返し(単純なもののみ)が装備されており、入れ子にできる。行ラベルはループの飛びさきなどに使用される。比較演算子が一般的な言語と大きく違うサブルーチンも使用できるが引数は参照渡しに限られる。
FORTRAN90での追加機能
・多重分岐SELECT CASEの追加
・条件によって繰り返しを行うDO WHILEの追加
・繰り返しを制御する命令としてCYCLE文(Continue)、ECXIT文(break)が追加
・構造体が使用できる
・型の定義と変数をまとめるモジュール機能が追加
・配列操作に関するライブラリの強化
・再帰呼び出しが可能に
・ポインタを使用して動的配列の割り当てができるようになった。
1-10までの数値を加算して、その経過を出力する例
COBOL
1959年米国国防省が事務処理用にメーカーとともに開発。
通貨の最小単位を正確に計算できるようなデータ型を用意。
ファイルを扱うことが常に意識されていて、ファイル内のデータ構造の形式を指定する書式がある。表形式のデータ処理に特化した言語。
1行に1命令、固定形式だと1-6カラム→一連番号領域、7カラム→標識領域(前の行からの継続やコメントを表す)、8カラム以降→プログラムと決められている。
見出し部、環境部、データ部、手続き部にわけてプログラムを記述。
言語仕様も構造化されているので、仕様変更に強く、保守性にすぐれている。
データに対して演算処理を行う場合はCOMPUTE命令を使用する。COMPUTE データ項目=演算式
条件分岐はIF命令とEVALUAR命令、反復はPERFORM で成立条件を指定する方法、繰り返し回数を指定する方法、カウンタ変数を使用する方法がある。
例として九九の表を出力するプログラムがのっていた。
配列は表と呼ばれる、表はOCCURS句で指定してデータ名(添え字)で使用する。
「報告書機能」は指定された報告書の形式でデータ出力する命令。
簡単な英単語はすでに予約語として登録されていることが多い。
例として入力ファイルを1件ずつ読み込んで、商品ごとに数量を集計して合計金額を計算し、出力ファイルにだすプログラムがのっていた。
ALGOL
1950年代後半に、アルゴリズムをできる限りスムーズに記述するために開発された言語。
エドガー・ダイクストラが提唱した構造化の機能をとりいれた初めてのコンピュータ言語。
構造化と再帰呼び出しの機能がついていた。
FORTORANでは言語の構文に関する規則にあいまいなところがあったので、厳密な言語仕様を策定して解決した。
ALGOL68では使用が複雑でコンパイラをつくるのが困難になり、あまり使われなくなったが、仕様はC言語やPascalに影響を与えている。
変数はあらかじめ宣言しておかなければならい(入力ミスが減り、コンパイル時にエラーが見つけやすい)
ブロック構造(複数の分をBEGIN ENDでまとめる、プログラム全体もそう)とローカル変数の導入。
プログラム例はユークリッドの互除法で最大公約数を求めるもの。
PL/I(ピー・エル・ワン)
1960年代後半、コンピュータの利用範囲が広がり、科学技術計算と事務処理に分類しておくのが困難になった。汎用的言語が求められた。
ALGOLを基にして、FORTRANとCOBOLのよいところを併せ持つ言語として開発。
構造体、エラー処理、マルチタスク機能、ビット処理などが盛り込まれた。
1964年Multics(マルチックス)というOSの記述に採用された。これはUNIXの先祖みたいなOS。
大規模な言語仕様をもつのでコンパイラの開発が困難で多くのライブラリを必要とするため実行ファイルが大きくなる欠点があった。このためIBMの大型汎用機でりようされることがほとんどだった。
2カラム目から72カラム目の間にプログラムを記述できる。
データ型は、整数、実数、複素数、倍精度(処理系により精度は異なる)が用意された。
文字演算が可能で、文字列を扱う関数も多く用意されている。
サブルーチンでは値を返すことができる。RETURN 値
再帰呼び出しもできる。
条件分岐はIF...THEN...ELSE構文。DO...ENDでブロック化してTHEN節やELSE節に複数の文を記述可能。
反復のDO分には、変数の初期値、終了値、増減値を指定する、反復条件を指定、反復に使用する値を列挙の記述法がある。
プログラム例では1-10までの数値を加算して、その経過を出力するがのっていた。
Simula(シュミラ、シミューラ)
1962-67にノルウェー計算センターのクリステン・ニガードとオルヨハン・ダールが開発。
さまざまな事象をシュミレーションするために開発された。
オブジェクトという概念を導入した初めてのコンピュータ言語。
クラス、継承、銅的束縛の機能をそなえている、はじめてのオブジェクト指向言語と呼ばれている。
7.3 C言語系
B言語
BCPLという言語の縮小版として1970年DEC社のPDP-7で開発された。
コンパイラによって中間言語を生成し、それをインタプリタ上で動作させるタイプのコンピュータ言語。
データ型はもたない。
誕生までの流れ
ALGOL60→CPL→BCPL→B言語→C言語
C言語
ベル研のデニス・リッチーとブライアン・カーニハンが1973年にB言語を改良して開発。
コンピュータ上でそのまま事項可能な機械語プログラムを出力するコンパイラにした。
豊富なデータ型。
C言語でUNIXが書きなおされた。UNIXは大学に無償で配布されて拡大した。OSのソースも公開されていた。
機種に依存する部分はコンパイラの機能に含まれないで、ライブラリとして組み込まれる。機種依存が低くなり、さまざまなハードウエアに展開した。
コンパイラは小さく、移植も容易、パソコンでも使用された。世界中で幅広く使われるようになった。
簡潔にプログラムを記述できよるように工夫されている。Pascalの表記と比較していた。
代入文自体が値を持てるので、そのまま条件判定ができる。(習得のハードルともなっている)
while((c=fgetc(fp)) != EOF ){...では、c=fgetc(fp)) が値を持つ。
真偽を表す型がなく、整数を代わりに使用する。
1を加える処理、指定した値を加算する処理はアセンブラと類似の書式があり、高速化に寄与している。
処理の流れをこわすことが多いgoto文ではあるが、ループの中断や再実行ではないとわかりずらいこともある。
break、continueの導入。
変数のアドレスを記憶する特殊な変数ポインタ。これによりメモリを直接操作できる。
プログラミングの幅はひろがるが、馬具の原因にもなる。
サンプル、ファイルの内容を画面に出力する関数、文字列をコピーする関数(代入文が値をとる例でもある)、文字列を比較する関数(ポインタで配列を処理する例でもある)
インラインアセンブラという機能が搭載されている処理系もある。使用すると互換性は失われる。
C++(シー・プラス・プラス、シー・プラ・プラ)
C言語の機能を提供しつつ、オブジェクト指向のプログラミングを支援する目的でベル研のビアルネ・ストラウストラップによって1979年から開発。
Sumilaからクラスの概念を導入。
1983年に課そう関数や演算子の多重定義が追加されて頒布が開始された。
C言語の上位互換なのでC言語のプログラムがそのまま使える。
最初UNIXで動作するものだったが、マイクロソフト社のVisual C++ ボーランド社のBorlandC++が発売され、Windows用のアプリケーション開発の標準言語としても利用されるようになった。
追加された機能の中でも代表的なものを紹介
コンストラクタ・デストラクタ、静的束縛と銅的束縛、多重継承、関数の多重定義(オーバーロード)、演算子の多重定義(オーバーロード)、テンプレート(型をパラメータとして渡し、手順のみを記述できる機能、他の言語でジェネリックや総称とよばれる)
プログラム例では複素数の演算をおこなっている。
C#(シー・シャープ)
2002年にマイクロソフト社が .NET Framwork用の開発言語として開発。
C++を拡張。JavaやVisualJ++に近い文法。
C#は .NET Framwork用なので実行ファイルでなくCLR(Comon Language Runtime 共通言語ランライム)用の中間コードを生成する。
当初マイクロソフト社のVisualC#.NETでのみ利用できたが、ボーランド社のDelphi2005に搭載された。
C++やJava、Visual Basicとの相違点を中心に特徴を説明。
クラスをまとめるのにJavaはパッケージ、C#では名前空間(Namespace)という概念を使う。
Javaではimport C#ではusing
GUIを構成する部品の属性の値を取得変更する方法はVisual Basicと同じ。
デリゲートが追加されている。デリゲートは関数ポインタに似た機能。変数宣言とその変数へ代入できる関数の型を定義する機能、関数の引数として使用することで、関数の引数に関数を渡すことが可能になる。
デリゲートがない処理系では関数の引数としてオブジェクトしか渡せないので、イベントハンドラを登録するにはクラスで包んで関数に渡す必要があった。
反復を抽象化した「イテレータ(反復子)」を使って繰り返しを定義するためのforeach分が用意されている。
イテレータはCKKではSTL(スタンダード・テンプレート・ライブラリ)として提供されていた。
ガベージコレクションがサポートされている。
演算子のオーバーロードが定義できる。
配列の配列と2次元配列が定義できる。
C++に似た構造体を記述するためにstruct宣言が用意されている。クラスはヒープ領域、structはスタック領域に確保される。構造体はObjectクラスを暗黙的に継承している。
不適切な多重定義によるバグをなくすために、多重定義を有効にするためにはvirtualとoverrideを記述する必要がある。
サンプルはユークリッドの互除法で最大公約数を求めるプログラム。
比較のため同じ動作をするプログラムがVisual J++、 Visual J#、 Visual Basic.NETでかかれている。
Objective-C(オブジェクティブ・シー)
C言語にオブジェクト指向の機能を導入したコンピュータ言語。
1983年にスtップスートン者の創設者ブラッド・コックスが開発。
1985年NeXTコンピュータ(スティーブ・ジョブズがつくった)のOSであるNeXTSTEPの開発言語になった。
このコンピュータは黒いキューブ型の特徴的携帯で画面表示にDisplay PostScriptをとりいれていた。
その後ハードから撤退しNextソフトウェアとなり、NeXTSTEPの技術はOPEN STEPとして公開された。
1997年アップルにNeXTソフトウェアが買収され、OPENSTEPは改良されてMac OS Xとなった。
よってObjective-CはMac OS Xの標準的なアプリケーション開発言語である。
Smalltalkで採用されたメッセージ送信によってオブジェクト指向を実現。
そのためC++とは見た目からかなり違う。
変数の代入 Objective-Cはオブジェクトへのポインタ、C++ではオブジェクトまたはオブジェクトへのポインタ
関数(メソッド)呼び出し、Objective-Cは動的束縛のみ、C++は静的束縛と銅的束縛
継承 Objective-Cは単一継承のみ許可、C++は多重継承が許可
演算子のオーバーロード、Objective-Cは不可能、C++は可能
7.4 Pascal系
Pascal
1968年スイス連邦工科大学のにクラウス・ヴィルトがコンピュータ言語の適切な教育を目的として開発。
構造化に必要な構文をそなえており、プログラムをすっきり記述できるという特徴があった。
そのため、同じアルゴリズムなら、だれが書いても同じようなプログラムになるという性質がある。
ユーザがデータ型を定義できる。
言語仕様がコンパイラの開発に適していたので、多くのコンピュータ上で動作するようになった。
1978年カリフォルニア大学サンディエゴ校のケネス・ボウルズが開発したUCSD PascalはP-Codeという中間コードをP-Machineとよぼれるインタプリタの仮想環境上で動作させるJavaのようなものだった。
1983年に発売されたボーランド社のTurbo Pascalは驚異的コンパイル速度と、使いやすい統合開発環境で世界的ヒットになった。
ALGOL60がベースなのでスタイルが似ている。
順接、分岐(if文、case文)、反復(for文、whie文、repeat...unitil文)が用意されているので構造化されたプログラムが記述しやすい。
構造化プログラミング→段階的に詳細化してプログラムを作成する→入れ子構造。Pascalで実現しやすい。
言語の厳密性のため、使う目に変数や関数は必ず宣言。
変数は通常の型の他に、列挙型、部分範囲型、集合型、レコード型、ポインタ型が用意されている。
記述形式は自由形式。複数行のコメントもOK。可読性の向上。
現在では一般的なものが多い。つまりPascalが与えた影響は大きい。
プログラム例は階乗を計算するもの。
Object Pascal(Delphi言語)
Pascalにクラスや継承などのオブジェクト指向機能を拡張したもの。
1995年にボーランド社が開発した統合開発環境Delphiに搭載。
Delphiはフォームデザイナを持つグラフィカルな統合開発環境。
豊富な機能とコンパイルや実行が早いのが支持の理由になった。
データベースを簡単に操作するクラスを装備。
ボーランドが開発したLinux上の統合開発環境Kylixにも採用されている。
Delphi7からはObject PascalからDelphi言語に名称が変更されている。
継承、多重定義、オーバーライド機能がある。
クラスの宣言はtype...endで定義、クラス型には、メンバ変数、メンバ手続き、メンバ関数を定義できる。
多くのクラスをまとめるUnitという単位が用意されている。
例外処理機能を装備
単一継承機能あり、静的束縛と動的束縛両方を備えている。
プログラム例はクラスの継承と多重定義、オーバーライドを使用した円と色つきの円をかくプログラム。
Ada
1970年代米国国防総省が制御ソフトを統一しようと開発。
1983年にANSI標準規格、1986年にISO規格として制定されている。
世界初のプログラマと呼ばれるエイダ伯爵夫人からとった名前。
厳密な言語仕様をもつ、多機能なコンピュータ言語。
コンパイラを使用するのにミニコンピュータやワークステーションを必要とするのでパソコン向けに普及しなかった。
1990年代にはオブジェクト指向の導入。1995年にISO標準としてオブジェクト指向言語として初めて承認。
この時点では2005年の規格が最新。
コンパイラに対して厳密な互換性を保証させるためAdaコンパイラであると認定する試験がある。
記述の効率より読みやすさ優先。保守の必要性から。
特徴は、厳密な型付け(動的結合は許さない)、パッケージの導入(外部へ公開するものを宣言)、並列処理(タスク)、例外処理、汎用体(C++ のテンプレートと多重定義を組み合わせた機能に似たもの、型や大きさを変えたスタックのプログラムを簡単に用意できる)
サンプルはコラッツ予想プログラムをWindows200ProfessionalのObjectiveAda for Windows Special Edition 7.2.2で作成したもの。
7.5 Java系
Java
サン・マイクロシステムズ社のジャームズ・ゴスリンがデジタル家電向けに開発したOakという言語を、インターネット向けに改良したもの。1995年に発表。
Javaと同時にJavaで開発されたHotJavaというWebブラウザも発表。音声や動画を直接再生できた。
インターネットでアプリケーションを配信できるアプレット技術と、その開発言語Javaが話題に。
1999年にJavaを大幅に機能拡張したJava2(JDK1.2)が発表。
バイトコードという中間コードをJava仮想マシン(JVM)で実行する仕様。
速度が遅いという欠点はハードの進化がおぎなった。
Java仮想マシンが動作する環境ならどんなコンピュータ上でも動作するようになった。
研究言語でなく、実用として開発された。既存のよいところをとりいれて、不要なものは削除した仕様。
バランスがよい、インターネットとともに普及した。
C++に似た構文を採用したオブジェクト指向言語。
クラスの定義と継承・・・インナークラス(クラスの中にクラスを定義する)や名前を指定せずにクラスを定義できる匿名クラスがある。継承は単一継承
マルチスレッド・・・言語の使用として組み込まれている
実行時コード生成・・・JITコンパイラで実行時コードを生成。インタプリタは遅いので。
ガーベージコレクション
シリアライズ・・・現在のオブジェクト群の状態をファイルに保存できる。そして保存したオブジェクトをメモリにロードして実行を再開できる。
アプレットとiアプリ、EZアプリ、Vアプリ・・・静的なWebページをつくるアプレット、他は携帯電話のなかで動作する単独のアプリケーション。携帯会社によって名称が異なる。
セキュリティ対応・・・インターネット前提なので、バイトコードの正当性チェック、コードの署名、メモリ領域チェック機能がついている。
安全性が携帯電話に採用された理由の一つである。
プログラム例はアプレットでマウスで句陸した場所に5つの円を描画するプログラム。
Visual J++
マイクロソフト社が開発したJava系の言語。
Visual J++1.1はJDK1.2準拠、その後Visual Studio6.0でVisual J++6.0となった。
Visual J++6.0はJDK1.1に準拠しているが、Windowsアプリケーションの開発を補助するために大幅に機能が拡張されている。
WFCの使用(マイクロソフトの開発したライブラリなので、Windows上でしか動作しなくなる)、
ActiveXコントロールの利用(Windows上でしか動作しなくなる)、ADO(ActiveX技術でデータベースと連携するライブラリ、Windows上でしか動作しなくなる)サポート、 RADツール(フォームデザイナ)として利用。
プログラム例はユークリッドの互除法。
Visual J#
Visual J++の後継言語で、マイクロソフト社が開発したJava系のコンピュータ言語。
Visual J++を .NET Framwork仮想環境に対応させたもの。
つまり.NET Framwork環境で動くjavaアプリケーションが開発できる。
ADO.NETが利用できる。
IISで動的なWebページの生成に使用するASP(Active Sever Pages)でも利用できる。
JDKと同等の機能をもつクラスライブラリを使用できるが、Javaのバイトコードは生成できない、アプレットも作成できない。
.NET FramwrokのCLRがガーベージコレクションを実行してくれる
サンプルはユークリッドの互除法。
7.6 BASIC系
BASIC
1964年、入門者のためのコンピュータ言語として、ダートマス大学でジョン・ケメニーとトーマス・カーツが開発。
対話型の環境で初心者でも気軽にプログラム作りを始められる。
1980年代のパソコンの登場とともに広まり、研究者や専門プログラマから一般大衆まで広まった。
パソコンに標準OSが搭載されていない時代で、電源をいれるとBASICが起動した。
BASICはOSの代わりとしてROMに搭載されていた。
ケメニーとカーツがBASICをパブリックドメインとして配付したことも広がる要因になった。
言語仕様でさえ変更を禁止しなかったので、異なる仕様のBASICがたくさんうまれた。
このため同じメーカーのBASICでさえ、以前のプログラムが動かないような事態も生まれた。
対話型で画面に命令を入力すると即座に結果がでる仕組みになっている。
インタプリタ型の代表言語で、対話形式であることとあわせて、非常に処理内容がわかりやすい。
いつでもプログラムを停止して、変数値を確認したり、変更したりできた。
プログラムに行番号が必要であったが、デメリットの方が大きかった。
構造化された美しいプログラムを書きにくいので、広がりはあったものの、教育現場ではPascalが使われるなどの状態が生まれた。
例として1から10まで加算するプログラムで仕様があいまいなため、処理系で結果が異なる例をあげていた。
プレグラム例は「リバースゲーム」
ビル・ゲイツとポール・アレンは1975年にインテル8080CPUで動作するBASICを開発した。これがマイクロソフト社のはじまり。その後IBMにOSとBASICを提供したのが発展のきっかけとなった。
QuickBASIC
プログラムの規模が大きくなるにつれ、BASICの生産性の低さが目立つようになった。
MS-DOSが隆盛を極めるようになると、Turbo Pascal、Turbo Cなどがシェアを奪うようになってきた。
これに対抗するためマイクロソフト社が構造化の概念を取り入れたQuickBASICを開発した。
内容はBASICの命令語を採用しただけのまったく新しい言語だった。
統合開発環境もつけられ、CUIの時代ではあったが、エディタ、イミディエイトウィンドウというデバッグに使える一時実行領域がついていた。ブレークポイントも設定できるし、ヘルプもついているので、いちいちマニュアルをさがさなくてよくなった。EXEファイルが生成できるようになった。
例としてBASICとQuickBASICのコラッツ予想プログラムがのっていた。
Visual Basic
QuickBASICの後継言語としてマイクロソフト社が開発した統合開発環境。
1991年に最初のバージョンが発売され(日本は未発売)それだけはMS-DOS版もある、
ウィンドウ環境に対応したアプリケーションを迅速に開発するためのフォームデザイナがついた。
このためユーザインターフェース部分はQuickBASICの資産は使えなかった。
使いやすい統合開発環境とWindowsとの相性の良さで、それほど速度を要求されない業務システム構築の標準言語として広く使用された。
簡単にフォームのレイアウトが変更できるので、プロトタイプをつくりながら開発するスタイルがとれるようになった。
フォームの制御のためにオブジェクト指向がとりいれられ、言語に大きな拡張性をもたせることになった。
データベースの操作に長けており、OLE準拠の追加のコントロールを購入して、画面に配置するだけで、データベース操作機能が使えるようになった。他にDAO、ADOを使うほうほうもあり、OracleやDB2にも接続できる。
中間コードを利用するため、アプリケーションとは別にランライム自体のインストールが必要なため、インターネットの大量配布にはむかない。
プログラム例は、QuickBASICのコラッツ予想をアレンジしたもの。
Visual Basic.NET
Visual Basicの後継言語。.NET Framworkとう共通プラットフォーム上で動作するアプリケーションを開発するための統合開発環境。
2002年に発売されたVisual Basic.NET2002が最初で、これはVisual Studio.NETにも含まれている。
表面的な命令文などはVBと似ているが、.NET Framwork対応のため内部はかなり変わっている。
統合開発環境はVisual C#.NETなどと共通で利用する。
Webフォームに対応している。マイクロソフト社のWebシステム開発環境Visual InerDevが統合したもの。
IISで使用することでWebブラウザで表示できるビジュアルなフォームを作成する機能。
VBであったVariant型は廃止された、Dim a,b as Integerの解釈は、a,bともにIntegerとなった。VBはaはVariantと解釈。
GOSUBステートメント、Typeステートメントの廃止。Visual C++.NETなどと融合しやすくするため。
組み込み関数がCLRのクラスやVisual Basicランタイムライブラリのメンバとして置き換えられた。
そのため命令が長くなった例をあげていた。
文字列の左から5文字をaにコピーする場合、VBなら a=LEFT(txtInput,5) だが、.NETだと a = Strings.Left(txtInput.Text,5)などとなる。 オブジェクト指向の厳密性が取り入れられた影響。
引数の指定が省略されるとVBは参照渡し、.NETでは値渡しになる。
VB6.0とは上位互換なし。
手軽なプログラミング環境でなくなったが、これまでのVBの大規模開発の欠点を取り除いた言語ともいえる。
サンプルはユークリッドの互除法。
VIsual Basic for Application
マイクロソフト社が開発したアプリケーション埋め込みようのVisual Basic。
Visual Basicの言語エンジンをもとに開発、個々のアプリケーションで利用するオブジェクトにアクセスできるコンピュータ言語。
1994年のExcel5.0に初めて搭載。現在はWord,PowrPint、Access、Outlook、FrontPageなどに搭載。
各アプリケーションから実行できるマクロ機能として導入されている。
ExcelやWordでは、ユーザの操作を補助するマクロ記録機能が装備されている。
記録されたマクロはVBAのプログラムとして生成されるのでユーザが修正できる。エディタもある。
プロパティの修正やフォームの作成、デバッグ機能も装備している。
ブックやワークシートをオブジェクトとして操作。参照設定画面で別のアプリケーション用のライブラリを追加すると、他のアプリケーションのオブジェクトを操作することも可能。
サンプルはコラッツ予想プログラム
7.7 スクリプト系
Perl
UNIXコマンド,rn、pachなどの作者ラリー・ウォールが開発したスクリプト。
1987年、ネットワークのログを分析して報告書を自動生成するプログラムをawkで記述しようとしてうまくいかず、自分で作ったもの。
ログの分析を分析、整形するという目的から、tr、grep、sed、awk、shとC言語のよいところの組み合わせで作ったという。
同じしょりでも全く別のコードで記述できるほど構文が用意されている。
構文に関する知識が多いほど、完結にプログラムが記述できるが、読みにくくもなるので注意が必要。
最大の特徴はパターンマッチングなど、テキスト処理に優れていること。
HTMLを出力するためのCGIでも広く使用されている。
強力な拡張機能でシステムコールを利用できる。
インタプリタ型の弱点である速度が遅い点以外は、どのような目的にでも対応できる汎用言語になった。
1994年リリースのPerl5ではオブジェクト指向の概念がとりいれられた。
連想配列機能=ハッシュがある。
演算機能の特徴として「コンテキスト」という概念があり、演算結果として何を返すべきか自動で決定する機能。
制御構文は、条件判定のif文、条件判定を逆にしたunless文、else説に記述する条件分岐elseifがある。これらのブロックはかならず{}で囲む。
反復は、条件による繰り返しwhile文、初期化と更新を同時に記述できるfor文、while文の条件判定を逆さにしたuntil文、リストを順番に処理するのに適したforeach分が装備されている。繰り返し制御として、繰り返しの最後に処理を移動するnext文、ループを脱出するlast文、条件式を再評価せずに繰り返しの先頭に処理を移動するredo文がある。
正規表現を用いた文字列の検索および置換が可能。
正規表現を使いやすくするための、文字表現の略記法、繰り返しを細かく指定する記法が追加されている。
Perl5ではリファレンス(変数のデータの登録箇所を取得できるポインタ)、パッケージ(大義した変数が見える範囲をパッケージとしてプログラマが指定できる)、モジュール(パッケージ名と同じ名前のファイル名で拡張子をPMとしたファイルに保存したもので、ある一連の処理をする関数や変数をまとめたもの)が追加。
パッケージとリファレンス、bless関数を使用するとオブジェクト指向のプログラムを記述できる。
bless関数は第一引数で指定されたリファレンスが、第2引数に指定されたパッケージに属するように設定する。
Perlにおけるクラス定義はパッケージを作成することになる。
サンプルは正規表現を使って、英数字と「_」で構成される単語の数をカウントして結果を出すプログラム。
ハッシュによる文字列出現回数のカウント
foreachによる配列要素の繰り返し。
$_には直前の処理値が格納される。
初めてのPerl 第6版
Python(パイソン)
グイド・ヴァン・ロッサムが教育用プログラミング言語ABCとModula-3の概念を組み合わせて、設計した言語。
Modula-3はPascalをつくったニコラウス・ヴィルトがPascalにモジュール機能を搭載して機能を強化したコンピュータ言語。
習得のしやすさを目標にしているので、表面上の高度な機能からは考えられないほど、シンプルでわかりやすい言語仕様になっている。
最初はMacintoshで動作するものだったが、Windows、Linux系OS、UNIX系OS、PalmOSなどに移植された。
Tk、gtk+、Qt、MFCなどによるGUIサポートがある。
標準モジュール以外でもインターネットで様々なモジュールを手に入れることができる。
代表的利用例
Red Hat系LinuxディストリビューションにおけるGUIを使用したインストーラおよび環境設定ツール
MailMan(Web上で設定や管理が可能なメーリングリストマネージャ)
ZopeとうWebアプリケーションサーバー
インタプリタ型の簡易言語だが、Javaのようにバイトコードにおける異機種間での互換性あり。
C言語のプログラムに埋め込んだ形での利用も可能。
対話モードでの利用ができる。
保存済みのソースファイルをパラメータとして利用可能なので、コマンドラインからプログラムを実行できる。
多重継承できる。
コードがシンプルだといわれるC言語やC++よりシンプルなコードがかける。
その理由は
インデントによるブロックの記述によってプログラムを簡潔にしている。
辞書型やリスト型といった多機能なデータ型で複雑な処理を簡単な命令で実現できる。
変数や引数における型宣言が必要ない。
複数の変数に同時に値を代入できる。
特徴として
豊富なデータ型と正規表現
インデントによるブロックの記述
反復処理
複数の変数への値の代入
ガーベージコレクション
プログラム例は配列の値を探索して検査値がみつかる場合、見つからなかった場合。
初めてのPython 第3版
Ruby(ルビー)
1995年「まつもとゆきひろ」氏が開発。
PerlやPythonであきたらず、理想とするオブジェクト指向スクリプト言語を開発した。
対話的に利用できるrib、PHPのようにHTMLファイルに埋め込んで利用できるeRubyなど多彩な利用方法が用意されている。
インタプリタ形式で実行するオブジェクト指向のスクリプト言語。
クラス定義可能、単一継承のみがサポート。
多重継承の代わりにMixinというあらかじめ定義されたモジュールを取り込む機能。
モジュールからメソッドを探索する方法は明確な規則が定められているため、メソッドが衝突した場合でも、問題なく動作するようになっている。
ハッシュや正規表現など、すべてがオブジェクト。
ハッシュは連想配列の拡張、添え字に文字列だけでなくオブジェクトを指定できる。
特徴として
変数の型宣言がなく、スコープの種類が命名方法できまっている。
制御構造、ifやunlessが命令だけでなく修飾子としても用意されているので、文の後ろにつけると、条件が成立したとき前の文を実行する。
反復ではfor...in文でオブジェクトの各要素を順番に取り出して処理を繰り返せる。
timesメソッドを使用すると繰り返し回数を簡単に指定できる。
メソッドにブロックを渡せるので、反復を抽象化したイテレータを実現している。最近はブロック付きメソッドと呼ばれている。
マルチスレッド、マシンレベルのスレッドは使わないので、マルチスレッド機能の無いOSでも利用できる。
ガーベージコレクションや例外機能もある。
プログラム例は単語の数を数えて出現頻度の少ない順に表示するプログラム、単語は英数字、「_」「-」で構成される文字列。
プログラミング言語 Ruby
PHP(ピー・エッチ・ピー)
デンマークのラスマス・らーどふがホームページのアクセス分析のためにPerlを使用したCGIプログラムを記述したのが始まり、その後同僚などに使用された。
CGIはシステムに負荷がかかるのでC言語で作り直した、それにHTMLのフォームを動的に作成する機能をもつFormInterpreter(FI)を組み込んだのが1995年にオープンソースとして公開されたのが「PHP/FI」
Webシステム開発で使われるようになり、プロジェクトグループが開発を行うようになった。
イスラエルのゼーブ・スラスキーとアンディ・ガトマンズが作り直したPHP3。
PHP3は拡張性を備えた使いやすい言語だったが、記述されるスクリプトが大きくなると処理速度が遅くなるので、書きなおされたのがPHP4。
2004年にリリースされたPHP5でオブジェクト指向などの機能が強化された。
PHPをインストールしたWebサーバは、スクリプトを含んだWebページのリクエストを受けると、PHPのスクリプトを処理し、実行結果としてHTMLファイルを生成してクライアントに送信。WebサーバのApacheではPHPをモジュールとして組み込むことで、1回のアクセスで1つのプロセスを生成するCGIよりも高速にプログラムを実行できる。
特徴として
HTMLファイルに埋め込むことで動的なWebページを簡単に作成することがdきるインタプリタ型の言語。
プログラムの記述と実行を繰り返し行うスタイルの開発作業が簡単で、動的なWebページを容易に開発できる。
変数を宣言せず、先頭に$をつけて使用する。連想配列をサポート。
制御構文は多くがC言語に似ている。
文字列処理が非常に得意で正規表現可能。
デバッグが簡単でエラー情報が行蛮行とともにHTML状に出力されるようになっている。
データベースとの連例が非常に用意。
プログラム例は九九の表をPHPで計算してHTMLで出力。
Programming PHP
JavaScript
Webブラウザ上でアニメーションや簡単なプログラムを実行できるようにするため、ネットスケープコミュニケーションが開発したスクリプト言語。
Javaの言語エンジンとは関係ない。
1996年にネットスケープコミュニケーションズ社のNetscape Navigator2.0に導入、その後マイクロソフト社のInternet Explorer3.0でもサポートされて、クライアントサイドスクリプトの標準となった。
HTMLファイル内の
第1章コンピュータ言語の歴史と概要
2001年をすぎてもHAL9000のような知能をもったコンピュータは夢物語。
コンピュータはプログラムという手順書に記述された内容の通りに動作することしかできない単純な機械のまま。
しかし、人間とコンピュータとの隔たりをなくすために、コンピュータ言語が開発され研究されてきている。
コンピュータ言語は人間がコンピュータに指示をあたえるためのもの。
あいまいさは一切ない。
コンピュータが理解できるのは機械語(マシン語)だけなので、
それ以外ならコンピュータ内の翻訳機を使う。
多彩なアプリがでてくるとコンピュータを操作するのはプログラミング言語だけではなくなってくる。
代表的なものは、Officeアプリケーションで使うマクロ言語、リレーショナルDBで使うSQLなど。
「完璧なコンピュータ言語」は存在していない。
現在のコンピュータ言語には万能なものがなく、用途に応じてつかうようにしている。
ハードやソフトの進化、社会情勢にあわせて言語が設計されてきた。
これまでの研究目的や課題
・もっとプログラミングが楽にならないか
・複雑な科学技術計算を数式で記述できないか
・後から見てもわかりやすいプログラムにできないか
・もっと高速に動作するプログラムにならないか
・論理記述をわかりやすく記述できる方法はないか
・他のコンピュータへ簡単に移植できないか
・初心者でも理解できるようなコンピュータ言語は作れないか
・プログラミングの教育用として適した言語はないか
・複数のプログラマにおけるチーム開発で、もっと開発効率を向上できないか
・GUIの画面設計をビジュアルにできないか
・データを簡単かつ確実に扱う構造を用意できないか
最初のコンピュータは一般的にはペンシルバニア大学「ENIAC」といわれている。
真空管とリレー、定航コンデンサ、スイッチ、ネオン管などでつくられた2.5×0.9×24の大きさ。
昔はその用途が弾道計算や暗号解読だったので、存在自体があまりあきらかにされなかった。
実際には「ENIAC」よりアイオワ州立大学の「ABC」がはやかったといわれている。
真空管をつかっており、メモリとしてコンデンサを設置したドラムをモーターで回転させていた。大きさは机程度。
「ENIAC」は敗戦でプログラミングしていた。
ノイマンが提唱するメモリにプログラムを内蔵するノイマン型コンピュータが開発され主流になっていく。
これがハードウェアからソフトウェアが分離するきっかけになった。
「EDVAC]はプログラムをメモリに搭載するようになったが、
後継の「EDSAC」が世界初のノイマン型コンピュータといわれている。
ノイマンは現在コンピュータの父といわれている。
コラムにパスカルの歯車式計算機が紹介されていた。
アラン・M・チューリングが開発して、暗号解読に活躍した「Colossus」は
プログラムが本体にくみこまれており、一部がプラグの差し替えで変更できるようになっていた。
「Baby」は、マンチェスター大学で開発され、Colossusの延長線上で開発された、
ウィリアムス管と名付けられた新しいメモリシステムで当時としては比較にならないくらい早いメモリアクセスを実現。
プログラムもメモリの中にとりこめるようになっており、現在のコンピュータに近い。
大きさは部屋いっぱいのビッグサイズだった。
コンピュータとコンピュータ言語の歴史が表になっていた。
1940年代→コンピュータの黎明期
軍事目的主体。アーキテクチャを模索中。プログラミンは物理配線などハードウェアに密接している。
言語は機械語のみ
1950年代から60年代→大型コンピュータの時代
時代を明確にきるのは困難。科学技術計算用にFORTRAN、事務用にCOBOLが使われた。
コンパイラの研究が盛んになる。
1970年代→パーソナルコンピュータの創世期
LSIの登場で数多くの部品を集積することが可能になり、コンピュータが小型化。
パソコンの原形ができる。マイクロソフトのBASICが多くのコンピュータに搭載され標準OSとしても利用される。
1980年代→標準化OSの時代
パーソナルコンピュータが多くのメーカーから発売され、計算だけでなくワープロや表計算ソフトらのアプリがのり、
企業が導入するようになる。
ソフトウェア資産の効率利用が考えられるようになる。
標準OS、CP/MやMS-DOS,UNIXなどの登場。
IBMのパーソナルコンピュータの標準機 PC/AT互換機で動作するソフトを標準ソフトとして売る動き。
アーキテクチャからアプリケーション中心にシフト。
プログラマがさまざまなコンピュータ言語を選択可能になる。
C言語のようなポピュラーな言語は各ソフト会社から機能の異なるものが発売される。
開発環境として発達して、のちのGUIで画面デザインできる統合開発環境ができる。
1990年代後半~→インターネットの時代
クライアントコンピュータに仕様を満たすWebブラウザがあれば、プログラムやサービスはインターネットから供給できるようになった。これまでとは異なる実行形態。
インターネットを利用したクライアント/サーバ型分散システムでは、速度が要求されるインターフェースをクライアントが担当。サーバで処理の重いデータを処理し、入力受付、計算、データ配信をするだけになった。このことから簡易的コンピュータ言語「スクリプト言語」が幅広く利用されることになる。
Webページの生成用の、PHPやVBScriptなどもうまれてきた。
パーソナルコンピュータの性能向上により、ついに余剰スペックが生まれる時代になった。
Javaha仮想マシン上で動作するコンピュータ言語は、こうした余剰スペックによって利用可能になったのである。
コンピュータ言語は様々あるが、コンピュータは機械語(マシン語)しかわからない。
どのコンピュータ言語で書かれたプログラムも最終的には機械語の命令に翻訳される。
機械語プラグラムは、人間にとって16進数で記述された記号の集まりにしかならない。
機械語の仕様はCPUによって異なる。
Z80 → NEDPC-8001など
8086→PC9801 、Pentiumの源流
PowerPC→Macintosh
同じ系列のCPUでもレジスタや命令が増えているなどの違いがあったりする。
機械語を簡単に記述するために「ニーモニック」という記述方法を使用することがある。
これをコンピュータで機械語に変換するソフトを「アセンブラ」という。
アセンブラは機械語に1対1で変換可能なコンピュータ言語。
プログラマはCPUの命令表から解放された。
機械語では命令の追加で移動先のアドレスが変わるたびに、
それぞれの移動先のアドレスを変更する必要があったが、
ラベルが使えるようになって効率がよくなった。
アセンブラの種類によっては、定数を指定できる、変数や構造体を宣言できる、
条件判断や反復処理を記述するなど、プログラミングを補助する機能が装備されていた。
アセンブラの問題
・データ型をもつ変数を使用できない。
・計算式をアセンブラに翻訳した形で記述しなければならない→「x=a*x+b」は記述できない
・プログラム制御の流れがわかりにくい。
「コンパイラ」は、より人間に理解しやすい形でかかれたプログラムのソースコードを機械語に変換する。
(現在のコンパイラは違う)
当時のコンピュータの利用方法は数値解析が主力だったので、
人間が理解しやすい形で、プログラム中に数式を記述したいというニーズが高かった。
1956年にIBMが開発した世界初の高級言語「FORTRAN]はこのニーズに答えたもの
計算を<変数>=<式>と表現できた。
可読性があがり、制御の流れもだいぶ理解しやすくなった。
もうひとつのニーズ、コンピュータに依存しないプログラムを記述したい、も
高級言語とコンパイラの開発を後押しした。
ターゲットのマシンに合わせたコンパイルをすることで、
一つのソースコードで異なるコンピュータで動作するようになることが期待された。
高性能なコンピュータが安価に入手できるようになったのは、1980年代後半からで、
それまではコンピュータの価格はプログラマの人件費よりずっと高かった。
そこで、処理時間が短く、コンピュータに負荷をかけないプログラミング技術が要求された。
コンピュータの性能があがると、コンピュータのとユーザの対話的な処理に、CPUの利用時間を割り当てられるようになった。
「インタプリタ」は、基本的に実行中にプログラムを1行ずつ解釈して実行する。
「コンパイラ」より速度は遅いが、プログラマが実行ファイルを作成すると意識しなくてもいい、
ソースコードと実行ファイルが同じで管理しやすいという利点がある。
代表はBASIC、現在のVisualBasicはインタプリタではなくコンパイラで動作する。
GUI・・・Grahical User Interface
現在のWindowsやMAC OSに搭載されているインターフェイス
プログラムやドキュメントを管理するウィンドウ、イメージで表現するアイコン、
画面上のオブジェクトを直接指定できるマウスなどで構成される。
こうした見た目の良さや直感的な操作の為にコンピュータの資源を割り当てられるのは
コンピュータが高速化したため。
GUIの登場で処理単位の開発→画面単位の開発に推移
多くのコンピュータ言語がフォームを作成するデザイン機能を搭載するようになった。
1970-1980年代にコンピュータ言語を表す際に高級言語と低級言語という表現が使われた。
人間に近いのを高級言語、コンピュータに近いのを低級言語という。
当時コンピュータの資源は限られていたので、高級言語は資源を多く必要とするため
コンピュータの資源をあまり使わず、能力を最大に引き出す低級言語もよく使われた。
しかし、コンピュータが安価になると、人間の資源を節約するほうが効率的になり、
高級言語で人間にわかりやすくプログラムを記述されるほうが重視されるようになった。
チューリング・テスト・・・コンピュータの父とよばれるアラン・M・チューリングが考えたテストで、人間の前に2つのディスプレイをおき、一方は人間が応答、一方はコンピュータが応答する、ディスプレイの前の人間が、ちがいがわからなければコンピュータが知性をもったとすることができるというもの。
人工知能の研究用に開発されたのがLISPとProlog
LISPは1958年にMITのジョン・マッカーシーが開発。
開発時期自体はFORTRANやCOBOLと変わらない。
ハードウェアが進化すると、ソフトウェアの有用性が社会的に認められ、利用範囲が拡大してきた。
ソフトウェアの機能は増え、プログラムやサイズが大きくなっていった。
複数のプログラマが共同で作業することも多くなり、大規模なプログラムを効率よく、間違いなく
開発することが求められるようになってきた。
1960年代末にエドガー・ダイクストラが『構造化プログラミング」を提唱。
それまで多用されていたgoto文を使わず、入り口と出口が一つのプログラムなら、順接(successive)、
分岐(conditional)、反復(repetition)で記述できると提案した。
初めて構造化プログラミングを導入したALGOL60の設計にもかかわった。
現在のほとんどのプログラミング言語に構造化の概念と命令がくみこまれている。
それまで必須だったフローチャートよりも、きれいに整備されたソースコードを読む方がわかりやすくなった。
ただし、goto文を使ったほうがわかりやすくなる場合もあると今日ではいわれていて、
その機能を持つ命令として、break文やcontinue文を実装しているプログラミング言語が多い。
1980年代、コンピュータの利用目的が、数値計算から蓄積されたデータの処理に移行する。
そこで「オブジェクト指向」という概念が登場する。
多くの研究者が様々な手法を発表しているが、共通するのは、データとデータに対する処理をひとまとまりにすること。
JavaやC++が有名なオブジェクト指向言語。
オブジェクト指向では、データの構造を変更しても、参照や変更がひとまとめになっていて修正しやすい。
そして、プログラマは本質的な部分に集中できることになる。
このような考え方はめずらしくなく、優秀なプログラマはどの言語を使っても、ある程度オブジェクト指向の概念を取り入れているものである。
現在の一般的なオブジェクト指向言語では、オブジェクトを「クラス」で定義、属性を「プロパティ」、処理を「メソッド」と呼び、クラスから「インスタンス」と呼ばれるオブジェクトを生成して操作する。
GUIでプログラムの操作体系は大きく変化した。
GUIプログラムを記述するために生み出されたのが、オブジェクト指向とイベント駆動型プログラムに対応したプログラミング言語。
それらではフォームのデザインがグラフィカルにできるようになっている。
そしてフォームに配置されたオブジェクト(テキストボックスやコマンドボタン)に対する数多くのイベントが発生する。
イベント駆動型プログラムでは、そのようなオブジェクトが発動するイベントに応じたプログラムを記述する。
このようなプログラム開発を補助するのが、イベント駆動型プログラミングに対応したオブジェクト指向言語。
本では、GUIで作った顧客登録フォームと、コマンドラインで同様の情報を入力する例をあげて、違いを解説していた。
以前はアプリケーションの中にデータベース機能を記述していたが、今では汎用のデータベースを使うことが一般的。
本来はデータベースはデータの集まり、それを管理するのをデータベース管理システムというが、いまではひとくくりにデータベースということが多い。
データベースではデータを高速に処理できるようにするために、データの格納方法に様々な工夫がされている。
代表的なモデル
・階層型データモデル
・ネットワーク型データモデル
・リレーショナルデータモデル
リレーショナルデータモデルが現在最も広く用いられている。データを実体(entity)という単位で格納して、
実体間の関係をリレーションとして論理的に定義する。データベースに格納されたデータは、関係代数演算および集合演算によって取得する。
Oracl、SQL Server、DB2などすべてリレーショナルデータベース。
SQL(Structured Query Language)・・・データベースに対する問い合わせや指示を文章に近い感覚で操作できるように設計されたもの。
SQLで記述された命令文をSQLステートメントと呼ぶ。
ストアドプロシージャ・・・SQLを拡張した簡易言語、変数の定義、分岐や反復といった構造化処理機能がある。コンピュータ言語がなくてもデータベースを処理できる。
SQは標準はあるもののデータベース毎に、仕様がちがうことがある。
ストアドプロシージャはデータベース管理システムによって違う。
プログラムからこれらデータベースを扱うのは一般的なことであり、コンピュータ言語の他にデータベース操作言語を習得するのは必須になりつつある。
第2章 コンピュータ言語の種類(動作による分類)
2.1 アセンブラ
コンピュータが扱えるのは機械語だけ。機械語は人間には簡単にわからないので、ニーモニックという表記法が考え出された。ニーモニックは、機械語の命令に対して内容にあったシンプルな単語の省略形を割り当てたもの。
プログラマにとって処理内容が連想しやすくなった。
ハンドアセンブルの方法が図解されていた。
アセンブラにはニーモニックの他に、ラベルの使用、分割アセンブル、メモリに対する名前の割り当て、マクロ機能が塔歳された。
ラベルをつけることで、分岐の先の行番号がかわってもプログラムを記述しなおさなくてよくなった。
機能ごとに分割したソースコードを別々にアセンブルできるようにして、時間を短縮できる。
アドレスのままでは目的がわからなくなるが、名前をつけると連想しやすい。
頻繁に使用される一連の処理を、一か所に記述しておく、アセンブラではそれをソースの置き換えで解釈してくれる。
2.2 コンパイラ
定義がかわってきている。
広義・・・ある言語で記述されたプログラムを別の言語のプログラムに変換するソフト。
一般的・・記述されたプログラムを実行用のプログラムに翻訳するソフト。
Javaでは「バイトコード」と呼ばれる中間コードを出力している。このようなタイプもある。
クロスコンパイラ・・コンパイル作業を行っている機種とは異なる機種用のオブジェクトコードを出力するもの
コンパイラの処理
・構文チェック、データ型チェック
・意味解析、コード生成
・最適化
コンパイラにより、変数に型を定義できるようになった。通常は整数、浮動小数点、文字列など。コンパイルの段階で型をチェックしてくれるので、ミスが減った。
代数式をそのまま記述できるようになった。
2.3 インタプリタ
プログラムに記述された命令を順番に逐次解釈する方法。
処理は主に、プログラムを解釈する部分と実行する部分にわけられる。
処理中にエラーが発生するとプログラムを停止させる。
一般的にコンパイラの言語より遅い。構文ミスを事前チェックできない。実行には専用の実行環境が必要。
BASIC、LISP、Perl、Ruby、PHPなどがインタプリタ言語。
スクリプト言語も、実行形態としてはインタプリタ型言語。
BASICは逐次解釈、Perlは実行前にコードを読み込んで内部コードに変換する。
逐次解釈では、ループなどは同じ作業が繰り返されることになる。
データ型はインタプリタ型コンピュータ言語でも使える。実行時に型検査を行っている→動的型検査
コンパイラとインタプリタの境目はだんだんなくなっている。Javaha中間コードをつくり(コンパイラ)、Java仮想マシン上で動作させている(インタプリタ)。
2.4 スクリプト
簡潔な記述で目的を達成できるように設計されたインタプリタ型の簡易言語。
インタプリタ言語とスクリプト言語の区別は明確ではない。
実行ファイルを生成しない簡易的開発言語や、Webページ上でHTMLに組み込んで実行できる言語をスクリプト言語と呼ぶことが多い。
・Webページに組み込めるもの
VBScriptとJavaScript、PHPなど。
JavaScriptはWebブラウザ上でアニメーションや簡単なプログラムを実行することが目的。
PHPはデータベースの操作に長けた言語、サーバーサイドで動作させると、Webシステムを簡単に構築できる。
・簡易開発に適した言語
テキスト処理が得意なPerlやawk、オブジェクト指向のRuby。
通常の言語と同等の機能を保有しているが、実行ファイルは生成せず、コマンドラインからプログラム入力やファイルを指定して実行できる機動性の良さが特徴。
他にUNIXのシェルスクリプト(sh BASH)、MS-DOSのバッチファイルなども一般的なコンピュータ言語より機能的には劣るが、スクリプトに含まれる。
2.5 マクロ
エディタや表計算ソフト、データベースなどのアプリケーションにおいて、ユーザが行う一連の操作を自動化する機能や、そのような目的で記述されたプログラムのこと。
機能が豊富なアプリケーションの中には、ユーザの行う一連の操作を自動化するために、指定したメニュー操作やキー操作の組み合わせを登録できる機能を提供している。もともとのマクロ機能とはこのこと。
最近のアプリケーションでは、メニューやキー操作だけでなく、通常のコンピュータ言語と同等の変数定義機能を装備したり、反復処理や分岐処理を可能にしたものが増えている。
マイクロソフト社のExcel5.0から搭載されたVBA(Visual Basic for Application)は、言語としての機能は通常のコンピュータ言語に劣らない。
第3章 コンピュータ言語の分類(設計概念による分類)
3.1 代表的なコンピュータ言語の分類
手続き型、関数型、論理型の3種類に分類した表があった。
ほとんどの言語が手続き型で、関数型はLISP、Scheme、Standard ML、LOGO、論理型はPrologのみ。
手続き型言語は、コンピュータ言語を用いて記述した命令とコンピュータの動作との対応がわかりやすいからと説明していた。
3.2 手続き型言語
一般的に利用されているコンピュータ言語のほとんど。
一つのコンピュータ言語を覚えれば、他のコンピュータ言語を習得するのは比較的容易といわれる理由。
手続き型言語の特徴
・命令の逐次実行→指定された行から順番にプログラムを実行してく
・変数への破壊的代入→同じ変数に何度も値を代入すること
作業手順を記すのが手続き型言語の書き方ともいえる。
メモリの値を変更しながらプログラムが動作すると、コンピュータにとっても自然で高速なプログラムになる、しかし、実行時における変数の値を追跡して全体的な動きを捉えることが困難であるという特徴がある。このため、プログラムの誤りを訂正したり、プログラムが正しく動くことを証明したりしなければならないとき、手間がかかる言語といえる。
3.3関数型言語
手続き型言語で作成されたプログラムはコンピュータの動きに近い。
手続き型言語が、本当に人間が考えやすいプログラムを記述できるかについては結論がでていない。
コンピュータ言語にとっては、人間の思考をそのまま記述できるかどうかが大切という考え方がある。
ラムダ記法・・・プリンストン大学の論理学者アロンゾ・チャーチが提案した関数の表記法。関数の引数として関数を渡したり、関数の計算式を関数に返したりするような計算式を、あいまいな点をなくして記述することができる。 従来の関数の表現方法、「f(x)」は、f(x)という関数なのか、引数xに関数fを適用したのかわからないという欠点がある。これを、「f(x)=x+1」という関数を定義するときは、ラムダ記法で「λx.(x+1)」と表記する。
チューリングマシン(現代のコンピュータのこと)で計算可能なことは、ラムダ計算で計算可能なことがチャーチによって示されている。
純粋な関数型言語は、同じ変数に何度も値を代入すること(破壊的代入)を許可していない。これによってプログラムの解析が容易になり、拡張、修正しやすくなる。しかし多くの関数型言語では、実行効率のために破壊的代入を許可している。
関数型言語は構造上、再帰的に関数を定義することが多くなるので、実行速度が遅い。
再帰呼び出しはコンピュータに大きな負荷がかかる。(末尾再帰の最適化が可能なら問題ないが)
命令を手順通り実行する必要がないので、記述されたプログラムを効率よく処理するコードに変換するのは困難。いまではかなり克服されていると主張する人たちもいる。
関数型言語の特徴
・多相型(Polymorphism)
C言語のテンプレートに似た機能。
型宣言部分を省力してプログラムを記述し、使用するときに具体的な型に適用できる。
自動的に肩を推論する機能をもつものもある。
・遅延評価(Lazy Evaluation)
関数の引数について、必要になった時点で評価をする
・高階関数(Higher Order Functiton)
計算結果として関数を返したり、実引数として関数をとることができる関数を「高階関数」という。
C言語では関数へのポインタを使用することで、この動作をある程度模倣できるが、制限があるし、記述が不自然になる。
関数型言語では、構造上メモリーリークを解消するためのガベージコレクションという機能が必要になる。
これはLISPで導入された機能で、最近では手続き型言語でも導入されている。
3.4 論理型言語
述語論理の定理証明を自動化したいという要求から生まれた言語。
プログラムを論理に沿って記述する。
通常の論理型言語でで用いられる論理は「述語論理式」と呼ばれる論理。
プログラマは論理のみを記述し、論理を満たす解をコンピュータが探索するという形で開発される。
述語とは真偽値を返す関数で、物事の関係や物事の性質をあらわすのにも使用する。
例 太郎と花子は夫婦である。→夫婦(太郎,花子)
論理記号(∀∧∨⇒)をつけて論理を記述する。
⇒はホーン節で、B⇒AでBならばAが成り立つ、B and C ⇒ A BかつCならば、Aが成り立つとなる。
Prologでの記述方法を解説し、太郎と花子は夫婦であると定義して、太郎の妻を探すという例で解説していた。
最初に定義を入力していき、「|?-fufu(taro, Wife)」ときくとPrologが「Wife=hanako」と返す。
他にも夫婦や親子関係を定義して、定義してない親子関係を、夫婦関係から求める例があがっていた。
3.5 クイックソートプログラムの例
手続き型言語Pascal、関数型言語LISP,論理型言語Prologによるクイックソートプログラムの記述例をあげ、
記述の比較を行っていた。
LISPでは配列を使うと手続き型言語と似てしまうのでリストを使っていた。
Prologで空でないリストが整列している関係を表す述語を定義していた。
第4章 コンピュータ言語の技術
4.1 コンピュータ言語に対する要求と技術
一般的な手続き型言語に焦点をあてて、これまでの技術を解説。
コンピュータは汎用的な演算処理を実現する夢のような機械で、必要な処理を行うプログラムを記述さえすれば、どのような処理も可能になると思われていた。
実際にはプログラミングという作業が予想したほどは簡単ではなかった。
ソフトウェアの規模の拡大により、過去の資産継承や、プログラマの共同作業の難しさなどの問題をかかえている。
そのような状況を脱却するため、プログラミング言語の技術に関する様々な研究がれ、提案がされてきた。
多くは、コンピュータの能力を最終的なプログラムの実行時に使用するだけでなく、ソフトウェア開発支援にも利用することにより、生産性の向上をはかるためのもの。
4.2 構造化プログラミング
コンピュータ言語では、常に何らかの制御構造が提供されている。
エドガー・ダイクストラは「一つの入り口から出口に向かう適正なプログラムであれば、連接、分岐、反復3種類の基本混蔵の組み合わせで記述することが可能である」と提唱した。
連接は順番通りに処理を実行すること。
分岐とは、条件の成立と不成立によって実行する命令群を制御するためのもの。
If...then...else命令、select文、switch文など。
構造化機能のないBASICと、構造化されたVisual Basicで記述の違いの例をあげていた。
コンピュータの最大のメリットは単純な命令を大量に実行することが得意なこと。
それぞれのコンピュータ言語には、指定された命令群を繰り返し処理するための構文が何らかの形で用意されている。
for...next、do...loopなど。
現在のコンピュータ言語に装備されている反復の命令は、ループを終了するための条件の指定方法によって、いくつかの反復制御命令が用意されている。
・カウンタを利用して、開始値から終了値まで繰り返す方法
・終了条件を満たすまで繰り返す方法で、条件判定がループの最後
・同上で、判定条件がループの先頭
4.3 オブジェクト指向
本来プログラムを作成するという行為は、実世界の対象を抽象化し、コンピュータの世界にモデリングすることを意味する。そこで、人間位取っ手自然なモデリングを可能にする、モデリングの結果をそのままプログラミングできる技術が研究された。その結果考え出されたのがモデル化する対象をオブジェクトとして定義できる「オブジェクト指向」と呼ばれる技術。
現在のコンピュータ言語には、洗練されたオブジェクト指向技術として、情報隠ぺいやモジュール化といった機能が盛り込まれている。
しかし、概念自体は古くからあり、経験豊富なプログラマなら実現していた考え方である。
オブジェクト指向という技術は、従来から提案されている数多くの開発技法をまとめあげて、プログラムの中で対象データを簡単にモデル化したり、操作することを可能にした機能。
オブジェクト化
オブジェクト指向のもっとも大事な概念は、処理対象を「オブジェクト」として捉えること。
それぞれのオブジェクトには状態を表す「属性=プロパティ」と「手続き=メソッド、メンバー関数」がある。
例では「円」というオブジェクトを定義して説明。
オブジェクトの属性を変数のように指定することができるが、実装方法としてはこれまでのコンピュータ言語で実現されていた共通変数や共通関数を応用した考え方である。
情報隠ぺい
オブジェクト化によって、整理した属性と手続きを、他のプログラムから不要な参照や変更をうけないようにするための機能。
JavaやC++、Visual Basicでは[private」で指定するとオブジェクトを外部から参照できなくなる。
プログラマが注意して、不要な参照や変更をしないように気をつけるよりも、確実にミスをなくせる。
クラスとインスタンス
同じ属性と同じ手続きを備えたオブジェクトが複数必要になるときがある。
このとき、同じ種類のオブジェクトを生成するために用意された考え方がクラスによるインスタンスの生成。
クラスはオブジェクトのひな形で、クラスから必要なオブジェクトを生成するのをインスタンス化といい、生成されたオブジェクトをインスタンスという。
継承
新しいクラスを定義するときに既存のクラスを指定して、新しいクラスが元の暮らすとまったく同じ機能を持つようにすること。
このとき既存のクラスと継承したクラスは、基底クラスー派生クラスまたは親クラスー子クラスと呼ばれる。
クラスに同じナメの手続きが定義されたときには、新しく定義された手続きが有効になる(オーバライド)
オーバライドを使うと、以前のクラスが保有していた動作を新たな動作に変更することができるようになる。
この機能がないと、元のクラスのコードをすべて複製して変更や拡張を行うことになり、個々のオブジェクトの区別がつきにくくなる可能性があるのと、元のクラスにバグがあった場合、すべてのクラスを修正する必要がでてくる。
機能の、追加、変更、拡張がやりやすくなる。
動的束縛
静的束縛・・・処理対象のオブジェクトの構造が確定している場合には、オブジェクト内の手続きの位置(関数のアドレスなど)がコンパイル時に決定される。関数呼び出しはアドレスで処理できる。
動的束縛では処理するオブジェクトがどのようなものかコンパイル時は決定していない。関数呼び出しが成功するかは、実際に関数を実行してみないとわからない。
静的束縛より速度は遅くなるが、柔軟なプログラムがかける。
例として、スタックのクラスを作成しそこにスタックの中身を横方向に出力する関数を記述。継承したクラスで出力方向が縦方向になる関数を記述。最初のスタッククラスと、後のスタッククラスをそれぞれ生成して結果を出力させるプログラムがのっていた。
4.4 イベント駆動型プログラム
1973年、ゼロックス社のパロ・アルト研究所のアラン・ケイが「Alto」を開発。
ユーザインターフェースとして、ウィンドウシステム、アイコン、ビットマップ、マウスという概念を使ったもので、今日GUIと呼ばれるもの。
GUIはユーザにはわかりやすいが、プログラム開発をするほうは面倒なもの。
どこでイベントが発生するかわからないので、すべてを記述することはできない。
GUIにおけるフォームの処理を簡単に記述できるようにするために、イベント駆動型という技術が発明された。
イベントはフォーム上のコントロールなどに対して、「選択された」「キーが押された」といった状態の変化で発生。
イベントハンドラは、そのイベントが発生したときに実行する処理を(プログラム)を関数の形で記述。イベントとイベントハンドらの対応付けはイベントループに登録する。
イベントループが発生したイベントを監視して、イベントハンドらに登録されているイベントが発生した場合にはイベントに対応づけられたプログラムを実行する。
イベントループはコンピュータ言語(開発環境)が解決してくれるので、プログラマはコントロールに対するイベントの指定のみを行うだけになる。
この仕組みでイベント数の増大によるプログラムの複雑さの増加を防ぐことができる。
コンピュータ言語がイベント駆動型プログラムに対応してGUIのイベント処理は飛躍的に簡単になった。
ただし、どの順番でイベントが発生しても適切に処理がおこるように記述する注意が必要。
4.5 実行時コード生成
インタプリタ形式で実行するプログラムに対して使用する高速化技法。
繰り返し実行する命令列がキャッシュに生成されていなければ生成するようにすること。
バイトコードを解釈して命令に該当する処理を実行するのではなく、機械語の命令を生成して機械語の命令を実行することで実現。
1970年代後半に開発されたSmalltaikに実装されている。
最近ではJavaがJITコンパイラ(Just-In-Time Compiler)という名前で同等の機能を実現している。
4.6 ガベージコレクション
プログラムが動的に確保したメモリは、プログラムが解放しなければならないが、このような処理は、使用中のメモリを誤って解放したり、解放作業を忘れるというバグの原因になりやすい。
不要になったメモリを検査し、自動的に廃棄する機能をコンピュータ言語が支援する機構が考え出された、これがガベージコレクション。
1960年に開発されたLISPにすでに実装されていた。(動的メモリで動くの必須だった)
ガベージコレクション=GCはコンピュータに負荷がかかる思い処理で、昔は数十秒システムが停止することもあった。
現在のコンピュータに採用されている主なGCの方式
・マークアンドスイープ方式
LISPで採用、セルに参照している先のポイントが格納されている。
GCはこれをたどって、参照されているセルにマークをつけていき、
次にルートから順番にマークの無いセルを回収する。
セルの大きさ一定でなくてはならず、間をつめる処理(コンパクション)をしない。
Rubyなど
・コピー方式
メモリ領域を二つにわけ、一方の領域が満杯になると
GCはルートから参照されていいるセルをたどり(循環参照は辿らない)、
必要なセルをもう一方にコピーしていく、最後までたどったら元の領域を消す。
セルの大きさは一定でなくてよい、コンパクションできるがメモリが半分しか使えない、
ゴミが多いときは高速に動作する。
・リファレンスカウント方式
セルの中にカウンタを保持し、他のセルから参照されたらカウンタを増やし、
他のセルが参照をやめたら減らす。カウントが0になると、そのセルを廃棄する。
プログラムの処理全体にGCが分散できる。不要になったセルが即座に廃棄できるメリットがある。
循環参照しているゴミが廃棄できない、リファレンス管理に手間がかかる。
Perlなど
・世代別GC・・・次の法則を利用
・新しく作られたデータはゴミになりやすい。
・ある程度生き残ったセルは、そのまま残ることが多い
・新しいセルから古いセルへの参照が多い
・寿命が短いデータほど量が多い
ある程度長く使用されているセルを特殊なセルとして特別な領域に移す。
そしてこれらの旧世代のオブジェクトが格納されているセルをGCの処理対象から除外することで、
何度も無駄な処理を実行するのを避ける。
Javaなど
いずれの方式も、使用しているメモリはルートと呼ばれる領域から辿る。つまりルートから辿ることができるセル(メモリ領域を一定の大きさに分けたもの)が使用されているかどうかをみている。
Pythonは、通常はリファレンスカウント方式、数回に1回マークアンドスイープ方式をとっている。
C言語やC++にはない。
4.7 ダイナミックリンクライブラリ
関数・・・プログラム記述する単位と定義(DDL)
ライブラリ・・・頻繁に実行する処理を関数の形であらかじめ作成し、まとめ上げたもの。
コンパイラがソースコードをつくるときに、ライブラリから必要な関数を選択して結合。(静的結合)
欠点、アプリケーションごとに結合されるので、メモリ領域が無駄になる。実行ファイル内に関数が格納されてしまうので、ライブラリ内の関数にバグがあると、すべてリンクしなおさないといけない。
ダイナミックリンクライブラリはこれらの欠点を解消するため、プログラムを実行するときにライブラリを結合する。
実行速度がおそくなるという欠点がある。
4.8 最適化技術
プログラムからオブジェクトコード(実行ファイル)を作成するとき、実行速度を向上させるために、元のプログラムと同じ処理を実現するオブジェクトコードに変換する機能。
わかりやすくするために、本来は機械語レベルの話を高級言語レベルに置き換えて説明
・技術1・・・ループの外に出す。
ループ内で変化しない部分をループの外に出してしまう。
・技術2・・・末尾再帰の最適化
階乗を求めるプログラムを例に、末尾再帰の関数が関数呼び出しをジャンプ命令に置き換えることができるのを説明。
・技術3・・定数の畳み込み
見た目をわかりやすくするための表記を最適化表記にする。
例 menseki=(jouteiLkatei)*10/2→menseki=(joutei+katei)*5
定数の畳み込みは、複数の式に定数の値を伝播させて処理を最適化する方法もある。
この場合は、最適化されて削除された変数が、後のプログラムで使われないのが条件になる。
4.9 正規表現
テキスト処理に長けたコンピュータ言語ではサポートしていることがある。
対象となる文字列を表すための表記方法のことで、検索や置換における文字列の指定に使用する。
文字列の先頭イッチヤ部分一致といった単純な文字列指定に比べて、文字列のパターンの指定により、取得した文字列をチェックするプログラムを記述しなくて細やかな文字列を指定することが可能になる。
元はUNIXやLinuxなどのOS上のgrepやegrep、sed、awkといったツールで使用されていた。
現在ではPerlやRuby、PHPといったテキスト処理を得意とするコンピュータ言語でも使用できるようになっている。JavaやC言語でもライブラリを用意すると正規表現を利用するのが可能になる。
正規表現のすべての機能を覚える必要はないが、使いこなせると便利さが増す。
サポートされている書式にはツールや言語で違いがあるので注意が必要。
・ワイルドカード指定→佐藤.*子だと、佐藤子、佐藤裕子、佐藤由香子、佐藤さんちの子などが照合
・文字クラス指定→[0-9][0-9][-/][0-9][0-9]で日付表示、10-21や10/22などの日付表示。-は範囲指定の他に文字としても指定するが、そのときは先頭に記述する必要がある。[a-zA-Z]→すべてのアルファベット。
・繰り返し→「*」で0回以上の直前の文字の繰り返し「XY*」なら、「X」「XY」「XYY」など
・選択→コーヒー豆と珈琲豆両方を表すなら、「コーヒー豆|珈琲豆」、または「(コーヒー|珈琲)豆。
・繰り返しと選択の応用→佐藤[あ-ん][あ-ん]*(子|美)→佐藤ひろ美、佐藤ゆみ子に照合
・先頭一致と行末一致・・・「^」段落の先頭、「様$」様で終わる
正規表現は便利だが、記述方法は簡単とはいえない、言語によっては簡単に記述できる独自の表現法を提供している。Perlの表記法を紹介していた。
4.10 連想配列
配列・・・同じ型の変数をメモリの連続領域に割り当てて、添え字を用いてアクセスすること。
連想配列は添え字に文字列を使用できる配列のこと。
awkで有名になり、その後PerlやRubyといったテキスト処理を得意とする多くのスプリクト言語に移植された。
商品名と販売価格の表から、商品名ごとに合計金額と販売台数を求めるプログラムを作成する例で、
通常だと、商品名を配列にわりあてて、商品名に割り当てた番号を得る処理が必要なところを、
商品名でそのまま取り出すプログラムがのっていた。
実装上非常に効率がよくないので、PerlやRubyではハッシュ関数を用いて添え字に使用する文字列を数値に変換してから格納している、それでこれらの言語では連想配列はハッシュと呼ばれている。
第5章 プログラム開発環境
5.1 一般的な開発環境
現在使用されているプログラム開発時におけるツールの一覧表
エディタ、フォームデザイナー、アセンブラ、コンパイラ、インタプリタ、リンカ、デバッガの説明
VisualBasicやDelphiはコンピュータ言語自体が開発環境に完全に埋め込まれているので切り離せない。
5.2 エディタ
テキストを記述できる機能をもつ、プログラムを作成するためのツール。
最近の補助機能、自動インデント、自動構文チェック、自動構文生成、色分け表示、命令や関数の入力補助機能
目的は、プログラムを見やすくすること、間違いのないプログラムを記述すること。
それぞれについてVisual Studio.NETを例に説明していた。
5.3 コンパイラ
記述されたソースコードを実行用のオブジェクトコードに変換するためのソフト。
コンピュータ言語の本体に相当するもの、統合開発環境を持たない言語ではコマンドから実行するのが一般的。
現在のコンパイラには、オブジェクトコードの生成以外に、構文チェック、変数の型チェック、最適化処理、デバッグ用のコード挿入などの機能がある。
5.4 リンカ
コンパイラで生成した実行用のオブジェクトコードを基にして、コンピュータで直接実行できるファイルを生成する機能。
コンパイラで生成したオブジェクトコードとライブラリを結合して、プログラムのアドレスを割り当てる。
最近はコンパイラと一体になっているものも多い。
Visual Studio.NETではビルドという名前で一体になっている。
5.5 デバッガ
プログラムに含まれるバグを発見し、取り除く作業を補助するツールの包括的呼び名。
代表的機能、ブレークポイントの設定、プログラムのステップ実行、変数のウォッチ、関数の実行履歴
それぞれについて開発環境の画面を乗せながら説明。
5.6 フォームデザイナ
RADツール(Rapid Application Development)に装備されているGUIのフォーム作成機能。
統合開発環境で新しいプログラムを作成すると、自動的に新規フォームが作成されて、フォームデザイナによる作業から開始できるようになっている。
多くの統合開発環境において、フォームデザイナで作成されたフォームはオブジェクトのプロパティをソースファイル内に保存し、テキスト情報として閲覧、編集できるようになっている。
5.7 オブジェクト指向への対応
オブジェクト指向の概念が取り入れられたコンピュータ言語では、オブジェクトのプロパティやメソッドの操作を補助するために、プロパティエディタ、オブジェクトブラウザといった機能が装備されている。
第6章 アセンブラで見るコンピュータの動作
コンピュータの動作を仕組みを考える場合は、プログラムがコンピュータにもっとも近いところでどのように動作するか知っておくことが大切。
アセンブラにおけるプログラムの動作を知ることは、高級言語が実現しているプログラムの処理に対する認識を深めることに役立つ。
6.1 アセンブラの基本的な動作
この章では現在のPentiumシリーズの元になった8086CPUのアセンブラで解説。
実際にはアセンブラはCPUによって違うので、注意すること。
6.2 8086CPUにおけるアセンブラの主な命令
どのCPUでも、データ転送、算術演算、論理演算など同種の命令が用意されている。
一つのCPUを習得すると、他のCPUでも推測がつくようになる。
3ページにわたって命令の一覧表がのっていた、上の基本命令の他に、比較、ジャンプ、ループ、コール/リターン命令、スタック操作命令、入出力、割り込み、その他の命令がのっていた。
一般的なコンピュータ言語より命令が非常に少なく、体系が異なる。変数の定義やデータ型の定義がない。
算術演算などの命令のオペランドに1バイト、2バイトの値しか指定できない。
ifのような判定用の命令はなくCMPだけ、関数はサブルーチンの呼び出しだけ。
高級言語で記述されたプログラムも、これらの組み合わせで実現されている。
6.3 2進数と16進数
コンピュータでは信号のオン・オフを利用するので2進数が便利なので使われるようになった。
コンピュータの高速化で人間の計算する処理に近い形での値の操作が可能になってきたが、創世期の名残がそこここに残っている。
2進数、8進数、16進数の説明。
6.4 四則演算
8086CPUでは、加算、減算、乗算、除算の4つの計算が行えるようになっている。
ただし引数には2バイトまでしかとれいない。
2バイトのデータおける四則演算を説明。
汎用レジスタ4種類を使い、MOVでAXレジスタに一方をいれて、それとADDするなど。
コラムでDEBUGコマンドによるアセンブルとプログラムの実行を解説。
3つの数の加算は、AXレジスタに加算を繰り返すことで行われる。アセンブラには式がない。
乗算はAL、DLレジスタを使って行われる、16ビットのときは8ビットに分解して行われる。
除算はこれに似ている。
インクリメント命令(INC)とデクリメント命令(DEC)は加算や減算よりメモリを使わないので、高速化のために用意されている。
6.5 大きな数の計算
16ビットより大きな数をプログラムで処理する方法。
キャリーフラグにより桁上げが行われたことがわかるようにしてADC命令を使って処理している。
実例が解説されていた。
6.6 負の数の計算
8ビットの場合は、最上位のビットを符号して使用する。取り扱えるのは-128~+127となる。
こういう取り扱いは-10+5などの計算で便利。
符号付加算ではキャリーフラグは無視できる。
符号付乗算と除算はIMULとIDIVという命令がある。
符号付の乗算と除算の命令をもたないCPUでは2の歩数を捕って、一度正の値に変換してから計算を行い、最後に符号だけを別によs里するような方法をとる必要がある。
6,7 小数の格納
小数はコンピュータが処理できないのでプログラムで処理している。
高級言語における小数の格納方法は「IEEE754」で規定されている。
単精度floatは4バイトでデータの格納方法は符号1ビット、指数部8ビット、仮数部23ビットとなる。指数の基数は2。10進数で1234.567だと、1.23456×10の3乗、2進数で1011.011=10進数の11.375は、1.011011×2の3乗となる。
仮数部は常に先頭桁が1なので値として格納しない。
6.8 メモリとのやりとり
本来の機械語には変数という概念はないので、アセンブラにもない。
メモリの領域に名前を付けておくことで、コード内で変数のように使用することができる。
データはあくまでバイト単位が基本。
配列という概念もなく、メモリの領域を連続的に確保しておくことで最初のメモリの場所を起点としてデータを書く方する方法で配列を取り扱う。
16ビットのアドレスでメモリの場所を指定する。命令はMOVを使う。MOV AL,12H MOV [0100H],ALこれで
12H を0100Hアドレスに格納したことになる。
BXレジスタを使う方法。
メモリにデータを格納し、それを使って演算を行う方法解説。取り扱うときはALレジスタを仲介。
メモリはCPUの外、レジスタは中、レジスタに格納するほうが高速。
配列のようにデータを格納して取り扱う例。BP=ベースポインタ、SI=ソースインデックス、DI=ディスティネーションインデックスを使う方法。実際には同じ機能をもつレジスタに割り当てるだけだが、機能がわかりやすいように、このように命名するのが一般的。
6.9 条件分岐
フラグとジャンプ命令を組み合わせて条件分岐を行う。
8086CPUに装備されているフラグ
OF(オーバーフローフラグ)符号付演算で桁あふれが発生した状態
DF(ディレクションフラグ)ストリング命令で増減の方向を指定する
など
フラグの状態はDEBUGコマンドでレジスタの内容を表示しているときに右下の欄で確認できる。
例としてZF(ゼロフラグ 演算の結果が0であることを表す)を使った分岐が解説されていた。
ジャンプ命令には無条件で指定したアドレスに移動するものもある。フラグと条件ジャンプ、無条件ジャンプの組み合わせでselect...case...end selectのような機能も実現している。
6.10 論理演算
アセンブラのプログラムではビットの処理が増える分だけ、論理演算を使用する機会が増える。高級言語のような論理値がないことも影響している。アセンブラでは値の判定処理より、ビット演算を使う方が高速で自然。
AND,OR、XOR,NOT,NEG(2の補数をとる)、TEST(AND演算を行うがフラグだけたてて値は変化させない)最後の二つは8086特有。
使い方は加算や減算と同じ。
偶数と奇数の判定ではビットの右シフトを使うのが一般的、最下位ビットのみの判定でよいので。
6.11 繰り返し処理
LOOP命令を使ってCXレジスタが0になる指定されたアドレスにジャンプするという処理で、繰り返し機能を実現している。
6.12 サブルーチンの呼び出し
サブルーチンの呼び出しにCALL、元のアドレスに戻るRETが用意されているのみ。
引数も戻り値もない。
アセンブラではすべのメモリ領域がプログラム内で共有されている。
そのため、プログラムが大規模になるとわかりにくくミスの元になる。
第7章 さまざまなコンピュータ言語と開発環境
7.1 原始的なコンピュータ言語
機械語
機械語はCPUが直接実行できる唯一のコンピュータ言語。
2進数で格納され、通常は16進数で表記されるデータの塊。プログラムとデータが格納されている。
人間がプログラムを作成するときには、機械語と1対1のニーモニックという記述を使用する。
CPUの種類ごとに機械語は異なる。高級言語と違って命令の種類は少ない。
計算ではレジスタを使用し、8086CPUの場合汎用レジスタは4種類。通常アキュムレータと呼ばれるレジスタが中心的に使われる。
レジスタとメモリには整数値しか格納できないので、小数などを使用するときはプログラマが自分有に値の構造を定義して使う。
高速で、ハードウェアのスペックをもっともひきだせる。
プログラム例としてコラッツ予想がのっていた。
コラッツ予想・・・ある自然数nに対して、それが奇数なら3倍して1を加え、偶数なら2で割る、これを繰り返すと、どのよう自然数からはじめても最後は1→4→2→1の繰り返しになる。とういもの、まだ証明はされていない。
アセンブラ
ニーモニックより人間に近い言語表現で、プログラミングを補助する機能として、メモリ領域に名前をつけることができる、定数を定義できる、ラベルをつけられる、文字列を記述できることなどが追加された。
データ型を指定した宣言はできない。
コンピュータに接続されているデバイスドライバなどはアセンブラを使っているものも多い。
コラッツ予想のプログラム例を紹介。機械語と共通。
クロスアセンブラ・・・最終的にプログラムを実行するハードウェアと異なるハード魚エアで機械語のプログラムを開発するためのもの。
逆アセンブル・・アセンブラを機械語に戻すこと。
MASM・・・・マクロアセンブラ、WindowsDDK(ドライバ開発キット))に含まれている。
7.2 初期のコンピュータ言語
FORTRAN
1954年IBMのジョン・バッカスが数式で記述されたプログラムを解釈して機械語にコンパイルできるコンピュータ言語を考案した。これがFORTRAN。
世界で初めての高級言語。高級言語の研究開発のはじめとなった。
他の処理系の機能をとりいれて、本の自転でFORTRAN90が最新で、自由カラム、ポインタ、モジュールなどが組み込まれた。
スーパーコンピュータなどで使われている。数多くの数値計算用ライブラリが充実しており、言語仕様が数値演算処理に最適化した構造であること、さまざまなメーカーが処理系に対して積極的に最適化技術をとりいれていることから、現在でも科学技術計算に使用されている。
FORTRAN77は特に多くのプログラマに利用された。パンチカードを使っていたころの名残が固定カラム方式にあらわれている。
条件分岐と繰り返し(単純なもののみ)が装備されており、入れ子にできる。行ラベルはループの飛びさきなどに使用される。比較演算子が一般的な言語と大きく違うサブルーチンも使用できるが引数は参照渡しに限られる。
FORTRAN90での追加機能
・多重分岐SELECT CASEの追加
・条件によって繰り返しを行うDO WHILEの追加
・繰り返しを制御する命令としてCYCLE文(Continue)、ECXIT文(break)が追加
・構造体が使用できる
・型の定義と変数をまとめるモジュール機能が追加
・配列操作に関するライブラリの強化
・再帰呼び出しが可能に
・ポインタを使用して動的配列の割り当てができるようになった。
1-10までの数値を加算して、その経過を出力する例
COBOL
1959年米国国防省が事務処理用にメーカーとともに開発。
通貨の最小単位を正確に計算できるようなデータ型を用意。
ファイルを扱うことが常に意識されていて、ファイル内のデータ構造の形式を指定する書式がある。表形式のデータ処理に特化した言語。
1行に1命令、固定形式だと1-6カラム→一連番号領域、7カラム→標識領域(前の行からの継続やコメントを表す)、8カラム以降→プログラムと決められている。
見出し部、環境部、データ部、手続き部にわけてプログラムを記述。
言語仕様も構造化されているので、仕様変更に強く、保守性にすぐれている。
データに対して演算処理を行う場合はCOMPUTE命令を使用する。COMPUTE データ項目=演算式
条件分岐はIF命令とEVALUAR命令、反復はPERFORM で成立条件を指定する方法、繰り返し回数を指定する方法、カウンタ変数を使用する方法がある。
例として九九の表を出力するプログラムがのっていた。
配列は表と呼ばれる、表はOCCURS句で指定してデータ名(添え字)で使用する。
「報告書機能」は指定された報告書の形式でデータ出力する命令。
簡単な英単語はすでに予約語として登録されていることが多い。
例として入力ファイルを1件ずつ読み込んで、商品ごとに数量を集計して合計金額を計算し、出力ファイルにだすプログラムがのっていた。
ALGOL
1950年代後半に、アルゴリズムをできる限りスムーズに記述するために開発された言語。
エドガー・ダイクストラが提唱した構造化の機能をとりいれた初めてのコンピュータ言語。
構造化と再帰呼び出しの機能がついていた。
FORTORANでは言語の構文に関する規則にあいまいなところがあったので、厳密な言語仕様を策定して解決した。
ALGOL68では使用が複雑でコンパイラをつくるのが困難になり、あまり使われなくなったが、仕様はC言語やPascalに影響を与えている。
変数はあらかじめ宣言しておかなければならい(入力ミスが減り、コンパイル時にエラーが見つけやすい)
ブロック構造(複数の分をBEGIN ENDでまとめる、プログラム全体もそう)とローカル変数の導入。
プログラム例はユークリッドの互除法で最大公約数を求めるもの。
PL/I(ピー・エル・ワン)
1960年代後半、コンピュータの利用範囲が広がり、科学技術計算と事務処理に分類しておくのが困難になった。汎用的言語が求められた。
ALGOLを基にして、FORTRANとCOBOLのよいところを併せ持つ言語として開発。
構造体、エラー処理、マルチタスク機能、ビット処理などが盛り込まれた。
1964年Multics(マルチックス)というOSの記述に採用された。これはUNIXの先祖みたいなOS。
大規模な言語仕様をもつのでコンパイラの開発が困難で多くのライブラリを必要とするため実行ファイルが大きくなる欠点があった。このためIBMの大型汎用機でりようされることがほとんどだった。
2カラム目から72カラム目の間にプログラムを記述できる。
データ型は、整数、実数、複素数、倍精度(処理系により精度は異なる)が用意された。
文字演算が可能で、文字列を扱う関数も多く用意されている。
サブルーチンでは値を返すことができる。RETURN 値
再帰呼び出しもできる。
条件分岐はIF...THEN...ELSE構文。DO...ENDでブロック化してTHEN節やELSE節に複数の文を記述可能。
反復のDO分には、変数の初期値、終了値、増減値を指定する、反復条件を指定、反復に使用する値を列挙の記述法がある。
プログラム例では1-10までの数値を加算して、その経過を出力するがのっていた。
Simula(シュミラ、シミューラ)
1962-67にノルウェー計算センターのクリステン・ニガードとオルヨハン・ダールが開発。
さまざまな事象をシュミレーションするために開発された。
オブジェクトという概念を導入した初めてのコンピュータ言語。
クラス、継承、銅的束縛の機能をそなえている、はじめてのオブジェクト指向言語と呼ばれている。
7.3 C言語系
B言語
BCPLという言語の縮小版として1970年DEC社のPDP-7で開発された。
コンパイラによって中間言語を生成し、それをインタプリタ上で動作させるタイプのコンピュータ言語。
データ型はもたない。
誕生までの流れ
ALGOL60→CPL→BCPL→B言語→C言語
C言語
ベル研のデニス・リッチーとブライアン・カーニハンが1973年にB言語を改良して開発。
コンピュータ上でそのまま事項可能な機械語プログラムを出力するコンパイラにした。
豊富なデータ型。
C言語でUNIXが書きなおされた。UNIXは大学に無償で配布されて拡大した。OSのソースも公開されていた。
機種に依存する部分はコンパイラの機能に含まれないで、ライブラリとして組み込まれる。機種依存が低くなり、さまざまなハードウエアに展開した。
コンパイラは小さく、移植も容易、パソコンでも使用された。世界中で幅広く使われるようになった。
簡潔にプログラムを記述できよるように工夫されている。Pascalの表記と比較していた。
代入文自体が値を持てるので、そのまま条件判定ができる。(習得のハードルともなっている)
while((c=fgetc(fp)) != EOF ){...では、c=fgetc(fp)) が値を持つ。
真偽を表す型がなく、整数を代わりに使用する。
1を加える処理、指定した値を加算する処理はアセンブラと類似の書式があり、高速化に寄与している。
処理の流れをこわすことが多いgoto文ではあるが、ループの中断や再実行ではないとわかりずらいこともある。
break、continueの導入。
変数のアドレスを記憶する特殊な変数ポインタ。これによりメモリを直接操作できる。
プログラミングの幅はひろがるが、馬具の原因にもなる。
サンプル、ファイルの内容を画面に出力する関数、文字列をコピーする関数(代入文が値をとる例でもある)、文字列を比較する関数(ポインタで配列を処理する例でもある)
インラインアセンブラという機能が搭載されている処理系もある。使用すると互換性は失われる。
C++(シー・プラス・プラス、シー・プラ・プラ)
C言語の機能を提供しつつ、オブジェクト指向のプログラミングを支援する目的でベル研のビアルネ・ストラウストラップによって1979年から開発。
Sumilaからクラスの概念を導入。
1983年に課そう関数や演算子の多重定義が追加されて頒布が開始された。
C言語の上位互換なのでC言語のプログラムがそのまま使える。
最初UNIXで動作するものだったが、マイクロソフト社のVisual C++ ボーランド社のBorlandC++が発売され、Windows用のアプリケーション開発の標準言語としても利用されるようになった。
追加された機能の中でも代表的なものを紹介
コンストラクタ・デストラクタ、静的束縛と銅的束縛、多重継承、関数の多重定義(オーバーロード)、演算子の多重定義(オーバーロード)、テンプレート(型をパラメータとして渡し、手順のみを記述できる機能、他の言語でジェネリックや総称とよばれる)
プログラム例では複素数の演算をおこなっている。
C#(シー・シャープ)
2002年にマイクロソフト社が .NET Framwork用の開発言語として開発。
C++を拡張。JavaやVisualJ++に近い文法。
C#は .NET Framwork用なので実行ファイルでなくCLR(Comon Language Runtime 共通言語ランライム)用の中間コードを生成する。
当初マイクロソフト社のVisualC#.NETでのみ利用できたが、ボーランド社のDelphi2005に搭載された。
C++やJava、Visual Basicとの相違点を中心に特徴を説明。
クラスをまとめるのにJavaはパッケージ、C#では名前空間(Namespace)という概念を使う。
Javaではimport C#ではusing
GUIを構成する部品の属性の値を取得変更する方法はVisual Basicと同じ。
デリゲートが追加されている。デリゲートは関数ポインタに似た機能。変数宣言とその変数へ代入できる関数の型を定義する機能、関数の引数として使用することで、関数の引数に関数を渡すことが可能になる。
デリゲートがない処理系では関数の引数としてオブジェクトしか渡せないので、イベントハンドラを登録するにはクラスで包んで関数に渡す必要があった。
反復を抽象化した「イテレータ(反復子)」を使って繰り返しを定義するためのforeach分が用意されている。
イテレータはCKKではSTL(スタンダード・テンプレート・ライブラリ)として提供されていた。
ガベージコレクションがサポートされている。
演算子のオーバーロードが定義できる。
配列の配列と2次元配列が定義できる。
C++に似た構造体を記述するためにstruct宣言が用意されている。クラスはヒープ領域、structはスタック領域に確保される。構造体はObjectクラスを暗黙的に継承している。
不適切な多重定義によるバグをなくすために、多重定義を有効にするためにはvirtualとoverrideを記述する必要がある。
サンプルはユークリッドの互除法で最大公約数を求めるプログラム。
比較のため同じ動作をするプログラムがVisual J++、 Visual J#、 Visual Basic.NETでかかれている。
Objective-C(オブジェクティブ・シー)
C言語にオブジェクト指向の機能を導入したコンピュータ言語。
1983年にスtップスートン者の創設者ブラッド・コックスが開発。
1985年NeXTコンピュータ(スティーブ・ジョブズがつくった)のOSであるNeXTSTEPの開発言語になった。
このコンピュータは黒いキューブ型の特徴的携帯で画面表示にDisplay PostScriptをとりいれていた。
その後ハードから撤退しNextソフトウェアとなり、NeXTSTEPの技術はOPEN STEPとして公開された。
1997年アップルにNeXTソフトウェアが買収され、OPENSTEPは改良されてMac OS Xとなった。
よってObjective-CはMac OS Xの標準的なアプリケーション開発言語である。
Smalltalkで採用されたメッセージ送信によってオブジェクト指向を実現。
そのためC++とは見た目からかなり違う。
変数の代入 Objective-Cはオブジェクトへのポインタ、C++ではオブジェクトまたはオブジェクトへのポインタ
関数(メソッド)呼び出し、Objective-Cは動的束縛のみ、C++は静的束縛と銅的束縛
継承 Objective-Cは単一継承のみ許可、C++は多重継承が許可
演算子のオーバーロード、Objective-Cは不可能、C++は可能
7.4 Pascal系
Pascal
1968年スイス連邦工科大学のにクラウス・ヴィルトがコンピュータ言語の適切な教育を目的として開発。
構造化に必要な構文をそなえており、プログラムをすっきり記述できるという特徴があった。
そのため、同じアルゴリズムなら、だれが書いても同じようなプログラムになるという性質がある。
ユーザがデータ型を定義できる。
言語仕様がコンパイラの開発に適していたので、多くのコンピュータ上で動作するようになった。
1978年カリフォルニア大学サンディエゴ校のケネス・ボウルズが開発したUCSD PascalはP-Codeという中間コードをP-Machineとよぼれるインタプリタの仮想環境上で動作させるJavaのようなものだった。
1983年に発売されたボーランド社のTurbo Pascalは驚異的コンパイル速度と、使いやすい統合開発環境で世界的ヒットになった。
ALGOL60がベースなのでスタイルが似ている。
順接、分岐(if文、case文)、反復(for文、whie文、repeat...unitil文)が用意されているので構造化されたプログラムが記述しやすい。
構造化プログラミング→段階的に詳細化してプログラムを作成する→入れ子構造。Pascalで実現しやすい。
言語の厳密性のため、使う目に変数や関数は必ず宣言。
変数は通常の型の他に、列挙型、部分範囲型、集合型、レコード型、ポインタ型が用意されている。
記述形式は自由形式。複数行のコメントもOK。可読性の向上。
現在では一般的なものが多い。つまりPascalが与えた影響は大きい。
プログラム例は階乗を計算するもの。
Object Pascal(Delphi言語)
Pascalにクラスや継承などのオブジェクト指向機能を拡張したもの。
1995年にボーランド社が開発した統合開発環境Delphiに搭載。
Delphiはフォームデザイナを持つグラフィカルな統合開発環境。
豊富な機能とコンパイルや実行が早いのが支持の理由になった。
データベースを簡単に操作するクラスを装備。
ボーランドが開発したLinux上の統合開発環境Kylixにも採用されている。
Delphi7からはObject PascalからDelphi言語に名称が変更されている。
継承、多重定義、オーバーライド機能がある。
クラスの宣言はtype...endで定義、クラス型には、メンバ変数、メンバ手続き、メンバ関数を定義できる。
多くのクラスをまとめるUnitという単位が用意されている。
例外処理機能を装備
単一継承機能あり、静的束縛と動的束縛両方を備えている。
プログラム例はクラスの継承と多重定義、オーバーライドを使用した円と色つきの円をかくプログラム。
Ada
1970年代米国国防総省が制御ソフトを統一しようと開発。
1983年にANSI標準規格、1986年にISO規格として制定されている。
世界初のプログラマと呼ばれるエイダ伯爵夫人からとった名前。
厳密な言語仕様をもつ、多機能なコンピュータ言語。
コンパイラを使用するのにミニコンピュータやワークステーションを必要とするのでパソコン向けに普及しなかった。
1990年代にはオブジェクト指向の導入。1995年にISO標準としてオブジェクト指向言語として初めて承認。
この時点では2005年の規格が最新。
コンパイラに対して厳密な互換性を保証させるためAdaコンパイラであると認定する試験がある。
記述の効率より読みやすさ優先。保守の必要性から。
特徴は、厳密な型付け(動的結合は許さない)、パッケージの導入(外部へ公開するものを宣言)、並列処理(タスク)、例外処理、汎用体(C++ のテンプレートと多重定義を組み合わせた機能に似たもの、型や大きさを変えたスタックのプログラムを簡単に用意できる)
サンプルはコラッツ予想プログラムをWindows200ProfessionalのObjectiveAda for Windows Special Edition 7.2.2で作成したもの。
7.5 Java系
Java
サン・マイクロシステムズ社のジャームズ・ゴスリンがデジタル家電向けに開発したOakという言語を、インターネット向けに改良したもの。1995年に発表。
Javaと同時にJavaで開発されたHotJavaというWebブラウザも発表。音声や動画を直接再生できた。
インターネットでアプリケーションを配信できるアプレット技術と、その開発言語Javaが話題に。
1999年にJavaを大幅に機能拡張したJava2(JDK1.2)が発表。
バイトコードという中間コードをJava仮想マシン(JVM)で実行する仕様。
速度が遅いという欠点はハードの進化がおぎなった。
Java仮想マシンが動作する環境ならどんなコンピュータ上でも動作するようになった。
研究言語でなく、実用として開発された。既存のよいところをとりいれて、不要なものは削除した仕様。
バランスがよい、インターネットとともに普及した。
C++に似た構文を採用したオブジェクト指向言語。
クラスの定義と継承・・・インナークラス(クラスの中にクラスを定義する)や名前を指定せずにクラスを定義できる匿名クラスがある。継承は単一継承
マルチスレッド・・・言語の使用として組み込まれている
実行時コード生成・・・JITコンパイラで実行時コードを生成。インタプリタは遅いので。
ガーベージコレクション
シリアライズ・・・現在のオブジェクト群の状態をファイルに保存できる。そして保存したオブジェクトをメモリにロードして実行を再開できる。
アプレットとiアプリ、EZアプリ、Vアプリ・・・静的なWebページをつくるアプレット、他は携帯電話のなかで動作する単独のアプリケーション。携帯会社によって名称が異なる。
セキュリティ対応・・・インターネット前提なので、バイトコードの正当性チェック、コードの署名、メモリ領域チェック機能がついている。
安全性が携帯電話に採用された理由の一つである。
プログラム例はアプレットでマウスで句陸した場所に5つの円を描画するプログラム。
Visual J++
マイクロソフト社が開発したJava系の言語。
Visual J++1.1はJDK1.2準拠、その後Visual Studio6.0でVisual J++6.0となった。
Visual J++6.0はJDK1.1に準拠しているが、Windowsアプリケーションの開発を補助するために大幅に機能が拡張されている。
WFCの使用(マイクロソフトの開発したライブラリなので、Windows上でしか動作しなくなる)、
ActiveXコントロールの利用(Windows上でしか動作しなくなる)、ADO(ActiveX技術でデータベースと連携するライブラリ、Windows上でしか動作しなくなる)サポート、 RADツール(フォームデザイナ)として利用。
プログラム例はユークリッドの互除法。
Visual J#
Visual J++の後継言語で、マイクロソフト社が開発したJava系のコンピュータ言語。
Visual J++を .NET Framwork仮想環境に対応させたもの。
つまり.NET Framwork環境で動くjavaアプリケーションが開発できる。
ADO.NETが利用できる。
IISで動的なWebページの生成に使用するASP(Active Sever Pages)でも利用できる。
JDKと同等の機能をもつクラスライブラリを使用できるが、Javaのバイトコードは生成できない、アプレットも作成できない。
.NET FramwrokのCLRがガーベージコレクションを実行してくれる
サンプルはユークリッドの互除法。
7.6 BASIC系
BASIC
1964年、入門者のためのコンピュータ言語として、ダートマス大学でジョン・ケメニーとトーマス・カーツが開発。
対話型の環境で初心者でも気軽にプログラム作りを始められる。
1980年代のパソコンの登場とともに広まり、研究者や専門プログラマから一般大衆まで広まった。
パソコンに標準OSが搭載されていない時代で、電源をいれるとBASICが起動した。
BASICはOSの代わりとしてROMに搭載されていた。
ケメニーとカーツがBASICをパブリックドメインとして配付したことも広がる要因になった。
言語仕様でさえ変更を禁止しなかったので、異なる仕様のBASICがたくさんうまれた。
このため同じメーカーのBASICでさえ、以前のプログラムが動かないような事態も生まれた。
対話型で画面に命令を入力すると即座に結果がでる仕組みになっている。
インタプリタ型の代表言語で、対話形式であることとあわせて、非常に処理内容がわかりやすい。
いつでもプログラムを停止して、変数値を確認したり、変更したりできた。
プログラムに行番号が必要であったが、デメリットの方が大きかった。
構造化された美しいプログラムを書きにくいので、広がりはあったものの、教育現場ではPascalが使われるなどの状態が生まれた。
例として1から10まで加算するプログラムで仕様があいまいなため、処理系で結果が異なる例をあげていた。
プレグラム例は「リバースゲーム」
ビル・ゲイツとポール・アレンは1975年にインテル8080CPUで動作するBASICを開発した。これがマイクロソフト社のはじまり。その後IBMにOSとBASICを提供したのが発展のきっかけとなった。
QuickBASIC
プログラムの規模が大きくなるにつれ、BASICの生産性の低さが目立つようになった。
MS-DOSが隆盛を極めるようになると、Turbo Pascal、Turbo Cなどがシェアを奪うようになってきた。
これに対抗するためマイクロソフト社が構造化の概念を取り入れたQuickBASICを開発した。
内容はBASICの命令語を採用しただけのまったく新しい言語だった。
統合開発環境もつけられ、CUIの時代ではあったが、エディタ、イミディエイトウィンドウというデバッグに使える一時実行領域がついていた。ブレークポイントも設定できるし、ヘルプもついているので、いちいちマニュアルをさがさなくてよくなった。EXEファイルが生成できるようになった。
例としてBASICとQuickBASICのコラッツ予想プログラムがのっていた。
Visual Basic
QuickBASICの後継言語としてマイクロソフト社が開発した統合開発環境。
1991年に最初のバージョンが発売され(日本は未発売)それだけはMS-DOS版もある、
ウィンドウ環境に対応したアプリケーションを迅速に開発するためのフォームデザイナがついた。
このためユーザインターフェース部分はQuickBASICの資産は使えなかった。
使いやすい統合開発環境とWindowsとの相性の良さで、それほど速度を要求されない業務システム構築の標準言語として広く使用された。
簡単にフォームのレイアウトが変更できるので、プロトタイプをつくりながら開発するスタイルがとれるようになった。
フォームの制御のためにオブジェクト指向がとりいれられ、言語に大きな拡張性をもたせることになった。
データベースの操作に長けており、OLE準拠の追加のコントロールを購入して、画面に配置するだけで、データベース操作機能が使えるようになった。他にDAO、ADOを使うほうほうもあり、OracleやDB2にも接続できる。
中間コードを利用するため、アプリケーションとは別にランライム自体のインストールが必要なため、インターネットの大量配布にはむかない。
プログラム例は、QuickBASICのコラッツ予想をアレンジしたもの。
Visual Basic.NET
Visual Basicの後継言語。.NET Framworkとう共通プラットフォーム上で動作するアプリケーションを開発するための統合開発環境。
2002年に発売されたVisual Basic.NET2002が最初で、これはVisual Studio.NETにも含まれている。
表面的な命令文などはVBと似ているが、.NET Framwork対応のため内部はかなり変わっている。
統合開発環境はVisual C#.NETなどと共通で利用する。
Webフォームに対応している。マイクロソフト社のWebシステム開発環境Visual InerDevが統合したもの。
IISで使用することでWebブラウザで表示できるビジュアルなフォームを作成する機能。
VBであったVariant型は廃止された、Dim a,b as Integerの解釈は、a,bともにIntegerとなった。VBはaはVariantと解釈。
GOSUBステートメント、Typeステートメントの廃止。Visual C++.NETなどと融合しやすくするため。
組み込み関数がCLRのクラスやVisual Basicランタイムライブラリのメンバとして置き換えられた。
そのため命令が長くなった例をあげていた。
文字列の左から5文字をaにコピーする場合、VBなら a=LEFT(txtInput,5) だが、.NETだと a = Strings.Left(txtInput.Text,5)などとなる。 オブジェクト指向の厳密性が取り入れられた影響。
引数の指定が省略されるとVBは参照渡し、.NETでは値渡しになる。
VB6.0とは上位互換なし。
手軽なプログラミング環境でなくなったが、これまでのVBの大規模開発の欠点を取り除いた言語ともいえる。
サンプルはユークリッドの互除法。
VIsual Basic for Application
マイクロソフト社が開発したアプリケーション埋め込みようのVisual Basic。
Visual Basicの言語エンジンをもとに開発、個々のアプリケーションで利用するオブジェクトにアクセスできるコンピュータ言語。
1994年のExcel5.0に初めて搭載。現在はWord,PowrPint、Access、Outlook、FrontPageなどに搭載。
各アプリケーションから実行できるマクロ機能として導入されている。
ExcelやWordでは、ユーザの操作を補助するマクロ記録機能が装備されている。
記録されたマクロはVBAのプログラムとして生成されるのでユーザが修正できる。エディタもある。
プロパティの修正やフォームの作成、デバッグ機能も装備している。
ブックやワークシートをオブジェクトとして操作。参照設定画面で別のアプリケーション用のライブラリを追加すると、他のアプリケーションのオブジェクトを操作することも可能。
サンプルはコラッツ予想プログラム
7.7 スクリプト系
Perl
UNIXコマンド,rn、pachなどの作者ラリー・ウォールが開発したスクリプト。
1987年、ネットワークのログを分析して報告書を自動生成するプログラムをawkで記述しようとしてうまくいかず、自分で作ったもの。
ログの分析を分析、整形するという目的から、tr、grep、sed、awk、shとC言語のよいところの組み合わせで作ったという。
同じしょりでも全く別のコードで記述できるほど構文が用意されている。
構文に関する知識が多いほど、完結にプログラムが記述できるが、読みにくくもなるので注意が必要。
最大の特徴はパターンマッチングなど、テキスト処理に優れていること。
HTMLを出力するためのCGIでも広く使用されている。
強力な拡張機能でシステムコールを利用できる。
インタプリタ型の弱点である速度が遅い点以外は、どのような目的にでも対応できる汎用言語になった。
1994年リリースのPerl5ではオブジェクト指向の概念がとりいれられた。
連想配列機能=ハッシュがある。
演算機能の特徴として「コンテキスト」という概念があり、演算結果として何を返すべきか自動で決定する機能。
制御構文は、条件判定のif文、条件判定を逆にしたunless文、else説に記述する条件分岐elseifがある。これらのブロックはかならず{}で囲む。
反復は、条件による繰り返しwhile文、初期化と更新を同時に記述できるfor文、while文の条件判定を逆さにしたuntil文、リストを順番に処理するのに適したforeach分が装備されている。繰り返し制御として、繰り返しの最後に処理を移動するnext文、ループを脱出するlast文、条件式を再評価せずに繰り返しの先頭に処理を移動するredo文がある。
正規表現を用いた文字列の検索および置換が可能。
正規表現を使いやすくするための、文字表現の略記法、繰り返しを細かく指定する記法が追加されている。
Perl5ではリファレンス(変数のデータの登録箇所を取得できるポインタ)、パッケージ(大義した変数が見える範囲をパッケージとしてプログラマが指定できる)、モジュール(パッケージ名と同じ名前のファイル名で拡張子をPMとしたファイルに保存したもので、ある一連の処理をする関数や変数をまとめたもの)が追加。
パッケージとリファレンス、bless関数を使用するとオブジェクト指向のプログラムを記述できる。
bless関数は第一引数で指定されたリファレンスが、第2引数に指定されたパッケージに属するように設定する。
Perlにおけるクラス定義はパッケージを作成することになる。
サンプルは正規表現を使って、英数字と「_」で構成される単語の数をカウントして結果を出すプログラム。
ハッシュによる文字列出現回数のカウント
foreachによる配列要素の繰り返し。
$_には直前の処理値が格納される。
初めてのPerl 第6版
Python(パイソン)
グイド・ヴァン・ロッサムが教育用プログラミング言語ABCとModula-3の概念を組み合わせて、設計した言語。
Modula-3はPascalをつくったニコラウス・ヴィルトがPascalにモジュール機能を搭載して機能を強化したコンピュータ言語。
習得のしやすさを目標にしているので、表面上の高度な機能からは考えられないほど、シンプルでわかりやすい言語仕様になっている。
最初はMacintoshで動作するものだったが、Windows、Linux系OS、UNIX系OS、PalmOSなどに移植された。
Tk、gtk+、Qt、MFCなどによるGUIサポートがある。
標準モジュール以外でもインターネットで様々なモジュールを手に入れることができる。
代表的利用例
Red Hat系LinuxディストリビューションにおけるGUIを使用したインストーラおよび環境設定ツール
MailMan(Web上で設定や管理が可能なメーリングリストマネージャ)
ZopeとうWebアプリケーションサーバー
インタプリタ型の簡易言語だが、Javaのようにバイトコードにおける異機種間での互換性あり。
C言語のプログラムに埋め込んだ形での利用も可能。
対話モードでの利用ができる。
保存済みのソースファイルをパラメータとして利用可能なので、コマンドラインからプログラムを実行できる。
多重継承できる。
コードがシンプルだといわれるC言語やC++よりシンプルなコードがかける。
その理由は
インデントによるブロックの記述によってプログラムを簡潔にしている。
辞書型やリスト型といった多機能なデータ型で複雑な処理を簡単な命令で実現できる。
変数や引数における型宣言が必要ない。
複数の変数に同時に値を代入できる。
特徴として
豊富なデータ型と正規表現
インデントによるブロックの記述
反復処理
複数の変数への値の代入
ガーベージコレクション
プログラム例は配列の値を探索して検査値がみつかる場合、見つからなかった場合。
初めてのPython 第3版
Ruby(ルビー)
1995年「まつもとゆきひろ」氏が開発。
PerlやPythonであきたらず、理想とするオブジェクト指向スクリプト言語を開発した。
対話的に利用できるrib、PHPのようにHTMLファイルに埋め込んで利用できるeRubyなど多彩な利用方法が用意されている。
インタプリタ形式で実行するオブジェクト指向のスクリプト言語。
クラス定義可能、単一継承のみがサポート。
多重継承の代わりにMixinというあらかじめ定義されたモジュールを取り込む機能。
モジュールからメソッドを探索する方法は明確な規則が定められているため、メソッドが衝突した場合でも、問題なく動作するようになっている。
ハッシュや正規表現など、すべてがオブジェクト。
ハッシュは連想配列の拡張、添え字に文字列だけでなくオブジェクトを指定できる。
特徴として
変数の型宣言がなく、スコープの種類が命名方法できまっている。
制御構造、ifやunlessが命令だけでなく修飾子としても用意されているので、文の後ろにつけると、条件が成立したとき前の文を実行する。
反復ではfor...in文でオブジェクトの各要素を順番に取り出して処理を繰り返せる。
timesメソッドを使用すると繰り返し回数を簡単に指定できる。
メソッドにブロックを渡せるので、反復を抽象化したイテレータを実現している。最近はブロック付きメソッドと呼ばれている。
マルチスレッド、マシンレベルのスレッドは使わないので、マルチスレッド機能の無いOSでも利用できる。
ガーベージコレクションや例外機能もある。
プログラム例は単語の数を数えて出現頻度の少ない順に表示するプログラム、単語は英数字、「_」「-」で構成される文字列。
プログラミング言語 Ruby
PHP(ピー・エッチ・ピー)
デンマークのラスマス・らーどふがホームページのアクセス分析のためにPerlを使用したCGIプログラムを記述したのが始まり、その後同僚などに使用された。
CGIはシステムに負荷がかかるのでC言語で作り直した、それにHTMLのフォームを動的に作成する機能をもつFormInterpreter(FI)を組み込んだのが1995年にオープンソースとして公開されたのが「PHP/FI」
Webシステム開発で使われるようになり、プロジェクトグループが開発を行うようになった。
イスラエルのゼーブ・スラスキーとアンディ・ガトマンズが作り直したPHP3。
PHP3は拡張性を備えた使いやすい言語だったが、記述されるスクリプトが大きくなると処理速度が遅くなるので、書きなおされたのがPHP4。
2004年にリリースされたPHP5でオブジェクト指向などの機能が強化された。
PHPをインストールしたWebサーバは、スクリプトを含んだWebページのリクエストを受けると、PHPのスクリプトを処理し、実行結果としてHTMLファイルを生成してクライアントに送信。WebサーバのApacheではPHPをモジュールとして組み込むことで、1回のアクセスで1つのプロセスを生成するCGIよりも高速にプログラムを実行できる。
特徴として
HTMLファイルに埋め込むことで動的なWebページを簡単に作成することがdきるインタプリタ型の言語。
プログラムの記述と実行を繰り返し行うスタイルの開発作業が簡単で、動的なWebページを容易に開発できる。
変数を宣言せず、先頭に$をつけて使用する。連想配列をサポート。
制御構文は多くがC言語に似ている。
文字列処理が非常に得意で正規表現可能。
デバッグが簡単でエラー情報が行蛮行とともにHTML状に出力されるようになっている。
データベースとの連例が非常に用意。
プログラム例は九九の表をPHPで計算してHTMLで出力。
Programming PHP
JavaScript
Webブラウザ上でアニメーションや簡単なプログラムを実行できるようにするため、ネットスケープコミュニケーションが開発したスクリプト言語。
Javaの言語エンジンとは関係ない。
1996年にネットスケープコミュニケーションズ社のNetscape Navigator2.0に導入、その後マイクロソフト社のInternet Explorer3.0でもサポートされて、クライアントサイドスクリプトの標準となった。
HTMLファイル内の
コメント 0