YAPC::Tokyo 2019のLTです
͏ݟͨ!!!id:AnaTofuZ
View Slide
• 最近Perl1.0とPerl6の処理系を書きます• 「Perl1.0を触っている」と人々に言うと…
Perl1.0• 「古い」• 「化石」• 「それ使ってて何の意味あるのw」• 「そんなことよりLisp」• 「いいから卒論」
Ұपճͬͯ৽͍͠ݹ͍
Perl1.0• Perl1.0はemacsより新しいのに….(発表年的な意味で)
Perl1.0• Perl1.0はemacsより新しいのに….(発表年的な意味で)•古めのCで書かれている から古いと思われるや!!!!
ΑΖ͍͠ͳΒ
mv {C,Golang}- Perl1.0八雲アナグラ @AnaTofuZ YAPC::Tokyo 2019
Cで書かれたPerl1.0をgolangで 書き直していくぞ!!!!
Perl1.0CYaccConfigure Makefile字句解析/ おおよその処理構文解析ビルド周りオリジナル
Perl1.0CYaccConfigure Makefile字句解析/ おおよその処理構文解析ビルド周りオリジナルGogoyaccgolangGo
Ͱ͖ͦ͏ͳงғؾ
rewriting Perl1.0• Perl1.0そこそこ書かれている(まぁプログラミング言語だし…)• 全部書き直すのは可能であると思うが,いきなりは厳しい• 戦略として適当なサンプルプログラムを用意し, gdb/lldbで元のPerl1.0をトレースしつつ そのPerlプログラムの実行で 使う関数と構造体をその都度実装していく
• c2goとかいうCをgoに変換してくれるツールもありますが…• 使ってみたらエラー吐いて変換できなかった
Perl1.0• golangでポインタ演算は厳しい(unsafeを使えば出来る?)が Perl1.0はポインタ演算や, アドレス参照をしまくっている• 単一の構造体のポインタを返しているだけかと思いきや, 同じ関数で構造体のリストをポインタ演算して作っている• yaccのデバッグトレースに対する知見があまりない
Perl1.0• 無駄な処理がある (初期値をいれて構造体を作った次の行で書き換えるなど)• 構造体の名前が良くわからない (なんでこんな名前にしたんだ……)• char型の下位ビットなどをフラグにしている (goへの移植時にいろいろと考える必要がある)• 実装の解説資料が無い• ラベルgoto多用
Perl1.0• 言うほどマクロ使ってない• 一人の人間が理解できそうな気がするコード量• 気合いれれば結構読める処理が多い• ラリー・ウォールが書いたコードが読める!!• golangへの変換でCとgolangの勉強になる
• 一週間でスカラ変数の代入と出力をしたかったが厳しかった• スカラ変数の代入と出力で利用するYACCの要素 レキサーの中で使用する関数は実装した• 愚直に使うコードを移植していてPerl1の雰囲気がわかってきた• 年内には作れそう!!
goPerl1.0• これからのgoPerl1.0にご期待下さい! (進捗報告はOkinawa.pmで!!!)• https://github.com/AnaTofuZ/Go-Perl1