いくつかデザインパターンが出てきました。今まで本を読んでもさっぱり分からなかったのに、コキュートスでやった経験が生きていてなるほどと関心しています。こういうのは実際に苦労しないと身につかないですね。
ファクトリーパターン
起動時のオプションによってバックエンドを切り替えるとき、ファクトリーパターンが使えます。コキュートスも、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)
この本には知らない事がいっぱい書いてあって勉強になります。