「C++の技術教育教材が難しかった人へのmruby版のすすめ」と「このAdvent Calendarについて」

本記事は[ETロボコン Unofficial Advent Calendar](https://qiita.com/advent-calendar/2017/etrobo) の初日の記事です。

# このカレンダーについて

## 誕生

今年で4回目となりましたこのカレンダーは、とある参加者OBが一人で始めました。
始めた経緯については、[ご本人の初年度初日の記事](http://ylgbk.hatenablog.com/entry/2014/12/01/070000)をご参照ください。

```
「ETロボコンに関して情報発信したいけど機会がない」
「俺達はCS大会に出られなかったけど、実は凄い技術を持っているんだ」
「情報発信して全国のチームと繋がりを持ちたい」
そんな人のために、Advent Calendar 2014を始めることにしました。

(ETロボコン Advent Calendar 2014 - Adventarの 1 日目のエントリーより)
```

参加者だけではなかなか枠は埋まらず、特に中盤は人が集まらず、深夜に帰宅して書いたりされていたようです。そんな状況を見て、彼の思いに賛同して執筆した人たちの中に "たまたま実行委員の顔「も」持っている人がいた" というのが実行委員が混ざっている理由です。

## 私が作成した理由

2年間Y_uuuさんが作成された後、昨年度より私がCalendarを作成しています。正直、私は実行委員の顔も持っているので、私が引き継ぐのは良くないのではとも思いましたが、せっかく始めたAdvent calendarをここで終わらせたくない<b>一個人として</b>引き継いでいます。

今の時代、技術記事を書くのもエンジニアにとって必要なスキルのひとつだと思います。
いつかきっとこのカレンダーも他の人気カレンダーのように一瞬で枠が埋まってしまうカレンダーになる日が来ればいいなあ…

# 技術教育教材で挫折した非mrubyユーザーへのmruby版のすすめ

前置きが長くなりましたが、ここからが今日の記事です。
今年、オリジナルのC++版のメンテナーさんや、TOPPERSのTECS WGの協力の元、mruby版を作成しました。 
mrubyなんて知らないし、使わないのでスルーしたという方も多いのではないでしょうか。
一方、C++は普段使わないので、C++で書かれている教材は難しくてよくわからなかったという方もいたのではないでしょうか。
本記事は、「C++が難しくて挫折したけど、mrubyもRubyも知らない」という方向けに「mruby版を使ってもう一度チャレンジしてみよう」というお話です。
(2019/06/08追記 2018年度版テキストよりmrubyが[yamanekko mruby-ev3rt](https://github.com/yamanekko/mruby-ev3rt) に変更になっています。TECSの知識は不要となりました)

## mruby版の位置づけ

mruby版は教材のうちC++依存の部分をmrubyに置き換えたものです。つまり言語依存のところを変えただけなので、この2つを見比べて違う部分をあなたの使いたい言語用に作れば、他の言語版が作成できます。[^fn1]
とはいえ、他言語対応にはそれなりの労力がかかるので、ここではmruby版で内容を理解しようという方向で話をすすめていきます。

## mrubyとは

mrubyを知ることはこの記事では本質ではないので、この教材を理解するために必要なことのみ紹介します。

mrubyとは軽量Rubyとも呼ばれる、組み込み向けのRubyです。「組み込み」には2つの意味があって、みなさんの想像する「組み込み」と特にWeb方面で使われている、他のアプリ内に組み込むという意味で使われる場合があるようです。残念ながら、mrubyは「他のアプリに組み込む」方が事例が多いため、ネットでの情報だとそちらが目立つので誤解されてる方もいるようですが、「組み込みプログラミング」にも使える言語です。

mrubyを使ったプログラムはRubyで書きます。requireがない、RubyGemsの代わりのmrbgemsはRubyGemsとは違い、静的にリンクされるなど若干の違いはありますが、言語仕様的にはRuby（CRuby）の文法がほぼ使えます。

また、バイトコードと呼ばれるコンパイル済み実行モジュールを使う方法と、CRubyのようにRubyスクリプトをそのまま実行する方法がありますが、教材で使用しているmruby on EV3RT+TESでは今のところ前者のみ対応しています。

## C++版とmruby版のちがい

### 「基本設計」のところは同じ
当然ながら分析モデルは実装言語には依存しないので、どちらも同じです。
設計モデル(教材では実装モデル)がC++とmrubyのAPIの違いに影響されて少し異なっています。つまり、「詳細設計」のタグがついているページが両言語版の間で異なっています。

### クラス図からコードを実装する部分

あまり詳しく書くと教材の著作権に触れかねませんので、ここでは一般的な範囲で留めておきます。
クラスの定義、属性、操作を実装に落とす方法は教材特有のノウハウではなく、一般的な方法です。
基本的な実装ルールは言語に関係なく同じです。基本的なルールにのっとって各言語で実装する方法が言語目線で各言語ごとの書籍で紹介されている。そんな感じです。
なので、他の言語でやろうと思ったら、一般書籍を参照すればやり方はわかるでしょう。この部分は、あなたの使いたい言語で実装してみるのも一般書籍などを参考にしながらやってみればそれほど難なくできると思います。

### TOPPERSの仕様にmruby on EV3RT+TECSの仕様が追加

C++を知らないために教材のハードルがあがっているケースの他に、TOPPERSを良く知らないためにハードルがあがっているケースが考えられます。後者の場合、残念ながら、mruby版ではさらに難しく感じるかもしれません。mruby版教材で使用しているTOPPERSは、TECSというコンポーネント技術も使われています。詳しくはmruby on EV3RT+TECSに関するエントリーに期待して、ここでは省略します。

C++版の場合はC言語で実装されたTOPPERSの関数をそのまま呼んでいますが、mruby版の場合はmrubyのクラスとしてタスクの操作関数を実装するということをやっています。[^fn2]

他の言語ユーザーがmruby版で学習する場合、タスク周りについては深入りせずにmruby on EV3RT+TECSはこうやって実装するんだーレベルで留めても充分かと思います（あくまで私個人の感想です）。

### mrubyのinclude

mrubyのincludeはC/C++の#include とは意味が異なりますので注意が必要です。
ここでの使われ方でいうと、メソッドや定数の探索ルートを示します。

```
include モジュール名
```
としたとき、通常なら

```
モジュール名::メソッド名
```

と書くべきところを

```
メソッド名
```

という感じにモジュール名を省略して書くことができます。

これぐらいわかっていれば、Rubyを知らなくてもmruby版の教材を理解できるのではないでしょうか。[^fn3]

## まとめ

このエントリーでは、mrubyを知らない人向けにmruby版の教材を使って学習するための補足をしました。

* もう一度教材を復習してみよう
* C++が難しいならmruby版を試してみよう
* できるところはあなたの使っている言語でもチャレンジしてみよう

# 最後にお願い

ETロボコンAdvent calendarに賛同してくれているごくわずかな有志たちが灯を消さないように苦闘しています。あなたも仲間になりませんか？
難しいことを書く必要はありません。あなたが知って助かったノウハウ、ベテランさんには気づかない以外なはまりポイントをごく簡潔にまとめてくれるだけでも、きっと来年の初心者さんの役に立つことでしょう。なにより新しい投稿者が増えることが喜ばしいことです。
あなたの投稿をお待ちしております！


[^fn1]: 少なくともJava版作成の相談にのってくれそうな人はいますよ
[^fn2]: mrubyのEV3RT実装はいくつかあり、それぞれ設計思想に若干違いがあるので調べてみるのもおもしろいですよ
[^fn3]: それでもわかりづらいところがあれば、教材に関することはコメント欄ではなく、ETロボコンの参加者MLか個人的にメールください