IGORプログラミング:データの一括処理に至る道①:関数のつくり方
本稿では全てIGOR pro 8.0を基準にして解説を行いますが、ここで紹介するレベルであればバージョン違いはそれほど大きな問題にならないと思います。
目標と想定読者のレベル
ここでは、研究室などに入ってIGOR proを使い始めて、そろそろ本格的な処理を行いたいけど何もわからない。。。
という読者を想定し、IGORを使ったプログラミングをしたことが全くないというところから
で紹介した、データの一括処理が自力でできるようになるまでを順を追って解説します!
このページではまず、IGORプログラミングを始めるための基礎の基礎を紹介します。
IGORプログラミングのはじめかた
まず、なにはともあれプログラミングするための画面を出さなければなりませんね。
IGORではプログラムを「プロシージャ(procedure)」という名前で管理し、プログラムを書くための専用領域を「procedure window」と呼びます。
この画面は下記の通り、Windows → Procedure Windows → Procedure Window、から開くことができます
(Windows → New → procedureという方法もあり、プログラムが増えてくるとこちらも重宝するのですが、今の段階では置いておきましょう)。
するとこのような画面が立ち上がるはずです。プログラムはここに書いていきます。
初めから書かれている2行はIGORのバージョンによっても異なりますが、とりあえずはそのまま残しておいて問題ありません。ここで文字のエンコードやグローバル変数などへのアクセス方法に関わる宣言を行っており、特別な意図がない限り変更する必要はありません。
IGORプログラミングを始める前に:関数とマクロの違い
さて、これからプログラムを書いていくわけですが、IGORプログラミングでは「関数(function)」と「マクロ(macro)」を作ることができます。関数というと数学の授業を思い出しますが、プログラミングでいう関数は必ずしも一つの出力を伴うわけではないなど数学でいう所の関数とは異なる点も多いですので、単に「プログラムの単位」くらいに理解してください。
関数とマクロの違いについてですが、マクロは初期のIGORで使われていたものであるため制限も多く、なによりマクロは関数と比較して相当に低速です。
実行速度は環境によって異なりますが、試しに手元の環境で比較した結果が以下の通りです。
マクロは50万回の繰り返しに16秒 (約32 μs/回)、関数は5000万回の繰り返しに5秒(約0.1 μs/回)と、実行速度におよそ300倍の違いがあることがわかります。
なお、お手元の環境での速度の違いを調べたい場合は、以下のコードをコピーしてProcedure Windowに貼り付け、コマンドウィンドウ(消してしまった場合はctrl + Jで出てきます)に「repeatMacro()」あるいは「repeatFunction()」と入力して実行してみてください。
macro repeatMacro()
variable i=0
printf "\tMacro started at %s\r",time();DoUpdate
do
i+=1
while(i<500000)
printf "\tMacro finished at %s (for %d times repetetion)\r", time(), i;DoUpdate
endmacro
function repeatFunction()
variable i=0
printf "\tFunction started at %s\r",time();DoUpdate
do
i+=1
while(i<50000000)
printf "\tFunction finished at %s (for %d times repetetion)\r", time(), i;DoUpdate
end
プログラミングの大きな利点の一つに「繰り返し処理」がありますが、実行速度が遅いと、この利点を活かしきることができません。そこで、今後は関数に絞って解説を行います。
関数の基本:何もしないプログラム
関数は以下のように作ります。
function Sukina_Namae()
end
「function」という一言で、「Sukina_Namae()」という名前の関数を作りますよ、という宣言を行います。
ここから、「end」までの間がSukina_Namae()という名前の関数になります。
関数名は好きに変えて良いですが、
- 半角英数字と一部の記号のみ使用可能
- 最初の一文字は数字や記号でなくアルファベットにする
- できるだけ関数名を見ただけで処理内容がわかるように名前付けする
ということに注意してください。
関数名の後の括弧()は今はおまじないと思っていてください。
では、関数「Sukina_Namae()」を実行してみましょう。
コマンドウィンドウ(ctrl + J)に「Sukina_Namae()」と入力してエンターキーを行います。
下図のように、履歴画面にSukina_Namae()を実行したという履歴が残り、特にエラーなどが出なければOKです。
それでは、試しに関数を使って何かしてみましょう。
文字を出力する関数
関数の学習段階において、文字を出力することは極めて重要です。せっかく何かを計算しても結果を出力しなければ意味がありませんからね。出力にもいろいろありますが、まずは基本中の基本、履歴画面への文字出力をやってみましょう。
文字出力の基本は「print」という命令です。わかりやすい命令ですので、いきなりサンプルコードを見てみましょう。
function Moji_Shutsuryoku_1()
print "Hello world!"
end
こちらを実行すると、次のようになります。
たしかに、実行すると「Hello world!」と表示されていることがわかります。
print命令を使う際には
- ただの数値(整数でも小数でも)はそのまま書くことができる
- 文字列はダブルクォーテーション(”)で囲む必要がある
点に注意してください。なお、必要なら数値も文字列として”3″のように書くこともできます。
なぜ文字列はダブルクォーテーションで囲わなければならないのか?
これは、次の「変数」の説明を見ることで理解できると思います。
変数
変数というのも関数と同じく数学の授業で出てきたと思いますが、数学でいうそれとは異なる概念です。
プログラミングにおいて変数とは、「数値や文字列(など)を記憶しておく箱」に名前を付けたものです。
こちらもサンプルコードを見たほうが理解しやすいですね。
function Hensuu1()
variable a
a = 10
print a
end
まず、「variable a」という部分で、「a」という名前の変数(数値を記憶しておくための箱)を用意しています。
続いて、「a = 10」という部分で変数aに10を代入します。
そうそう、プログラミングにおいてはイコール「=」の意味も数学とは違います。
数学では両辺が等しいという意味の記号ですが、プログラミングでは右辺を左辺に「代入」することを意味します。
今回は、左辺の変数aに右辺の数値10を代入していますので、この命令移行、aは数値10のつもりでふるまいます。
というわけで、最後に「print a」と書かれているこのプログラムを実行すると
のように、「a」ではなく変数aの中身「10」が出力されます。
print命令で「文字列はダブルクォーテーションで囲む」と注意したのは、ダブルクォーテーションで囲わずにprint aと書くと、「aという文字列」ではなく「変数a」を指してしまうためです。
なお、変数の宣言と代入をまとめて
function Hensuu2()
variable a = 10
print a
end
と書いても問題ありません。
変数名は好きなものをつけられますが、関数名と同じ注意が必要です。すなわち
- 半角英数字と一部の記号のみ使用可能
- 最初の一文字は数字や記号でなくアルファベットにする
- できるだけ変数名を見ただけで内容がわかるように名前付けする
ということですね。
複数の変数を一度に宣言する場合、
function Hensuu3()
variable a, b
a = 10
b = 5
print a
print b
end
のように、「variable a, b」とカンマで区切って一行でまとめて宣言することもできます。
このページのまとめ
ここまでで、ようやくIGORプログラミングを始めるための準備が整いました。
- IGORプログラムはProcedure windowに書く
- 実行するときは関数名をコマンドウィンドウに写してエンターキー
- 画面出力にはprint命令
- 変数とは、数値を記憶しておくための箱
次回以降、簡単な電卓から始めて最終的にデータの一括処理ができるようになるまで解説します。
お楽しみに!
“IGORプログラミング:データの一括処理に至る道①:関数のつくり方” に対して1件のコメントがあります。