Skip to content

shadowlink0122/Cm

Repository files navigation

Cm (シーマイナー) プログラミング言語

ステータス: 🚧 設計・開発中

概要

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を経由して行われます。

エコシステム: gen (弦) — 将来構想

💡 Cb/Cmが音楽(コード名)に由来することから、「弦」をモチーフにした パッケージマネージャ・バージョン管理ツールを将来的に計画しています。 現在は未実装です。

CLI使用方法

# 実行(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にて動作確認)。

CI/CD テストマトリクス

GitHub Actionsで全バックエンドの自動テストを実行しています:

テスト構成 (2 OS × 4 Backends × O0/O3 = 16 configurations)

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

ドキュメント

開発者向け

関連プロジェクト

  • Cb言語 - 本プロジェクトの前身

ライセンス

検討中


© 2025-2026 Cm言語プロジェクト

最終更新: 2026-02-15

About

No description, website, or topics provided.

Resources

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •