Releases: Charless-language/Charless-cli
Releases · Charless-language/Charless-cli
v0.0.1
Charlessとは
Charlessは、極限まで単純化された構文を持つ、ユニークなプログラミング言語です。その最大の特徴は、すべてのコードが数字と区切り文字である**20**のみで記述される点にあります。
言語思想の核となるのは「ミニマリズム」です。複雑なキーワードや記号を排し、スタックマシンベースの単純な計算モデルを採用することで、コンパイラや仮想マシンの仕組みを学ぶための教育的な目的、あるいは言語設計の実験的な試みとして開発されています。
Charlessで書かれたコード(.cless)は、独自のコンパイラclesscによってアセンブリ言語に変換され、最終的に実行可能なバイナリが生成されます。
v0.0.1の主な機能
- スタックベースの計算: 四則演算(
+,-,*,/)および剰余(%)をサポート。 - 数値リテラル: 10進数の数値をコード内に埋め込み可能。
- スタック操作:
PUSHによる数値のスタックへのプッシュ。 - メモリ操作:
STOREとLOADによる限定的なメモリアクセス。 - 基本的なI/O:
- 標準入力からの数値・文字列の読み取り。
- スタック上の数値、文字列、または単一文字の標準出力への書き込み。
- 改行の出力。
構文
Charlessの構文は2つの基本要素で構成されます。
- 命令コード (OpCode):
0から65までの数字で表現される命令です。 - 区切り文字 (Separator): 命令や数値リテラルを区切るための
20という文字列です。
数値リテラルの表現
数値をコードに記述する場合、99で始まり20で終わる特別な形式を使用します。
例:
- 数値
123は9912320と記述します。 - 数値
45は994520と記述します。
命令セット (OpCode)
v0.0.1で利用可能な命令は以下の通りです。
| OpCode | 命令 | 説明 |
|---|---|---|
00 |
HALT |
プログラムを正常に終了します。 |
01 |
PRINT_STRING |
メモリから文字列を読み込み出力します。 |
02 |
PRINT |
スタックの先頭の値(数値)を出力します。 |
03 |
PRINT_MEM_STRING |
メモリ上の文字列を出力します。 |
04 |
PRINT_CHAR |
スタックの先頭の値をASCII文字として出力します。 |
11 |
INPUT_STRING_AND_PARSE |
文字列を入力として受け取り、パースします。 |
12 |
INPUT_NUM |
数値を入力として受け取り、スタックにプッシュします。 |
13 |
INPUT_STRING |
文字列を入力として受け取ります。 |
21 |
PRINT_NEWLINE |
改行文字を出力します。 |
51 |
PUSH |
後に続く数値リテラルをスタックにプッシュします。 |
53 |
STORE |
スタックの値を指定したメモリアドレスに格納します。 |
54 |
LOAD |
指定したメモリアドレスから値を読み込み、スタックにプッシュします。 |
61 |
ADD |
スタックの先頭2つの値を加算し、結果をスタックにプッシュします。 |
62 |
SUB |
スタックの先頭から2番目の値から先頭の値を減算し、結果をプッシュします。 |
63 |
MUL |
スタックの先頭2つの値を乗算し、結果をプッシュします。 |
64 |
DIV |
スタックの先頭から2番目の値を先頭の値で除算し、結果をプッシュします。 |
65 |
MOD |
スタックの先頭から2番目の値を先頭の値で割った剰余をプッシュします。 |
サンプルコード
10と5を加算し、結果を出力するプログラムの例です。
// 意味: PUSH 10 -> PUSH 5 -> ADD -> PRINT -> HALT
51209910205120995206120022000
5120991020:PUSH命令と数値10512099520:PUSH命令と数値56120:ADD命令0220:PRINT命令00:HALT命令
今後の展望
v0.0.1はCharlessの第一歩です。将来的には以下の機能の追加を計画しています。
- 条件分岐命令 (
JMP_IF_ZEROなど) - ループ構造のサポート
- 関数やサブルーチンの定義と呼び出し
- より高度なメモリアクセスとデータ構造
Full Changelog: https://github.com/Saku0512/Charless/commits/v0.0.1