LabVIEW その2

shagaくん 『 Cをベースにした制御構造に慣れているせいか、LabVIEWに特化したものはなかなか思いつきませんよね。』

僕はむしろ今までハードウェア設計をやってたので、SPWMATLAB/Simulink といった、ダイヤグラムベースのシミュレーションプログラム開発環境をずっと使ってきました。なのでダイヤグラムで処理を設計することには慣れているつもりです。それでもLabVIEWはとっつきにくいです。
LabVIEWはソフト屋的発想(順序処理)とハード屋的発想(同時処理)がごっちゃになってるような感じがします。



他に感じたことを違和感を挙げると、

  • すべてのVI(関数やオブジェクトのようなもの)がフロントパネル(GUI)をもち単独で動作できる。たとえば Cの関数で int add ( int a, int b ) { int c; c = a + b; return c; } というような単純なものでさえ、LabVIEWのVIでは必ずGUI (aとbを入力する欄とcが表示される欄があるウィンドウ) をもち単独実行できる。 もちろんGUI非表示で他のVIからコールされることもできる。
  • VIへの入力と出力 (関数の引数と返り値) がダイヤグラム上では見た目で区別しにくい。入力のことを「制御器」といい、出力のことを「表示器」という。 
  • そもそも外部との入出力(関数の引数と返り値、回路のinputとoutput)とVI内部の変数(関数のローカル変数、回路のreg)もダイヤグラム上では見た目で区別しにくい。ふつう回路図とかならもっと直感的に分かる描き方をするのに。
  • 構造体のことを「クラスター」と言ったり、ループ内で繰り返し使われる変数のことを「シフトレジスタ」と言ったり(なんでやねん!)、とにかく用語が特殊。



僕の前任者は絶対、ソフト屋だと思う。

トップのダイヤグラムで、未結線のVIをとりあえず並べておき、下階層のダイヤグラムで、そのVIを「リファレンス呼び出しノード」で結線する。

というややこしいことをしている。これはつまり、

グローバルで関数を定義しておき、ある関数から関数ポインタでその関数を呼び出す。

という発想だ。「リファレンス呼び出し」は原文の英語で「Call By Reference」といったほうがソフト屋には分かりやすいと思う。 ハード屋はこういう発想をしない。回路にポインタで結線なんてありえないから。