プログラミング入門 (その1)

●System Transcript

 太陽の画像処理プログラム(および、今後リリースするプログラム)は、スクリプト言語を搭載し、プログラム自身が持つ機能を使ってプログラミングできるようになります。

 搭載されているコンピュータ言語がどんなものか、少し遊んでみましょう。

 各プログラムの(今1個しかありませんが)メニューから「SystemTranscript」を呼ぶと、プログラミング言語本体のオペレーションウィンドウとなる「SystemTranscript」(訳:システム操作)が開きます。

 バージョンによっても微妙な差が出るかと思いますが、おおむねこんな感じのフォームが開きます。


2008/02/21
●Fortressとは

 ここで扱えるコンピュータ言語はFortress風の言語(サブセットあるいは方言)です。
 Fortressとは、FORTRANの後継言語としてSun Microsystems主導でオープンソースによる開発中の並列処理言語です。別のコーナーで書きまくっているので、Fortressについては改めて説明しませんが、元々、科学技術計算用の言語であって、こういったクライアントアプリケーションの制御用途に使うモノではないんですが、並列処理に釣られて採用となりました。

 現時点では、Fortressの規定スペックの1割も搭載しておらず、並列処理もできない有様なので、過度な期待はしないでください。なお、処理系は全く独自開発です。本物のFortressのソースコードは1バイトたりもと入っていません。


2008/03/02
●とりあえず動かしてみる

 では、動かし方とか言語の特徴を説明していきます。(システムのデバッグを兼ねておりますので、お手元のバージョンでは、この通りに動かない場合があります。)


 SystemTranscriptの下の部分にプログラムを入力します。
print(12+34)

そして、do it ボタンを押します。

 入力した命令と、実行結果が返されているので、その結果が表示されます。12+34=46という計算が行われ、結果の46が表示されます。
46



2008/02/23
●定番 hello, world

 hello, worldを表示してみましょう。

 通常は、以下の4行が必要です。
component testprogram
    export Executable
    run():()=print "hello,world"
end

 さっそく実行してみましょう。
 上記の4行を、>>の部分に上記のプログラムを入力し、doitボタンを押します。


hello,world
と表示されるはずです。(※Ver.0.1では、上記の4行を入力した場合は動きません。)

 通常は、こういったプログラムをテキストエディタ(メモ帳など)で書いてファイル保存し、それを実行させるというスタイルをとるのですが、なるべく親しみやすくするため、多少の長めのプログラムでも、フォームから入力してすぐに実行できるようにしてあります。

 また、即時実行をよりやりやすくするため、
print "hello,world"
たった1行で済むようにしてもあります。



 ということで、print命令を使って、ちょっとした計算をやってみます。
 プログラムを入力してすぐ結果を確かめられるのは、わかりやすさの点で重要だと私は考えます。


 以下、入力した内容を
print(12+34)
結果を
46
と表します。


2008/02/23
●四則演算と関数について

 Fortressでは、関数と四則演算の扱いに少々癖があります。プログラムを数学のように書くので、一般的なコンピュータ言語とは式の書き方・解釈方法が少々違います。

 たとえば、表示のための命令であるprint命令自体、sin関数などと同様に引数を一つ持つ関数になっています。このため、sin,cos,tanといった関数を書くときのルールと、ほぼ同じルールになります。

 たとえば、12+34×56 の計算結果を知りたくて
print 12+34*56
と入力しても
(実行結果)
12
見事に計算してくれません
(今後のバージョンの動向によっては、エラーになるかもしれません。)

唐突ですが、

  sin θ+α

って、

  sin(θ)+α

の意味ですよね? それと同じです。print関数も、sin,cos,tanなどと同様、関数の後方に書く式は、加減算の手前までが有効になります。だから、
print 12+34*56
は、
print(12)+34*56
という意味になってしまうのです。

 加算を含めた式全体「12+34*56」を計算させるには、全体を括弧で囲む必要があります。
print(12+34*56)
 (実行結果)
1916
今度は計算できました。しかも、きちんと、乗算が優先されています。


2008/02/23
●関数について

 C言語やPascalなど、一般的な言語では、関数は
関数名(引数1,引数2…)
のように書き、引数が1つでも、必ず関数名の後ろには括弧が必要でした。(引数は「ひきすう」といいます。)
 たとえば、関数fに10を与えて計算させる場合、C言語では
x=f(10);

と書きます。sin関数も例外なく同様で
x=sin(a);

です。括弧の省略はできません。(※)
ところが、Fortressでは、引数が1つの関数については括弧を省略できます。

 たとえば、数学では三角関数や対数といった関数には一般に括弧は付けませんね。それと同じ書き方が可能です。(数学の先生で厳しい人になると、sin関数に無意味な括弧が付いていると怒ったりしますけどね。Fortressでは、無意味な括弧は省略できます。)

print sin 1
 (実行結果)
compile error:変数 'sin' は宣言されていません。
ありゃ。
sin関数、実装してませんでした。(汗)

(※)C言語で、関数の括弧の省略は文法上行えます。C言語では、関数名だけの場合は、関数へのポインタの意味になります。それに( )演算子を適用させると、その関数が呼ばれる仕組みになっています。
void main(void)
{
    int (*p)(char *, ...);
    int n=5;
    p=printf;
    p("%d",n);
}
(…確かこれで合っていたはず。)
C言語の関数にくっついている( )は、関数を示すための括弧でなく、関数を呼ぶ演算子として独立した機能を持っています。

(昔の)Pascalでは、括弧までがライブラリに登録されているので、関数名と括弧を離して書くとコンパイルエラーになったそうな。
○ writeln(a);
× writeln (a);



2008/02/11
●改めて関数(Ver.0.11〜)

…こほん。(咳払い)
print sin 1
 (実行結果)
0.841470984807897
という具合です。sin関数のように、引数が1つしかない関数には括弧が不要で、数学の数式と同じように書けます。なお、与える数はラジアンになるので、1ラジアンの正弦になっているはずです。

 同様に、sin、cos、sqrt(平方根)なども括弧は不要です。
print(sin 1 cos 2 + cos 1 sin 2)
 (実行結果)
0.141120008059867
合ってるんかいな。
print sin(1+2)
 (実行結果)
0.141120008059867

  sin(α+β)=sin α cos β + cos α sin β

加法定理ですね。


2008/02/21
●変数の宣言

 変数は、ある値を保管しておく箱のようなものです。
 Fortressでの変数宣言は、変数の後ろにコロンを付けて、その後ろに型名を書きます。
(例)
x:ZZ32

この宣言は、変数xを、32ビット整数で宣言しています。ZZ32型は、32ビット整数(C言語で言うところのlong型に相当)です。

【標準準拠の型】
ZZ32 … 32ビット整数(long型)
RR64 … 64ビット浮動小数(同double型)
String … 文字列型
Boolean … 論理型


他の言語ではIntegerとかFloatといった表記がよく使われますが、数学で言うところのInteger(整数)は無限桁数ですから、表記可能範囲を意識させる意味で、あえてZZ32みたいな書き方をしてるんでしょうかね。個人的には気に入らないけれど。

【独自拡張の型】
integer … 32ビット整数(int型)
double … RR64型に同じ
string … String型に同じ
bitmap … 24ビットカラービットマップ
color … 24ビットカラー型
form … フォーム(画面表示するウィンドウ)型
control … コントロール(フォーム上のテキストボックスなどのコントロール)型

 元々画像処理ライブラリを作ろうと思って制御言語として作り始めた関係で、bitmap型、color型などを備えます。
 integer型、double型、string型は、それぞれZZ32,RR64,String型として存在するので、削除するかもしれません。

 では、実際に定義してみましょう。通常は、プログラムを組んだ中で指定するのですが、とりあえずSystemTranscriptから直接宣言が可能です。
x:ZZ32
と書いて実行します。これで、32ビット整数型の変数xが宣言されます。

※Ver.0.1では、前回のprint時の結果が結果として返されますが、気にしないでください。


2008/02/23
●変数を混ぜた計算

続いて、
x:=3
と書いて実行します。これで、xに3が代入されます。

変数xに3が代入されたかを調べます。
print x
と書いて実行します。
(実行結果)
3
xに3が代入されました。

xの4倍を計算してみます。
print 4 x
と書いて実行します。
(実行結果)
12
xの4倍、12が表示されます。

 Fortressでは、通常は乗算のために乗算の記号を必要としません。言語仕様上、乗算のための * 演算子は持っていません。(×演算子などを使います)

 ま、感覚的に不便なので、一応、*演算子は独自拡張してあります。そのため、他のコンピュータ言語のように*記号を乗算演算子として使う事もできるようにしてあります。
print 4 * x
(実行結果)
12



2008/03/02
●文字列の連結

print "Data=" x
(実行結果)
Data=3

 このようにすると、文字と一緒に数値を出力できます。

 賢明な皆さんであれば、この書き方の正体がわかると思います。
print "Data=" * x
(実行結果)
Data=3

 そうです。文字列に対して乗算の演算を行うと文字列の連結が行われます。乗算なので、print関数に括弧を付ける必要がありません。


2008/02/11
●定数の分かち書き

数値の定数を空白で区切って並べる事ができます。
print 3.14159 26535 89793
(実行結果)
3.14159265358979

このように、5桁区切りでも良いし、会計のように3桁区切りで書いても構いません。わかりやすい桁数で区切って表記できるので、誤記を減らす事ができます。

なお、定数間では空白で区切った場合については、乗算の計算は行われません。
print 9 9
(実行結果)
99
九九は、八十一になりません。


2008/03/02

[戻る]