月別アーカイブ: 2018年02月

2 posts

プログラミング言語

前回私はプログラミング言語について、「プロであれば、知っている言語の数を自慢するものではありません」と書きました。
勿論理由があります。

 

私たちの周りで実際沢山プログラミング言語が使われていますが、いくつかの言語を理解してみれば、言語の違いは、方言の違いだと言える程なのです。

プログラミング言語Pacsalの設計者Wirthは、次のようなタイトルの教科書を書いています。

Algorithms + Data Structures = Programs 

このタイトルは、プログラムの本質を言い当てています。
すなわち、プログラムはどんなデータをどんなアルゴリズムで操作するのか、
に尽きると言っています。

昔々、コンピュータが世の中で使われ始めたころ、すなわちIBMがこの世界の絶対王者であったころ、コンピュータは大変高価で、メモリーをふんだんに使うことができなかったので、プログラムはできるだけメモリーを使わないようにしました。

当時私たちが使うことができた言語は、FortranとCobol、少し後からC言語ですが、ここで取り入れられたのがデータ型の概念です。

データ保存倉庫に何(どんなデータ型のデータ)が入っているか、明確にする手法がとられました。

Xというアドレスには整数が、
Yというアドレスには実数(小数)が、
Zというアドレスには文字列が入っていると明示する必要があったのです。

というのは、整数や実数や文字列のコンピュータ内部での表現が異なり、多くの場合それぞれの倉庫の大きさも違うのです(倉庫の境界線はどこにも書いてありません)。Xというアドレスには実際には整数が入っているのに、
文字列だと解釈しては、何をやっているのか訳が分からなくなります。

例えていえば、全てを0と1のパターンとしてしか見えないロボットが、Xというアドレスには5㎡の面積に果物が入っているのに、10㎡の面積に建材があると思って取り出すと何をしているのか分かりません。

上でX、Y、Zを変数といいますが、以後長い間、様々な言語でこの変数のデータ型を明確に宣言することが重要であり、当然のことと考えられてきました(特にPascalはデータの型付けを厳格にしました)。

プログラムは求める結果を実現するために、このデータをどのように操作するかのロジック(Algorithm)が必要だし、それを実現する一連の命令が「手続」(Procedure)です。

この手続きも意外と少ないし、どの言語も結局同じようなことをしているのです。
例を挙げますと…

アドレス:Xに値:1を代入する。例 => X = 1
アドレス:Xの値を他のアドレス:Xに代入する。例 => Y = X
あるアドレス:XとYの値を計算しあるアドレス:Zに保存する。例 => Z = X – Y
(データの演算は、様々なものがあります。)

また一連の手続を制御するのは、アドレスの値を判定する条件文(if文、switch文)、同種の動作を繰り返す繰り返し文(While、Until文)です。

また、一連の処理を纏めておいて、必要な時に呼び出して使うサブルーチンや関数やライブラリーも昔から使われていました。

データを単独ではなく纏めて保存する仕組みとして当初から配列がありましたが、
その後リスト、ストラクチャー、ディクショナリー等の便利なデータ保存の仕組みが登場しました。

更に、近年プログラミング言語で大きく発展したのは、クラス概念です。

クラスは仕様書のようなものです。
例えば、自動車という仕様書には、車輪があり、駆動部があり、座席があります
(自動車は車輪を持っている。have)。乗用車や作業車は自動車の一種です(乗用車は自動車である。is)。

ここで乗用車は自動車クラスを継承します。すなわち乗用車といえば、自動車クラスの性質(駆動部や座席を持っている)を継承しています。

当然、プログラムは世界を定義するのではなく、そのプログラムに適したクラスを定義していきます。

実際のデータは仕様書から、「生産」(言語では通常=newを使います)することで、オブジェクトとして実体化します。
例 => 私の車 = new 乗用車

 

上の説明は、プログラミング言語をよく説明したとは言えませんが、プログラミング言語の骨組みはこのようなもので、これに色々便利な(場合によっては厄介な仕組み)が付加されています。

例えば、正規表現、デリゲイト、ラムダ式、ジェネリック、データベース、ファイル操作や様々なライブラリー(処理プログラムのパッケージ)です。

最初に書きましたが、データ型はプログラミング言語では必須の概念と考えられてきましたが、多分メモリーを気にしなくてよくなったことと関連すると思いますが、データ型を余り気にしなくてよい言語があります。

例えば、特にインタープリター型言語のPerlやJavascriptやPythonでは、必要になって初めて動的にデータ型を判断するし、Pythonでは数字を含むすべてのデータをオブジェクトにしていて、むき出しのデータではなく、データをオブラートで包んで処理することで、プログラマはデータ型を気にしなくてよいようになっています。

ともかく、手続き型言語は、それぞれ特徴を持ってはいるにしても、文法の本質は変わらないので、この部分を理解していれば、後は方言だと思う程度のものです。

勿論実務で使いこなすには、マニュアルでよく動作を確認しなければいけませんが、それも難しいものではありません。

 

 

WEB プログラミング

最近、とりとめもなく色々なことをしていて、ブログのまとまった記事を書くことができません。

 

私はWebの仕事は、数件お手伝いでプログラムを書いた程度で、あまり詳しくありません。

私は、これまでもっぱらWindows用のデスクトップアプリケーションの開発をしてきて、「もう新たに他分野の勉強をすることもない」と意欲がありませんでしたが、WEBの仕事も面白いかもしれないと、少し勉強しています。

これまで私がWEBの仕事で使った言語はMicrosoftのASP.NET以外に、Perl、Java、Javascript、Phpで、これで打ち止めと思っていたのですが、Pythonが面白そうなので、今結構一生懸命勉強しています。

 

私たちが見るWebのページは、最終的には(ユーザのコンピュータで使われるのは)、Htmlという規約に則った文字データ(その他画像や音源へのリンク)でできています。

どんなものか知りたければ、ブラウザでどこかのページを表示しておいて、キーボードで[Ctrl + U](コントロールキーを押したまま、アルファベットのU)を押すと、このファイルのHtmlデータが表示されます。

ブラウザ(Microsoftのインタネット・エクスプローラーやGoogleのChrome)が、この文字情報を元に、通常私たちが見るきれいな画面に作り替えています。

先に書いた言語はブラウザを支援するために使われます。

JavaやPerlのプログラムの中身はHtmlファイルでは見えません。
通常、画面上のボタンをクリックすると、その指令はサーバーに送られて、JavaやPerlのプログラムが計算等の処理をして、その結果をブラウザに送ってくる仕組みになっています。

PhpはHtmlファイルの中にプログラムを書きます。たとえば、

<?php $a = 1;if ($a == 2): ?>
これは正しい。
<?php else: ?>
これは間違い。
<?php endif; ?>

で、<?php  ?>で囲まれた部分がPhpのプログラムで、この処理はサーバーで実行し、結果だけブラウザに送りますので、ユーザ(クライアント・ブラウザ)に届いたときには、この部分が何であったか分かりません。
上のプログラムは、ブラウザには「これは間違い。」という文章だけが返ってきて、従ってそのように表示されるだけです。その裏の処理はユーザは知る由もないのです。

再度言いますが、PhpのプログラマはHtmlファイル(拡張子はphp)にプログラムを書き込んでいくのですが、サーバがPhpを処理し、その部分はユーザには届きません。

 

JavascriptはWebでは最も多く使われている言語だといわれています。
この言語で書かれたプログラムはユーザ(ブラウザ)まで届き、ブラウザがこのプログラムを処理します。

上で[Ctrl + U]の押し下げると、Javascriptのプログラムは丸見えになります。

 

言語にはそれぞれ向き不向きがあります。
その言語が何に力をいれているかによって、関連するライブラリーがどれだけ沢山あるか濃淡があります。

セキュリティを十分考慮したプログラムを書くにはJavaが向いています。
その代りJavaを実行する環境が必要で、サーバーで設定しなければいけません。

私たちが簡単に使うことができるレンタルサーバーでは、あまり使うことができません。

恐らく、航空券の発行や金融機関では、専用のサーバーを構えて、Javaでプログラミングしていると思います。

 

簡便にちょっとした仕事をするには、JavascriptかPhpを使うと思います。
Perlは昔はよく使われていましたし、現在も使われているようですが、PythonやRubyに取って代わられるのではないかと思います。

 

言語は実行形式で大きく、コンパイラー型とインタープリター型に分けられます。プログラムは最終的には機械語に変換されますが、一度機械語に変換(コンパイル)しておいて、実務では常に機械語化されたプログラムを呼び出して使うタイプの言語をコンパイラー型言語といい、必要なときその都度元のプログラムを機械語に翻訳して使う形式の言語をインタープリター型言語といいます。

先の例では、Javaがコンパイラー型言語でその他はインタプリター型です。

コンパイラー型のプログラムは高スピードなので、纏まった処理をする場合にはこの形式の言語を使います。Java以外では、Fortran、C、C++、VB、C#、Pascal等沢山の言語がコンパイラー型です。

一方のインタプリター型の言語は、テスト(デバッグ)が容易にできますので、一寸した仕事、特別高速を要求されない仕事には向いています。

コンパイラー型とインタープリターの中間の言語があります。
プログラムコードを中間言語に一度翻訳しておいて、実際には中間言語から機械語にその都度翻訳するものです。
実はJavaがこの形式ですし、.NETといわれるマイクロソフトのVBやC#やC++がこれに属します。

 

ついでに、言語の分類で別の分け方があります。

宣言型と手続型です。

上に挙げた言語はすべて、処理の手続きをプログラマが書いていきます。

ところが、「こうしたい」と書いてやれば、処理してくれる言語があります。データベース用言語SQLとか昔AI研究で使われた推論用Prolog等です。

前者を手続型言語、後者を宣言型言語といいます。

 

さて、Pythonをどのように使ったらいいのかまだよくわからないのですが、Webの世界を徘徊し情報を集めるには適しているようなので、少し研究しています。

 

余談ですが、
数年前、初対面のあるソフト技術者が、現在ほとんど日本では使われていないDelphi(Pascal)という言語を使っていると聞いたので、軽い気持ちで、「デルファイを使っているのでね」と話の口火と切ったところ、「デルファイも」と「も」に力を入れて返答してきて、大変面喰ったことがあります。

彼は「あれもこれも知っているのだ」と言いたかったのでしょうが、ソフト技術者であれば最低3つ、普通に5つくらいの言語が使えなければ一人前とは言えません。

プロであれば、知っている言語の数を自慢するものではありません。