ステータス: 🚧 設計・開発中
Cm(シーマイナー)は、Cb言語の設計レベルからのリニューアルプロジェクトです。
OSなどの低レイヤーなソフトウェアから、ウェブフロントエンドまでを単一の言語で記述できる、次世代のプログラミング言語を目指しています。
- ⚡ LLVMバックエンド: LLVM IRによる高速なネイティブバイナリ生成
- 🌐 対応プラットフォーム: macOS (ARM64) / Ubuntu (x86_64) / WASM / JavaScript / UEFI
- 🕸️ WebAssembly対応:
--target=wasmで直接WASMバイナリ生成 - 🎸 JavaScriptバックエンド:
--target=jsでJSコード生成、Node.jsで実行可能 - 🖥️ ベアメタル/UEFI対応:
--target=uefiでOS不要のUEFIアプリケーション生成 - 🚀 C++風構文: 馴染みやすい構文、モダンな言語機能
- ☄️ インラインユニオン型:
int | nullのように型を直接結合、null許容型を簡潔に記述 - 🎼 演算子オーバーロード:
impl T { operator ... }でカスタム演算子定義、複合代入(+=等)自動対応 - 📝 Rustスタイルフォーマット:
{}プレースホルダーによる柔軟な文字列フォーマット - 🧬 ジェネリクス: 型パラメータによる汎用プログラミング
Note: 2025年12月より、LLVMバックエンドを唯一のコード生成方式として採用しています。 以前検討されていたRust/TypeScript/C++へのトランスパイルは今後行いません。
// 関数定義(C++風:戻り値型が先)
int add(int a, int b) {
return a + b;
}
// フォーマット文字列(変数自動キャプチャ)
import std::io::println;
int main() {
int x = 10, y = 20;
println("x = {x}, y = {y}"); // 変数を自動的にキャプチャ
return 0;
}
// ジェネリクス
T identity<T>(T value) {
return value;
}
// 構造体
struct Point {
int x;
int y;
};
// インターフェースと実装
interface Printable {
void print();
};
impl Point for Printable {
void print() {
println("({self.x}, {self.y})");
}
};
// 演算子オーバーロード
impl Point {
operator Point +(Point other) {
return Point{x: self.x + other.x, y: self.y + other.y};
}
}
int main() {
Point a = Point{x: 1, y: 2};
Point b = Point{x: 3, y: 4};
Point c = a + b; // Point{4, 6}
c += Point{x: 1, y: 1}; // Point{5, 7}
return 0;
}
// スレッド
import std::thread::{spawn, join};
void* compute(void* arg) {
return 42 as void*;
}
int main() {
ulong t = spawn(compute);
int result = join(t); // 42
return 0;
}
// パターンマッチ
int getValue(Option<int> opt) {
match (opt) {
Some(v) => return v;
None => return 0;
}
}
// インラインユニオン型とnull型
typedef MaybeInt = int | null;
int main() {
// typedef経由でのユニオン型
MaybeInt x = null;
MaybeInt y = 42 as MaybeInt;
// インラインユニオン型(typedef不要)
int | null a = null;
int | string | null b = null;
return 0;
}Cm Source (.cm)
│
▼
Lexer → Parser → AST → TypeCheck → HIR → MIR
│
┌───────────┴──────────┐
▼ ▼
┌───────────┐ ┌────────────┐
│ LLVM IR │ │ JS CodeGen │
└─────┬─────┘ └─────┬──────┘
│ │
┌──────────┬────────┬───┼──────────┐ │
▼ ▼ ▼ ▼ ▼ ▼
┌─────────┐ ┌───────┐ ┌──────┐ ┌──────┐ ┌──────────┐
│ x86_64 │ │ ARM64 │ │ WASM │ │ UEFI │ │output.js │
└────┬────┘ └───┬───┘ └──┬───┘ └──┬───┘ └────┬─────┘
▼ ▼ ▼ ▼ ▼
Linux/macOS macOS Browser Firmware Node.js
Note: Rust/TypeScript/C++へのトランスパイル機能は廃止されました。 すべてのコード生成はLLVM IRまたはJS CodeGenを経由して行われます。
💡 Cb/Cmが音楽(コード名)に由来することから、「弦」をモチーフにした パッケージマネージャ・バージョン管理ツールを将来的に計画しています。 現在は未実装です。
# 実行(LLVM JITまたはインタプリタ)
cm run example.cm # プログラムを実行
cm run example.cm -d # デバッグログ付き
cm run example.cm --verbose # 詳細表示
# コンパイル(LLVMバックエンド)
cm compile example.cm # ネイティブにコンパイル
cm compile example.cm -o myprogram # 出力ファイル名指定
cm compile example.cm -O3 # 最適化レベル3
cm compile example.cm --emit=llvm-ir # LLVM IR出力
cm compile example.cm --target=wasm # WebAssembly出力
cm compile example.cm --target=js # JavaScript出力
cm compile example.cm --target=uefi # UEFIアプリケーション出力
# 構文チェック
cm check example.cm # 型チェックのみ
# ヘルプ
cm help # ヘルプ表示Note:
--emit-rust、--emit-ts、--emit-cppオプションは廃止されました。
Rustスタイルのフォーマット文字列をサポートしています:
import std::io::println;
int main() {
int n = 255;
double pi = 3.14159;
// 基本的なフォーマット
println("Value: {}", n); // Value: 255
// 基数変換
println("Hex: {:x}", n); // Hex: ff
println("Binary: {:b}", n); // Binary: 11111111
// 浮動小数点の精度
println("Pi: {:.2}", pi); // Pi: 3.14
// アライメント
println("|{:<10}|", "left"); // |left |
println("|{:>10}|", "right"); // | right|
println("|{:^10}|", "center"); // | center |
// ゼロ埋め
println("{:0>5}", 42); // 00042
return 0;
}
- C++20 (Clang 17+推奨, GCC 13+)
| OS | アーキテクチャ | ステータス |
|---|---|---|
| macOS 14+ | ARM64 (Apple Silicon) | ✅ 完全サポート |
| Ubuntu 22.04 | x86_64 | ✅ 完全サポート |
| UEFI | x86_64 | ✅ サポート(no_std) |
| Windows | - | ❌ 未サポート |
Note: macOS Intel (x86_64) でも動作する可能性がありますが、CIでの検証はARM64のみです。 UEFI対応はクロスコンパイルで実現しています(macOS/Linux上でQEMU + OVMFにて動作確認)。
GitHub Actionsで全バックエンドの自動テストを実行しています:
| OS | Arch | JIT | LLVM Native | LLVM WASM | JavaScript |
|---|---|---|---|---|---|
| macOS 14 | ARM64 | ✅ O0/O3 | ✅ O0/O3 | ✅ O0/O3 | ✅ O0/O3 |
| Ubuntu 22.04 | x86_64 | ✅ O0/O3 | ✅ O0/O3 | ✅ O0/O3 | ✅ O0/O3 |
- 単体テスト: GoogleTestによるC++単体テスト(Lexer, HIR, MIR, 最適化)
- JIT テスト: 347個のCmプログラムをJIT実行(343 PASS / 0 FAIL)
- LLVM Native テスト: ネイティブバイナリにコンパイル・実行(343 PASS / 0 FAIL)
- LLVM WASM テスト: WASMにコンパイル・Wasmtimeで実行(338 PASS / 0 FAIL)
- JS テスト: JavaScriptにコンパイル・Node.jsで実行(298 PASS / 0 FAIL)
# すべてのテスト
make test
# バックエンド別(並列実行)
make tip # JITテスト(= test-jit-parallel)
make tlp # LLVMネイティブテスト
make tlwp # LLVM WASMテスト
make tjp # JSテスト
# 最適化レベル指定
make tjitp0 # JIT O0 parallel
make tjitp3 # JIT O3 parallel
# 個別カテゴリ
./tests/unified_test_runner.sh -b jit -c basic
./tests/unified_test_runner.sh -b llvm -c generics- テストガイド - テストの作成と実行方法
- テスト クイックリファレンス - よく使うテストコマンド集
- 設計ドキュメント - 未実装機能の設計書
- アーキテクチャ - システム設計
- HIR設計
- バックエンド
- LLVMバックエンド実装
- LLVMランタイムライブラリ
- LLVM最適化パイプライン
- フォーマット文字列
- FFI設計
- パッケージマネージャ
- UEFIベアメタル開発 - UEFI Hello World チュートリアル
- プロジェクト状況
- Cb言語 - 本プロジェクトの前身
検討中
© 2025-2026 Cm言語プロジェクト
最終更新: 2026-02-15