ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

Writing Compilers and Interpreters: A Software Engineering Approach 3rd Edition その4

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

何にもしてないけど、パースが終わった時点でパーサーのサマリーを出力し、これまた何もしないコード生成が終わるとコードジェネレータのサマリーを出しています。

Writing Compilers and Interpreters: A Software Engineering Approach 3rd Edition その3

いくつかデザインパターンが出てきました。今まで本を読んでもさっぱり分からなかったのに、コキュートスでやった経験が生きていてなるほどと関心しています。こういうのは実際に苦労しないと身につかないですね。

ファクトリーパターン

起動時のオプションによってバックエンドを切り替えるとき、ファクトリーパターンが使えます。コキュートスも、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: A Software Engineering Approach 3rd Edition その2

Writing Compilers and Interpretersを読んでる。
Tokenにソース上の位置情報を持たせてあって、あーなるほどーと関心した。
パーサーやスキャナーは抽象クラスを作って、それらを継承して言語固有のパーサーにするという設計が面白い。

オブザーバーパターンについても記載があり、オブジェクト指向の勉強にもなる本である。

Writing Compilers and Interpreters: A Software Engineering Approach 3rd Edition

手持ちになんちゃってでも良いので、そこそこ動くコンパイラが欲しいので、Writing Compilers and Interpreters: A Software Engineering Approach 3rd Editionを購入して勉強を始めた。

ATOMとPlanUMLでUML図を書いている。

なかなか思った通りに配置されず、ただただ図を書くのが面白かった。
ソースはこんな感じです。

https://github.com/natsutan/Limbus/blob/master/chap1/figure/frontend_class.uml

CourseraのPractical Time Series Analysis

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でも欲しい機能。

Quizの難易度

機械学習に比べる楽勝でした。計算問題が少なく良く分からなくても正解を当てに行けるというか、すぐ次の問題に正解が書いてあったり修了証のゲットは簡単です。講義の間の小テストはわざと間違えさせるというか、テストの後にその解説が来るみたいたのがあって逆の方が良いかなと思いました。pdfのテキストも中途半端で、結局ビデオを見直したりするのもちょっと面倒でした。

得た物

まあ、時系列データの異常検知がしたかったのですが、目的からはちょっと外した感じです。
Rが少し使えるようになったのは収穫です。