Skip to content

Releases: Charless-language/Charless-cli

v0.0.1

29 Oct 00:38
43027c8

Choose a tag to compare

Charlessとは

Charlessは、極限まで単純化された構文を持つ、ユニークなプログラミング言語です。その最大の特徴は、すべてのコードが数字と区切り文字である**20**のみで記述される点にあります。

言語思想の核となるのは「ミニマリズム」です。複雑なキーワードや記号を排し、スタックマシンベースの単純な計算モデルを採用することで、コンパイラや仮想マシンの仕組みを学ぶための教育的な目的、あるいは言語設計の実験的な試みとして開発されています。

Charlessで書かれたコード(.cless)は、独自のコンパイラclesscによってアセンブリ言語に変換され、最終的に実行可能なバイナリが生成されます。

v0.0.1の主な機能

  • スタックベースの計算: 四則演算(+, -, *, /)および剰余(%)をサポート。
  • 数値リテラル: 10進数の数値をコード内に埋め込み可能。
  • スタック操作: PUSHによる数値のスタックへのプッシュ。
  • メモリ操作: STORELOADによる限定的なメモリアクセス。
  • 基本的なI/O:
    • 標準入力からの数値・文字列の読み取り。
    • スタック上の数値、文字列、または単一文字の標準出力への書き込み。
    • 改行の出力。

構文

Charlessの構文は2つの基本要素で構成されます。

  1. 命令コード (OpCode): 0から65までの数字で表現される命令です。
  2. 区切り文字 (Separator): 命令や数値リテラルを区切るための20という文字列です。

数値リテラルの表現

数値をコードに記述する場合、99で始まり20で終わる特別な形式を使用します。

:

  • 数値 1239912320 と記述します。
  • 数値 45994520 と記述します。

命令セット (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番目の値を先頭の値で割った剰余をプッシュします。

サンプルコード

105を加算し、結果を出力するプログラムの例です。

// 意味: PUSH 10 -> PUSH 5 -> ADD -> PRINT -> HALT
51209910205120995206120022000
  • 5120991020: PUSH命令と数値10
  • 512099520: PUSH命令と数値5
  • 6120: ADD命令
  • 0220: PRINT命令
  • 00: HALT命令

今後の展望

v0.0.1はCharlessの第一歩です。将来的には以下の機能の追加を計画しています。

  • 条件分岐命令 (JMP_IF_ZEROなど)
  • ループ構造のサポート
  • 関数やサブルーチンの定義と呼び出し
  • より高度なメモリアクセスとデータ構造

Full Changelog: https://github.com/Saku0512/Charless/commits/v0.0.1