この記事は、LabVIEWプログラムとは何?全然イメージが湧かないよ、という方に向けた内容となっています。
LabVIEWはグラフィカルなプログラミング言語と呼ばれて、いわゆる命令を文字(テキスト)で書き連ねていくテキスト言語とは全然異なる書き方になります。
テキスト言語はわかるけれど、グラフィカル言語と聞いても全然イメージできない、という方のために、Pythonを例にプログラムの構造の違いを紹介します。
具体的なプログラムがあった方がいいと思うので、コラッツ予想の計算をどう書くかを通してLabVIEWのプログラムはこんなもの、という例を紹介していきます。
グラフィカル言語、LabVIEW
LabVIEWというプログラミング言語は、アルゴリズムをグラフィカルに表現します。
これだけ聞いて、LabVIEWを全く知らない人がどんなものか想像することは不可能だと思います。
あとで具体的なプログラムを題材に例を紹介しますが、最も簡単なプログラムとしては例えばこんな感じです。
LabVIEWのプログラムには二つの顔があり、ユーザーインタフェースになる「フロントパネル」と、アルゴリズムを書きだす「ブロックダイアグラム」があり、二つで1セットになっています。
上の図の左がフロントパネル、右がブロックダイアグラムです。入力と出力、と書いてある通り、入力側の数値が何らかの処理を経て出力されるというプログラムになっています。
ブロックダイアグラム上でオレンジ色で示された二つの長方形が線で結ばれていますが、この線を伝ってデータが入力から出力へ渡されるというイメージでデータを処理していきます。
上の例ではただただまっすぐ線が引かれているだけなので、入力=出力になっています。一方で例えば下の図のように処理を加えることができます。
こちらのプログラムのブロックダイアグラムを見ると、数値入力という部分から出た線が和と書かれた絵につながっています。この和にはもう一つ3と書かれたもの(定数)からも線がでてつながっていて、その和の右側から出た線が数値出力につながっています。
何となくわかるかもしれませんが、これがLabVIEWの処理の流れになっています。ブロックダイアグラムの数値入力や数値出力という名前と一致した項目がフロントパネルにも表れており、例えば数値入力に4と入れて実行すると結果として数値出力に7が表示されている状態になっています。
これがグラフィカルプログラミング言語であるLabVIEWの実体です。
こんな簡素なプログラムではつまらないので、もう少しそれっぽいプログラムでアルゴリズムの実装の方法も今から説明していきます。
で、その題材として本記事ではコラッツ予想の計算を扱うことにしました。(題材なんて本当はなんてもいいのですが、面白そうだったので)
これ自体は、数学の未解決問題なのですが、問題自体は非常にシンプルで、四則演算が理解できれば問題も理解できます。
数学者ではないので厳密な定義はわかりませんが、内容としてはある数Nを考えたときに
- その数が偶数なら2で割る
- その数が奇数なら3倍して1を足す
という操作を繰り返すと、最初の数Nがどんな数であっても最終的に必ず1になると予想されているらしく、これが全ての数で成り立つのかはまだ証明されていないようです。
例えば、最初の数Nが7の場合を考えると、
7→22→11→34→17→52→26→13→40→20→10→5→16→8→4→2→1
となるといった具合です。Nが7以外の場合の小さい数でも、たまに1にたどり着くまでの計算がかなり多くなる数もあるようで(例えばN=31など)、Nが小さければいいというものでもないようです。
プログラムを使って調べる
ではこの初期値Nを与えてどんな数の変遷をたどって1になるのか、ということを調べるプログラムをどう書くか、まずは比較対象としてPythonで書いた場合の例を示します。
Pythonプログラムの場合
指定した数への演算を、数が1になるまで繰り返させて、結果をリストにいれて表示させるようにしています。(他の書き方もあると思いますが、LabVIEWとの比較を考えた書き方としています)
def collatz(num):
result_array = []
index = 0
while num != 1:
if num % 2 == 0:
num //= 2
else:
num = num * 3 + 1
result_array.insert(index, num)
index += 1
return result_array
これを計算することで、result_arrayとして定義したリストの中に1に至るまでに至った数値が格納されます。
LabVIEWプログラムの場合
次に、比較対象として同じようなことをLabVIEWで行う場合の例を示します。(敢えて上記のPythonプログラムに近づけた形としたプログラムとしています)
実行結果をいくつか示してみます。
ブロックダイアグラムと対応してフロントパネル上でいくつかの結果が出ていることが分かると思います。
両プログラムを比較する
では、PythonプログラムとLabVIEWプログラムを比較してみたいと思います。
完全に一対一で対応するわけではないので、あくまでこんな対応がある、というざっくりした説明にはなりますが、テキストで書いていることを全て絵で表現するという感覚がわかればいいかなと思います。
まずは、関数を定義する部分です。Pythonではdefの後に関数名を書いていました。
LabVIEWでは、プログラム(viと呼びます)を作ること自体が関数を作ることに相当します。今から紹介していくviを、そのまま他のviにおいて呼び出して実行できるためです。
さて、関数の中身にはアルゴリズムを記していくので、ここから先はLabVIEWでいうところのブロックダイアグラムとの対応になります。
まず、関数で使用される変数を定義します。今回のプログラムではWhile文を使用していますが、PythonではそのWhile文に入る前に引数であるnumやresult_arrayというリスト、そしてindexという数値を定義しています。
LabVIEWでもこれらの値を定義するところから始まります。PythonでリストにあたるものがLabVIEWでは配列と呼ばれます。関数に与える引数numはLabVIEWプログラムのブロックダイアグラムでは端子として示され、対応するものがフロントパネル上に表れます(上の図でnumと書かれている部分がそれです)。
次に、PythonプログラムではWhile文に入っていきます。
LabVIEWでは、While文を四角いグレーの枠組みで表します。要は、この枠組みに入っている中の処理が繰り返される、ということになります。
while文の条件は一旦置いておいて、中身にはif文が使用されています。
これもLabVIEWでは絵的に表現するため、if文のTRUEやFALSEにあたる内容をそれぞれTRUEのケース、FALSEのケースとしてWhileの枠組みとはまた異なる見た目の枠組みで囲みます。
numの値を「商&余り」という処理に渡し、numを2で割った余りが0に等しいかどうかを判別している様子が下の図です。
判別してTRUE、つまり2で割った余りが0となっている場合にはnumの値を2で割っています。
もし0に等しくない場合には、numの値を3倍して1足している、という場合には下の図のようになります。
if文での処理が終わったら、Pythonプログラムではリストにnumの値を挿入しています。また、インデックスの値に1を足して更新しています。
LabVIEWでは、リストならぬ配列に対して「配列要素挿入」という処理を用い、インデックス番号とif文からの結果を渡しているのがわかるでしょうか?
またインデックスについてはインクリメントという処理を施すことで値を更新しています。
ここで、先ほど飛ばしたWhileループの条件が出てきます。今回のプログラムとしては、numの値が1出ない限り処理を続ける、というのがPythonプログラムで指定しているやり方になっています。
LabVIEWプログラムでは、if文の結果が1と等しかったらWhileループを停止する、という書き方になっています。
この点については、LabVIEWプログラムを「1と等しくなかったらWhileループを続ける」という書き方にすることもできるにはできるのですが、デフォルトでは「ある条件がTRUEになったら処理の繰り返しを止める」というのがLabVIEWのWhileループであるため、Python(ある条件がTRUEである限り処理を繰り返す)とは逆の動きになります。
なお、Whileループが繰り返される場合、現在のループの結果を次のループに渡す必要があります。LabVIEWではシフトレジスタという処理でこの動作を実現しています。
さて、Pythonでいうところの戻り値にあたるものはWhileループを抜けた後のリストの結果になっています。
LabVIEWでもWhileループという枠組みを抜けた後の配列を戻り値としています。
以上が今回のサンプルプログラムについてのPythonとLabVIEWの対応になります。
途中、Whileループの抜け方について条件の考え方が逆になっているという風に説明しましたが、このようにPythonとLabVIEWでは感覚が異なる点が他にもあります。
本記事でそれらを挙げていくのは主旨ではないのですが、例えば
- PythonはWhileの条件次第では中のコードを一度も実行しないことがあるがLabVIEWは一度は必ず実行する
- Pythonのリストは複数のデータタイプを含めることができるが、LabVIEWの配列は一つのデータタイプしか含めることができない
などといった違いがあります。
また、今回紹介したLabVIEWプログラムは必ずしも最適化されていません(余分な処理などを加えています)。Pythonとの(可能な限りの)対応を無視すれば、例えば以下のように書いても同じ結果を得られます。
そのため、「プログラミング言語」という意味で共通はしていても、それぞれの言語で特徴的な書き方や便利な表現方法などがあるため、そういった違いは少なからず慣れる必要があります。
LabVIEWの中でPythonプログラムを呼んで動かす
ここまでPythonとLabVIEWのプログラムを比較してLabVIEWというグラフィカルプログラミング言語とはどういったものか、その一端を紹介してきました。
すべてを絵的に表現する、ということがお分かりいただけたでしょうか?
ところで、LabVIEWは、LabVIEWプログラムの中でPythonを呼び出すことができます。これ専用の関数があり、これを使用するだけです。
本記事の本質とは外れますが「今まで使っていたPythonのプログラムがある」という場合にそれを流用する方法もなくはないよ、といった程度に参考にしていただければと思います。
私はLabVIEWを使用してプログラミングに親しみを持ったのですが、プログラミングの入門としてとっつきやすいのは重要なことと思っています。
グラフィカルにプログラミングする、という言葉を聞いて、何か頼りなさやどこまでのことができるのか不安、と思う方も中にはいるかもしれません。
言語によって得意、不得意があるので一概にどれが優れているといった表現はできないと思いますが、LabVIEWはプログラミングのアルゴリズムや考え方を学ぶための初歩としてだけでなく、ハードウェアを動かすなど本格的なプログラムを作るのにも対応できる、応用の広い言語だと思っています。
どんなものでも、わかりやすさはとても大事だと思います。この点、文字の羅列より、絵で表現されているということがLabVIEWの魅力であるという説明はよく見るものの、知らない方にとっては実際にどんなだろうというイメージを付けづらいと思います。そういった方々に、どんなことでも絵的に表現する、という感覚を本記事で何となく感じとれてもらえていたらうれしいです。
ここまで読んでいただきありがとうございました。
コメント