大学でElixirを教えた話

この記事は[Elixir Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir)の25日目の記事です。

昨日は @piacerex さんの[「クラウドの外でエッジサーバを作るためのElixir技術スタック（＋立てた予定を仲間と実現できるようになる思考パターン）」](https://qiita.com/piacerex/items/5c6db095f4c567c36f69)でした。

[Elixir Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir)が[Advent Calendar Ranking 2020のプログラミング言語部門のLGTM数順位](https://qiita.com/advent-calendar/2020/ranking/feedbacks/categories/programming_languages)で2位にランクインしましたね。スゴイことです！

さて25日目最終日の今日は，予定を変更して「大学でElixirを教えた話」にしました。これは[「大学でRustを教えた話」](https://ytakano.hatenablog.com/entry/2020/12/23/204528)を見て「書かねば！」と思い書きました。

# Elixirを大学で教える理由

私は北九州市立大学で教育・研究に従事しています。プログラミング言語処理系，ソフトウェア工学，組込みソフトウェア，プログラミングなどを教えています。

研究では最近Elixir(エリクサー)を中心にしており，[Pelemay(ペレメイ)](https://github.com/zeam-vm/pelemay/)の研究開発を進めてきました。

なぜElixirに注目するかという点については，次の講義動画で解説しています。25:52に及ぶ長めの動画ですが，見ていただければ幸いです。

[プログラミングパラダイムを変えた歴史的背景](https://youtu.be/Z_IklJgmJ4c)

[![スクリーンショット 2020-12-24 14.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/2167d19b-67f6-f915-2601-d19424dcfd2e.png
)](https://youtu.be/Z_IklJgmJ4c)

あらすじは次の通りです。

![programming_paradigm_history.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/b49f833f-ae47-9f23-17bd-e3de06ffb5de.jpeg)

1. 1980年代以前: CPUのみで計算，シングルコア・シングルコンピュータ CUI
2. 1990年代: CPUのみで計算，GPUをグラフィック用に活用，シングルコア・シングルコンピュータ GUI
3. 2000年代: CPUのみで計算，GPUをグラフィック用に活用，マルチコア・シングルコンピュータ GUI
4. 2010年代前半: CPUのみで計算，GPUをグラフィック用に活用，マルチコア・マルチコンピュータ 多様なGUI，フロントエンド・バックエンドの分離
5. 2010年代後半〜2020年代: 多様な計算資源，GPGPU，ディープラーニングの普及

これを踏まえて，注目されるプログラミングパラダイムが構造化プログラミング→オブジェクト指向プログラミング(OOP)→関数型プログラミングと変化していきました。また，私たちはその先のプログラミングパラダイムとして，計算グラフと**「データ変換パラダイム」**に注目しています。

![programming_paradigm_history.031.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/2d6bdff0-e662-a49f-5652-250c7150307d.jpeg)

データ変換パラダイムというのは，次のようなElixirにおける`Enum`とパイプライン演算子によるプログラミングスタイルを，**Elixir Zenスタイル**と私が命名したのですが，このプログラミングスタイルは，もはや新しいプログラミングパラダイムではないか？と考えるようになったので，新たなプログラミングパラダイムとして提起するものです。

```elixir
1..1000
|> Enum.map(& &1 * 2)
|> Enum.map(& &1 + 1)
```

データ変換パラダイムだというのは，1行目の1から1000までの要素からなるリストを，2行目で各要素を2倍にし，3行目で各要素に1加える，というように，データを変換するような捉え方でプログラミングするからです。

私の研究開発するPelemayは，このデータ変換パラダイム(あるいはElixir Zenスタイル)のプログラミングに着目してコード最適化を行うものです。それは，現代的なコンピュータアーキテクチャに最適化して実行するのに理にかなっている考え方です。

なぜ理にかなっているかというと，1つには2000年代以降はCPUクロック周波数が伸び悩んでいる代わりにコア数を増やすようにしているからです。

![programming_paradigm_history.017.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/77654cbe-d634-22c6-70a9-3aa8a9601d60.jpeg)

もう1つには，GPUを汎用の計算に用いるGPGPUが一般的になってきており，プログラミング言語でSIMDに基づく計算を扱えるようにすると好都合だからです。

![programming_paradigm_history.028.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/9a8d2976-3d02-f4c0-3292-308d53e01f12.jpeg)

先ほどの下記のプログラムは，そのままSIMDアーキテクチャで効率よく実行できます。なぜならば各要素で同じ計算を行い，要素間の依存関係もないからです。

```elixir
1..1000
|> Enum.map(& &1 * 2)
|> Enum.map(& &1 + 1)
```

こうしたことを考えると，Elixirを大学で教えることには大きな意義があるのではないか？と思うようになりました。そこで，次の授業でElixirを扱うようになりました。

* コンピュータシステム
* プログラミング論(プログラミング・同演習)
* ディジタルシステム設計(2020年まで)
* 組込みソフトウェア

先ほど紹介した動画は，プログラミング論のイントロダクションとなる講義動画です。なぜElixirが求められるのか，その歴史的背景を説明したものです。講義はこの後，命令型プログラミング，オブジェクト指向プログラミング，関数型プログラミングのそれぞれが注目された背景と，そのパラダイムの中核となるプログラミング上の概念を説明していきます。

# 謝辞

プログラミング論の講義内容については， @piacerex さんに多数の貴重な助言をいただきました。ここに感謝します。