**********************************************************************
セッションs1a 分科会・パネル
テーマ:【SWEST/ESS共同企画セッション】組込みに使うプログラミング言語について語ろう!
コーディネータ:間瀬 順一(アイシン精機株式会社ソフトウェア技術部)
日時:2019/9/5(木) 21:00〜22:30
参加人数:約30人
**********************************************************************

◆はじめに
車載分野では、いまだにおおむねC言語が使われている。
モデルベース開発の分野ではMATLAB/Simulinkも普及してきたが
SimulinkもCを出力しているので、まだCが使われているという状況

◆お願い
主観的な批判や事実に基づかない主張は泥仕合になるので避ける。
言語に関わる人へのリスペクトを持ちながら客観的、科学的な議論をしていく。


◆議題
Next Cはあるのか
Pythonが流行っている理由
ある言語が広く使われるにはどんな特徴が必要か



◆間瀬 順一 氏のポジショントーク
88年〜90年コンピュータの開発をする会社でアルバイト UNIX環境 Cを使っていた
個人では8bitPC コンパイラが有償でとても高かった。
アセンブラやバイナリを打ち込んでいた時代。
アセンブラから見たらCはとても使いやすかった。
Cが書きやすいから広まったというのを実体験した世代

オブジェクト指向設計の個人的経験
98年〜2000年電気系ソフトウェア開発会社に勤務
Windows 上でGUIをつくる作業が C++(Visula C++)に移行してきた時代
4、5年前の世代ではCでGUIを書いていた。
GUIをCで書くのはしんどそうに見えた。
ものとして見えやすくて物のあいだをメッセージでやり取りするという考え方の
オブジェクト指向はWindowsシステムにぴったりはまっていると思った。
GUIみたいに書きやすいアプリがあったからオブジェクト指向が流行ったという原体験がある。


◆パネラーの方からのポジショントーク
●東京工業大学 渡辺 卓雄 氏
大学でプログラミング言語に関する研究をしている。
組込みシステム向けに副作用のない関数型言語でプログラムを書いている。
高校生時代 言語処理系を作るのにCがちょうどよいから使っていた。
論文を書くのにはCommon Lispを使っていた。

仕事自体はHaskellのような関数型言語を使っている。
それ以外にErlanやElixirやRustを学生に合わせて使ったりしている。
最近やっているのは関数リアクティブプログラミング(FRP)
Haskell:副作用のない関数型言語
肝となる概念:時間とともに変化する関数をそのまま使って演算しよう。抽象化
ポーリングや割り込みでアップデートしなくてもそのまま使える。

強い型付けを伴う関数型言語

小規模システム用関数リアクティブプログラミング言語

ロボットの制御もできるというデモ
去年;分散処理や並列処理をやりたい。
今年;分散処理版ができた。

・Cの次にくる言語:型は必要だろう。型の助けなしにプログラムをかきたくない。
依存型:通信パターンを型とみなす。通信に関するエラーが起こらないことを
保証できる。
リソース型:リソースの使い方 ファイルをオープンしたらクローズする。

Cの次の言語に必要なものは
・型安全性
・メモリ安全性 所有権の移譲
・記憶管理
・並行性
・実時間性
候補としてC++でないことは確か。
Rust:メモリの所有権ががっちりしている。

・なぜPythonが流行ったのか
言語としては簡単
ライブラリが豊富
一番流行っているCPythonはいまいちだが頑張ってる処理系がある。
お金を出さなくても実用的に使えて教育用として普及している。


・ある言語が普及するには
ちゃんとしたドキュメントやチュートリアルが必要
なんでこの言語がほしいのかを短いニュアンスでビシッと書いてるとすごく使いやすい。

開発環境も重要。
例:言語を作っていて.elを書くのにEmacsが簡単

キラーアプリが欲しいと言っているようじゃ駄目で、こういうものが欲しいから作った
という姿勢が理想。


●九州大学 田中 和明 氏
mrubyを始めた理由
ロボット関係や組込み関係をやっていてC言語で作っていた。
C言語はめんどくさい、大変だからやめたい。
データ処理でRubyを使っていて書きやすいと思った。
うまく組み合わせられるといいなと思ったのが2007年。
そうして作られたのがmruby。

C言語のパフォーマンスに惹かれていってmrubyを作った(C言語で)。
mrubyで子供たち用の商材をつくって子供たちに使ってもらっている。

mrubyの特徴
言語として分かりやすい
子供たちに使ってもらって熱中してもらえる
子供たちは集中力が持たないので数分で書けるような言語が必要。
行を書く言語(RubyやPython)かブロックを組み合わせる言語。
長いプログラムを書くのには行を書く必要がある思ってmrubyを推薦。

子供に教えるときは休憩をはさむことが必要
集中して理解度も高いので習得はすぐ。
覚えてしまうと回すだけなので、それを抑えて子供たちが理解できる範囲で時間を組む
のが大切。子供に教えててだんだん広まっていった。
今では小中学生から専門学校や社会人向けにも使ってもらっている。

mrubyはとにかく使いやすい。
M氏:mrubyは日本初なので応援したいと思っている。


●北九州市立大学 山崎 進 氏
Elixirについて
プログラム言語処理系の研究開発者なので実現できていることだけでなくこれからの
予定も含めて話をする

Elixirの流行っている(流行らせたい)背景
情報量爆発:2013年データの総量が4ゼタバイト 来年にはその10倍に
増える量も年々増化している
半導体のトレンド 計算量が追い付かない。
2003年 消費電力と発熱の増大でクロック周波数が頭打ちに。
最近は代わりにコア数が増えてクロック周波数はむしろ落ちている。

今後の半導体トレンド
メモリの高速化:プロセッサに追い付いていない。
コア数は増え続ける。数千コア程度
メモリアクセスの高速化で共有型より分散型のほうが優位に。

kilocore 研究開発用で1000コア
Wafer-Scale Engine 1辺215ミリ 40万コア 消費電力15KW 冷却テクノロジーの
進歩によって登場


従来の言語の問題点
共有データの破壊的更新による排他制御がボトルネックに。
Elixirは破壊的更新がない。他のコアを止める必要がなく、メモリ破壊バグが起きない。


●イーソル 竹内 陽児 氏
組込み言語としてのRust Rust応援団(仕事では使ってない)
一番好きなのはPython(組込みで使う気はない)

Rustとは
性能・信頼性・生産性が高く効率の良いソフトウェア言語
早くてメモリ効率が良い、ランタイムが最小限、ガベージコレクションがない。
所有権モデルでメモリ安全性とスレッド安全性を保障。
いろんな種類のバグをコンパイル時に排除(悪いところにつながる部分も)

優れたドキュメント
言語そのものというより優れたエコシステム
rustcというコンパイラが有益なエラーメッセージを出力
優秀なツールが存在(cargo、rustup)

2018年4つのドメインに注力しようと決めた
・コマンドラインアプリ
・WebAssembly
・ネットワークサービス
・組込み機器

生産性は本質ではないが、パフォーマンスと信頼性が大きい。

Cからの移行があるのかを考えると文法が似てるといえば似ている。

Rustの悪い所
学習難易度が高い(所有権モデル)
所有者、所有権の移動、参照を借用…ドキュメントにも他の言語に慣れた人向けと
書いてある。
初学者はとにかくコンパイルが通らない。
コンパイラは優秀なメッセージを出してくれるが…入門者には概念が分からないから
直し方が分からない。

結論
Cでプログラムを書いている人がRustに移行できるとは思わない。
移行するコストが高すぎる。


所有権の概念は素晴らしい。
調べても所有権の概念を生み出した元が見つからなかったので知っていたら教えてほしい。


◆全体での議論
・言語の変遷を振り返る
Tiobeの順位は検索に出てくる数だからほんとに使っている数かは怪しいが…
GithubでJavaやCがメイン最近はPythonも人気になってきている。

少し昔の書籍から:パソコン言語学(1985年)
紹介しているプログラム言語 → 概ね今残っているのはCくらいの気が。

組込み機器のソフトウェア開発の特性
ハードリアルタイムのために動的なリソースの取得と解放を避けたい場合がある。
ガーベジコレクションで処理系全体が止まる。
ガベージコレクションの動くタイミングを小さく採ることでソフトリアルなら使えないか
という議論もある。

省リソースが求められる
小さいのもあるけど主流ではない。Cはある種の使いやすさが残っている。

リアルタイム制約や省リソースが求められる製品では未だにCが使われている。

●議題1 Next Cはあるのか
メモリの処理をしている言語が多い。
C++はうまくやれば避けられるけどコンストラクタとディストラクタとかの文法が複雑
すぎていつ動くかわからない。使いにくいのではないか。
ではCが残るか?Cも書いててつらい。アセンブラはかきたくないというのが人類の総意。
Rustに期待していたが、詳しい人から人類には早すぎたという発言もあって辛い…
C++かRustしか思い浮かばないが…

・Elixirはすべてがイミュータブル
どんな利点があるのか
内部的にコピーを作っても問題ない。コア間で排他制御する必要がない
循環参照を明示的に作れない。(まだやってないが理論上はガベージコレクションを
なくせる。)
所有権問題がなぜ難しいか:ミュータブルとイミュータブルが混在しているからElixir
なら単純化できるだろう。
循環参照のなしでグラフを表すには:ハッシュ表のようなもので表せる。
Lispのような単純さを捨てて実利をとっている。
主要なのがリストとタプルとマップという3つのデータ構造で大体表せる。

−リアルタイム性
現状:ミリ秒単位のソフトリアルタイム
プロセスごとにマックス、ハイ、ノーマル、ローの4段階の優先順位。
絶対優先順位のタスクがキューに溜まっているとき他のタスクは止まる。相対優先順位
しかないとき(ノーマルとロー)
ノーマルが動いているときローもちょっとだけ動く。
Erlangの問題点
メッセージは優先順位がついてないのでおそらく優先度逆転問題が起こる。
組込み分野に応用するには,メッセージに優先度がついていない問題を何とかしなくちゃ
いけない。
メッセージを含めてマイクロ秒単位のハードリアルタイムができるような研究をして
リアルタイムカーネルをこれから作ろうとしている。

●Next Cの候補は?
−予測性があるかどうか
−C++でも予測が難しくなる。Cだと書いた量にある程度比例する。
Cは書いたこと以外やらない。プログレスが高くなる一方でやりきれなくなる。

−所有権とかの関係でCだと通っちゃう問題のあるプログラムがRustだと通らないのがよい。
−最初化からRustの教育をして覚えてもらえれば

ハードリアルタイムはどの程度必要なのか。
−あまりいらないのではないか。
−サブミリまで保証してもらえればそんなに問題ない。

●Cが使われる理由
−ガベージコレクションがなくてハードリアルタイムが必要とされている。
−監視系のプログラムを動かせばソフトリアルタイムでも十分なのではないか。


●Elixirに使われているErlangVMの問題点は?
−素晴らしい先進的な言語だがいろいろ良くない部分も引きずっている。
何人かの人が,Erlangの全て(互換性)を引き継ごうとして挫折している。
リビルドが必要になってくるだろう

Pythonはすごい労力をかけてリビルドした。

●省リソース
−半導体が進歩すれば(値段的にも)そんなに気にならないのでは?

■ここまでのまとめ
Rustは人類の進化を待つ。
Elixirの研究ではリアルタイム性の追求を頑張る。

−静的型、静的オブジェクト
動的なものを扱いたいが安全に扱うこととリアルタイム性が悩み。
どんどんメモリを使って捨てたほうがいい。その方がガベージコレクションが楽。

−ソフトリアルタイムでミリ秒保証するっていっても絶対に保証できるのか?
ものによってはそこまで厳密に保障しなくてもよいのでは。


◆議題2 Pythonが流行ったのはなぜか。
2020春から基本情報技術者試験に採用された。そしてCOBOLが消えた。
理由は適応範囲の拡大と利用の増加。機械学習やディープラーニングに関わる主要な
OSSでの利用。

そもそもCをUdemyで覚えようという人が少ないので何とも言えないが…
UdemyにてPythonの学習コースと学習してる人が多い。
Pythonは組込みにはあまり使われていないが周辺設備への利用などが増えている。

オブジェクト指向言語はGUIで広がった。
ではPythonはAIで広がったのか? AIやってる人はそんなに多いのか?
−AIで仕事があるからやる人がいる。NumPy、SciPyがあるから。

Cやオブジェクト言語は実感として書きやすくなったと思った。
Pythonはそういう実感がない。実際のところどういう部分が良いのか。

−違う次元を推論してくれるからAIを書くのにすごいきれいに書ける。
for文なしで足し算するだけで行列にスカラー足してくれる。

−Perlは1つのことをやるのに書き方がたくさんある。書き方の発見から始めるときも。
Pythonはやり方が大体同じでコピペばかり→プログラミングが嫌いな人にこんな楽な
言語はない。

−Pythonは文法など、言語としては面白くないし新しくない。

−ググれば目的のものが出てきやすい。大体出てくるのがとてもありがたい。
使ってる人が多いので情報量が多くて流行っている。これから学ぶ人に学びやすい。
エコサイクルがちゃんと回っている感じがする。

−Pythonだとほぼパッケージがある。お前がやる必要はないって言われてる気がする。
プログラミングする気はあるのか? 大規模な開発に必要なのは認める。

−再使用しないで自分で全部書くのは無駄も多い。

若い人(目的志向、やりたいことを早くやりたい)vsおじさん(昔本当に作った)

−論理的、理論的な拡張はPythonだと早いと思う
パッケージをいれれば他のソフトと同じ書き方でできるようになる。
ハードウェアの性能を最大限引き出すという面で使えるかといえばできない部分があり、
議論のベクトルが違うのでは。

−Pythonも案外効率がいい

−言語の話と実行環境の話が混ざっている。

−組込みで使えるといっているPythonってどんな感じなのか。
−誰がサポートしてくれるか。メンテしてるのかという部分が疑問。
ちゃんとした製品ならともかくIoTなどの分野でプロトタイピングしてガンガン回そう
とするのなら有益なのではないか。

−Cかける人はCでかけばいい。
−若い人にも組込みをかける環境をつくるのが大事。


■議題2のまとめ
Pythonはライブラリにたくさんある。VS 自分で書かないと真実は分からないのでは?
世代間の違いのような気もする。

●Cがつらい理由
マルチコアのCPUやキャッシュなど現代の複雑なアーキテクチャをもつ最近のものに適応
できないからでは?

●Elixir
AIやMLや画像、3D処理 作ってるし現実でも結構できる。
現状ではI/Oを直接操作するものは外部のC言語を呼び出している。
生の条件分岐、ポインタを書かないことで型安全性とかを保障された状態で素のアセンブリ
コードを記述できる仕組みを検討中。
高度な最適化の恩恵を受けつつ自由なコードが書けることを目指したい。(まだ一部しか
実現はしていない)


◆議題3 ある言語が広く使われるには?
ElixirやRust、Rubyを応援したいがどんなものが流行るか分からない。

●キラーアプリ:並列操作を効率よく処理できるもの。
通信が早くなってマルチコアとか他のコンピュータのリソースが使いやすくなっている。

・言語のアップデートは必要だがあんまり多いと大変。

・Pythonのやった活動をElixirでやったら流行るのか?

−Pythonが流行ったのは運としか言いようがない。
NumPy、SciPyのコミュニティとは完全に別でやってきたのがAIのほうで使えたから
流行った。

−手に入れやすくて動くハードと文献が大事。
どこかがサポートしてくれたり、大きなプラットフォームに乗っているとよい。

−ちゃんとしたドキュメントが必要。

−googleですぐ検索出来てちゃんとしたドキュメントがあればいい。

−調べやすいと学ぶモチベーションを保ちやすいのがよい。
−プロなんだからgoogleに頼っていいの?
−新しい言語を流行らせるならそこにいるのはプロじゃない

・ちゃんとしたドキュメントが必要という意見もあるが一方で若者はGoogleという意見がある。

●データの専門家としてはいい言語だとは思わないが、なぜかそこそこ使われているVBA
ある程度使われないといい言語もやっぱり廃れる
見て試してまず動くことが大切。


■全体まとめ
●Next C
ガベージコレクションがない C++かRust
Rustは人類には早すぎたという意見もあって難しい。
C++もデストラクタが難しい。
−結構Rustが組込みで使われてる例がある。
★nextCの候補はRust

●Pythonがはやったのは
Pythonはgooglabilityが高いらしい
−Pythonはググらないでチュートリアルとかリファレンスとかを地道に読んだ方がいい
−Pythonのリファレンスはすごくちゃんとしている。

●ある言語が流行るには
本質的にちゃんとしたドキュメントがないとダメ
でもやっぱりちょっと調べれば出てくる言語がよい
言語の原典があるとわかりやすいが案外原典がない言語が多い。
Rubyのこれ読んどけばいいって原典は?
この言語ならこれ読んでおけばいいっていうバイブルを作ろう。


最後に

ソフトウェア開発でソフトウェアを知らない人はどの言語で書いてもいいんじゃないって
いう人もいるが、開発者にとっては宗教に近い部分もある。
ここからは好きな言語について語ろうということで、話したい方は徹夜部屋へ


以上