ビジュアルプログラミング言語を俯瞰する(ScratchからNode-RED、TouchDesignerやIFTTTまで)

# はじめに

世の中にたくさんあるビジュアルプログラミング言語(Visual Programming Languages; VPLs) の全体像を俯瞰したい、という欲求が以前からありました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/e2f1d13c-50aa-0aae-81ed-780bc6971c82.png)


Scratch、Node-RED、TouchDesigner、IFTTTなど、教育や個人用途や業務用途、従来プログラミングの置換え、データ流通、メディアアート用途のものまで様々なビジュアルプログラミング言語を見聞きしたり触れるうち、その想いが強くなりました。
粗いところも多々ありますが、一旦本記事に手元のメモをまとめます。


## VPLsの定義

> ビジュアルプログラミング言語（VPL）とは、プログラム要素をテキストで指定するのではなく、グラフィカルに操作してプログラムを作成することができるプログラミング言語のことです。
> -- https://en.wikipedia.org/wiki/Visual_programming_language より抄訳

> プログラムをどのように視覚的に表現するかには、いろいろな種類がある。「矩形と矢印」の考え方に基づいており、矩形や円を画面上のオブジェクトとし、それらを矢印や線や弧でつなぐものや、空間上でテキストやグラフィックシンボルを配置するものや、ブロック状のものなどがある。それぞれを指す呼び方としては、アイコンベースの言語、フォームベースの言語、ダイアグラムベースの言語などといった用語がある。
以上のような要素を操作するために、ほとんどの言語では、GUIが提供されている。
> -- [ビジュアルプログラミング言語 - Wikipedia 日本語版](https://ja.wikipedia.org/wiki/%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)より

## VPLsの種類

これらの類型化にはいくつかの方法がありそうです。本記事は ["The maturity of visual programming"(2015)](https://www.craft.ai/blog/the-maturity-of-visual-programming/)  での類型をベースとし、そこにいくつかの注釈、再構成を行う形としました。カテゴリ毎に、背景や特徴、ビジュアルでの表現方法の説明、言語の例を挙げました。歴史、領域などで、こういうのもあるよ! といったご意見ありましたら是非教えてください。

**本記事での類型**

- **ブロック型(Block-based)**
- **フロー型(Flow-based)**
 - 汎用
 - ビット列、数値
 - 形状
 - 音、画像、映像
 - 大量データの連携
 - 深層学習
 - ワークフロー(BPM)
 - (参考) "classical" flow-based programming
- **その他**
  - Event driven rules
  - Finite State Machines *(追記予定)*
  - Behavior trees *(追記予定)*

## VPLsの歴史

代表的なものの初期リリース時期などを挙げます。
Block-basedは、教育用途に、比較的最近開発が始まったのと比較し、Flow-basedは(類型の対象を広く捉えていることもありますが)、Data Flow Programming等のプログラミングパラダイムの興りを受けて、1980年代から使われていたことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/ba0d2114-29b5-cee9-7eab-58980cf366a3.png)

では、これらを一つ一つ見ていきましょう。


# ブロック型言語(Block-based VPLs)

### 背景と特徴

手続き型のプログラミング言語の1行から数行を、ブロックに置き換え、それらを組み立てることで、直感的にプログラミングを行えます。プログラミング言語をタイピングすることが難しい年代からでも取り組め、主に教育用途で使われています。
2000年代初頭からプロトタイピングが始まり、2006年に発表された教育用プログラミング環境 Scratchが非常に有名です。


### 表現方法

例えば、コードのあるひとかたまりが、ブロックで表現されます。それらをドラッグ&ドロップで「組み立て」ていくことで、ソースコードと等価な手続きが出来上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/22aaa4ce-bba9-bd27-dd13-48122866d481.png)

> 出典: https://developers.google.com/blockly


### 代表例

##### Scratch (MIT) 

https://scratch.mit.edu/

教育向けに最もよく知られているのは、ビジュアルプログラミング言語であり、実行環境でもあるScratchでしょう。日本の小学校でのプログラミング教育でも多く取り上げられ、[厚切りジェイソンのNHK番組](https://www.nhk.or.jp/sougou/programming/) も話題となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/9be1a128-b01f-bd71-fea4-265fa31d7431.png)

> 出典: https://scratch.mit.edu/about

書籍も多く発売されており、例えば [こちら](https://amzn.to/3hNtuhG) には、以下のような学年との対応表があります。ブロックは、日本語へのローカライズだけでなく、低学年でも読みやすいよう、ひらがな化されたものもあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/2ee06c21-be91-2be3-1622-80ef64017d7d.png)

>　出典: [親子でかんたん スクラッチプログラミングの図鑑](https://amzn.to/3hNtuhG)


##### MakeCode (Microsoft) 

https://www.microsoft.com/ja-jp/makecode

MakeCodeは、次に挙げるBlocklyをフロントエンドのベースとして用いています。また、Scratchと同様に実行環境を伴ったものです。リリース時のmicro:bit用実行環境に始まり、対象メニューを増やしてきました。以下のように、(みんな大好き)マインクラフトを題材とした、ブロックベースのプログラミングを行うようなコース、ライブコーディング例もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/e2ac45f5-0b21-986d-a781-30fe5bd550f5.png)

> 出典: https://www.youtube.com/watch?v=NEenOTqMv48


##### Blockly (Google) 

https://developers.google.com/blockly

前の二つが言語かつ実行環境であるのに対して、Blocklyはブロック型言語のフロントエンドであり、ブロック型言語から様々な言語へのトランスパイラとして動作します。そのため、ブロック型言語の編集画面と、そこからトランスパイルされたソースコード画面を行き来できます。Blocklyは、様々なオープンソースのブロック型言語プロジェクトに取り込まれています。最新のScratch3.0は、ソースコード編集部分のエンジンにBlocklyを採用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/fc0826ba-50da-73fc-e076-8145f606cb9e.png)


> 出典: https://developers.google.com/blockly

上のScratch、MakeCode共に、Blocklyを活用しています。Blockly Developer Summit [2019](https://www.youtube.com/playlist?list=PLSIUOFhnxEiDpgF62jkfdSYGGhK-pe3tL)や[2018](https://www.youtube.com/playlist?list=PLSIUOFhnxEiCxU0n9IPYZXL-UNNiUeEte)に、ブロック型言語間の交流を見ることができます。

また他にも以下のようなプロジェクトで使われています。皆さんが利用されている言語が見つかるかもしれません。

- **Arduino** https://ardublockly.embeddedlog.com/index.html, https://github.com/BlocklyDuino/BlocklyDuino
- **ROS** http://wiki.ros.org/blockly
- **OCaml** https://github.com/harukamm/ocaml-blockly
- **Python** https://think.cs.vt.edu/blockpy/
- **Processing** https://github.com/kut-tktlab/blockly-processing
- **UIFlow** https://flow.m5stack.com/




# フロー型言語(Flow-based VPLs)

### 背景と特徴

フローベースのビジュアルプログラミング言語は、見た目こそ似て見えますが、手続き型のフローチャートをそのまま表現したものと、データフローベースのものなど、異なる設計思想に基づくものがあります。単純なノードとそれを接続する線という見せ方を採用したものから、関数型プログラミング、ノイマン型コンピュータの限界に対して何をすべきか、といった思考や課題解決に基づき作られているものまで様々です。また、そのフローを通してやりとりされる「データ」にも様々な種類があります。


### 表現方法

各ノードが何らかの処理を表し、それを結ぶ線がノード間の接続を指します。
そして、何らかのイベントがトリガーされると、線で結ばれたノードを、データが通り抜けて行きます。言語設計に依存しますが、それらのデータは見かけ上または実際に、並列に処理されます。各ノードを通過する毎に何らかの処理や変換が行われ、最終的に処理済みのデータがどこかに渡される、という形を取ります。

こちらはNode-REDフローの例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/be27c602-3705-d10a-c19a-63c14d11311a.png)

以下の一連の動作を行います。
1. BLEの心拍センサから心拍数を受け取る
2. その値を次のノードに渡す
3. 受け取った値をデバッグコンソールに出力する



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/0e67288a-baae-2805-cfb6-1a20b2c1e9cc.png)

さらに様々な機能を持つノードを線でつなぎ、拡張していきます。この例では、ビット列からの値の切り出し、ダッシュボードの描画、WebSocketでの値の送信の機能を備えました。


先に述べたように、ノード間を流れていくデータは、数値だけではなく、ビット列、画像、映像、音、大規模なテーブルデータなど、様々なものがあります。そのため、通常のプログラミングから、組み込み開発、メディア作品の制作に使われるツール、データの転送・管理などに特化したものから機械学習用のソフトウェアまで、幅広い用途のものがあります。

### 代表例

#### 汎用

ここに挙げるものは、JavaScript(Node.js)の開発をフローベースで行うことができます。

##### NoFlo

https://noflojs.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/46f4e816-7b30-b5a0-5c6a-ee5d00962b3f.png)

> 出典: https://noflojs.org/example/


##### Node-RED

https://nodered.org/

IBMの開発していたものがオープンソース化されました。[Web上の日本語チュートリアル](https://nodered.jp/docs/tutorials/)や、[IoTの実例を紹介する書籍](https://amzn.to/3hNk9Xh)などが発売され、ラピッドプロトタイピング用途に使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/d5ac49e6-bc33-501f-8c4b-a3bf7d61b8e4.png)

> 出典: https://nodered.org/



##### (参考) "Classic" flow based programming

Flow-based Programmingは、1970年代前半にJ. Paul Morrison氏が発明したものとされます。余談ですが、御年80歳を超える今もGitHub上にアクティブに発信されています。氏は、NoFloに端を発し、Node-REDなどに広がりを見せた"FBP"は、"FBP"のエッセンスを取り入れており一定の評価はできるのだが、氏の提供した真の"FBP"ではない、としています。興味を持たれた方は、 [こちら](https://jpaulm.github.io/fbp/index.html) から全文が読めます。

> NoFloは、FBPに光をあてた功績をたたえつつ、FBPと異なる点がある。手続き型、アルゴリズミック、1つのことを1回に行う、という従来型のプログラミングに近い。configurable modularity, componentry, visual designを従来型プログラミングに持ち込むこと自体は意味があるが... 開発者体験, メンテナンス性の観点では、従来型のプログラミングと変わらない。
> -- http://www.jpaulmorrison.com/fbp/noflo.html より抄訳



#### 数値、ビット列

組み込み開発や、シミュレーション、モデリングに用いられます。

##### LabVIEW

https://www.ni.com/ja-jp/shop/labview.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/25e13bde-30f4-fc3f-b604-257eb33e5bcd.png)

> 出典: http://www.ni.com/tutorial/6951/en/

##### Simulink (MATLAB)

https://jp.mathworks.com/products/simulink.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/85bb03af-c8c8-125c-0b41-5ce0cd979a90.png)

> 出典: https://jp.mathworks.com/products/simulink.html


#### 形(頂点、平面、立体などのオブジェクト)

プロシージャルモデリングといわれ、建築、デザイン用途に使われます。

>「プロシージャルモデリング（Procedural Modeling）」とは、プロシージャル（数式や処理を組み合わせ）を利用して3DCGのモデル（物体）を生成することを指します。プロシージャルとは、もともと「手抜き型」や「手続き型」という意味で、数式を用いて何らかの法則に従ってあらかじめ準備しておいた処理を行います。
> -- [プロシージャルモデリングとは](https://school.dhw.co.jp/word/cg/proceduralmodeling.html)


##### Grasshoppper(Rhino)

https://www.rhino3d.com/6/new/grasshopper

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/4379372b-c79c-1fa7-29e3-f257b4aa1655.png)

> 出典: https://vimeopro.com/rhino/grasshopper-getting-started-by-david-rutten

以下は全てGrasshopperによる作例です。建築などで、アルゴリズムから生み出されるデザインの裏に、こういったソフトウェアが活用されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/35aa605b-df93-c339-787a-5f9a1ccfcb79.png)

> 出典: [建築/プロダクトのための、Grasshopperクックブック](https://amzn.to/3fPKJ09)

##### Nodi

https://nodi3d.com/

プロシージャルモデリングを、Webベースで扱えるものを個人で開発されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/56ae6925-2d02-72c4-327d-cb3c42bec8b0.png)

> 出典: https://nodi3d.com/

##### Houdini

https://www.sidefx.com/

プロシージャルに3DCGや、アニメーションを制作できます。Side FX社の提供するソフトウェアですが、Houdini Apprenticeという無償版ライセンスも提供されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/3565e6e2-980b-0c21-fc34-453f42056dc0.png)

> 出典: https://www.youtube.com/watch?v=J91mQ9OJq6s

また[日本語での解説書籍](https://amzn.to/2YlmGjv)も複数発売されており、書影から、できることの幅広さが伺えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/b1c458ac-c284-c769-96b1-d0818b72b3eb.png)

> 出典: [理論と実践で学ぶHoudini](https://amzn.to/2YlmGjv)


#### 音、画像や映像

VJ、メディア作品のオーサリングに使われます。

##### Pd(Pure Data)

https://puredata.info/

入門から、音、画像に対する処理までの [チュートリアル](https://www.ei.tohoku.ac.jp/xkozima/lab/avmed-pd1.html) があります。また、[Max](https://www.mi7.co.jp/products/cycling74/) はPdの商用版です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/a337971c-daf1-4c7a-cb2b-5d63f37824c0.png)

> 出典: https://www.youtube.com/watch?v=jADuLtsFqkk

##### Stamper

https://p5stamper.com/

p5.js(Processing)を使った、フローベースのクリエイティブコーディング環境。関連論文は [こちら]([Stamper: An Artboard-Oriented Creative Coding Environment](https://dl.acm.org/doi/fullHtml/10.1145/3334480.3382994))。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/5a94496a-d43f-51ba-78a7-79f455372915.png)

> 出典: https://vimeo.com/392454807

##### TouchDesigner

https://derivative.ca/

カナダ Derivative社の提供する商用ソフトウェア(無償でつかえるコミュニティ版もある)です。日本語リソースとしては、[TDSW YouTube Channel](https://www.youtube.com/channel/UCKwb_ZPHs-DEzK9TdVl3_Ew)が最近盛んに動画チュートリアルを発信されています。似たコンセプトのソフトウェアに、vvvvなどが挙げられます。

私自身[「Visual Thinking with TouchDesigner　プロが選ぶリアルタイムレンダリング＆プロトタイピングの極意」](https://amzn.to/3hQXEjZ)という書籍を持っていますが、現場でどのように使われているか、実例に触れられていて面白いです。[紅白歌合戦でUnityと組み合わせ活用された例](https://madewithunity.jp/info/stu/)もありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/b7650b88-adba-7f4e-9bd0-068d64865d94.png)

> 出典: https://www.youtube.com/watch?v=hbZjgHSCAPI


#### (大量)データの連携
##### Apache Nifi

https://nifi.apache.org/

ETLのように、あるストレージやデータベースから他方への連携、連携時の変換、といった内容を担います。
そういった操作をグラフィカルに行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/6c8542bc-05f3-15b2-e8dc-6352cb2afbaa.png)

> 出典: https://nifi.apache.org/



#### その他

ここ以降は、ビジュアル"プログラミング"ではありませんが、データフロープログラミングであり、コードから、グラフが生成されるようなケースを取り上げます。通り抜けるデータとしては、数値の行列、その行列で表された画像、映像、文章であることがあります。

##### MediaPipe

https://github.com/google/mediapipe

ノードをつなぐ線を通り抜けてゆくデータへの処理は、機械学習の適用も考えられます。GUIのエディタはなく、ビジュアルプログラミング言語とは言えませんが、これはデータフロープログラミングの概念の基づくものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/4c01ecdd-4779-63c3-a6f9-3a2b42cfc77b.png)

> 出典: https://ai.googleblog.com/2019/08/on-device-real-time-hand-tracking-with.html


##### TensorFlow

https://www.tensorflow.org/

TensorFlowは、さまざまなタスクのデータフローや微分可能なプログラミング用のオープンソースライブラリです。ニューラルネットワークなどの機械学習アプリケーション適用で知られます。こちらもGUIのエディタはなく、ビジュアルプログラミング言語とは言えませんが、データフロープログラミングとの関係性から取り上げます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/731bb1c7-1809-6468-7b27-834f96670b3e.png)

> 出典: https://www.tensorflow.org/tensorboard/graphs


#### ワークフローエンジン
##### Camunda BPM

https://camunda.com/

こちらもビジュアル"プログラミング"かと言われると微妙なのですが、ビジネスプロセスモデリング言語であるBPMNを用いて、よく会社で使われるようなワークフローを作るソフトウェアを取り上げます。企業向け、プロプライエタリなソフトウェアが多いですが、Camunda BPMの様に、一部オープンソースも存在します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/61a276cf-7281-f633-0149-62adc8d298de.png)
> 出典: https://docs.camunda.org/manual/7.13/


# その他
## Event driven rules

### 背景と特徴

あるイベントのトリガに対して、何かを実行する、という「プログラミング言語」と呼ぶにはシンプルなものも含みます。

懐古になりますが、00年代後半、RSSフィードアグリゲータが盛り上がった時期がありました。Plagger、そしてYahoo! Pipesなどがありました。Plaggerはyamlで処理や使用するモジュールを記述をしていましたが、Yahoo! PipesではGUIとして提供されました。RSSフィードなどの配信をトリガーに、なんらかの処理を行い、出力するというものです。Googleで「腹減った」と検索したらピザを頼める! なんて記事( https://e8y.net/blog/2006/07/25/p126.html )もありました。

その後、スマートフォンが普及し、個人向けに10年代からIFTTTが流行りました。"If this, then that." のサービス名の通り、定義されたトリガーから、なんらかの処理を行い、出力を目的の場所(メール、通知、ファイルの保存・配信など)へ返します。

ここでは取り上げませんが、エンタープライズ向けでRPA文脈、およびハイブリッドクラウド文脈でiPaaS(integration platform as a service)という様々なSaaSをイベント駆動型で繋ぐアプリケーションもあり、それらはこの「Event driven rules」と「(大量)データの連携」「ワークフローエンジン」をまたがる領域で活用されます。

### 表現方法

トリガー、処理、出力先をそれぞれ定義します。それぞれ、簡易に組み立てられるよう、予め準備されたライブラリーから選ぶことがほとんどです。
以下の例では、「Gmailに新着メール」が来ることをトリガーに、「添付ファイルをDropboxに保存」という処理をし、「Slackに通知する」という出力まで行うフローの定義です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/9876fe41-5fad-f00a-4480-70d82936534b.png)
> 出典: https://zapier.com/

### 代表例

##### IFTTT

https://ifttt.com/


##### Zapier

https://zapier.com/

##### Power Automate (旧Microsoft Flow)

https://flow.microsoft.com/ja-jp/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64608/1c73c2a2-4de5-dab8-894f-62bb5ca60837.png)

> 出典: https://flow.microsoft.com/ja-jp/templates/

## Finite State Machines

- 追記予定


## Behavior Tree

- 追記予定


# おわりに

ビジュアルプログラミング言語の内、実際に触ってみたもの、少なくともデモなどを見られたものを中心に紹介しました。
より幅広いリストは [英語版Wikipedia - Visual Programing Language](https://en.wikipedia.org/wiki/Visual_programming_language) に取り上げられています。ご興味を持たれたら、活用してください。
歴史、領域など、おそらくスッポリ抜けているところがあると思うので、類型および追加するとよい項目について、ご意見いただけたら嬉しいです。