hariboteは、はりぼて言語の処理系です。
gitを使わなくてもhariboteのhistブランチ(Commits on Aug 7, 2024)のソースコードが利用できるように、ここに置いておきます。
haribote HL-1
haribote HL-1は、text変数に書き込んだプログラムを解釈実行します。
/* Copyright (c) 2023 Masahiro Oono This software is a translator for HL. HL (Haribote Language) is a programming language designed in 2021 by Hidemi Kawai. https://essen.osask.jp/?a21_txt01 */ #include <stdio.h> #include <stdlib.h> unsigned char text[] = /* BEGIN */ "a=1;" "b=2;" "c=a+b;" "print c;" /* END */ ; int main(int argc, const char **argv) { int vars[256]; for (int i = 0; i < 10; ++i) vars['0' + i] = i; int pc; for (pc = 0; text[pc] != 0; ++pc) { if (text[pc] == '\n' || text[pc] == '\r' || text[pc] == ' ' || text[pc] == '\t' || text[pc] == ';') continue; if (text[pc + 1] == '=' && text[pc + 3] == ';') vars[text[pc]] = vars[text[pc + 2]]; else if (text[pc + 1] == '=' && text[pc + 3] == '+' && text[pc + 5] == ';') vars[text[pc]] = vars[text[pc + 2]] + vars[text[pc + 4]]; else if (text[pc + 1] == '=' && text[pc + 3] == '-' && text[pc + 5] == ';') vars[text[pc]] = vars[text[pc + 2]] - vars[text[pc + 4]]; else if (text[pc] == 'p' && text[pc + 1] == 'r' && text[pc + 5] == ' ' && text[pc + 7] == ';') printf("%d\n", vars[text[pc + 6]]); else goto err; while (text[pc] != ';') ++pc; } exit(0); err: printf("Syntax error: %.10s\n", &text[pc]); exit(1); }
参考
「10日くらいでできる!プログラミング言語自作入門」
インタプリタをC言語で実装しながらプログラミング言語自作に入門するテキストです。無料で読めます。続編ではインタプリタをJITコンパイラに改造します。
「10日くらいでできる!プログラミング言語自作入門」の続編#1-1
プログラミング言語自作入門で実装したインタプリタを、x86用またはx64用のJITコンパイラに改造します。後半では、レジスタ変数の導入や無駄なメモリアクセスの削減、コンパイル時の定数計算などの最適化に取り組みます。
「10日くらいでできる!プログラミング言語自作入門」の「残された課題」に関する補足
作者の川合秀実さんが、a21_txt01_10の「残された課題」への取り組み方について、再検討した内容を共有してくれました。残された課題は、記号表やスタックを自分で実装する必要があるため、はりぼて言語の公式処理系の構造をベースに言語開発を進めたい人にとって、良い課題となるでしょう。