機械語、アセンブラ、高水準言語、手続き型言語、第4世代言語、非手続き型言語、SQL、関数型言語、論理型言語、オブジェクト指向言語、Java、javaアプレット、Javaサーブレット、JRE、J2EE、JDBC、Perl、Python、PHP、Ruby、R, Javascript、ECMAScript、CGI、SSI、セッション管理、セッションID、クッキー、Ajax、非同期通信
プログラミング言語の発展は,コンピュータの動作に依存した言語から人間の発想に近い言語への発展であるといえます。
汎用コンピュータ時代
第1世代言語:機械語
最初のプログラミング言語は、CPUの演算装置が理解できる機械語を記述するものでした。
例えば,メモリのA4番地にあるデータの値(X=13)とA5番地にあるデータの値(Y=27)を,演算装置のアキュムレータAとBに入れて加算し,その結果をメモリのA6番地(Z)に入れるプログラムは次のような数字(16進表示)の羅列になります。
11A412A5410221A630A70D1B00
区切りをつければ,
9F 11,A4 メモリA4番地の値→アキュムレータA
A0 12,A5 メモリA5番地の値→アキュムレータB
A1 41,02 A+B→A
A2 21,A6 Aの値→メモリA6番地
A3 30,A7 次の命令はA7番地から
A4 0D 10進数13の16進数
A5 1B 10進数27の16進数
A6 00 結果を入れる場所を確保
A7 --
第2世代言語:アセンブラ
機械語を覚えるのは大変です。それで,たとえばメモリからアキュムレータに入れる命令をLD,アキュムレータ間での加算命令41をADというように記号化すれば,かなりわかりやすくなります。このような言語をアセンブラといいます。
LD A,X メモリX番地の値→アキュムレータA
LD B,Y メモリX番地の値→アキュムレータA
AD A,B A+B→A
SV A,Z A→メモリZ番地
J P 次にフラグPの命令を行う
X DT 13 Xの値を13とする(10進数表示)
Y DT 27 Y←27
Z DT 0
P ---
上のような四則演算や入力・出力処理など、多くのプログラムに共通する処理があります。それらをライブラリとして登録しておき、個別プログラムから、それらを呼び出す命令を用意することにより、プログラミングは容易になりエラーも少なくなります。
第3世代言語:高水準言語(手続き型言語)
もっと人間に理解しやすくすることが求められます。その要求に応えて,
Z=X+Y (FORTRAN)
ADD Y TO X GIVING Z. (COBOL)
のように,数学的な表現や英語表現で記述できる言語が多数出現しました。これらを高水準言語といいます。代表的なものに、FORTRAN、COBOL、Pascal、PL/Iなどがあります。
高水準言語では,機械語やアセンブラと異なりコンピュータの機種に依存しない形式になりますので,言語文法のレベルでは多くの機種で共通に用いることができます。また,共通にするために,いくつかの言語では文法仕様の標準規格化(JISにもなる)も進みました。
第4世代言語:非手続き型言語、SQL
- 非手続き型言語
- 第3世代言語では,「どのように処理をするかの手順」を記述します。たとえばファイルから府県が東京であるレコードだけを選択して抽出するには,
READ 入力ファイル.
WHILE (EOF=0)
IF 府県="東京" THEN WRITE 出力ファイル
READ 入力ファイル
END
というような記述をします。このような言語を手続き型言語といいます。
それに対して第4世代言語は非手続き型言語であり,
SELECT *
FROM 入力ファイル
INTO 出力ファイル
WHERE 府県="東京";
というように,「何をするか」だけを記述して手順は記述しないのです。このような記述は人間の思考により合致しています。
- SQL
- 以前は多様な第4世代言語がありましたが,SQLがRDB(リレーショナル・データベース)の国際標準言語になってからは,SQLの独壇場です。DB/2,Oracle,AccessなどほとんどのRDB言語はこれを用いています。SQLに関しては別シリーズ「データベース」で詳述します。
主流ではありませんが、次のような言語もありました。これらの考え方は、近年の言語にも大きな影響を与えています。
- 関数型言語
- 関数を定義し、その関数に引数を与える関数を定義し・・・というように、関数のツリー構造として記述する言語です。変数や機能など、全ての事物を関数の概念を以って言語全体をすっきりと整理し、一貫性を乱すような余計な機能は排除し、可能な限りのシンプルさを保とうとする数学的発想で体系化されています。代表的な関数型言語にLISPがあります。
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))
関数をオブジェクトとすれば、現在のオブジェクト指向言語に似ているように、LISPでは、木構造、ガベージコレクション、動的型付け、条件分岐、高階関数、再帰など多くの概念をもち、現在のプログラミング言語に影響を与えています。
- 論理型言語
- 宣言型言語ともいいます。「〇ならば△である」というような述語論理の節形式の定義を列挙し、「〇と□のものは?」の質問に論理的推論を行う言語です。与える定義や質問の順序は任意で、システムが実行順序を選択決定するのが特徴です。
代表的な論理型言語にPrologがあります。LISPとともに1980年代AIの応用であるエキスパートシステムの基本言語になりました。
Web環境でのプログラミング言語
高水準言語
現在、汎用的に広く用いられている高水準言語(コンパイル型プログラミング言語)は、C言語系とJavaが主流です。
C言語系には、C、C++、C#があります。CはUNIXで以前から汎用的に用いられていた言語です。C++はCをオブジェクト指向言語にしたものです。C#はC、C++とは全く別のプログラミング言語で、Javaと似たような言語になっています。
Javaは、当初からシンプルなオブジェクト指向言語として開発されました。開発後早期にOSSになったため、標準ライブラリなどの整備が進んでいます。
オブジェクト指向言語(Object-Oriented Programming、OOP)
データと手続き一体化したオブジェクト群を定義していき、それらが互いに指示やデータを送り合うことにより処理を進めていく言語です。
オブジェクトの雛形であるクラス(class)やプロトタイプ(prototype)、および内部のメソッド(method)やプロパティ(property)を定義する構文や、オブジェクトのインスタンス化、メソッド呼び出し、メッセージ交換などの機能を提供すします。
- クラスベース(class-based)言語
オブジェクトの雛形にあたるクラスを定義する。Java、C++、C#など
- プロトタイプベース(prototype-based)言語
元になるオブジェクトを複製し、要素や動作の追加や変更を行うことで新しいオブジェクトを定義する。JavaScript、Ruby、Pythonなど
スクリプト言語(scripting language)
通常はHTML文書に直接記述する言語のことです。代表的なものにJavaScriptがあります。
軽量言語(lightweight language)
厳密な定義はなく、習得や記述が容易なプログラミング言語の総称です。一般に、型宣言などが不要、インタプリタ形式で実行する、オブジェクト指向言語であるなどの特徴をもっていますが例外もあります。
- 比較的単純なプログラムを記述する:Perl、Python、Rubyなど
- CGIを利用して動的なWebページを構築する:PHPなど
フロントエンド言語とサーバサイド言語
プログラムの動作環境による区分です。フロントエンド言語とはクライアント側で動作する言語で、単純にいえばブラウザが解釈して実行する言語のことで、HTMLやXML、CSS、JavaScript などがあります。
サーバサイド言語は、サーバ側で動作する言語で、バックエンド言語ともいいます。JavaやCなどの高水準言語、PHP、Ruby、Python などのスクリプト言語の大部分はサーバサイド言語です。
ビジュアルプログラミング言語
プログラムをテキストで記述するのではなく、視覚的な図形やイラストを組み合わせてプログラミングする言語
ほとんどマウス操作だけで作成できること、結果が即座に表示され、試行錯誤が容易なことなどから、主に子どもを対象にした教育用言語として用いられています。
- ブロックタイプ
指示の書かれた小さなブロックをマウス操作でつなぎ合わせてプログラミングしていきます。
代表的な言語にScratch(スクラッチ)があります。小学校での情報教育での標準言語に指定されています。
- フロータイプ
フローチャートのように、指示や機能、条件のアイコンを配置して線でつないでプログラムします。SonyのMESHや、SAM Labsなどの専用アプリのプログラミング方式として採用されています。
Java
Javaの特徴
- 言語系
コンパイラ型、手続き型言語、オブジェクト言語
- 移植性(portability)
当初からOSに無関係なバイトコード(中間コード)が公開され、ほとんどのOSがJavaをサポートしており、移植性が高い(機種やOSに関係なく互換性あり)
- JavaBeans
小さなJavaプログラムを集めたライブラリです。よく用いられる処理をクラスとして再利用可能できるようにしています。
- javaアプレット
アプレットとは「小さなアプリ」のこと。Javaアプレットは、あらかじめバイトコードにしてサーバに保存した小さなプログラムで、それをWebページから呼び出して、ブラウザで実行し、Webページ内に表示されます。アプレットをWebページと同じようなファイルとして保存しておけば、CGIを経由せずに使えます。
- Javaサーブレット
Javaサーブレットとは、厳密にいえば、WebサーバをJavaアプリケーション・サーバに変身させる技術で、それを用いることにより、アプレットをサーバで実行します。それ以外はアプレットと同様です。
Java実行環境
- JRE(Java Runtime Environment、Java実行環境)
バイトコードをネイティブコード(機械語)に翻訳する環境です。ほとんどのブラウザ(またはOS)は、JRE対応になっています。そのため、Javaで作成したプログラムは、どのブラウザでも表示できる環境になっています。
- J2EE(Java 2 Platform, Enterprise Edition)
企業の業務 システムや電子商取引などで使われるサーバに必要な機能をまとめた、エンタープライズシステム向けのJavaプラットフォームです。
サーバ向けJava技術の標準として定着しており、サーバー側で動くJavaアプリケーションやミドルウェアのほとんどがJ2EEに準拠しています。
- JDBC(Java Database Connectivity)
JavaプログラムからSQL命令を発行してRDBにアクセスするためのAPI
Javascript
代表的なHTMLスクリプト言語です。HTML文書内の <script>~</script> に記述し、Webブラウザで解釈・動作します。動的なWebページ作成での基本ツールです。
名称は Java言語と類似していますが、別個の言語です。
- ECMAScript規格
Javascriptは、Netscape社のブラウザ用に開発したものを、各ブラウザが独自に拡張して標準化されていない言語でした。ECMAがコア部分を標準化してECMAScript仕様を策定し、ISO/IEC 16262、JIS X 3060 の附属書で規格化されています。現在ではほとんどのJavascriptはECMAScriptに準拠しています(それでも解釈の違い、拡張機能の違いがあります)。
- Javascriptの実行
Javascriptは、HTML内部に記述できるスクリプト言語です。Webページのある部分を表示/非表示にしたり、入力データから簡単な計算をして結果を表示したりするのは、ほとんどJavascriptで行っています。
Javascriptは、Webブラウザで解釈され実行されます(Webサーバは関与しません)。ほとんどのブラウザはこの機能をもっており、どのブラウザでもほぼ互換性があります。
- JavaScriptライブラリ
Javascriptでの処理には、決まったパターンが多くあり、そのなかには、かなり複雑で初心者にはわからないとか、熟練者でも大量の記述が面倒だというものもあります。さらにブラウザ間での非互換を吸収できると便利です。
そのような要請に応えるのが「JavaScriptライブラリ」です。代表的なものに、jQueryやPrototypeなどがあります。どちらもOSSになっており無料で利用できます。
代表的な軽量言語
- Perl
- 広く使われるようになった最初の軽量プログラミング言語。後続の言語と比較してオブジェクト指向や言語体系として不完全な面もある(逐次改訂されてきた)が、歴史が長いため、多くの開発者によるど巨大なライブラリCPANや解説サイトがあり、利用しやすい環境になっている。現在でもPHPと並ぶ多くの利用者がいる。
- Python
- 教育の立場から、目先の利便性を優先した機能を取り込んで複雑にするのではなく、「シンプルで習得が容易」という目標に重点にし、言語自体の機能は最小限に押さえ、必要な機能は拡張モジュールとして追加する方針で開発された。
当初からオブジェクト指向言語、関数型言語を目指している。
プログラム記述ではインデント(字下げ)を重視し、「ブロックの範囲をインデントで決定する」という特徴をもっている。
近年は、機械学習(AI)の基本言語として利用者が増大している。
- PHP
- 当初から、動的にHTMLデータを生成することにより、動的なWebページを容易に実現することを目的としている。WebサーバにPHPで記述したスクリプトを登録しておき、HTMLからCGIを通して呼び出されると、サーバ側で実行されHTMLを生成してブラウザに送信する。
習得が容易であり、多くのオープンソースのライブラリがあり、多くのレンタルサーバがPHPをサポートしているので、初心者がWebページを作成するのに向いている。また、大規模システムの開発にも適しているので、これを用いる開発者も多い。現在世界で最も広く利用されている軽量プログラミング言語である。
- Ruby
- 日本発でISO規格になった初の軽量プログラミング言語。世界的にも支持者が多い。
シンプルかつ強力なオブジェクト指向スクリプト言語
純粋なオブジェクト指向なので、クラス内インスタンスを他クラスからは参照できない。
データの型がないが、型に特化したデータ操作クラスをもつ。
開発環境Ruby on Railsが優れている。
- R
- 主に統計確率分野に広く用いられている軽量言語である。用途では Python と似ているが、命令の文法がより単純であることから、教育分野で広く用いられている。
動的Webページの作成
Webページは、Webサーバに存在するHTML言語で記述したファイルを、クライアントにあるWebブラウザからサーバにHTTPで接続して、URLで指定したHTMLファイルをクライアントにダウンロードし、Webブラウザで解釈して画面表示します。
ネット販売サイトのように、表示される画面を動的に変化させる手段を掲げます。
CGI(Common Gateway Interface)
Javascriptは豊富な機能をもっていますが、パスワードによるアクセス制限やデータベースの検索など複雑な処理をするのには不適切です。また、HTMLに組み込んだJavaScriptは閲覧者がソースリストを見ることができるので秘密事項を記述するには不適切です。
CGIは、サーバにあるプログラムをブラウザから呼び出すための仕組みです。
- あらかじめ、PHP, Perl、Python、Rubyなどのスクリプト言語で記述したプログラムをサーバに保存しておく。
- Webブラウザから、そのプログラムの起動リクエストを出す(HTMLで指定、データが必要ならばFORM入力)
- サーバはプログラムを実行。その結果をHTML形式にして、ブラウザに戻す
- ブラウザは受け取った結果を表示する
SSI(Server Side Includes)
CGIと似た機能ですが、もっと単純なものにSSIがあります。例えば、HTML中に、
<p>今日は<!-- #echo var="DATE_LOCAL" -->です。</p>
と記述すると、DATE_LOCALの値がサーバで処理され、その結果が
今日は Sunday, 9-August-2015 09:12:43 です。
のように、記述した部分に挿入されます。
SSIは時刻・日付機能やアクセスカウンタなどのように簡単な機能に限定されています。SSIコマンドを含んだHTMLファイルをSHTMLファイルといいます。
「プログラミング言語」からやや外れますが、Webページでの処理にはいくつかの特徴があります。
ローカルファイルへのアクセス制限
パソコン内でのプログラムでは、パソコンにあるデータファイルを読んだり書き込んだりすることは自由にできます。ところがWeb環境では、Webサーバにある他人が作成したWebページを閲覧するのが通常です。
Webページから閲覧者のパソコン(ブラウザ側)のファイル(ローカルファイルといいます)をアクセスできると、悪意のあるWeb作成者に、パソコンにあるファイル内容を知られたり、改ざんや破壊をされたりします。
このような危険を防ぐために、ブラウザやWeb関連言語では、原則として閲覧者が操作せずにローカルファイルへのアクセスができないようになっています。
Webサイトで買物をするとき、ログイン→注文→決済→ログオフという流れになり、それぞれのWeb画面が表示されます。このとき、ログオンからログオフまでの一連の流れをセッションといいます。
ところが、WebブラウザとWebサーバの間の通信プロトコルであるHTTPは、1往復のメッセージのやりとりで処理が完結するステートレスなプロトコルなので、セッションという概念がなく(一つのWebページが一つのセッション)、Webページが切り替わると接続も切れてしまうのです。それでは、注文ページで入力したデータを決済ページで使うというようなデータの受け渡しができません。
これを解決するために、いくつかの方法があります。
- セッションID
- セッションIDとは、セッション(あるWebページ)を識別する符号です。このサイトには多くの利用者がいます。利用者Aの注文データが利用者Bの決済ページに使われるのでは困ります。それで、Webサーバは、利用者Aの注文ページのセッションIDを利用者Aのブラウザに記録し、利用者Aが決済ページを閲覧したときにサーバはブラウザからセッションIDを受取り、同一利用者であると認識します。このような操作により、ログオンからログオフまでを一連のセッションにすることができます。
- クッキー
- セッションIDをサーバとブラウザ間で受け渡しする仕組みでよく使われるのがクッキーです。原則としてローカルファイルへのアクセスが禁じられているといいましたが、例外の一つがクッキーです。クッキーは、ブラウザがWebページを開くときにサーバから取りに来ます。
クッキーはサーバが指定した一定期間保持されます。そのため、注文処理をしただけで中止し、翌日、決済処理を行うことができます。「買物カゴに入れる」などは、これを使っているのです。
- URLパラメタによるデータの受け渡し
- セキュリティ対策の一つとして、ブラウザにクッキー禁止の設定をしている場合もあります。あるいは、上記のような一連の処理ではなく、単にあるページから他のページに単純な情報(パラメタ)を受け渡したいこともあります。
このような場合は、「http://kogures.com/index.html?para=xxx」というようにリンク先のURLにパラメタを追加して、データ「xxx」を受け渡すことができます。
Ajax(Asynchronous JavaScript + XML)とは、JavaScriptを活用した方法論です。上述のjQueryのようなライブラリでもなくPHPのような新言語でもありません。XMLやJavascriptなどに関連する技術(非同期通信やDOMなど)を組み合わせて、新しい機能を実現させたものです。ほとんどのブラウザが対応しているので、何ら手を加えなくても、Ajaxを用いたWebページを作ることができます。
Ajaxの代表的な実用例として、GoogleMapの地図サービスがあります。GoogleMapでは、カーソルを操作するだけで、地図が連続的に変化します。これは、ブラウザがサーバからの情報をすべて受け取ってから解析して表示する従来の処理と異なり、パソコンからサーバにリクエストを送ったら、サーバからの結果を待つのではなく、その間にパソコンできる処理をやってしまうという、非同期通信(Asynchronous)をしているからです。
Webページは、タグで構成され、そのタグはDOM(Document Object Model)という階層構造の体系になっています。それを解析すれば、Webページの任意の個所をデータとして取り扱うことができます。それにより、現在のWebページの特定個所を表示/非表示にしたり、他のWebページのある部分を抜き取って現在のWebページに組み込んだりできます。その中核となるコマンドがXMLHttpRequestです。
HTMLの最新版はHTML5です。旧版では、Webページにグラフなどの図表を表示するには、gifのような画像ファイルを作る必要がありました。それがCANVAS機能を用いれば、Javascriptでデータからグラフを作り画像として表示できるようになりました。
従来は、動画再生には、Flashなどのアドオンソフトを使う必要がありましたが、HTML5では、「video」や「audio」タグにより、Javascriptだけで実現できるようになりました