**********************************************************************
セッション:S3a
テーマ  :Zig言語およびZen言語によるリアルタイムOSの実現
講師   :高田 広章 名古屋大学
日時   :2020/08/21(金) 11:30~12:40
参加人数 :49 名
**********************************************************************


<目次>
・取り組みの背景
・Zig言語とZen言語の紹介
・Zig言語およびZen言語によるRTOSの実現
・プログラミング言語の安全性
・今後の取り組みとソースコードへのアクセス


<取り組みの背景>
・開発する対象が複雑化するなかで開発に使用する道具も革新させていくべき
・C言語のベースは古い
新しい言語を使いたい
いつが乗り換え時かは難しい


<Zig言語とZen言語の紹介>
Zigとは
・汎用プログラミング言語
OS、組込みシステム、リアルタイムシステムも想定
・C言語を現代風に改良、拡張したもの
・なぜZigなのか?
静的APIを置き換えられる可能性があるのがモチベーション

他のプログラミング言語との位置付け
Go : better Java/C#
Rust : better C++
Zig : better C

・明確な違いはヒープの扱い
Go: ヒープありガベッジコレクション(GC)を使用する
Rust: ヒープあり 所有権でメモリ開放を静的に決定する
Zig : ヒープ必須ではない、使う場合はアロケータを呼ぶ、複数種のアロケータを利用できる

・Zigを選ぶ理由
組み込みシステムによるが、リアルタイムシステム的にGCは使いたくない
ヒープもシステムによっては利用したくない

Zigの基本的な設計方針
隠れた制御フローが無い
手動のメモリ管理
性能と安全性の両立(ただし、メモリ安全ではない)
alloc、free手動なので間違えるとメモリ破壊
シンプルな文法

Zigの特徴
コンパイル時のコード実行
安全性の向上: ポインタの種類分け
記述性の向上: 新しいエラー処理がいい、メタプログラミング的記述


Zen言語について
詳しいことはs2a参照
Zigから派生した言語
インターフェース機能などを拡張
Zenのライセンス形態 : https://zen-lang.org/ja-JP/blog/2020-08-20/



・TOPPERS/ASP3カーネル
Toppersで開発しているitron系のRTOS
メモリ保護やマルチコアに対応していないベースカーネル
カーネルlibkernel.aをZxx言語で記述することに成功
アセンブラもインラインアセンブラで記述(.c, .Sファイルを排除)
コンフィギュレーション、コンフィギュレータもZxx言語で記述
アプリケーションとシステムサービスは修正なし
ビルドシステム(Makefile)も修正

・C言語とZxx言語の違い
ソースコードのレビューをしながら解説 (公開資料参照)
Zxx言語は関数の引数が変更不可
Zxx言語はcomptimeなどを指定することで静的、動的処理を選択できる
C言語のマクロ的な処理が書ける
Zxx言語はdeferを宣言することで特定のイベントが発生した時の処理が書ける
GOTOを使用したエラー処理の代わりに使える
try、catchな大域脱出とdeferの組み合わせで安全なエラー処理
Zxx言語はオプショナル型でNULLポインタの取り扱いを管理
代入の記述でNULLが代入可能かどうかなどを記述

・静的APIとコンフィギュレータの置き換え
itronではタスクやセマフォなどの使用量を設計時に決定する
コンフィギュレータでC言語のソースを静的に生成する
コンフィギュレータの文法を覚える必要がある
静的APIをZxx言語で記述したい
オブジェクトを動的に生成するサービスコードが静的に生成されることが理想
すべてを記述することは現状では難しいが、できるだけ記述できるようにする
comptimeを利用してコンパイル時にコンフィギュレーションデータを生成する
コンフィギュレータの実装アプローチ
カーネルとコンフィギュレータを個別にコンパイルし、リンカで結合
カーネル本体とバイナリコードはコンフィギュレーションで変化しない
バイナリが変わったらテストを再実行などのケースで有効
カーネルとコンフィギュレーションをまとめて実行
コンフィギュレーションが変わるとバイナリが変わる
最適化が利きやすい

コンパイルオプションで両方の実装アプローチを実現した


・実現したRTOSの性能評価
プログラムサイズ比較
ZigのReleaseSafeで35%程度大きい、ReleaseFast/Smallでは15%程度大きい
Zxxは関数を積極的にインライン展開するためコードサイズが大きくなると思われる
実行時間比較
C言語と比較して15-20%程度高速(サービスコールのact_tskを評価)

・Zxx言語の現時点での評価
記述性
綺麗に記述できる
エラー処理が綺麗に記述できるなど
性能の評価
コードサイズが大きくなるのは気になる
Zxxの課題
言語処理系の不具合が多い
ドキュメントが不足している
エラーメッセージが不親切


<プログラミング言語の安全性>
・RTOSの特性と設計
性能が重視される
組み込み用途では性能優先で危険なコードを書くことがある
安全でないコードを特定、局所化し集中的に検証したい
C言語ではMISRA-Cからの逸脱
Zxxでは安全でない構文要素が明示されていない
安全性について議論が必要

・プログラミング言語の安全性
安全なプログラミング言語で記述したプログラムは、ある種の不正動作をしない
メモリ安全 : 定義されていないメモリアクセスをしない
C,C++の場合 : 配列の範囲を超えたアクセスは検出されず安全でない
Java : 配列の範囲を超えたアクセスは検出されて例外が発生(回復可能)
Rust : 配列の範囲を超えたアクセスは検出されてpanicが発生(回復不可能)

Zig zenはどうか?
理想はコンパイル時に検出されることだが、現実的に難しい
配列の範囲を超えたアクセスは検出されてpanicが発生(回復不可能)

不正動作から保護されている4つのレベル
・ 静的安全
不正動作がコンパイル時にエラーになる
不正動作が実行時に検出され、不正動作しないようにプログラムを書く事が強制される
・ 実行時安全
不正動作が実行時に検出され回復可能な例外を発生させる
不正動作が実行時に検出され回復不可能なpanicを発生させる

<今後の取り組みとソースコードへのアクセス>
残っている項目の開発
ソースコードへのアクセス
TOPPERS/ASP3のZigによる実装
https://github.com/toppers/asp3_in_zig


■まとめ
Zxx言語を使用してRTOSを実装した。
コードサイズ、性能の評価を行い、コードサイズで35%-15%増加、性能でほぼ同等の結果を得た