Cm v0.12.0 リリースノート
リリース日: 2026-01-28
✨ ハイライト
v0.12.0は、const強化、多次元配列最適化、Linter/Formatter、末尾呼び出し最適化を含む開発ツール中心のリリースです。
主要な変更点
- const強化: 配列サイズにconst変数・定数式を使用可能に
- 多次元配列フラット化: キャッシュ効率の大幅改善
- Linter: コードの静的解析ツール(
cm lint) - Formatter: コードフォーマッター(
cm fmt) - 末尾呼び出し最適化(TCE): 再帰関数のスタックオーバーフロー防止
🚀 新機能
const強化(配列サイズにconst変数を使用可能)
コンパイル時定数評価を実装し、配列サイズの宣言にconst変数や定数式を使用できるようになりました:
const int SIZE = 10;
const int DOUBLE_SIZE = SIZE * 2; // 定数式も評価可能
int main() {
int[SIZE] arr1; // int[10]
int[DOUBLE_SIZE] arr2; // int[20]
println(arr1.size()); // 10
println(arr2.size()); // 20
return 0;
}
サポートされる演算
- 整数リテラル、bool値
- 算術演算(
+,-,*,/,%) - ビット演算(
&,|,^,<<,>>) - 比較演算、論理演算
- 三項演算子
多次元配列フラット化最適化
多次元配列を1次元配列に自動変換し、キャッシュ効率を大幅に改善:
// コンパイラが自動的に最適化
int arr[100][100]; // → 内部的に int arr[10000] として扱う
// ユーザーコードは変更不要
arr[i][j] = value; // → arr_flat[i * 100 + j] = value
Linter実装
コードの静的解析ツールを実装しました:
./cm lint src/main.cm
./cm lint src/ # ディレクトリ内を再帰チェック
機能:
- 命名規則チェック(snake_case、PascalCase)
- 未使用変数の検出
- const推奨警告
Formatter実装
コードフォーマッターを実装しました:
./cm fmt src/main.cm # フォーマット結果を表示
./cm fmt -w src/main.cm # ファイルに書き込み
機能:
- K&Rスタイルのブレース配置
- 一貫したインデント(4スペース)
- 単一行ブロックの保持
末尾呼び出し最適化(TCE)
LLVMレベルでの末尾呼び出し最適化を実装。再帰関数のスタックオーバーフローを防止:
// 末尾再帰でスタックオーバーフローなし
int factorial_tail(int n, int acc) {
if (n <= 1) return acc;
return factorial_tail(n - 1, n * acc); // TCE適用
}
🔧 CI/CD改善
Windows対応の一時停止
test-interpreter.ymlからWindowsのbuild/JITテストを完全削除- 理由: LLVM公式Windows版にCMakeファイル(LLVMConfig.cmake)が含まれていないため
- 将来計画: vcpkgやconanなどのパッケージマネージャー経由での対応を検討中
不要なテストバイナリの削除
test_1d_native、test_2d_native、test_ptr_nativeを削除
📁 主要な変更ファイル
コンパイラ本体(const強化)
| ファイル | 変更内容 |
|---|---|
src/frontend/types/scope.hpp |
Symbolにconst_int_valueフィールド追加 |
src/frontend/types/checking/checker.hpp |
evaluate_const_expr, resolve_array_size宣言追加 |
src/frontend/types/checking/utils.cpp |
コンパイル時評価・配列サイズ解決の実装 |
src/frontend/types/checking/stmt.cpp |
check_letにconst値評価を追加 |
src/frontend/types/checking/decl.cpp |
GlobalVarDeclの登録処理追加 |
Linter/Formatter
| ファイル | 変更内容 |
|---|---|
src/lint/ |
Linter実装(命名規則、未使用変数、const推奨) |
src/formatter/ |
Formatter実装(AST Rewriter方式) |
src/main.cpp |
lint/fmtコマンド追加 |
ドキュメント
| ファイル | 変更内容 |
|---|---|
docs/FEATURES.md |
const強化機能を追加 |
docs/design/v0.12.0/const_enhancement.md |
設計ドキュメント(新規) |
docs/UNIMPLEMENTED_FEATURES.md |
未実装機能リスト(新規) |
docs/flyer/ |
Cm言語のチラシを追加 |
🧪 テスト状況
| カテゴリ | 通過 | 失敗 | スキップ |
|---|---|---|---|
| LLVM Native (O0) | 281 | 0 | 31 |
| LLVM Native (O3) | 281 | 0 | 31 |
| インタプリタ (O0) | 283 | 0 | 29 |
| インタプリタ (O3) | 283 | 0 | 29 |
📊 統計
- コミット数: 48
- 変更ファイル数: 408
- 追加行数: 19,918
- 削除行数: 1,608
⚠️ 重要な変更
Windows対応について
現在Windows対応は一時停止中です。Linux/macOSでの開発を推奨します。
const評価の制限
- 現在はグローバル
const変数と定数式のみサポート constexpr関数は今後のバージョンで実装予定
🔮 今後の予定
- v0.13.0: const generics(
fn foo<const N: int>())、constexpr関数 - v0.14.0: パッケージ管理システム(
cm pkg) - v0.15.0+: Windows対応の再検討、非同期処理
📝 謝辞
このリリースは多くのフィードバックとテストによって実現しました。特にLinter/Formatterの設計とconst評価のテストに貢献してくださった方々に感謝します。