Cm v0.10.0 リリースノート
リリース日: 2025-12-15
リリースタイプ: Development (開発版)
重要度: ⭐⭐⭐⭐⭐ メジャーアップデート
🎯 ハイライト
v0.10.0は配列・ポインタ・型システムの完全な再設計を含む大規模なアップデートです。C/C++との互換性を強化し、型安全性を保ちながら実用的なシステムプログラミングを可能にします。
主要な変更点
- 配列とポインタの完全実装 - C++スタイルの配列/ポインタ構文、Array Decay
- 型制約システムの統一 - インターフェース境界の明確化(AND/OR境界)
- 自動トレイト実装(with) - Rust風の
deriveをC++風に再設計 - デッドコード削除 - 未使用関数・構造体の自動削除による最適化
- operator実装の完全対応 - LLVM/WASMでのカスタム演算子定義
- CI/CD整備 - クロスプラットフォームテスト(Linux/macOS/Windows)
🆕 新機能
1. 配列サポート(完全実装)
C++スタイルの配列宣言と操作をネイティブサポート。
// 配列宣言と初期化
int[5] numbers = [1, 2, 3, 4, 5];
// 多次元配列
int[3][4] matrix;
// 構造体配列
struct Point { int x; int y; }
Point[10] points;
// インデックスアクセス
int first = numbers[0];
numbers[1] = 42;
実装状況:
- ✅ インタプリタ完全対応
- ✅ LLVMネイティブコンパイル
- ✅ WASMバックエンド対応
2. ポインタサポート(完全実装)
C/C++互換のポインタ構文とメモリ操作。
// ポインタ宣言
int* p;
int x = 42;
// アドレス演算子
p = &x;
// デリファレンス
int value = *p;
*p = 100; // xは100になる
// 構造体ポインタ
Point pt = Point(10, 20);
Point* ptr = &pt;
ptr->x = 30; // メンバアクセス(構文糖衣)
実装状況:
- ✅ インタプリタ完全対応
- ✅ LLVMネイティブコンパイル
- ✅ WASMバックエンド対応
- ⚠️ typedef型ポインタはインタプリタのみ
3. 配列→ポインタ暗黙変換(Array Decay)
C/C++と同様の配列からポインタへの暗黙的変換。
int[5] arr = [1, 2, 3, 4, 5];
int* p = arr; // arrの先頭要素へのポインタ
void print_array(int* data, int size) {
for (int i = 0; i < size; i++) {
println(data[i]);
}
}
print_array(arr, 5); // 配列を関数に渡す
4. with キーワードによる自動トレイト実装
Rustの#[derive(...)]をC++風に再設計したwithキーワード。
// 自動的に == 演算子を生成
struct Point with Eq {
int x;
int y;
}
Point a = Point(1, 2);
Point b = Point(1, 2);
bool same = (a == b); // true
// 複数トレイトの自動実装
struct Student with Eq + Ord + Clone {
int id;
string name;
}
サポート済みトレイト:
Eq- 等価演算子(==, !=)Ord- 比較演算子(<, >, <=, >=)Clone- clone()メソッドHash- hash()メソッド
実装状況:
- ✅ インタプリタ完全対応
- ✅ LLVMネイティブコンパイル
- ⚠️ WASMバックエンド未対応
5. 統一された型制約システム
インターフェース境界の構文を統一し、AND/OR境界をサポート。
// 単一インターフェース境界
<T: Printable> void print(T value);
// AND境界(複数インターフェースを実装)
<T: Eq + Ord> T max(T a, T b) {
return a > b ? a : b;
}
// OR境界(いずれかのインターフェースを実装)
<T: Numeric | Stringable> void display(T value);
// where句
<T, U> Pair<T, U> make_pair(T first, U second)
where T: Clone, U: Clone {
return Pair<T, U>(first.clone(), second.clone());
}
破壊的変更:
- ❌ 具体型境界は廃止(
<T: int>は無効) - ✅ インターフェースのみが型境界として使用可能
6. デッドコード削除(DCE)
未使用の関数・構造体を自動的に削除してバイナリサイズを削減。
struct Unused { int x; } // 使われないので削除される
void helper() { // mainから到達不可能なので削除される
println("never called");
}
int main() {
println("Hello");
return 0;
}
最適化効果:
- 未使用の自動実装関数を削除
- mainから到達不可能な関数を削除
- 使用されない構造体定義を削除
7. ufloat / udouble プリミティブ型
非負制約付き浮動小数点型(セマンティクスのみ、実行時検証なし)。
ufloat distance = 10.5; // 32bit 非負浮動小数点
udouble area = 100.25; // 64bit 非負浮動小数点
// 負の値は代入可能だがセマンティクス違反
ufloat x = -5.0; // コンパイルは通るが意味的に不正
実装状況:
- ✅ レキサー・パーサー対応
- ✅ LLVM/WASMでfloat/doubleと同じ表現
- ⚠️ 実行時の非負制約チェックなし
🔧 改善
1. operator実装の完全サポート
HIR/MIRの型推論を強化し、カスタム演算子の実装を完全サポート。
struct Vec2 {
float x;
float y;
}
impl Vec2 {
operator Vec2 +(Vec2 other) {
return Vec2(self.x + other.x, self.y + other.y);
}
operator Vec2 -(Vec2 other) {
return Vec2(self.x - other.x, self.y - other.y);
}
}
Vec2 a = Vec2(1.0, 2.0);
Vec2 b = Vec2(3.0, 4.0);
Vec2 c = a + b; // (4.0, 6.0)
修正内容:
- HIRの型情報がoperator実装内の式に正しく伝播
- MIR型推論で
is_error()型もフォールバック対象に - LLVM float/double型間の自動変換
- FNeg演算子の正しい処理(浮動小数点の単項マイナス)
2. 論理演算子の修正
LLVM/WASMバックエンドでの論理AND/OR演算子を修正。
bool a = true;
bool b = false;
bool and_result = a && b; // false
bool or_result = a || b; // true
修正内容:
- i8型bool値を正しくi1に変換してAND/OR演算
- LLVM IRでの正しいコード生成
3. where句サポート
型制約をwhere句で記述できるように拡張。
<T, U> Result<T, U> combine(T value, U error)
where T: Clone, U: Display {
// ...
}
4. 文字列操作の改善
文字列リテラルと文字列型の処理を改善。
5. 関数ポインタのサポート拡張
関数ポインタ型の宣言と使用を強化。
🐛 バグ修正
LLVMバックエンド
- 型変換の修正: 整数型間・浮動小数点型間の変換を正しく処理
- 構造体戻り値: 関数から構造体を返す際のポインタ型不一致を修正
- switch文内リテラル: 文字列リテラル型推論を修正
- インターフェースfat pointer: 値渡しに変更(ポインタ渡しから修正)
CI/CD
- LLVM互換性: LLVM 17で動作確認
- クロスプラットフォーム: Linux/macOS/Windowsでビルド成功
- wasmtime統合: WASM実行テストを追加
- コンパイル警告: 全警告を修正
💥 破壊的変更
1. 型制約の変更
変更前:
<T: int> void foo(T x); // 具体型境界
変更後:
<T: Numeric> void foo(T x); // インターフェース境界のみ
2. ConstraintKind の変更
内部型システムの変更(APIユーザーに影響):
None,Single,And,Orの4種類に整理- 具体型制約を廃止
⚠️ 既知の問題
未実装機能
- typedef型ポインタ
- インタプリタでは動作
- LLVM/WASMコンパイルは未対応
- with自動実装のWASM
- LLVMでは動作
- WASMバックエンド未対応
- 実行時型検証
- ufloat/udoubleの非負制約チェックなし
パフォーマンス
- デッドコード削除は基本的な呼び出しグラフ解析のみ
- より高度なDCEは将来のバージョンで実装予定
📊 統計情報
テストカバレッジ
- 総テストファイル数: 138ファイル
- C++ユニットテスト: 全パス
- リグレッションテスト: 全パス
- LLVMテスト: 39テスト全パス
- WASMテスト: CI統合完了
コードサイズ
- ソースファイル数: 約100ファイル
- 総行数: 約30,000行(C++/Cmコード)
- ドキュメント: 40以上のマークダウンファイル
🔨 開発者向け情報
ビルド要件
- C++20: Clang 17+ / GCC 12+ / MSVC 19.30+
- LLVM: 17+(オプション)
- CMake: 3.20+
ビルド方法
# LLVM有効ビルド
cmake -B build -DCM_USE_LLVM=ON
cmake --build build
# テスト実行
ctest --test-dir build
./build/bin/cm tests/regression/*.cm
make test-llvm-all
CI/CDマトリクス
| OS | LLVM | WASM | 状態 |
|---|---|---|---|
| Ubuntu 22.04 | ✅ 17 | ✅ | 🟢 |
| macOS 14 | ✅ 17 | ✅ | 🟢 |
| Windows 2022 | ✅ 17 | ✅ | 🟢 |
📚 ドキュメント更新
新規作成
- なし(v0.10.0専用ドキュメントは追加予定)
更新
CHANGELOG.md: v0.10.0の変更を詳細に記録VERSION: 0.9.0に更新README.md: CI/CDテストマトリクスを追加.github/workflows/: CI設定を整備
🎓 学習リソース
サンプルコード
v0.10.0の新機能を使ったサンプルコードはexamples/とtests/test_programs/にあります:
tests/test_programs/array/- 配列の使用例tests/test_programs/pointer/- ポインタの使用例tests/test_programs/interface/with_*.cm- withキーワードの例examples/generics/- ジェネリクスの例
重要な設計文書
docs/design/CANONICAL_SPEC.md- 正式言語仕様(必読)docs/design/architecture.md- システム設計docs/PROJECT_STRUCTURE.md- プロジェクト構造
🚀 次のステップ(v0.10.0予定)
- スライス型 -
[]T動的配列ビュー - String型の改善 - 標準文字列ライブラリ
- モジュールシステム - import/exportの完全実装
- マクロシステム -
#macroの実装 - エラーハンドリング - Result<T, E>の標準化
🙏 謝辞
このリリースは以下の貢献によって実現しました:
- CIインフラの整備
- クロスプラットフォーム対応
- 138個のテストケースの作成と維持
- LLVM 17互換性の確保
📝 フィードバック
バグ報告や機能リクエストはGitHubイシューまでお願いします。
Cm言語をお使いいただきありがとうございます! 🎉