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ファイル内のタグで囲まれた領域にプログラムを記述することでWebページ内に動的な処理を付加できる。
オブジェクト指向の考え方が導入されており、テキストボックスやボタンなどのWebページ上の各種コントロールをオブジェクトとして操作できる。
各演算処理、変数や配列定義、条件分岐の機能も提供されていて、シンプルな言語仕様ながら一通りの処理は実現できる。
値が数値、文字列、論理型3種類しかなく、変数がすべてVariant型。
Netscape Navigator3.0とInternet Explorer4.0以降では、タグにプログラムを記述することでJavaScriptを実行できるようになっている。
最大の特徴はHTMLファイルに埋め込むことができること。Webブラウザさえあれば、特別な実行環境がいらない。
ある程度の規模になるとデバッグが大変になる。
Webページを補助するスクリプトという利用方法に限定したほうがよい。
またHTMLファイルのソースがみなにみられてしまうので情報漏えいの可能性がある。
プログラム例としてWebページ上に表示された「日付表示」ボタンをクリックすると日付を表示する。
JavaScript 第6版
VBScript
1999年にマイクロソフト社がWebページに埋め込むことができるWindows用のスクリプト言語として開発。
ベースはVisual Basicが採用されているが、簡易言語の色合いが強く、別の言語といえる。
クライアントWebブラウザで実行するスクリプトとして動作するが、IISのASPという拡張機能におけるスクリプト言語としても使える。
データ型はすべてVariant型。
インタプリタ型の言語なので処理速度が遅く、事前の構文チェックによって文法エラーや構文エラーなどはわからない。
Format関数やStrConv関数が装備されていないので、業務系のシステムの開発ができない。
主な用途は、HTMLに埋め込んで処理を実行させる。Windows用のスクリプトとして実行する。IISで動的にHTMLを生成する。
サンプルで「日付表示」プログラムを例に解説。
VBScriptでWebシステムを構築するメリットとして、
IISなどのWebサーバの他にはテキストエディタがあれば開発可能。
CGIではプログラムですべてのHTMLを出力していますが、VBScriptではHTML中にプログラムを埋め込むことができるため、HTMLデザインの編集が簡単になった。
マイクロソフト社のVisual InterDevを使用することでデバッグ作業を行える。
ファイルのインクルードも可能なので、汎用関数を特定のASPファイルにまとめることができる。
小規模な業務システム構築に適したコンピュータ言語。
非常に強力なのでウィルスに利用されたこともある。
VBScript Pocket Reference
JScript
マイクロソフト社がWebページに埋め込むことができるJavaScript互換として、Internet Explpre4.0から採用したスクリプト言語。
イメージとしてはJavaScriptの方言。
VBScriptと同様の使われ方をする。
基本的な言語仕様はJavaScriptと同じ、ファイル操作やCOMオブジェクトの操作などで機能拡張が行われている。VBScriptより速度が遅いのであまり使われない。
ASP.NETではVBScriptやJScriptは使えなくなったが、JScript.NETが新たに登場している。
プログラム例は、VBScriptやJavaScriptで取り上げたサンプルを紹介。
クライアントサイドスクリプトとしてHTMLにいれられた日付表示をするサンプル。
WindowsScriptingHost(WSH)の日付表示
サーバーサイドスクリプト(ASP)で動的にクライアントに日付を表示するHTMLファイルを生成する。
WSHクイックリファレンス 第2版
Tcl/Tk(ティクル/ティケー)
インタプリタ言語のTcl(Tool Command Language)とGUI構築機能をもつライブラリであるTk(Tool Kit)から構成されている。
カリフォルニア大学バークレー校のオゥスターホゥトがIC設計用の対話的アプリケーションを開発していたが、汎用的な使用可能なコマンド言語がほしくて開発したもの。それが1988年にTclとして完成。
Tkはアップルコンピュータ社のHyperCardのようなグラフィカルな対話型アプリケーションを作成するツールを研究した勝ったスターホゥトが、代わりに細かい部品をライブラリとして提供して、組み合わせて作成するツールを考えたもの。UNIXのX Window Systemのツールキットとして提供。
このふたつがそろってつかわれることが多い。
Tclの特徴はC言語のライブラリとして実装されていること。
ターゲットのアプリケーションにリンクして実行できる。
tclshとうシェルから呼び出して実行することもできる。利用している人はこの方法が多い。
変数の代入にsetコマンドを使用。
数式を評価すうrときにexprコマンドを使用.exprは指定されたすべての引数をつないだ文字列を数式として解釈して演算子、その結果を実行結果として返すコマンド。
制御構造は条件分岐のifコマンドswitchコマンド、繰り返しのwhileコマンド、foreachコマンドなどが用意されているが、文法ではなくコマンドなので制約がある。
文字列処理のコマンドもあり、正規表現が使用できる。
連想配列も使用できる。
TkもC言語のライブラリの形で実装されているので、他のアプリケーションに取り込むことができる。
作成できるコントロールはボタン、テキストボックス、ラジオボタン、チェックボタン、メニューなどがあり、一般的なGUIのフォームを作成する機能がそろっている。
TclにTkのライブラリを呼び出すコマンドを追加するこで両者が結合される。
wishはTcl/Tkを使用するために開発されたシェル。これを使ってスクリプトでGUIのフォームを表示する例がのっていた。
プログラム例は10問の足し算に答えて、最後に結果がポップアップで表示されるもの。
Tcl/Tkデスクトップリファレンス (Programming tools)
awk(オーク)
UNIXで動作する一つのツールとして開発された。
以下のUNIXコマンドを装備して、その上で数の概念を取り入れたのがawk
sort・・・行ごとに並べ替え
grep・・・指定された正規表現に照合する文字列が出現する行のみを表示
sed・・・指定されたコマンドによって文字列の置換などを行う
制御構造もあり、ツールというより言語。
現在はUNIXだけでなく、さまざまなプラットフォームで動作している。
1977年にベル研で、アルフレッド・エイホ、ブライアン・カーニハン、ピーター・ワインバーガーによってつくられたので、3人の頭文字から命名された。
1985年にユーザ定義関数、動的正規表現の機能が組み込まれた。
特徴は、テキスト処理に特化したインタプリタ言語だということ。
awkの構文は学習しやすいようにC言語に似せて作ってあるが、変数宣言やデータ型は存在しない。
テキスト処理を行うツールはデータは行単位で処理するのが一般的で、awkもそうなている。
行はレコード、空白やタブで区切られた文字列をフィールドと呼ぶ。
フィールドの数を表すNFやレコードの数を表すNRとう組み込み変数が用意されていて使用できる。
演算関数などの組み込み関数も用意されている。
ユーザが新たな関数を定義することもできる。
プログラムは基本的にパターンマッチとそれに対応する処理で構成される。
パターンの記述が省略されるとすべての行に対する処理として実行される。
BEGINとENDというパターンが用意されていて、データを読み始める前と後のアクションを記述できる。
制御構文、if for do...while whileが用意されている。記述はC言語とほぼ同じ。特殊なものとしてはfor...inで配列の添え字を順番に変数に代入する機能がある。
連想配列も使用できる。
プログラム例は連想配列を使って単語の出現頻度を調べるもの。
プログラミング言語AWK
BASH(バッシュ)
Bourne Again SHellの略。
LinuxなどのOSのシェル(ユーザーと対話してコマンドの実行などを行うプログラム)として利用できる。
インタプリタ言語の実行エンジンとしても利用できる。
UNIXのシェルは他にcshやtcshがあってユーザが選択できる。
1988年ブライアン・フォックスが開発。
最初のバージョンはBシェルあるいは単にshと呼ばれた。
その後開発にチェット・レイミーが参加して、彼が今の公式管理者。
シェルプログラムの多くはシェルスクリプトという実行手順をこきこんだファイル(スクリプトファイル)を実行する機能をもっていて、BASHのスクリプト実行機能は条件分岐など、C言語と同等の機能をもつ。
特徴は、コンパイルの必要がなく開発が容易。
システムで利用できるコマンドをスクリプト内で実行できる。
内部で実行したプログラムが出力した情報を再利用したり、コマンドの実行を制御したりできる。(Perlなどは無理)サーバ用の起動スクリプトなどとして利用できる。
システムの状態が格納されている環境変数を使用することもできるので、環境に依存したスクリプトを書くことができる。
プログラム例は、使用しているOSの名前とアーキティクチャ-を表示するもの。
入門bash 第3版
REXX(レックス)
IBM社が開発したスクリプト言語。
汎用機用のコマンド処理言語であるEXECを元にREXが開発され、名前をREXXにかえた。
1979年から1982年の間にマイク・カウリショウを中心に開発された。
VM/SPというOSで対話型通信を行うためのソフトCMSのコマンド処理言語として採用。
コマンド処理言語としてシステム制御するだけでなく、文字列処理と算術演算機能を備え、一般的な目的に利用することもできる。
PL/I ALGOL APLなどを参考に開発。
特徴は、変数の宣言が不要で動的な有効範囲を持つこと。
制御構造や関数を定義する構文があり、通常のプログラミング言語と同様に使える。文字列処理をはじめとする組み込み関数が充実している。
OS/2に付属して有名なシェルスクリプトになり、Windows、Linux、Mac OS Xの処理系もある。
高級言語の機能を装備したシェルスクリプト言語。
オブジェクト指向をとりいれたObject REXXも登場している。
プログラム例は、ファイルの拡張子を判断して実行するコマンドを選択するもの。
7.8 関数型言語
LISP(リスプ)
MITのジョン・マッカーシーによて1950年代の終わりに開発開始、1960年に完成。
FORTRANができて数年後のこと。
マッカーシーは人工知能が専門で、その研究用に開発された。
当時コンピュータ言語は計算が主要目的だったが、LISPではリストを扱うことができるようになっていた。
記号処理や文字列処理に適していたので、エキスパートシステムや推論システムに採用された。
人工知能言語の代名詞になった。
利用が増えるとともに方言がふえたため、1984年にComon Lispが策定された。
Prologも人工知能研究で使用されることが多いが、LISPは人工知能用の言語としては低級、Prologは高級といわれることが多い。
特徴はインタプリタ型の言語、初めての関数型言語(関数の定義だけでプログラムを記述する言語)。
変数の宣言不要。関数の引数も宣言不要。
概念さえわかれば、かっこに囲まれた複雑そうなみかけより、ずっと簡単に操作できる。
S式という特有の記述を使う、引数arg1 arg2をとる関数fooの記述はS式で(foo arag1 arg2)
プログラムもデータもS式であつかうが、データの場合は括弧の前に「'」をつける。
リストは二つのオブジェクトをコンス・セルでつないだもの、セルはデータ格納部を刺し、コンスはデータを結合しているポインタ格納部を指す。
リスト操作はcar(コンス・セルの前者をとる)とcdr(コンス・セルの後者をとる)がある。
プログラムもリスト構造で表現するので、実行時に大量のセルを消費する、不要になったセルを消去する仕組みとしてガーベージコレクションが考え出された。
関数を関数の引数として渡したり、関数の戻り値として関数をうけとることができるようになっている。
制御構造は、条件分岐のif、多重条件分岐のcondがある、反復は、カウンタ変数を増やしながら処理を繰り返すdotimes、リストで与えた値を順番に渡しながら処理を繰り返すdolist、無限ループ用のloopなどがあり、これらを利用すると実際には手続き型の記述もできる。
プログラム例は数式の微分を行うもの。
Land of Lisp
Scheme
LISPの方言の一つとして生まれた。
1975年にジェラルド・サンスマンとガイ・スティールJrによって開発された。
LISPとしてはコンパクト。
研究と教育を目的に開発。あいまいさがなく、きれいに簡潔にまとめられている。
インターネットで入手可能。
Standard ML
1974年に、エディンバラ大学のロビン・ミルナーが開発。
メタ言語=言語を記述する言語。
元はEdinburgh LCFという定理照明システムの一部。
現在の代表的な処理系は、ベル研とプリンストン大学の共同研究で開発されたStandard ML for New Jersey
特徴は関数型言語で、関数を値として扱えること。
対話型のインターフェースでプログラムを記述することが可能。記述されたプログラムを読み込むのも可能。
プログラムで型を定義しなくても、型を自動的に推論し決定する「型推論」が装備されている。
関数は多相型関数(汎用性が高く、任意の型のデータを扱うことが可能な関数)、高階関数(引数として関数を受け取ったり、戻り値として関数を返すことができる)を使用できる。
研究用途だけでなく、実用的な用途にも利用可能。
Standard ML基本ライブラリを使用すると実用的なプログラムが書ける。
Windowsで、四則演算を実行する例をあげて型推論、関数の引数、戻り値などを解説。
プログラム例は、関数を引数にとる関数と、リストのパターンマッチング
The Standard ML Basis Library
LOGO
1967年にMITのシーモア・ぱぱーとが開発。
タートル(亀)へ命令することができる子供向け教育用言語。
最初は亀のロボットだったが、その後コンピュータ画面で動作するようになった。
パパートの思想は、「子ども達が自分のやり方で思考の道具として成し得るようなものを他にむけて造りだすこと」、「プログラムとはタートルに新しい言葉を教えること」というもの。
自らの考えた目的を達成するためにプログラミングするとう思想。
特徴としてはインタプリタ言語。対話型実行が可能。
データ型はもたないがLISPに似た強力な関数型言語。
「forward、left、right、penup、pendown」などタートルに指示を出す命令の他に、
四則演算、べき乗、乱数、SIN、COSなどの演算命令や、分岐条件や反復の制御命令、ファイル操作命令まで用意されている。
サンプルとして日本語版LOGO「ロゴ坊」を使ってタートルで図形をかくのを解説。
サンプルでは九九の表を出力するをとりあげ、入力出力制御構造が使えるのをしめている。
LEGO MINDSTORMは子ども様なカラフルなブロックをつくっているレゴ社が販売している教育用のロボットキット。商品パッケージの側面にパパート博士のメッセージが記されている。
レゴ マインドストーム EV3 31313
7.9 論理型言語
Prolog
1965年ロビンソンによって銃津語論理のための推論規則である導出原理発表。
導出原理は論理型言語の基になった。
1971年エディバラ大学のロバート・コワルスキーが論理式をホーン節に制限すると、論理型言語の処理効率が上がり実用的なシステムが開発できることを証明。
最初の処理系はマルセイユ大学でFORTRANで記述された。
その後、アセンブラで、そしてProlog自身で記述された処理系が登場。
それが高速だったので普及した。
特徴は
論理式を処理する論理型言語
対話型インターフェイスによるプログラミング
高度なパターンマッチング機能
プログラム例は、与えられた文章が最初に定義した文法に沿っているかを調べ、それぞれの単語の品詞を求める簡単な自然言語処理プログラム。
7.10 その他の言語
Smalltalk(スモールトーク)
1970年代初頭、ゼロックスのアラン・ケイがだれでも簡単に操作できる未来のコンピュータの姿を考え、片手で持ち運べるほどのノートパソコンで画像や音声を扱うことができ、子ども達でも簡単に利用できるものとして、Dynabookと命名。
そしてそのふぉふとウェアとしてAltoという試作機の上で暫定的環境としてSmalltalkが実装された。
AltoはCUIだったが、SmalltalkはGUIだった。
Smalltalkは環境とその上での開発言語という2つの側面をもつ。
環境としてはグラフィカルな画面の上にアイコンやウィンドウをもつ現在のGUIの基礎となるもの。
言語としては対話型インターフェースを備えたオブジェクト指向のインタプリタ言語で、LISP,LOGO,Simulaの影響をうけている。オブジェクト指向とう言葉はSmalltalkはのプログラム構造を説明するために作られた。
LOGOではコンピュータの動作を理解するのに視覚的にタートルを使ったが、それだと実現できることが限られる。
Smalltalkはタートルを一般的なオブジェクトに拡張した。
タートルに与えていた命令はオブジェクトへのメッセージ送信となる。
Simulaに装備されていたオブジェクト指向の基礎となる、クラス、継承、動的束縛の概念を取り込んだ。
1980年パークプレースシステムズからSmalltalk-80として販売された。
正当な処理系としてObjectWorks,VisualWorksと名前をかえている。
コンピュータ言語としての特徴は、すべてのデータをオブジェクトとして扱うこと。
数値や文字列など通常の言語では基本的なデータもすべtオブジェクトとして扱う。
クラスもオブジェクトとして扱う。
変数に型がない。
Smにおける演算処理はオブジェクトへのメッセージ送信になり、戻り値は必ずオブジェクトになる。
メッセージは必ず左から右へ評価される。
制御構造はブロックと呼ばれるオブジェクトを利用。
ブロックはBlockContextクラスのインスタンスでコンパイルされたSmalltalkコードのかたまり。
{}で囲まれており、その状態ではまだ評価されず、メッセージvalueを指定すると評価される。
ブロックは引数をもてる。 例 [ 3 + 5 ] value →8と表示される。
他に制御構造の例もあげていた。
クラスの定義ができて、単一継承のみできる、メソッドは動的束縛。
Smalltalkは仮想機械の上で実行しているので、速度をあげるため実行時コード生成をおこなっている。
非常に拡張性は高いが、すべてがオブジェクトであるために学びにくい面がある。
プログラム例はSampleCircleクラスの定義
Squeak(スクイーク)
当時アップルコンピュータ社に所属していたアラン・ケイとダン・インガルスを中心とするメンバによって199年12月から開発が開始されたフリーのSmalltalk-80.
仮想機械もSmalltalkで記述されており異色性が非常に高いのが特徴。
当初Macintoshで開発されたが、その後多くのプラットフォームに移植された。
仮想機械で動くので保存されたイメージファイルはどの機種上でも実行できる。
現在はSqueak FoundationというNPOによって管理されている。
子ども達や普通のユーザーの教育用言語として開発された。
Apple版のSmalltalk-80がアセンブラで記述されたものをC言語に書きなおすことが検討されたが、面倒なのでだれもやりたがらなかった。
そこでカーネルをSmalltalkで実装、SmalltalkのサブセットをC言語に変換するトランスレータを開発。
こうして10週間で、最終的にC言語による高速なカーネルを手にいれた。
開発効率がよいのはSmalltalk自体の良さもある。
言語仕様としてはSmalltalkと全く同じなのでサンプル例もない。
FORTH
米国国立電波天文台職員のチャールズ・ムーアが観測の自動化を目的に開発。
最初の原型は1968年。
簡潔性が信頼性と拡張性につながあるという考えで設計されたもので独創的だった。
最大の特徴は、スタックにデータを格納し、逆ポーランド記法でプログラムを記述すること。
逆ポーランド記法を採用すると構文解析の必要がなく、計算処理を簡単に実装できる。
システムのコアがとても小さなプログラムで記述できる。
この利点から現在も組み込み用システムやロボット制御といったメモリ制約の多い場面で使用されている。
処理を「ワード」と呼ばれる単位で格納、ワードを集めたものを「ディクショナリ」として管理。
ユーザがワードを定義することも可能。組み込みのワードも同様に使える。
ワードで自己拡張可能なので第4世代言語と呼ばれる。
インタプリタ形式の処理系が一般的だがコンパイラもある。
逆ポーランド記法だとコンピュータのCPUに搭載されているスタック機能をうまく利用して、構文解析なく処理w実行できる解説。
構文の特徴
変数宣言→variable 変数名
変数の参照方法→ 変数名@
変数への代入→値 変数名!
条件分岐→if 処理 else 処理 then
一定回数の反復処理→終了値 開始値 do 処理 loop
条件位よる反復処理→begin 条件判断のための処理 while ループ本体 repeat
スタック操作用命令
dup スタックの先頭にある要素と同じ要素をスタックに積む
2dup スタックの先頭とその次にある要素をスタックに積む
drop スタックの先頭要素取り出し
swap スタックの先頭とその次の要素を交換。
. スタックの先頭の要素を取り出して表示。
rot スタックの底にある要素を抜き出してスタックに積む。
ワードを定義する記述があるので、何度も同じ処理を記述しなくていい。→:double dup *.;なら10doubleで100を得られる。
プログラム例はユークリッドの互除法。
ちなみにアドビのPDFで使用されているPostScriptとうページ記述言語も逆ポーランド記法で記述されるスタック処理型言語
Mind
すべての命令を日本語で記述できるコンパイラ型言語。
逆ポーランド記法で記述された命令をスタックで処理する。
1985年リギーコーポレーション社の片桐明氏によって開発。
NECのPC-9801で開発されたが、その後多くのハードウェアに対応。
Windows版やUNIX版がリリースされている。
ひらがなを無視する機構を搭載し、自然な日本語に近い記述を可能にした。
1+2 → FORTHだと 1 2 + →Mindでは 1に2を加える となる。
逆ポーランド記法は自然な日本語に近い記法。
プログラミングには時間がかかるが、Mindの記述を理解できないユーザでもおおよその中身がわかるソースコードができあがる。記述より読む方が簡単なのは大きな特徴。
特徴として
日本語の解釈は空白で区切って、先頭以外のひらがなを無視という解釈機構を使っている。
否定形の送り仮名は使えない(コンパイルエラーになる)
目的語の順番をいれかえる助詞のみ、一定の形式になるよう変換。
プログラムは単語のまとまり。
新しく単語を定義するとき→挨拶とは(改行) 「こんにちは」を 表示すること。
一般的な言語では関数定義に相当する。
実行するときには → メインとは(改行) 挨拶する。 となる。
コンパイラからはMコードとう中間コードが生成され、「ディスパッチャ」とよばれるランタイムプログラムで実行。
プログラムを別の環境で動作することができる。
現在発売されているWindows版では、Tcl/Tkのエンジンを利用することで、ウィンドウの生成やコントロールの配置などのGUI操作が可能になっている。
MindでTcl/Tkを呼び出すプログラム例。
プログラム例はコラッツ予想
Excelマクロ
マイクロソフト社の表計算ソフトExcelに搭載されていたマクロ言語。
現在のExcel2003に搭載されているのはVisual Basic for ApplicationなのでExcelマクロとは違う。
Excelにおける一連のコマンド操作を自動化するための簡易プログラミング機能のこと。
現在のExcelでも互換性のために以前のマクロを実行、修正する機能が装備されている。
特徴は、特殊なExcelシートに決められたコマンドを記述する形式で作成すること。
Excelのワークシートにユーザが行うあらゆる操作を記述することができる。
例として、D1セルを選択し、そこに=B1+C1の式を入力して薄い黄色をつけるマクロを作成修正していた。
SQL(エス・キュー・エル、シークェル)
リレーショナルデータベースの汎用的な操作言語。
1970年、IBM者のサンノゼ研究所のエドガー・F・コッドの論文で初めて提唱された。
集合論をもとにRDBの概念を提唱したもの。
同研究所で最初に開発されたRDBのSystem Rの操作言語がSEQUEL。
1976年新しいバージョンがでたときSQLに改名。
1987年、ISOとJISでSQL87の規格が策定。
1990年代にワークステーションやパソコンでRDBが動作するようになり、各社から機能拡張したRDBが発売されるようになる。
現在の多くのRDBのSQLは1992年のSQL92仕様がベース。
プログラム例としてマイクロソフト社のSQL Server 2000で動作するコラッツ予想プログラムを紹介。
拡張SQLである「Transact-SQL」で記述したストアドプロシージャ(データベースに保存することができるプログラムコード)
実行にはあらかじめIDとResultのint型のフィールドを定義したTResultテーブルが必要だと注意書きあった。
7.11 統合開発環境の種類と特徴
Visual Studio
マイクロソフト社から販売されているプログラム開発環境の統合パッケージ。
最初のバージョンは1997年出荷。Visual Basic 5.0、Visual C++5.0、Visual J++1.1、Visual InterDev1.0、Visual SourceSafe5.0が同梱されていたが、ヘルプや開発補助ツールは装備されていたものの、言語間で統合された開発環境になってはいなかった。複数言語の統一開発環境.NETのもとになった製品。
Visual InterDevはWebシステムを構築するための補助ツール。マイクロソフト社のWebサーバIISで動作するASPを利用したアプリケーションを構築できる、VBScriptやJScriptによる開発ができる、デバッグ機能がある。
Visual SourceSafeは複数プログラマによる開発を補助するツール。
Visual Studio6.0からはソフトがすべて6.0に揃えられた。
Visual Studio .NET
マイクロソフト社が提供する.NET Framworkというプラットフォーム上のアプリケーションを開発するための統合開発環境。
.NET Framworkに準拠したことにより、Visual Studioとは格言の仕様が大きく変わった。
最初のバージョンは2002年に発売。その後2003年に機能が修正されたVisual Studio.NET2003が発売。
含まれていた開発環境は、Visual Basic.NET2003、Visual C#.NET2003、Visual C++.NET2003、Visual J#.NET2003、Visual SourceSafe6.0
各言語が一つの環境に融合されたことが最大の特徴。
プロジェクトの上位にソリューションという概念を導入。
個々のプロジェクトを指定した言語で記述する単位になる。
複数プラグラマが参加するチーム開発をみすえている。
C++の一部を除いて、.NET Framework環境で動作するので、OSや機種に依存しない。
生成されるコードはMSILと呼ばれる中間コード。
Windowsでも.NET Frameworkが必要になる。
.NET Frameworkの実体は、プログラムを実行するためのエンジン部分であるCLR(共通言語ランタイム)と、ククラスライブラリ、CLRは.NET開発環境で生成される中間コードを解釈する。
.NET FrameworkではSOAPというプロトコルでXMLベースのメッセージをやりとりして、より柔軟にサービスや構造化されたデータを利用することができる。
Microsoft Visual Studio Professional 2013 通常版
Delphi/Kylix
Delphiはボーランド社が販売しているObject Pascal(Delphi言語)の統合開発環境。
1993年Windows3.1用(16ビット)、Windows95用(32ビット)にDelpahi2が発売。
Windows用の開発環境だが、Delphi7には同等の機能を有するLinux用の開発環境Kylixを同梱。
Delphi7からは搭載言語のObject PascalがDelphi言語と改名。
Delphi8は.NET Framework対応版
Delphi2005では、Delphi7、Delphi8、C#Builderの機能を統合したもの。
Kylix3ではObject Pascalに加えてC言語とC++が使用できるようになっている。
特徴はフォームエディタを搭載した高機能なRADツールであること。
Delphiの最大の特徴は高速なコンパイルとパフォーマンスの高い実行ファイル。
生成される実行ファイルは中間コードを含まない32ビット版のWindows用のネイティブなプログラムになりランタイムなしで実行できる。
GUIのコンポーネントライブラリとしてVCLというフレームワークを提供。
.NET Framework対応Delphiでは、VCLとの高い互換性を持つVCL for .NETを提供して.NET Frameworkへの移植性を高めている。
KylixにはLinux用のCLXとうコンポーネントライブラリが提供され、WindowsとLinuxにおけるクロスプラットフォームの開発を実現。文字コードの違いがあるので完全ではない。
Delphiのデバッグ機能は、ステップ実行、トレース実行、ブレークポイント設定、関数呼び出し履歴表示、監視式の登録など高機能で使いやすい。
生成された機械語プログラムを確認しながらデバッグできるCPUウィンドウも装備されている。
命令ごとに対応するアセンブラコードだけでなく、レジスタやフラグの状態が確認できる。
業務システムだけでなく、パッケージソフトやフリーウェアなど様々なアプリケーションの開発環境として人気が高い。
Borland Delphi 7 Personal
JBuilder
ボーランド社が販売しているJavaの統合開発環境。
Windows、Macintosh、Linuxで利用できる。
1997年Windows95およびWindows NT4.0 用の開発環境として発売。
Javaが発表されたのが1995年。
この時点でJBuilder2005が最新。
特徴として、コード入力支援機能、リアルタイムにエラーを検出する機能、自動的なソースのバックアップと比較、ウィザードによる支援、モバイルアプリケーションの開発があげられていた。
JBuilder2005には個人用や学習用に無償で提供されるFuoundation版、企業の大規模開発支援のEnertprise版などがある。
JBuilder 2007 アカデミックパック1 (マルチプラットフォーム版)
Zend Studio
イスラエルのゼンド社が販売しているPHPによるWebシステム用の統合開発環境。
PHP3と4、それらの言語エンジンZend Engine1.0を開発したメンバ、ゼーブ、スラスキーとアンディ・ガトマンズが設立した会社で、PHP4のライセンスも同社の保有。
2004年のZend Studio3.5ではPHP4とPHP5がサポートされている。
クライアント用とサーバ用のソフトウェアが用意されている。
クライアントからWebサーバを操作してリモートでバッグができる。
クライアントだけでもデバッグできる。
開発環境内に用意されている「アウトプット領域」では、プログラムの実行にあわせて、HTMLの出力結果が随時表示される。
任意の場所にブレークポイントを置くとその時点におけるHTMLを確認できる。
ステップ実行しながら少しずつ生成されるHTMLの内容も確認できる。
停止したところの経過をWebブラウザに表示できる。
クライアント開発環境はJavaで記述されているので、プラットフォームを選ばないが、速度は遅い。
Zend Studio4.0 日本語版
CodeWarrior
一般的なパソコンOSの他に、PDAやゲーム機のプラットフォームまで幅広い製品が提供されている。
ただし、これらの製品間でソースコードが流用できるのではなく、開発環境として共通の機能と操作性を実現しているということ。
C言語とC++が組み込まれている。
Windows用やMacintosh用のバージョンではJavaも組み込まれている。
多種の製品が存在するので特徴のところではCodeWarrior Learning Edition for Mac OSについて解説。
ひな形をステーショナリから選択するとスケルトンができて、プログラムを記述できる。
Mac OS向けにPowerPlanatとうプラットフォームがクラスライブラリとして提供されているので、Mac OS上のGUIアプリケーションを効率的に開発できる。
クラス階層ウィンドウでクラスの階層をビジュアルに確認できる。
Java用にはRADツールが装備されているので、GUIのフォームを簡単に作成できる。
CodeWarrior Learning Edition for Windows 日本語版 バージョン 2.0
第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ファイル内のタグで囲まれた領域にプログラムを記述することでWebページ内に動的な処理を付加できる。
オブジェクト指向の考え方が導入されており、テキストボックスやボタンなどのWebページ上の各種コントロールをオブジェクトとして操作できる。
各演算処理、変数や配列定義、条件分岐の機能も提供されていて、シンプルな言語仕様ながら一通りの処理は実現できる。
値が数値、文字列、論理型3種類しかなく、変数がすべてVariant型。
Netscape Navigator3.0とInternet Explorer4.0以降では、タグにプログラムを記述することでJavaScriptを実行できるようになっている。
最大の特徴はHTMLファイルに埋め込むことができること。Webブラウザさえあれば、特別な実行環境がいらない。
ある程度の規模になるとデバッグが大変になる。
Webページを補助するスクリプトという利用方法に限定したほうがよい。
またHTMLファイルのソースがみなにみられてしまうので情報漏えいの可能性がある。
プログラム例としてWebページ上に表示された「日付表示」ボタンをクリックすると日付を表示する。
JavaScript 第6版
VBScript
1999年にマイクロソフト社がWebページに埋め込むことができるWindows用のスクリプト言語として開発。
ベースはVisual Basicが採用されているが、簡易言語の色合いが強く、別の言語といえる。
クライアントWebブラウザで実行するスクリプトとして動作するが、IISのASPという拡張機能におけるスクリプト言語としても使える。
データ型はすべてVariant型。
インタプリタ型の言語なので処理速度が遅く、事前の構文チェックによって文法エラーや構文エラーなどはわからない。
Format関数やStrConv関数が装備されていないので、業務系のシステムの開発ができない。
主な用途は、HTMLに埋め込んで処理を実行させる。Windows用のスクリプトとして実行する。IISで動的にHTMLを生成する。
サンプルで「日付表示」プログラムを例に解説。
VBScriptでWebシステムを構築するメリットとして、
IISなどのWebサーバの他にはテキストエディタがあれば開発可能。
CGIではプログラムですべてのHTMLを出力していますが、VBScriptではHTML中にプログラムを埋め込むことができるため、HTMLデザインの編集が簡単になった。
マイクロソフト社のVisual InterDevを使用することでデバッグ作業を行える。
ファイルのインクルードも可能なので、汎用関数を特定のASPファイルにまとめることができる。
小規模な業務システム構築に適したコンピュータ言語。
非常に強力なのでウィルスに利用されたこともある。
VBScript Pocket Reference
JScript
マイクロソフト社がWebページに埋め込むことができるJavaScript互換として、Internet Explpre4.0から採用したスクリプト言語。
イメージとしてはJavaScriptの方言。
VBScriptと同様の使われ方をする。
基本的な言語仕様はJavaScriptと同じ、ファイル操作やCOMオブジェクトの操作などで機能拡張が行われている。VBScriptより速度が遅いのであまり使われない。
ASP.NETではVBScriptやJScriptは使えなくなったが、JScript.NETが新たに登場している。
プログラム例は、VBScriptやJavaScriptで取り上げたサンプルを紹介。
クライアントサイドスクリプトとしてHTMLにいれられた日付表示をするサンプル。
WindowsScriptingHost(WSH)の日付表示
サーバーサイドスクリプト(ASP)で動的にクライアントに日付を表示するHTMLファイルを生成する。
WSHクイックリファレンス 第2版
Tcl/Tk(ティクル/ティケー)
インタプリタ言語のTcl(Tool Command Language)とGUI構築機能をもつライブラリであるTk(Tool Kit)から構成されている。
カリフォルニア大学バークレー校のオゥスターホゥトがIC設計用の対話的アプリケーションを開発していたが、汎用的な使用可能なコマンド言語がほしくて開発したもの。それが1988年にTclとして完成。
Tkはアップルコンピュータ社のHyperCardのようなグラフィカルな対話型アプリケーションを作成するツールを研究した勝ったスターホゥトが、代わりに細かい部品をライブラリとして提供して、組み合わせて作成するツールを考えたもの。UNIXのX Window Systemのツールキットとして提供。
このふたつがそろってつかわれることが多い。
Tclの特徴はC言語のライブラリとして実装されていること。
ターゲットのアプリケーションにリンクして実行できる。
tclshとうシェルから呼び出して実行することもできる。利用している人はこの方法が多い。
変数の代入にsetコマンドを使用。
数式を評価すうrときにexprコマンドを使用.exprは指定されたすべての引数をつないだ文字列を数式として解釈して演算子、その結果を実行結果として返すコマンド。
制御構造は条件分岐のifコマンドswitchコマンド、繰り返しのwhileコマンド、foreachコマンドなどが用意されているが、文法ではなくコマンドなので制約がある。
文字列処理のコマンドもあり、正規表現が使用できる。
連想配列も使用できる。
TkもC言語のライブラリの形で実装されているので、他のアプリケーションに取り込むことができる。
作成できるコントロールはボタン、テキストボックス、ラジオボタン、チェックボタン、メニューなどがあり、一般的なGUIのフォームを作成する機能がそろっている。
TclにTkのライブラリを呼び出すコマンドを追加するこで両者が結合される。
wishはTcl/Tkを使用するために開発されたシェル。これを使ってスクリプトでGUIのフォームを表示する例がのっていた。
プログラム例は10問の足し算に答えて、最後に結果がポップアップで表示されるもの。
Tcl/Tkデスクトップリファレンス (Programming tools)
awk(オーク)
UNIXで動作する一つのツールとして開発された。
以下のUNIXコマンドを装備して、その上で数の概念を取り入れたのがawk
sort・・・行ごとに並べ替え
grep・・・指定された正規表現に照合する文字列が出現する行のみを表示
sed・・・指定されたコマンドによって文字列の置換などを行う
制御構造もあり、ツールというより言語。
現在はUNIXだけでなく、さまざまなプラットフォームで動作している。
1977年にベル研で、アルフレッド・エイホ、ブライアン・カーニハン、ピーター・ワインバーガーによってつくられたので、3人の頭文字から命名された。
1985年にユーザ定義関数、動的正規表現の機能が組み込まれた。
特徴は、テキスト処理に特化したインタプリタ言語だということ。
awkの構文は学習しやすいようにC言語に似せて作ってあるが、変数宣言やデータ型は存在しない。
テキスト処理を行うツールはデータは行単位で処理するのが一般的で、awkもそうなている。
行はレコード、空白やタブで区切られた文字列をフィールドと呼ぶ。
フィールドの数を表すNFやレコードの数を表すNRとう組み込み変数が用意されていて使用できる。
演算関数などの組み込み関数も用意されている。
ユーザが新たな関数を定義することもできる。
プログラムは基本的にパターンマッチとそれに対応する処理で構成される。
パターンの記述が省略されるとすべての行に対する処理として実行される。
BEGINとENDというパターンが用意されていて、データを読み始める前と後のアクションを記述できる。
制御構文、if for do...while whileが用意されている。記述はC言語とほぼ同じ。特殊なものとしてはfor...inで配列の添え字を順番に変数に代入する機能がある。
連想配列も使用できる。
プログラム例は連想配列を使って単語の出現頻度を調べるもの。
プログラミング言語AWK
BASH(バッシュ)
Bourne Again SHellの略。
LinuxなどのOSのシェル(ユーザーと対話してコマンドの実行などを行うプログラム)として利用できる。
インタプリタ言語の実行エンジンとしても利用できる。
UNIXのシェルは他にcshやtcshがあってユーザが選択できる。
1988年ブライアン・フォックスが開発。
最初のバージョンはBシェルあるいは単にshと呼ばれた。
その後開発にチェット・レイミーが参加して、彼が今の公式管理者。
シェルプログラムの多くはシェルスクリプトという実行手順をこきこんだファイル(スクリプトファイル)を実行する機能をもっていて、BASHのスクリプト実行機能は条件分岐など、C言語と同等の機能をもつ。
特徴は、コンパイルの必要がなく開発が容易。
システムで利用できるコマンドをスクリプト内で実行できる。
内部で実行したプログラムが出力した情報を再利用したり、コマンドの実行を制御したりできる。(Perlなどは無理)サーバ用の起動スクリプトなどとして利用できる。
システムの状態が格納されている環境変数を使用することもできるので、環境に依存したスクリプトを書くことができる。
プログラム例は、使用しているOSの名前とアーキティクチャ-を表示するもの。
入門bash 第3版
REXX(レックス)
IBM社が開発したスクリプト言語。
汎用機用のコマンド処理言語であるEXECを元にREXが開発され、名前をREXXにかえた。
1979年から1982年の間にマイク・カウリショウを中心に開発された。
VM/SPというOSで対話型通信を行うためのソフトCMSのコマンド処理言語として採用。
コマンド処理言語としてシステム制御するだけでなく、文字列処理と算術演算機能を備え、一般的な目的に利用することもできる。
PL/I ALGOL APLなどを参考に開発。
特徴は、変数の宣言が不要で動的な有効範囲を持つこと。
制御構造や関数を定義する構文があり、通常のプログラミング言語と同様に使える。文字列処理をはじめとする組み込み関数が充実している。
OS/2に付属して有名なシェルスクリプトになり、Windows、Linux、Mac OS Xの処理系もある。
高級言語の機能を装備したシェルスクリプト言語。
オブジェクト指向をとりいれたObject REXXも登場している。
プログラム例は、ファイルの拡張子を判断して実行するコマンドを選択するもの。
7.8 関数型言語
LISP(リスプ)
MITのジョン・マッカーシーによて1950年代の終わりに開発開始、1960年に完成。
FORTRANができて数年後のこと。
マッカーシーは人工知能が専門で、その研究用に開発された。
当時コンピュータ言語は計算が主要目的だったが、LISPではリストを扱うことができるようになっていた。
記号処理や文字列処理に適していたので、エキスパートシステムや推論システムに採用された。
人工知能言語の代名詞になった。
利用が増えるとともに方言がふえたため、1984年にComon Lispが策定された。
Prologも人工知能研究で使用されることが多いが、LISPは人工知能用の言語としては低級、Prologは高級といわれることが多い。
特徴はインタプリタ型の言語、初めての関数型言語(関数の定義だけでプログラムを記述する言語)。
変数の宣言不要。関数の引数も宣言不要。
概念さえわかれば、かっこに囲まれた複雑そうなみかけより、ずっと簡単に操作できる。
S式という特有の記述を使う、引数arg1 arg2をとる関数fooの記述はS式で(foo arag1 arg2)
プログラムもデータもS式であつかうが、データの場合は括弧の前に「'」をつける。
リストは二つのオブジェクトをコンス・セルでつないだもの、セルはデータ格納部を刺し、コンスはデータを結合しているポインタ格納部を指す。
リスト操作はcar(コンス・セルの前者をとる)とcdr(コンス・セルの後者をとる)がある。
プログラムもリスト構造で表現するので、実行時に大量のセルを消費する、不要になったセルを消去する仕組みとしてガーベージコレクションが考え出された。
関数を関数の引数として渡したり、関数の戻り値として関数をうけとることができるようになっている。
制御構造は、条件分岐のif、多重条件分岐のcondがある、反復は、カウンタ変数を増やしながら処理を繰り返すdotimes、リストで与えた値を順番に渡しながら処理を繰り返すdolist、無限ループ用のloopなどがあり、これらを利用すると実際には手続き型の記述もできる。
プログラム例は数式の微分を行うもの。
Land of Lisp
Scheme
LISPの方言の一つとして生まれた。
1975年にジェラルド・サンスマンとガイ・スティールJrによって開発された。
LISPとしてはコンパクト。
研究と教育を目的に開発。あいまいさがなく、きれいに簡潔にまとめられている。
インターネットで入手可能。
Standard ML
1974年に、エディンバラ大学のロビン・ミルナーが開発。
メタ言語=言語を記述する言語。
元はEdinburgh LCFという定理照明システムの一部。
現在の代表的な処理系は、ベル研とプリンストン大学の共同研究で開発されたStandard ML for New Jersey
特徴は関数型言語で、関数を値として扱えること。
対話型のインターフェースでプログラムを記述することが可能。記述されたプログラムを読み込むのも可能。
プログラムで型を定義しなくても、型を自動的に推論し決定する「型推論」が装備されている。
関数は多相型関数(汎用性が高く、任意の型のデータを扱うことが可能な関数)、高階関数(引数として関数を受け取ったり、戻り値として関数を返すことができる)を使用できる。
研究用途だけでなく、実用的な用途にも利用可能。
Standard ML基本ライブラリを使用すると実用的なプログラムが書ける。
Windowsで、四則演算を実行する例をあげて型推論、関数の引数、戻り値などを解説。
プログラム例は、関数を引数にとる関数と、リストのパターンマッチング
The Standard ML Basis Library
LOGO
1967年にMITのシーモア・ぱぱーとが開発。
タートル(亀)へ命令することができる子供向け教育用言語。
最初は亀のロボットだったが、その後コンピュータ画面で動作するようになった。
パパートの思想は、「子ども達が自分のやり方で思考の道具として成し得るようなものを他にむけて造りだすこと」、「プログラムとはタートルに新しい言葉を教えること」というもの。
自らの考えた目的を達成するためにプログラミングするとう思想。
特徴としてはインタプリタ言語。対話型実行が可能。
データ型はもたないがLISPに似た強力な関数型言語。
「forward、left、right、penup、pendown」などタートルに指示を出す命令の他に、
四則演算、べき乗、乱数、SIN、COSなどの演算命令や、分岐条件や反復の制御命令、ファイル操作命令まで用意されている。
サンプルとして日本語版LOGO「ロゴ坊」を使ってタートルで図形をかくのを解説。
サンプルでは九九の表を出力するをとりあげ、入力出力制御構造が使えるのをしめている。
LEGO MINDSTORMは子ども様なカラフルなブロックをつくっているレゴ社が販売している教育用のロボットキット。商品パッケージの側面にパパート博士のメッセージが記されている。
レゴ マインドストーム EV3 31313
7.9 論理型言語
Prolog
1965年ロビンソンによって銃津語論理のための推論規則である導出原理発表。
導出原理は論理型言語の基になった。
1971年エディバラ大学のロバート・コワルスキーが論理式をホーン節に制限すると、論理型言語の処理効率が上がり実用的なシステムが開発できることを証明。
最初の処理系はマルセイユ大学でFORTRANで記述された。
その後、アセンブラで、そしてProlog自身で記述された処理系が登場。
それが高速だったので普及した。
特徴は
論理式を処理する論理型言語
対話型インターフェイスによるプログラミング
高度なパターンマッチング機能
プログラム例は、与えられた文章が最初に定義した文法に沿っているかを調べ、それぞれの単語の品詞を求める簡単な自然言語処理プログラム。
7.10 その他の言語
Smalltalk(スモールトーク)
1970年代初頭、ゼロックスのアラン・ケイがだれでも簡単に操作できる未来のコンピュータの姿を考え、片手で持ち運べるほどのノートパソコンで画像や音声を扱うことができ、子ども達でも簡単に利用できるものとして、Dynabookと命名。
そしてそのふぉふとウェアとしてAltoという試作機の上で暫定的環境としてSmalltalkが実装された。
AltoはCUIだったが、SmalltalkはGUIだった。
Smalltalkは環境とその上での開発言語という2つの側面をもつ。
環境としてはグラフィカルな画面の上にアイコンやウィンドウをもつ現在のGUIの基礎となるもの。
言語としては対話型インターフェースを備えたオブジェクト指向のインタプリタ言語で、LISP,LOGO,Simulaの影響をうけている。オブジェクト指向とう言葉はSmalltalkはのプログラム構造を説明するために作られた。
LOGOではコンピュータの動作を理解するのに視覚的にタートルを使ったが、それだと実現できることが限られる。
Smalltalkはタートルを一般的なオブジェクトに拡張した。
タートルに与えていた命令はオブジェクトへのメッセージ送信となる。
Simulaに装備されていたオブジェクト指向の基礎となる、クラス、継承、動的束縛の概念を取り込んだ。
1980年パークプレースシステムズからSmalltalk-80として販売された。
正当な処理系としてObjectWorks,VisualWorksと名前をかえている。
コンピュータ言語としての特徴は、すべてのデータをオブジェクトとして扱うこと。
数値や文字列など通常の言語では基本的なデータもすべtオブジェクトとして扱う。
クラスもオブジェクトとして扱う。
変数に型がない。
Smにおける演算処理はオブジェクトへのメッセージ送信になり、戻り値は必ずオブジェクトになる。
メッセージは必ず左から右へ評価される。
制御構造はブロックと呼ばれるオブジェクトを利用。
ブロックはBlockContextクラスのインスタンスでコンパイルされたSmalltalkコードのかたまり。
{}で囲まれており、その状態ではまだ評価されず、メッセージvalueを指定すると評価される。
ブロックは引数をもてる。 例 [ 3 + 5 ] value →8と表示される。
他に制御構造の例もあげていた。
クラスの定義ができて、単一継承のみできる、メソッドは動的束縛。
Smalltalkは仮想機械の上で実行しているので、速度をあげるため実行時コード生成をおこなっている。
非常に拡張性は高いが、すべてがオブジェクトであるために学びにくい面がある。
プログラム例はSampleCircleクラスの定義
Squeak(スクイーク)
当時アップルコンピュータ社に所属していたアラン・ケイとダン・インガルスを中心とするメンバによって199年12月から開発が開始されたフリーのSmalltalk-80.
仮想機械もSmalltalkで記述されており異色性が非常に高いのが特徴。
当初Macintoshで開発されたが、その後多くのプラットフォームに移植された。
仮想機械で動くので保存されたイメージファイルはどの機種上でも実行できる。
現在はSqueak FoundationというNPOによって管理されている。
子ども達や普通のユーザーの教育用言語として開発された。
Apple版のSmalltalk-80がアセンブラで記述されたものをC言語に書きなおすことが検討されたが、面倒なのでだれもやりたがらなかった。
そこでカーネルをSmalltalkで実装、SmalltalkのサブセットをC言語に変換するトランスレータを開発。
こうして10週間で、最終的にC言語による高速なカーネルを手にいれた。
開発効率がよいのはSmalltalk自体の良さもある。
言語仕様としてはSmalltalkと全く同じなのでサンプル例もない。
FORTH
米国国立電波天文台職員のチャールズ・ムーアが観測の自動化を目的に開発。
最初の原型は1968年。
簡潔性が信頼性と拡張性につながあるという考えで設計されたもので独創的だった。
最大の特徴は、スタックにデータを格納し、逆ポーランド記法でプログラムを記述すること。
逆ポーランド記法を採用すると構文解析の必要がなく、計算処理を簡単に実装できる。
システムのコアがとても小さなプログラムで記述できる。
この利点から現在も組み込み用システムやロボット制御といったメモリ制約の多い場面で使用されている。
処理を「ワード」と呼ばれる単位で格納、ワードを集めたものを「ディクショナリ」として管理。
ユーザがワードを定義することも可能。組み込みのワードも同様に使える。
ワードで自己拡張可能なので第4世代言語と呼ばれる。
インタプリタ形式の処理系が一般的だがコンパイラもある。
逆ポーランド記法だとコンピュータのCPUに搭載されているスタック機能をうまく利用して、構文解析なく処理w実行できる解説。
構文の特徴
変数宣言→variable 変数名
変数の参照方法→ 変数名@
変数への代入→値 変数名!
条件分岐→if 処理 else 処理 then
一定回数の反復処理→終了値 開始値 do 処理 loop
条件位よる反復処理→begin 条件判断のための処理 while ループ本体 repeat
スタック操作用命令
dup スタックの先頭にある要素と同じ要素をスタックに積む
2dup スタックの先頭とその次にある要素をスタックに積む
drop スタックの先頭要素取り出し
swap スタックの先頭とその次の要素を交換。
. スタックの先頭の要素を取り出して表示。
rot スタックの底にある要素を抜き出してスタックに積む。
ワードを定義する記述があるので、何度も同じ処理を記述しなくていい。→:double dup *.;なら10doubleで100を得られる。
プログラム例はユークリッドの互除法。
ちなみにアドビのPDFで使用されているPostScriptとうページ記述言語も逆ポーランド記法で記述されるスタック処理型言語
Mind
すべての命令を日本語で記述できるコンパイラ型言語。
逆ポーランド記法で記述された命令をスタックで処理する。
1985年リギーコーポレーション社の片桐明氏によって開発。
NECのPC-9801で開発されたが、その後多くのハードウェアに対応。
Windows版やUNIX版がリリースされている。
ひらがなを無視する機構を搭載し、自然な日本語に近い記述を可能にした。
1+2 → FORTHだと 1 2 + →Mindでは 1に2を加える となる。
逆ポーランド記法は自然な日本語に近い記法。
プログラミングには時間がかかるが、Mindの記述を理解できないユーザでもおおよその中身がわかるソースコードができあがる。記述より読む方が簡単なのは大きな特徴。
特徴として
日本語の解釈は空白で区切って、先頭以外のひらがなを無視という解釈機構を使っている。
否定形の送り仮名は使えない(コンパイルエラーになる)
目的語の順番をいれかえる助詞のみ、一定の形式になるよう変換。
プログラムは単語のまとまり。
新しく単語を定義するとき→挨拶とは(改行) 「こんにちは」を 表示すること。
一般的な言語では関数定義に相当する。
実行するときには → メインとは(改行) 挨拶する。 となる。
コンパイラからはMコードとう中間コードが生成され、「ディスパッチャ」とよばれるランタイムプログラムで実行。
プログラムを別の環境で動作することができる。
現在発売されているWindows版では、Tcl/Tkのエンジンを利用することで、ウィンドウの生成やコントロールの配置などのGUI操作が可能になっている。
MindでTcl/Tkを呼び出すプログラム例。
プログラム例はコラッツ予想
Excelマクロ
マイクロソフト社の表計算ソフトExcelに搭載されていたマクロ言語。
現在のExcel2003に搭載されているのはVisual Basic for ApplicationなのでExcelマクロとは違う。
Excelにおける一連のコマンド操作を自動化するための簡易プログラミング機能のこと。
現在のExcelでも互換性のために以前のマクロを実行、修正する機能が装備されている。
特徴は、特殊なExcelシートに決められたコマンドを記述する形式で作成すること。
Excelのワークシートにユーザが行うあらゆる操作を記述することができる。
例として、D1セルを選択し、そこに=B1+C1の式を入力して薄い黄色をつけるマクロを作成修正していた。
SQL(エス・キュー・エル、シークェル)
リレーショナルデータベースの汎用的な操作言語。
1970年、IBM者のサンノゼ研究所のエドガー・F・コッドの論文で初めて提唱された。
集合論をもとにRDBの概念を提唱したもの。
同研究所で最初に開発されたRDBのSystem Rの操作言語がSEQUEL。
1976年新しいバージョンがでたときSQLに改名。
1987年、ISOとJISでSQL87の規格が策定。
1990年代にワークステーションやパソコンでRDBが動作するようになり、各社から機能拡張したRDBが発売されるようになる。
現在の多くのRDBのSQLは1992年のSQL92仕様がベース。
プログラム例としてマイクロソフト社のSQL Server 2000で動作するコラッツ予想プログラムを紹介。
拡張SQLである「Transact-SQL」で記述したストアドプロシージャ(データベースに保存することができるプログラムコード)
実行にはあらかじめIDとResultのint型のフィールドを定義したTResultテーブルが必要だと注意書きあった。
7.11 統合開発環境の種類と特徴
Visual Studio
マイクロソフト社から販売されているプログラム開発環境の統合パッケージ。
最初のバージョンは1997年出荷。Visual Basic 5.0、Visual C++5.0、Visual J++1.1、Visual InterDev1.0、Visual SourceSafe5.0が同梱されていたが、ヘルプや開発補助ツールは装備されていたものの、言語間で統合された開発環境になってはいなかった。複数言語の統一開発環境.NETのもとになった製品。
Visual InterDevはWebシステムを構築するための補助ツール。マイクロソフト社のWebサーバIISで動作するASPを利用したアプリケーションを構築できる、VBScriptやJScriptによる開発ができる、デバッグ機能がある。
Visual SourceSafeは複数プログラマによる開発を補助するツール。
Visual Studio6.0からはソフトがすべて6.0に揃えられた。
Visual Studio .NET
マイクロソフト社が提供する.NET Framworkというプラットフォーム上のアプリケーションを開発するための統合開発環境。
.NET Framworkに準拠したことにより、Visual Studioとは格言の仕様が大きく変わった。
最初のバージョンは2002年に発売。その後2003年に機能が修正されたVisual Studio.NET2003が発売。
含まれていた開発環境は、Visual Basic.NET2003、Visual C#.NET2003、Visual C++.NET2003、Visual J#.NET2003、Visual SourceSafe6.0
各言語が一つの環境に融合されたことが最大の特徴。
プロジェクトの上位にソリューションという概念を導入。
個々のプロジェクトを指定した言語で記述する単位になる。
複数プラグラマが参加するチーム開発をみすえている。
C++の一部を除いて、.NET Framework環境で動作するので、OSや機種に依存しない。
生成されるコードはMSILと呼ばれる中間コード。
Windowsでも.NET Frameworkが必要になる。
.NET Frameworkの実体は、プログラムを実行するためのエンジン部分であるCLR(共通言語ランタイム)と、ククラスライブラリ、CLRは.NET開発環境で生成される中間コードを解釈する。
.NET FrameworkではSOAPというプロトコルでXMLベースのメッセージをやりとりして、より柔軟にサービスや構造化されたデータを利用することができる。
Microsoft Visual Studio Professional 2013 通常版
Delphi/Kylix
Delphiはボーランド社が販売しているObject Pascal(Delphi言語)の統合開発環境。
1993年Windows3.1用(16ビット)、Windows95用(32ビット)にDelpahi2が発売。
Windows用の開発環境だが、Delphi7には同等の機能を有するLinux用の開発環境Kylixを同梱。
Delphi7からは搭載言語のObject PascalがDelphi言語と改名。
Delphi8は.NET Framework対応版
Delphi2005では、Delphi7、Delphi8、C#Builderの機能を統合したもの。
Kylix3ではObject Pascalに加えてC言語とC++が使用できるようになっている。
特徴はフォームエディタを搭載した高機能なRADツールであること。
Delphiの最大の特徴は高速なコンパイルとパフォーマンスの高い実行ファイル。
生成される実行ファイルは中間コードを含まない32ビット版のWindows用のネイティブなプログラムになりランタイムなしで実行できる。
GUIのコンポーネントライブラリとしてVCLというフレームワークを提供。
.NET Framework対応Delphiでは、VCLとの高い互換性を持つVCL for .NETを提供して.NET Frameworkへの移植性を高めている。
KylixにはLinux用のCLXとうコンポーネントライブラリが提供され、WindowsとLinuxにおけるクロスプラットフォームの開発を実現。文字コードの違いがあるので完全ではない。
Delphiのデバッグ機能は、ステップ実行、トレース実行、ブレークポイント設定、関数呼び出し履歴表示、監視式の登録など高機能で使いやすい。
生成された機械語プログラムを確認しながらデバッグできるCPUウィンドウも装備されている。
命令ごとに対応するアセンブラコードだけでなく、レジスタやフラグの状態が確認できる。
業務システムだけでなく、パッケージソフトやフリーウェアなど様々なアプリケーションの開発環境として人気が高い。
Borland Delphi 7 Personal
JBuilder
ボーランド社が販売しているJavaの統合開発環境。
Windows、Macintosh、Linuxで利用できる。
1997年Windows95およびWindows NT4.0 用の開発環境として発売。
Javaが発表されたのが1995年。
この時点でJBuilder2005が最新。
特徴として、コード入力支援機能、リアルタイムにエラーを検出する機能、自動的なソースのバックアップと比較、ウィザードによる支援、モバイルアプリケーションの開発があげられていた。
JBuilder2005には個人用や学習用に無償で提供されるFuoundation版、企業の大規模開発支援のEnertprise版などがある。
JBuilder 2007 アカデミックパック1 (マルチプラットフォーム版)
Zend Studio
イスラエルのゼンド社が販売しているPHPによるWebシステム用の統合開発環境。
PHP3と4、それらの言語エンジンZend Engine1.0を開発したメンバ、ゼーブ、スラスキーとアンディ・ガトマンズが設立した会社で、PHP4のライセンスも同社の保有。
2004年のZend Studio3.5ではPHP4とPHP5がサポートされている。
クライアント用とサーバ用のソフトウェアが用意されている。
クライアントからWebサーバを操作してリモートでバッグができる。
クライアントだけでもデバッグできる。
開発環境内に用意されている「アウトプット領域」では、プログラムの実行にあわせて、HTMLの出力結果が随時表示される。
任意の場所にブレークポイントを置くとその時点におけるHTMLを確認できる。
ステップ実行しながら少しずつ生成されるHTMLの内容も確認できる。
停止したところの経過をWebブラウザに表示できる。
クライアント開発環境はJavaで記述されているので、プラットフォームを選ばないが、速度は遅い。
Zend Studio4.0 日本語版
CodeWarrior
一般的なパソコンOSの他に、PDAやゲーム機のプラットフォームまで幅広い製品が提供されている。
ただし、これらの製品間でソースコードが流用できるのではなく、開発環境として共通の機能と操作性を実現しているということ。
C言語とC++が組み込まれている。
Windows用やMacintosh用のバージョンではJavaも組み込まれている。
多種の製品が存在するので特徴のところではCodeWarrior Learning Edition for Mac OSについて解説。
ひな形をステーショナリから選択するとスケルトンができて、プログラムを記述できる。
Mac OS向けにPowerPlanatとうプラットフォームがクラスライブラリとして提供されているので、Mac OS上のGUIアプリケーションを効率的に開発できる。
クラス階層ウィンドウでクラスの階層をビジュアルに確認できる。
Java用にはRADツールが装備されているので、GUIのフォームを簡単に作成できる。
CodeWarrior Learning Edition for Windows 日本語版 バージョン 2.0