*********************************************
セッションS5-ab
テーマ:言語紹介N連発!
講師 :細合 晋太郎 氏
日時 :2021/9/3 15:10~16:20
参加人数:20人(開始時)
*********************************************

○自己紹介
・株式会社チェンジビジョンに所属
・モデリング技術,ソフトウェア工学を使って開発支援の仕事
・プログラマのためのプログラマ

○略歴
都島工業高校→近畿大学→JAIST修士→JAIST博士→九大 enpit特任教員→チェンジビジョン

○言語と私
・小学生のころにN88Basicを初めて触る
・工業高校ではアセンブラ,C
・大学ではC,Java,Pascalなど
・修士ではC,OCamel,Prologなど
・博士ではC#,C++,Fortranなど
・教員ではPython,VBA
・現在は,Java,Kotlin,Javascript/Typescript

○目次
・言語の分類
・言語機能
・ドメイン毎言語紹介

○言語とは
 コンピュータ様にお願いを伝えるお手紙.
 お願い事によって伝えやすさが異なる.
 ナイフで釘を打つ,木を切り倒すことはできることはできるが、合わない道具は使わない方が良い.

●特化と汎化
・特化するほど,その分野での開発効率は上がるが汎用性は下がる
・汎化はその逆
・Cはかなり汎化より

 目的,好みに合う言語がないとき,人は言語を作り出す.
  →世の中に言語が増えている.

○言語の分類
・動的型付けか,静的型付けか
・関数型言語か,手続き型言語か
・コンパイルか,スクリプトか
   など

○言語の数
・Wikipediaの言語一覧によると329
・一覧にない言語もあったので,有名どころで500くらいあるのではないか
・独自の自作言語も含めるとさらに数倍ですまないのでは
 ちなみに...人間が話している言語は5000や6000あるらしい

○選び方
・課題解決力
・やろうとすることを解決できるかどうか
・達成までどれくらい難しいか
・制約
・環境,性能,安全性
・環境に導入できない言語だと使えない
・コスト
・購入,導入コスト →いまどきは少ないが,言語自体に値段がついている場合がある
・運用,保守コスト
・教育コスト →教育に1ヶ月などかけると,その分の人件費がかかる
・売上コスト
・人気
・人が集まっているとこには人が集まりやすい,ライブラリが豊富になる
・人気がないと弱まりつつある
・ノイズが増えるため玉石混合にはなる
・プラットフォーム,ランタイム
・どのCPU,OSで動くか,VMは使っているか
・ライブラリ,フレームワーク
・十分に枯れているか,メンテされているか
・パッケージマネージャ,リポジトリ
・ライブラリがどのように管理されているか
・簡単に取ってこられるか
・依存性などは解決されているか
・いまどき一つ一つダウンロードして入れるのはあり得ないので重要
・言語仕様
・自分が制御しきれない言語を使おうとするとやけどする
・ドキュメント
     ・そろっているかも重要

○究極の汎用言語
アセンブリ,機械語で書けば理論上はコンピュータの全てを掌握できるが無理である.

○究極の特化言語
書かない,一文字だけの言語など.あまり意味がない.

プログラム以外の方法で解決することも重要である.
 →書かなければバグもなければメンテの必要もない.

○言語機能
●データ型
  int,doubleなど基本的なデータ構造の扱い方
・統計に使う場合などはベクトルなどがある方が良い
・直接,複素数が扱える言語もある
・構造体,クラスなどの有無
・データ構造
・配列だけなのか
・リストやマップ,タプルがあるか,またそのAPIはあるのか
・データ構造周りのAPIが揃っていると楽になる
●変数
データをいれておくための箱.型に基づいている.
・静的型付け →CやJavaなど
・あらかじめコード内で明示的に型を指定する
・ちょっと賢いと,型推論によりコンパイル時にすべて解決してくれる
・動的型付け →Pythonなど
・明示的に型付けしない
・入っているものや演算に合わせて型が判別される
・Mutable/Immutable
・変数に再代入可能か否かを明示し,極力Immutableにすることで,
 複雑さやコードの安全性などを保つことができる
・所有権やスコープの明示
●関数
数学の関数と概ね同じで,何かしらの操作群をまとめたもの
・メソッド:クラスに属する関数
・サブルーチン:返り値がなく,処理を分けただけ
・無名関数,ラムダ,クロージャ:名前がない関数
●関数型言語
・手続き的な記述ではなく,全て関数で記述する
・基本的に状態を持たない
・コンパイル時におおよそ解決される
・一級オブジェクトとして関数が扱えるもの,くらいの認識が広まってそうである
●制御
・if,forなどは関数型を除いて大体同じである
・パターンマッチ
・かなり緩い条件でマッチさせて条件分岐できるもの
・これが使えるとかなり楽
・文と式
・ifなどが文ではなく式として持っている言語が便利
・式として評価されるので値を返す
・非同期記法 async/awaitmpromise
・結果がまだ出ていなくても呼び出し元に戻ることができる
●型
・データの構造に名前をつけたものと思えばよい
・データ構造に限らず,関数の型もある
・ジェネリクス,テンプレート
・Listのようなもの,後から型を差し込める仕組み
・最近の言語ならば大体入っていると思う
・Nullable,Optional,Either
・JavaプログラマなどはNull Pointer Exceptionに苦しめられていたと思う
・例外的にNullを入れられる変数
・Nullを扱いたいけどNullとしては扱わない変数
・2つの型(成功した型,失敗した型)をもつ変数
・などをもっていると安心性の高いコードが書ける
●構造体,クラス,インタフェース
・基本的に大体の言語は構造体までは持っている
・クラスは継承周りで嫌われがちで外されることも多い
・Trait,Mixin:実装込みの関数群で,継承より安全,柔軟に機能を埋め込める
・クラスではなくTrait,Mixinなどを用いた言語も増えている
●module,package,namespace
・まとめて名前をつける仕組みと思えば良い.言語によって呼び方が違う.
・パッケージシステム
・ライブラリを纏めて持ってこれたり,ビルドできたりする仕組み
・パッケージリポジトリ
・ライブラリを取ってきて導入仕組み
・そこに入っているものは安全であることが保証されているとよい
・バージョンの依存関係も整備されているものが良い
●マクロ,リフレクション
・一番簡単なマクロだと,コンパイルタイムにいろいろ埋め込み,置き換える
・少し凝ったマクロもある
・ASTを書き換えられるようなマクロだと別の言語に書き換えたりできる
・マクロを使わないといけない状況になるまでは使うべきではないと思う
・リフレクション(ランタイムをあれこれ書き換えるもの)もあまり使うべきではないと思う

○言語機能の裏側を知る
便利な機能はどんどん使えば良いが,その機能の実装をある程度覚えておくと良い
 →間違った使い方をするとパフォーマンスの劣化や意図しない動きになったりする

○言語紹介30連発くらい
細合氏が触ったことがある言語で雑感が書けるぐらいのものを扱っている

●組込み
・C言語
・説明不要
・古い言語
・おおよそ何でも書ける
・Cは基本的には全部ポーティングされてるのでどんな環境でも書ける
・最近の言語仕様で書く事はできない
・C以外を選べるならばC以外を選んだ方が良いと思う
・C++
・Cの言語仕様があまり変わらないのに比べて割とはっちゃけている
・最近の機能を色々と取り込んでいる
・Boostがかかったことで,他の言語の機能をごちゃ混ぜにしていれたような機能も入っていたりする
・Cは何でも使えるナイフというイメージに対して,C++はチェーンソー
・Rust
・比較的新しい言語
・メモリ安全のあたりが強い
・ほぼほぼ全部を静的に解析してくれ,メモリ周りのエラーを踏む事は少なくなっている
・unsafeなコードは囲んでそれ以外は安全であるというように書ける
・きちんとコンパイルが叱ってくれる
・所有権の思想に慣れるまでが難しい
・LLVM前提なので組込みで使うのにはポーティングされていない石は使えないのが残念
・Go
・実はあまり触ったことはない
・Rust同様比較的あたらしく,似たようなコンセプトなのではないか
・Goルーチンが有名.軽量スレッドを立ち上げてチャンネル通信,同期などが統合されている
・Javaのような取りこぼしがすくないGCでメモリ管理が行われる
・リソースをとりこぼしにくい
・個人的な感想としてはRustに比べると自由度が高くて怖い
・こちらもLLVMが前提
・mRuby
・Rubyを組込み向けに最小限にVMを軽量化したもの
・最終的にPCで確認してバイトコードに直してVM上で動かすことができる
・やわらかい部分をmRubyで書いて,深い部分はCで書くと良さそうである
・Rubyで書いたときにリソースや性能がどうなるのかが見えにくい
・Nerves/Elixir
・Elixirを組込みでも動くようにしたもの
・並行性がサクサク書けるのでリアクティブな構成にしやすい
・IoT周りはかなり向いているかもしれない
・低レイヤはCやライブラリ任せなので使い分けが大事
・Node-red
・メーカー系,教育系でよく使われる
・ブロックプログラミング
・センサとアクチュエータだけならばネットワーク越しにマイコンを制御できる
・これで動かせる要件であればこれをつかうのが良いのでは
・ラピッドプロトタイピングなどで使えそうである
・ネットワークのない世界では生きてはいけぬ
・Arduino
・皆さんご存知
・一見C++だが,中身でトランスパイルして助けてくれる
・お手軽である
・少し凝ったことをしようとしたときに苦しむこともある
・Nim
・トランスパイラ,Cに変換される
・組込みの本命にできるのではないかとも思っている
・Cに変換されるだけなので,既存資産と相互運用できる
・組込み周りの低レイヤも書きやすいらしい
・割と最近の言語機能も入っている
・場合によると生成されたCをいじる必要も出てきそうである

ハードウェア記述の言語はスキップする.システム,CUIもスキップする.

●バックエンド
・Java
・少し大きいWebのバックエンドに多いのではないか
・オブジェクト指向に代表されるような言語
・しっかり設計してしっかり大きいものが作れる言語だと思う
・でかく作れてしまうために機能的にはつながるが増築すると,
 どこに手をいれていいのかわからなくなる設計になってしまう言語
・JVMのおかげで資産が使い回しできる
・Sun,OracleのあれこれでJava言語がどこに行くのかがわからないのが辛い
・Ruby
・Ruby on Railsが出たことで一躍ヒットした言語
・割りと直感的に書ける手軽さがある
・自由度が高いのでチーム内でルールとテストをしっかりする必要がある
・Elixir
・Ruby on Railsの影響を受けている
・Webアプリが非常に書きやすい
・Erlangのランタイムを受け継ぎつつRubyの言語仕様を取り込んでいる
・Ruby on Railsと同等のアプリならばElixirで良いのでは
・コミュニティも非常に活発である
・動的言語なのでしっかりとテストで縛る必要がある
・Erlang
・Elixirの前の言語
・Elixirを書いていると実はErlangを読まないと理解できないとこもある
・ElixirでかけるならElixirで良いのでは
・php
・有名だが非常に辛い言語である
・WordPressが有名でサクサク動く
・HTMLとサーバーサイドのコードが一緒に書けるのでサクサク書ける
・もともとHTMLと混ざっているのでJSまで混ざるとメンテナンス性が急激に悪化する

○コメントを読む時間
C#やChiselなど時間の関係で端折った言語がある.

●サーバレス
・AWS Lambda
・ちょろっと書いた言語をさくっと動かせるサービス
・Python,Java,Nodeなど色々動く
・わずかに課金される

●インフラ
・Ansible,Chef,Vagrant
・Virtual Boxが流行っていたころはよく聞いた
・今はDockerに喰われている
・Dockerfile,Docker-compose
・みんなが使っているのでいろいろイメージが作成されている
・いつのまにかいつのまにかゴリゴリHDDを喰われている
・Terraform
・AWSなどのサービスをどれを使うなどを書くと勝手に構築してくれる
・あまり触れていないのでよくわからない

●フロントエンド
・Javascriptはみんな知っているので省略
・Typescript
・Javascriptは何でもかんでもオブジェクトに入るのでよくわからなくなる
・こちらは型で縛ってくれるのでコンパイルが通ると安心できる
・何でもかんでも型を定義して書けるが全てを型指定しないといけないので好み次第で変わってくると思う
・React,Vue,Angular
・言語ではない
・三大フレームワークとして戦ってきたが今はReactが一強
・VueやAngularを割とゆるく書けるが,Reactは堅くて堅牢なイメージなので,書き上げた段階で割と動く
・ある程度大きいものを書くならTypescript+React,さくっと書くならVueが良いかも
・流行がすぐ変わるので定期的に見る必要がある
・Kotlin
・Javaのいいとこどり
・Javaの資産が全部使える
・InteliJの会社がメインでサポートしているので相性がよい
・JVMで動くものが使えるならKotlinがおすすめ
・凝るといくらでも難しく書けるのでチーム内の制約が必要
・Swift,Objetive C
・Macがないのでわからない

●ゲーム
・Unity,UnrealEngine
・面白そうなので是非触ってみて欲しい

●機械学習,統計
・Python
・とても良い言語
・ユーザが豊富
・あまり好きではない,触らないで済むなら触りたくない
・Jupyter Notebook
・言語としてはPython
・ノートを書くようにドキュメントを書きつつコードを書きつつ結果を残せる
・やりたいことの意図などが全部残せるのでとても良いのではと思っている
・R
・難しかった
・Julia
・結構流行っているらしい
・最近の言語で数値解析や機械学習が強いらしい
・スクリプト言語だがCなみに速いらしい
・あまり情報が落ちてこない
・eBNF
・少し読めるくらいにはなっておいてください
・Xtext
・Eclipseのプロジェクト
・言語定義するだけでエディタがポンと出来上がるような仕組み
・そこから別の言語へトランスパイルするようなテンプレートも用意されている
・VScodeのプラグインなども作れる

紹介しきれなかったが,ZennやZigなども面白い.

○未来の話
・プログラミングはAIに奪われるのか?
   →半分Yes.仕様を固めて出てきたものが正しいかどうかは判断する必要がある.
・最近の技術を追うのも面白いかなと思う

・プログラマがこの先生き残るには
・プログラムの仕事は自動生成ツールによっていらなくなることも起こりうる
・プログラミングのスペシャリストになる方法
・プログラミングを奪うプログラマになる
・言語に拘らず,仕事が楽になる方法を探る必要がある.

質疑応答
 S氏:コンピュータと話をするのに計算手順をいかに教えるのかと発展したのがプログラミング言語.
   エンジニアにとって嬉しいのは機械にものを教えるときに人間にとって自然な思考のまま教えられる言語が有利なのではと思う.
   現時点で人間にとって自然な思考に近い言語は何だと考えるか.
 回答:Kotlinとしか言わないが,言語仕様などはおいといてIDEやコンパイラがつよい.
    IDEが書いている途中にインタラクションができる言語が一番強いと思う.