# 今週の進捗
- OS研究会
- marpのslideテーマ作りました
- LLVMちょっとやったりしていた
- Gearsのデバッグ
- ビルド関連のコマンドを作りました
- 雛形生成とかもしたい
- mercurialのラッパーコマンドも作成している
- ビルド関連のコマンドを作りました
- Perl5.31.10で入った連鎖比較(chained comparisons)の実装を見ていた
- Perlの雑誌の印刷所入稿が今日終わりました
# おしらせ
- 今週末kernel/vm探検隊
- PLDI2020が5日まで登録をすると無料らしい
# OS研究会
- zoomなのでいつもよりは緊張しなかった
- しなかったわけではないですが…
- こころなし普段より疲れた気がする
- return less kernelというものがあるらしい
- 攻撃から守るために特定の命令を検知して書き換える手法
- 論文読みます…
# marp
- node.js製のスライドジェネレーター
- 以前electron製のものがり、それのリストア
- slideshowよりは生成するスライドが良心的
- CLIベースのものとvscodeベースのものがある
- CLIベースのものはバイナリが配布されている
- 研究室のロゴを右下にあてただけのテーマとmakefile等を作った
- cssあまりかけないのでかなり雑な作りですが…
# Gears
- 以前のGearsでは
example
以下のディレクトリで生成したインターフェイスは無視されていた
|
|
-
perlの
if (-f)
はファイルがあればtrueをかえす -
generate_stubを実行しているディレクトリから見えないと無視される
-
今はビルドしている.cbcと同じディレクトリにあるものは含めるようにした
|
|
- とりあえずはmonkeyをCbCに移植したpiposaruを動かすのを目的
par goto
がどう変換してくれるかがいまいちつかめず…- interface中の引数で独自定義したenumとかを使うとcontext.hにincludeされない問題
- 生成Perlスクリプトで頑張る
# Gears関連のコマンド
-
いちいちビルドした.cとcbcを確認する際に行ったり来たりするのがめんどう
- araganeコマンドをつくった
-
aragane cbc2c main.cbc
でビルドしたcのパスを表示する -
aragane cbc2c editor main.cbc
で.cをエディタで開く -
なんとなくgolangのcobraをつかっている
- なぜかzsh補完も勝手に作ってくれるので便利…
-
今の所Gearsにしか対応していないので、xv6とかにも対応させたい
- make一発でrmとcmake再実行までしてくれる的な
# hg
- cloneするのがめんどう
- forkするのもめんどうなのでコマンド作りたいみたいな…
# 比較連鎖
Perl5.32で取り入れられる(厳密には5.31からですが)のおもしろ機能として連鎖比較(Chained comparisons)が存在します。
今までPerlで数値などが特定の範囲に含まれているかどうかをif文で判定するには次の様に書く必要がありました。
|
|
これがこう書ける様になります!!!
|
|
便利!!!!!!!!!!!!!!!!!!!!!!!!
………..というわけで、この便利な連鎖比較がどの様に実装されているかを探検してみます。
# リポジトリから探す
まずはPerl5のgitリポジトリを雑にcommit logを検索します。
とりあえずはchained comparisons
あたりで検索してみます。
|
|
この内前2つはそれぞれperlopのpodの更新のコミットであり、 連鎖比較の実装そのものの変更ではありませんでした。
|
|
このコミットで連鎖比較の実装が行われています。
# 連鎖比較の実装のコミットを探る
というわけで上の02b85d3dab092d678cfc958a2dc252405333ed25
の変更を見ていきます。
webから見たい方はGitHubから見れます
# 変更があったファイル一覧
$ git log -p 02b85d3dab092d678cfc958a2dc252405333ed25 --stat
とかで表示出来るらしいので見てみます。
|
|
結構いろいろなファイルが変更されているのがわかりますね。
lib/B
以下のファイル群はPerlのBモジュール(Perlのバックエンドをいい感じにスクリプトから使えるくん)関連です。
# とりあえずテストから見る
連鎖比較の実装を追う前に、そもそもどういう使用感なのかをテストから探ります。
連鎖比較のテストは t/op/cmpchain.t
に記述されています。
全体で1749ものテストが存在するので、全てでは無いですが一部を取り出してみます。 実行には5.32.0-RC0を利用しています。
|
|
テストを見ると連鎖比較は 0 < $n < 10
のような3条件以外にも 5 < 7 <= 8 > 9
の様にさらに複数連鎖可能な様です。
さらに大小以外にもcmp
や~~
なども使えるみたいですね。
# perly.(h|tab|y)
まず最初に見るのはperly.(h|tab|y)
系のファイルです。
このファイルはPerlの心臓部と言ってもいいであろう構文解析系の実装を担当しています。 Perlは構文解析ではYacc(Bison)を利用しており、perly.yがその定義ファイル、 perly.tab及びperly.hはbisonが生成してくれるファイルです。
その為人間が変更したファイルであるperly.hの変更点を見てみましょう。
|
|
結構いろいろ変更点がありますね。上から見ていきましょう。
|
|
このdiffを確認すると %token <ival> RELOP EQOP MULOP ADDOP
の中のRELOP
とEQOP
が削除されています。
これはYACC中のトークンとしてRELOP
MULOP
などを宣言し、トークンが持つ値の型としてival
を宣言しています。
ivalそのものやyaccの宣言部分でI32
型として宣言されています。
削除されたRELOP
とEQOP
が何であるかを見てみましょう。
実際にYACC内でこのトークンがどういうものかを定義している構文規則部分を見てみましょう。
|
|
コメントからなんとなく雰囲気がわかるかと思いますが、 RELOP
は左右をterm
で囲う文法規則です。
|
|