2010年3月23日火曜日

プログラム言語について-Basic言語-

Basic言語は、1964年にコンピュータ教育用の言語として開発されたようです。言語的には、当時使われていたFORTRANに近いものとなります。FORTRAN言語での処理系は、軽いので非常に小さなメモリでも動作できたことから、パソコン上で動作できるようになり、普及しました。
私も以前、Z80パソコン上で動作するBasicインタプリターを開発したことがあります。コンパイラーがコーディングされたプログラムのロジックが動作する機械語を作成するものですが、インタプリターは、機械語を作成するのではなく、直接、動作します。

例えば、以下のBasicプログラムを実行した場合には、
10 A = 10
20 FOR I=1 TO 3
30 A = A+1
40 NEXT I
をRUNコマンドで実行すると、次のように動作します。
① 行番号10でA=10を実行します。変数Aに10を代入する命令ですが、変数Aは未だありませんので、変数Aの領域をメモリに確保して、10を設定します。
② 行番号20は、FOR文であり、そのループ変数がIであること、下限が1、上限が3であることが分かります。そこで、①と同じように変数Iを作りその中に値0を代入します。変数Iの内容が3より小さいので次の行(行番号30)を実行することになります。
③ 行番号30では、A=A+1であることから、変数Aの値を取り出し、その変数値に1を加えた結果を変数Aに格納します。
④ 行番号40では、Iの値に1を加え、行番号20に戻ります。
⑤ この動作を繰り返し、変数Iが3を超えるまで③④を繰り返します。Iが3を超えると行番号40の後の行を探しますが、行番号40に続く行が見つからないので終了となります。変数Aには、13となります。
このように、インタプリターでは、順にプログラムを実行するようになります。

2010年3月7日日曜日

なぜ -1 と-1 を掛けると +1 になる(その2)

このブログサイトで以前、-1×-1が+1になる理由について書いていました。そのときの解法は、乗算の分配の法則と交換を使ったものでした。
一週間ほど前から、図書館で「虚数の話」と言う本を借りて読んでいます。内容は、タイトルどおり虚数の話ですが、この中で、その理由が書かれていました。
虚数とは、二乗してマイナスとなるような数ですが、実は、虚数はそれだけではなく、数を直線上の点として表現するではなく、数を平面上の点として拡張して表現すること重要な要素であるそうです。
数を直線状の値ではなく、平面状の値でとすることで、ベクトルの加算や減算の定義は簡単ですが、乗算については、それぞれの線の長さを乗算した後、その方向を回転することで、従来の乗算と拡張みなすことが可能となりました。
マイナスとは、180°回転した方向を示すので、-1×-1では、先ず-1で180°回転し、次の-1でさらに、180°回転することから、元の位置に戻り0°である+1となります。


詳しくは、ポール・J・ナーイン氏の「虚数の話」をご覧頂くことが良いかと思います。少し難解なので根気強く読むことが必要かと思います。エッセンスが書いてあるのでは、Newtonの2008年12月号ですが、少し断片的過ぎる感じがします。みなさんも、もう一度見直すのも勉強になるかと思います。

2010年2月28日日曜日

プログラム言語について-C言語-

久しぶりです。今日は、C言語についてお話します。最近では、C言語やJavaでのプログラム開発が多くなっていますが、私が最初にC言語を使うようになったのは、約25年前でした。
当時、パソコンでのシステム開発用のプログラム言語としては、アセンブラの他には、PascalやPL/M(PL/I言語の中から、パソコンシステム開発向けに限定したもの)くらいしかありませんでした。共に、メモリの確保やポインターなどを利用したプログラミングが可能となる点が、利用されていた点かと思います。

しかしながら、Pascalではビット演算機能がなく、より高速な処理を行うには不向きでした。Pascalは、設計者であるヴィルトが本来プログラミングとは、事柄を抽象的に考えるべきであり、コンピュータ内のビット形式などを意図したコーディングはすべきでないとの考え方によるものだと思います。しかし、これが、実際のプログラミングでは、より高速に処理するために、コンピュータ内のビット形式を意図する必要がありました。

このような状況下で、使われるようになったのがC言語です。C言語では、PascalやPL/Mなどのようにメモリを動的に確保したり、ポインターが利用できること、CPU上のビット操作が簡単にできること、構文が単純でありコンパイル時間が高速であったことなどからパソコンシステム用のプログラム言語として利用されるようになったと思います。

なお、C言語は、もともとUnixオペレーティングシステムを開発するために設計されているために、面白い書き方があります。。Unixが稼動するミニコンがPDP-11であったことから、PDP-11が6ビットマシンであったころから、通常は、バイナリデータを表現する際に16進数で表現されたますが、8進数の表現のが簡単になっています
 ⇒(文字列の中に16進数表現で書き込むには、「\xAB」、8進数表現で書き込むには「\253」などと指定します)

詳しくは、パソコン昔話(なぜ1バイトは8ビット)をご覧ください。

2010年2月9日火曜日

Javaで構造体を扱う

Javaは、オブジェクト指向の言語と言われますが、いままでC言語などを使ってプログラミングしていた人にとっては、C言語の構造体のメンバーに関数が追加されたものがクラスと考えることができます。詳しくは、Cプログラマーから見たJavaをご覧下さい。
したがって、JavaでのC言語の構造体は、メソッドのないクラスを定義することで利用可能となります。Javaのクラス内で構造体を利用するには、クラスの内部に別ファイルで定義したClassを利用することで対応できますが、この方法だとファイルの数が増えてしまうことが欠点となります。
各クラスのロジックをコーディングする時に、一時的に構造体を使いたくても別にファイルを作成することが必要になってしまいます。
このような場合に、簡単に構造体を作る方法がわかりました。

このような場合、クラス定義のファイルに、一時的に利用する構造体を「final」を付けたクラスとして定義します。

final class xxx_item {
 double key;
 String value;

 public xxx_item (double p1, String p2) {
  key = p1;
  value = p2;
 }
}

public class xxx_list {
 ・・・・・・・
 メソッドなどで
 xxx_item temp = xxx_item(10,"aaaaa");  
 temp.key は、10
 temp.value は、"aaaaa"
 となります。
}

このようにすると、1つのクラス定義でも簡単に構造体を利用することが可能となります。
参考にしてやってみてください。


2010年2月7日日曜日

自転車のチェーンが外れたときの対処方法

コンピュータの話ではありませんが、今日、自転車のチェーンが外れました。とりあえず、引いて家に戻りましたが、インターネットで簡単に直せることが分かりました。自転車屋さんに持っていったらお金がかかったかもしれませんが、タダで直すことができました。

後輪の歯車にチェーンの一つを引っ掛けてペダルをゆっくり回すと、次々の歯車にチェーンが噛むようになり、元通りになりました。チェーンが若干のたるみを持っているので、このような方法で直すことができます。

2010年1月26日火曜日

プログラム言語について -アセンブラ-

今日は、アセンブラについてお話します。アセンブラとは、コンピュータのCPUが動作する機械語と1対1に対応するものです。FortranやCobolと言った高級プログラム言語が人間に分かり易く設計されているのに対し、アセンブラは、機械に分かり易く設計されていると言った方が分かり易いかも知れません。
初期のパソコンでは、MS-DOSやCP/MなどのOSとアセンブラしかなく、FortranやCobolなどのコンパイラが提供されていませんでした。そのため、これらの開発環境では、場合には、このアセンブラを使ってプログラムを書いていました。
私もCPM(8ビットのパソコン用オペレーティングシステム)で、Basicインタプリターやデータ入力システムなどを開発しました。
通常のCPUでは、メモリからCPUが持っているレジスタにデータを取り出したり、レジスタの内容をメモリに書き戻したり、レジスタ上で演算(比較を含む)などを行います。
通常は、命令と呼ばれる部分(レジスタ同士の計算、メモリからレジスターへのロード、レジスターからメモリへの書き込み)とオペランドと呼ばれる部分(命令の対象となるレジスタやメモリを指定する)から構成されます。
最初にソフト会社に入った時の教育でミニコンでのアセンブラプログラム教育がありましたが、全く動作しませんでした。その後、CPMでデバッガーが会いアセンブラでのプログラミングできるようになり、最後には再帰呼び出しのプログラムもアセンブラで書くようになり、結局、昔のAPPLE IIに搭載されていた6502, Z80,インテル8086,モトローラ68000,SunのSPARCチップなどのアセンブラによるプログラム作成を行いました。
また、アセンブラでプログラムを書くようになると、それぞれのCPUの特色が分かり、その点もメリットがあったと今でも思っています。

アセンブラによるプログラムを行うには、非常に根気の要る作業で、プログラマー35才定年説も個々から出たのかもしれません。しかし、現在では、javaなどの高級言語のお陰で、私のような実際の定年近くになる老人でもプログラムが可能になっています。



2010年1月17日日曜日

プログラム言語について -Pascal-

私がソフトウェア会社に入社した1978年当時、大型ホストコンピュータのプログラム言語としては、以前にお話したFortranやCobol、PL/Iが主なプログラム言語でした。
その後、数年でパーソナルコンピュータ(パソコン)が販売されるようになり、このパソコン用の言語としてPascal処理系が搭載されるシステムが販売されました。有名なものがAPPLE Pascalですが、これは、UCSD(カルフォルニア大学サンディエゴ分校)で開発されたUCSD-PascalをAPPLE上で動作させたものになります。
なお、UCSD-Pascalについては、本ブログの
をご覧ください。
このUCSD-Pascalは、起源を辿ると、チューリッヒ工科大学のニクラウス・ヴィルトが開発したP4 Pascalを元に開発されたようです。P4パスカルは、コンパイラによって生成されたPコードと呼ばれる仮想的なマシンコードと、この仮想マシンコードで記述されたプログラムを実行するインタプリターから構成されています。ちなみに、この仮想マシンコードを処理するインタプリターを各CPUに合わせて開発することで、様々なコンピュータ上で動作させたのがUCSD-Pascalとなります。この仮想マシンコードを使った処理は、Javaに引き継がれています。

Pascalの特徴は、プログラミング作成のために必要となる制御文(for文、do-while文, repeat-until文)が用意されており、構造化プログラミングを実現するツールとなる点でしょう。また、通常のシステムプログラミングで必要となるポインターが使えることも大きな特徴です。また、変数は、基本的にオートマチック変数(手続き内だけに有効となる変数)であり、より信頼性の高いプログラミングが可能となります。
これらの強力な機能により、システムプログラミング言語としてパソコンを中心に使われるようになりました。

しかし、Pascalの弱点は、分割コンパイルによるプログラム開発(大きなプログラムを、いくつかの部分に分割して開発し、それぞれ開発した部品をリンクにより結合するプログラム開発)が、初期のPascal仕様には無かったことが弱点でした。
また、Pascalは、最初、教育用のプログラム言語から出発したことから、データ変数の扱いなど、なるべくコンピュータの処理系に依存しないように定義されており、ビット演算などの処理が煩雑であること等も弱点の一つです。

その後、パソコンなどのシステム言語として利用されたPascalは、より記述するコード量が少なくて済み、かつ、ビット演算などが簡単に行えるC言語に移行されました。