/haribote

10日くらいでできる!プログラミング言語自作入門

Primary LanguageCMIT LicenseMIT

haribote

License: MIT

hariboteは、はりぼて言語の処理系です。HL-1からHL-9aまでの各バージョンのコミットを、それぞれのブランチに記録しています。

はりぼて言語は、川合秀実さんが開発しているプログラミング言語です。2021年に「10日くらいでできる!プログラミング言語自作入門」で発表されました。

私はプログラミング言語は(世間の人が思っているよりは)ずっと簡単に作れるものだと思っています。・・・今からここにそのためのテキストを置きます。これを読んで是非作れるようになってください。そうすれば「作りたいけど、作り方が分からない」を卒業することができます。そして今後は「じゃあどんな言語を作ろうか」をメインで考えられるようになるのです。それはとても素敵なことだと思います。

ライセンスについて川合秀実さんに質問したところ、「私はHLシリーズの派生物に対して一切の権利を主張しません」という、うれしいお返事をいただきました(a21_bbs01)。

はりぼて言語の公式処理系は、作者の川合秀実さんが処理系を可能な限り小さく作ってみて、残ったものを「本質」とみなしてみよう、という趣旨で実装されているため非常にコンパクトな実装になっています。

それに対してhariboteは、HL-4, HL-7, HL-8を中心に「改造のしやすさ」を意識して変更を加えた実装になっています。

そのためコード量は増えていますが、公式処理系と同じ構造を持っています。

Dependencies

  • gcc or clang

HL-9, HL-9aをコンパイルする際はaclibが必要です(See aclライブラリの入手方法)。

Building

  1. gitを使ってソースコードをクローンします
$ git clone https://github.com/ready-player1/haribote
$ cd haribote
  1. ビルドします

Building HL-1...HL-8c

with gcc:

$ gcc -O3 -Wno-unused-result -o haribote main.c

with clang:

$ gcc -O3 -Wno-pointer-sign -o haribote main.c

Note

macOSでXcodeをインストールした際にあわせてインストールされるgccコマンドは、clangを指しています。

$ gcc --version
Apple clang version 14.0.0 (clang-1400.0.29.102)
...

Building HL-9, HL-9a (merged into demo branch)

with gcc:

$ gcc -I/path/to/acl_sdl2 -DAARCH_X64 -O3 -Wno-unused-result -o haribote main.c `sdl2-config --cflags --libs` -lm

with clang:

$ gcc -I/path/to/acl_sdl2 -DAARCH_X64 -O3 -Wno-pointer-sign -o haribote main.c `sdl2-config --cflags --libs`

Note

gccの例は、Ubuntuにlibsdl2-2.0-0aptコマンドでインストールして確認しました(aclライブラリはSDL2.0版を使用)。

clanの例は、macOS x86_64にsdl2brewコマンドでインストールして確認しました(aclライブラリはSDL2.0版を使用)。

履歴確認用ブランチ

mainブランチやdemoブランチは、ソースコードの変更をブランチの先頭にコミットします。バグ修正をおこなうと履歴が残ります。

それに対してhistブランチは、git rebase -iコマンドを使って、直接、バグが発生したコミットを書き換えます。バグの痕跡は残りません。

histブランチは、mainブランチやdemoブランチにマージされることのない履歴確認用ブランチです。

写経をおこなう際など、差分にバグ修正履歴を含む必要がない場合は、histブランチに切り替えてgit log -pコマンドを使うとよいでしょう。

Switching to hist branch

  1. リモートから変更を取得し、histブランチをチェックアウトします
$ git fetch origin hist
$ git checkout hist
  1. 差分をパッチ形式で表示します
$ git log -p