WebAssemblyに直接コンパイルする静的型付けプログラミング言語
MystiaはWebAssembly (WASM)にコンパイルすることに特化して設計されたモダンなプログラミング言語です。Rustの安全性とパフォーマンスを、OCamlのような関数型プログラミング言語の表現力と組み合わせています。静的型付けと型推論、メモリ安全性、JavaScript環境とのシームレスな統合を特徴としています。
- 型チェック: 型の整合性に関する問題はコンパイル時に検出され、実行時に落ちません
- 型推論: コンパイラが自動的に型を推論し、ボイラープレートコードを削減します
- メモリ安全: nullは必ず型付きで、nullチェック演算子
?
でバグを防ぎます - スコープ: ブロックに入る毎に新しいスコープが生成され、名前汚染を防ぎます
- 馴染みやすい構文: 構文はRustとOCaml, TypeScriptなどに影響を受けています
let
文: 変数や関数の定義や再代入には一貫してlet
キーワードを使用しています- マクロ: コンパイル時に型に縛られずスコープをキャプチャしたままコードを共通化できます
- 静的例外処理: 型エラーで分岐する
try-catch
で、マクロをもっと便利に汎用的に
- 高速実行: LLVMを介さず独自のバックエンドで効率的なバイトコードを生成します
- JavaScript相互運用: FFIによるJavaScriptオブジェクトとのシームレスな変換
- Web・Node.js対応: フロントエンド・バックエンド両環境のランタイムで動作します
- 仮想DOM: 仮想DOMサポート付きの組み込みUIフレームワークでWebアプリを簡単に作れます
- Rust(最新安定版)
- Node.js(v16以上)
- wasm-pack
git clone https://github.com/KajizukaTaichi/mystia.git
cargo install --path ./mystia/app
# ビルドスクリプトを実行
./build_wasm.sh
# または手動で:
cd wasm
wasm-pack build --target nodejs
wasm-pack build --target web
# Mystiaファイルをコンパイル
mystia example/fizzbuzz.ms
# 型推論サマリーを表示
mystia example/fizzbuzz.ms --summary
# Node.jsランタイムでコンパイル・実行
node run.mjs example/fizzbuzz.ms
node repl.mjs
<!DOCTYPE html>
<html>
<head>
<script type="module">
import { mystia } from './docs/runtime/web.mjs';
const code = `
load alert(_: str): void;
alert("Hello, WebAssembly!")
`;
mystia(code);
</script>
</head>
</html>
~~ 変数宣言 ~~
let message = "Hello, world!";
pub let x = 42; ~~ グローバル変数 ~~
~~ 関数定義 ~~
let add(a: int, b: int) = a + b;
~~ 条件式 ~~
let result = {
if x > 0 then "positive"
else if x == 0 then "zero"
else "negative"
};
~~ ループ ~~
let i = 0;
while i < 10 loop {
print(i: str);
let i + 1
}
~~ 基本型 ~~
let number = 42: int;
let decimal = 3.14: num;
let text = "Hello": str;
let flag = true: bool;
~~ コレクション ~~
let numbers = [1, 2, 3, 4, 5];
let person = @{ name: "Alice", age: 30 };
~~ カスタム型 ~~
type Status = ( Success | Error | Pending );
~~ マクロ定義 ~~
macro inc(n) = {
~~ 静的例外処理 ~~
try n + 1 catch n + 1.0
};
~~ 使用例 ~~
inc(5): num + inc(3.14)
~~ 外部関数のインポート ~~
load print(_: str): void;
load to_str(n: num): str;
~~ パブリック関数 ~~
pub let main() = {
print("Hello from Mystia!")
};
load to_str(n: num): str;
load print(n: str): void;
let fizzbuzz(n: int) = {
if n % 15 == 0 then "FizzBuzz"
else if n % 3 == 0 then "Fizz"
else if n % 5 == 0 then "Buzz"
else n: str
};
let i = 1;
while i <= 100 loop {
i.fizzbuzz().print();
let i + 1
}
type LinkList = @{ value: int, next: LinkList };
let car(self: LinkList) = self.value;
let cdr(self: LinkList) = self.next;
let node(value: int) = memcpy(@{ value: value, next: LinkList! });
let append(self: LinkList, other: LinkList) = {
let current = self;
while current.next? loop {
let current = current.next
};
let current.next = other;
self
};
let a = node(1);
let b = node(2).append(node(3));
b.append(a)
その他のサンプルは example/
ディレクトリにあります。
mystia/
├── core/ # 核となる言語実装
│ ├── src/
│ │ ├── lexer.rs # トークン化
│ │ ├── expr.rs # 式の解析
│ │ ├── stmt.rs # 文の解析
│ │ ├── type.rs # 型システム
│ │ └── value.rs # 値の型
│ └── Cargo.toml
├── app/ # コマンドラインインターフェース
│ ├── src/
│ │ └── main.rs
│ └── Cargo.toml
├── wasm/ # WebAssemblyバインディング
│ ├── src/
│ │ └── lib.rs
│ └── Cargo.toml
├── docs/ # ドキュメントとランタイム
│ ├── runtime/ # JavaScriptランタイム
│ └── wasm/ # 生成されたWASMバインディング
├── example/ # サンプルプログラム
└── build_wasm.sh # ビルドスクリプト
- 字句解析: ソースコードがトークンストリームにトークン化されます
- 構文解析: トークンが抽象構文木(AST)に解析されます
- 型チェック: 型推論による静的型解析
- コード生成: ASTがWebAssembly Text format(WAT)にコンパイルされます
- WebAssembly: WATがバイナリWebAssembly形式にコンパイルされます
- Node.jsランタイム: ファイルシステムアクセス付きのフル機能ランタイム
- Webランタイム: DOM統合付きのブラウザ互換ランタイム
- 標準ライブラリ: math、OS、random、datetime、time操作のための組み込みモジュール
# Rustをインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# wasm-packをインストール
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
# クローンとビルド
git clone <repository-url>
cd mystia/main
cargo build
# Rustテストを実行
cargo test
# サンプルのテスト
node run.mjs example/fizzbuzz.ms
node run.mjs example/app.ms
# Rustドキュメントを生成
cargo doc --open
# WebAssemblyバインディングをビルド
./build_wasm.sh
貢献大歓迎!以下の手順に従ってください:
- リポジトリをフォーク
- 機能ブランチを作成 (
git checkout -b feature/amazing-feature
) - 変更を実装
- 変更に対するテストを追加
- すべてのテストが通ることを確認 (
cargo test
) - 変更をコミット (
git commit -m 'Add amazing feature'
) - ブランチにプッシュ (
git push origin feature/amazing-feature
) - プルリクエストを作成
- Rustの命名規則に従う
- コードフォーマットには
rustfmt
を使用 - パブリックAPIにはドキュメントを追加
- 新機能にはテストを含める
バグの報告や機能要求にはGitHubのissueを使用してください。以下を含めてください:
- Mystiaのバージョン
- オペレーティングシステム
- 最小限の再現ケース
- 期待される動作と実際の動作
このプロジェクトはMITライセンスの下でライセンスされています - 詳細は LICENSE ファイルをご覧ください。
Mystia - WebAssembly時代のモダンプログラミング言語