とりあえず3章まで終了してトーカナイザーができた。正直この辺までは僕の人生で10回くらいやってる。
パーサーを突破したのが2回くらい。
4章はシンボルテーブル。Cで書くと辛い奴だが、今時の言語なら余裕だと思う。
順調だけど油断せずに行こう。
とりあえず3章まで終了してトーカナイザーができた。正直この辺までは僕の人生で10回くらいやってる。
パーサーを突破したのが2回くらい。
4章はシンボルテーブル。Cで書くと辛い奴だが、今時の言語なら余裕だと思う。
順調だけど油断せずに行こう。
2章まで終了。
この本の面白いところは、まずはソースコードを入力して、トーカナイザーとパーサーとコードジェネレータを通すフレームワークを先に作る所です。
2章が終わった時点でできるのは、このようなPascalのコードを読み込んで、行番号つけて表示するだけ。
PROGRAM hello (output); {Write 'Hello, world.' ten times.} VAR i : integer; BEGIN {hello} FOR i := 1 TO 10 DO BEGIN writeln('Hello, world.'); END; END {hello}.
実行結果がこう。
1 PROGRAM hello (output); 2 3 {Write 'Hello, world.' ten times.} 4 5 VAR 6 i : integer; 7 8 BEGIN {hello} 9 FOR i := 1 TO 10 DO BEGIN 10 writeln('Hello, world.'); 11 END; 12 END {hello}. 12 source lines 0 syntax errors 0 instructions generated
何にもしてないけど、パースが終わった時点でパーサーのサマリーを出力し、これまた何もしないコード生成が終わるとコードジェネレータのサマリーを出しています。
いくつかデザインパターンが出てきました。今まで本を読んでもさっぱり分からなかったのに、コキュートスでやった経験が生きていてなるほどと関心しています。こういうのは実際に苦労しないと身につかないですね。
起動時のオプションによってバックエンドを切り替えるとき、ファクトリーパターンが使えます。コキュートスも、C、Neon対応のC、FPGA用ソースなど、バックエンドをこれで切り替えると楽でした。次はそうしましょう。
class BackendFactory: def create_backend(self, operation): if operation == 'compile': return CodeGeneretor() elif operation == 'execute': return Executer() else: raise ValueError(operation)
コンパイラのそれぞれのパーツでMessageを全体に送受信する仕組みを共有します。Messageを受け取った側は、自分宛(もしくは自分が興味を持っている)Messageにのみ対応します。これも便利ですね。
class BackendMessageListener(MessageListener): def message_received(self, msg): type = msg.type body = msg.body if type == MessageType.INTERPRETER_SUMMARY: print('%d statements executed. %d runtime errors.' % (body[0], body[1])) elif type == MessageType.COMPILER_SUMMARY: print('%d instructions generated' % body)
この本には知らない事がいっぱい書いてあって勉強になります。
Writing Compilers and Interpretersを読んでる。
Tokenにソース上の位置情報を持たせてあって、あーなるほどーと関心した。
パーサーやスキャナーは抽象クラスを作って、それらを継承して言語固有のパーサーにするという設計が面白い。
オブザーバーパターンについても記載があり、オブジェクト指向の勉強にもなる本である。
手持ちになんちゃってでも良いので、そこそこ動くコンパイラが欲しいので、Writing Compilers and Interpreters: A Software Engineering Approach 3rd Editionを購入して勉強を始めた。
なかなか思った通りに配置されず、ただただ図を書くのが面白かった。
ソースはこんな感じです。
https://github.com/natsutan/Limbus/blob/master/chap1/figure/frontend_class.uml
全リソースをつっこむくらいの勢いで、Deep Learning Specializationコースを受講中。
https://www.coursera.org/specializations/deep-learning
1/3くらいを終えたところ。
一回、ちゃんと授業として受けておくのは良いことだと思う。
CourseraのPractical Time Series Analysisを完了しました。
修了証
https://www.coursera.org/account/accomplishments/certificate/364U9TKUZXYD
時系列データを扱うときに使うモデル、MA、AR、ARMA、ARIMAについて、基本から順番に説明していきます。
イメージで言うと、こういう波形から何か特徴のような物を見つける技術です。
最後に少し違う事をしますが、講義の大半はMAとARの習得でした。前半は何をやっているのかわからず面白く無かったですが、後半から急に面白くなり、その後どうなるの?って所で急に終わってしましました。MA、ARについてはくどいほどでてきたので、今後別の本で勉強するときも大丈夫な気がします。演習用の言語はRでした。初めてのRでしたが、特に問題無くRの良さが少し分かりました。summaryはnumpyでも欲しい機能。
機械学習に比べる楽勝でした。計算問題が少なく良く分からなくても正解を当てに行けるというか、すぐ次の問題に正解が書いてあったり修了証のゲットは簡単です。講義の間の小テストはわざと間違えさせるというか、テストの後にその解説が来るみたいたのがあって逆の方が良いかなと思いました。pdfのテキストも中途半端で、結局ビデオを見直したりするのもちょっと面倒でした。
まあ、時系列データの異常検知がしたかったのですが、目的からはちょっと外した感じです。
Rが少し使えるようになったのは収穫です。