Help us understand the problem. What is going on with this article?

プログラミング言語処理系をDDDを用いて二週間で作るチャレンジを始めてみた

こんにちはmegumishです。

日曜日ぐらいからプログラミング言語「megulang」を作り始めました。
まずはじめに言っておくとチャレンジはおそらく失敗です。
マイルストーンを決めて、二週間で作ろうと考えていたのですが、知識量的にも実装量的にもどう考えても間に合わないことに気づき一部だけ作ることに決めました。

0. お品書き

  1. ドメイン駆動設計を使った開発手法
  2. プログラミング言語処理系のシーケンス図
  3. ドメインモデルがうまく抜き出せない!
  4. まずはドメイン知識を蓄えるために一部だけ実装しつつ本を読もう!

1. ドメイン駆動設計を使った開発手法

ドメイン駆動設計を使ってこの開発を進めることにしました。
ドメイン駆動設計とはプロジェクト全体をコンテキストとさらにドメインに切り分けることで、実際の当該領域の知識や実務に寄り添った設計をする手法です。
会社などで複数の人が関わって開発する場合は、ドメインエキスパートと呼ばれる当該領域のエキスパートに話を聞きながらプロダクト開発を進めるのですが、個人の場合は自分や書籍などからドメイン知識を構築する必要があります。

ここでは私のドメイン知識不足から全体への完成は頓挫してしまいましたが、以下が私がドメイン駆動設計を進めていくための手法になります。

1.1 シーケンス図などで実際の作業のフローを図示

自分は紙に綺麗に書き直すのが面倒なためシーケンス図を用いますが、複数人でやる場合にはホワイトボードに自由に書く方が良いかもしれません。

1.2 ドメインモデルを抜き出す

先ほどのフローを基にドメインモデルを抜き出します。これはのちにエンティティやドメインサービスとなり実装を構成する核となるものになります。

1.3 実装への設計

モデルから設計を抽出して実装を進めます。

1.4 フィードバックを得て、モデルの再構成やリファクタリングを進める

実装してる最中などにドメイン知識が深まり、モデルを再構成する必要やリファクタリングをする必要がある場合はそれをモデルや実装にフィードバックします。

テストについて

実際にはプロダクトを始めから作り直すなどと言ったことがないようにテストも計画しておくのが賢明だと考えています。
またその時にテストハーネス(モックやスタブなどとも呼ばれる)を用意できるように依存関係の注入をできるようにしておくと便利です。

2. プログラミング言語処理系のシーケンス図

はじめにプログラミング言語処理系(以下、処理系と呼ぶ)がどのように処理しているのかについて、以下のようなシーケンス図を書きました。
少なくともこれは私の解釈であり、経験則であるのできちんと学びたい方は言語処理系のちゃんとした記事に当たることをお勧めいたします。

https://github.com/megumish/megulang/blob/master/design/lexical_analysis.pu
lexical_analysis.png

これは字句解析の部分のシーケンス図です。
単なる文字の羅列であったコードをトークンと呼ばれる一つ一つのものに変換することで、処理系が続く以下の処理を行えるようになります。

https://github.com/megumish/megulang/blob/master/design/token_evaluation.pu
token_evaluation.png

次にトークンの解釈になります。先ほどトークンに分解した時点ではまだ文字の羅列がトークンの羅列になったに過ぎず、ここで初めてコードから変換されたものたちが意味を持つようになります。
ここではまず、トークンのうち前処理(Preprocessor)を担当する部分に前処理が行われます。これはC言語で言うところの #defineマクロ などが当たります。これによって更なるトークンが得られます。
前処理が終わると、トークンのまとまりごとに意味が与えられます。ここではそれを機能(Function)と呼び、さらに続く処理でその機能が正しいものか判定します。(ここは型検査のようなものだと捉えています。)

https://github.com/megumish/megulang/blob/master/design/compilation_to_intermediate_language.pu
compilation_to_intermediate_language.png

3番目のシーケンスです。これは先ほど意味が与えられ機能となったものを中間言語(Intermediate Language)と呼ばれる、機械語に変換する前のロジックを持った言語に変換します。

https://github.com/megumish/megulang/blob/master/design/generation_executable.pu
generation_executable.png

最後に中間言語から機械語を生成し、それを基に実行ファイルを生成して終了します。
このシーケンスでは実行ファイルを生成しますが、インタプリタ式に中間言語を実行するようにしても構わないと考えています。

3. ドメインモデルがうまく抜き出せない!

今回の場合、私の知識不足もあり先ほどのフローから実装に至るためのドメインモデルを抜き出せませんでした。

特にコンテキスト間の依存関係にはかなり迷いがありました。フローとしては上のものであっているとは思うのですが、細かいところからそれぞれの関係をどう共有するかという境界づけられたコンテキストのマッピングをうまくできませんでした。

4. まずはドメイン知識を蓄えるために一部だけ実装しつつ本を読もう!

結果的にドメイン知識を蓄えるためには短期間では無理ということがわかり、一部だけ実装してみることをまずは始めようと思いました。
今は通称ドラゴンブックと呼ばれる、「コンパイラ 原理・技法・ツール」という本を読み進めてパーサーではなく、自分の興味のある中間言語、機械語の生成や最適化についてから読む予定です。

また、何かあったらこの記事かもしくは別の記事で続報を伝えます。DDDについても実践の中で理解を深めるつもりです。まだまだ未熟ですが、よろしくお願いします。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away