ぱたへね

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

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)

この本には知らない事がいっぱい書いてあって勉強になります。