しょぼいマシンで自作プログラミング言語を作ってみる (3)

コンパイラを作るにあたって

新しい言語gallopのソースコードの拡張子について

 trotにしましょう。
 理由? そもそもgallopって馬の走法の名前なんですよ。競馬場で走っている馬の速さ。それがギャロップなんです。
 で、その速さよりちょっと遅いのがトロット。というわけで、ギャロップの一歩手前となる→gallopでビルドされる前の段階→trot
 こんな感じで決まりました。

ディレクトリ構成

.
├── CMakeLists.txt
├── bin
│   └── gallop0
├── build
├── cmake
│   ├── CLangConfig.cmake
│   ├── GoogleTestConfig.cmake
│   ├── LLVMConfig.cmake
│   ├── SetShCmdVar.cmake
│   ├── clang
│   │   ├── FindClangC.cmake
│   │   └── FindClangCxx.cmake
│   ├── googletest
│   │   └── FindGoogleTest.cmake
│   └── llvm
│       ├── FindLLVM.cmake
│       ├── FindLlvmAr.cmake
│       ├── FindLlvmAs.cmake
│       ├── FindLlvmConfig.cmake
│       └── FindLlvmRanlib.cmake
├── cmake.cmd.sample
├── cmake.sh
├── cmake.sh.sample
├── googletest
├── include
│   ├── gallop.hpp
│   └── util
│       └── xxx.hpp
├── src
│   ├── gallop.cpp
│   └── lib
│       └── util
│           └── xxx.cpp
├── test
│   └── lib
│       └── util
│           └── xxx.cpp
└── testdata

 こんな感じにします。googletestについてはこのあと、触れます。
 なお、include/配下、src/lib/配下、test/lib/配下の構造についてはサンプルなので実際には追加変更される予定です。
 トップ配下にあるファイルはcmakeビルド用のスクリプトだったり、cmake用の設定ファイル。
 bin/ディレクトリ配下はビルドされた際に出力されるファイル置き場。
 build/ディレクトリはcmakeビルド用のワーキングディレクトリ。
 cmake/ディレクトリはcmakeビルド用の設定(主にライブラリのインクルード設定)スクリプト置き場
 include/ディレクトリはヘッダファイル置き場。
 src/ディレクトリは実行ファイルのためのソースファイル置き場。
 test/ディレクトリは単体テストのためのソースファイル置き場。
 testdata/ディレクトリはテスト用のtrotファイル置き場
 googletest/ディレクトリは後述しますが、ユニットテストのための機能であるGoogleTest。そのためのヘッダファイル、ライブラリ置き場。

単体テストのためのライブラリについて

$ wget https://github.com/google/googletest/archive/refs/tags/v1.15.2.tar.gz -O googletest-1.15.2.tar.gz
$ tar xvzf googletest-1.15.2.tar.gz
$ cd googletest-1.15.2
$ cmake . -DCMAKE_INSTALL_PREFIX=../googletest
$ make
$ make install

 上記のようにして、プロジェクト外のディレクトリでユニットテストのためにGoogleTestライブラリをビルドしました。
 あとはできたgoogletestディレクトリを上述した場所に放り込んでおきました。
 なんで必要なのかな? っていう点で言えば、ソースを改修することによってリグレッション(機能退行)が発生するのも検知できたりするのもありますしね。

 それにですね?
 ソースコードのコンパイルには切り離せないもの。キャラクターセット、つまりは文字エンコーディングですけれど。
 それを検知するのにファイルを読み込んでゴニョゴニョとなるとちょっと面倒な部分もあるかな? と思います。
 当然、文法解析や構文解析もね?
 ならばユニットテスト機能を組み込みましょうって話です。

 まあ、そういったわけでこれまでの話を踏まえて、次の記事では最低限のビルドができるところまで持っていきましょうか。

いいなと思ったら応援しよう!