読者です 読者をやめる 読者になる 読者になる

yutopp's blog

サンドバッグになりたい

文鳥言語にプルリクください - Aizu Advent Calendar 2014(1日目)

おはようございます.Aizu Advent Calendar 2014一日目の@yutoppです.
現段階で9人枠が余ってるので各位頼む頼む頼む!!!!

さて今年は,Rill(a.k.a. 文鳥言語)についてポエムを書きます.
この記事の要約をすると,"pullreqください" になります.

Rill

Rillは趣味で作っているプログラミング言語です.

yutopp/rill

自分はC++をよく使うのですけど,構文に対して「こう書けたら良いのになあ」と思うことが多く,その感情を解決してみたかったということと,型理論LLVMの勉強したさで実装を始めたのがこの処理系です.ア,C++は大好きですよ.
意味が直感的で落とし穴が少なく,ライブラリが作りやすい言語が目標です.[要出典]
C++Ruby,Go,D,Scalaを主に参考にしています.
静的型付けです.また,この処理系が仕様です.

あれこれ

  • 仮引数は,デフォルトでconst参照.
  • 値と参照の扱いはC++に似ている.コピーとムーブがある.参照自体の値が欲しければポインタを使う.
  • 型に生存期間の情報を付けて,リソースを適切に扱えるようにする.
  • GCやスレッドサポートも入れたいところ.もちろんオプションで切り離し出来るようにする.
  • コンパイル時処理はD以上に充実させたい.ライブラリを作りやすくするにはメタプログラミングの手厚いサポートが必要だという考えから. 現状の処理系でも,意味解析中にLLVM IRを生成し,IRをJITコンパイルして呼び出すような実装になっているので,Rillの言語機能の全体に近いサブセットをコンパイル時にも実行できるようになっているはず.既にintなどの型情報はコンパイル時はtype型の値として扱われていて,例えば,const(int)はただの関数呼び出しであり,コンパイル時にコンパイラ内部のconstという関数intの型を表す整数値を渡して呼び出すLLVM IRを生成してJITコンパイル,実行され,const属性が付加されたint型を表す整数値を生成する.今のところ上手くいっているけれど,コードが大きくなると重たそうでア!
  • それでいてC++並の自由さが欲しい.
  • "C++の設計と進化"は最高.

つまり?

つまりRillは,文鳥が,小さいライブラリとランタイムを組み合わせて自由に楽しくコードを書けるプログラミング言語(になる|という)わけです.

ちなみに,「Rustと被ってない?」「劣化C++」「劣化D言語」「劣化Embedded C++」などというコメントは大歓迎です.

部分的に実装されている機能

サンプルコード

def main(): int {
    val i = "i";
    ref calendar = "Calendar";
    (Aizu() + i).f("u").advent(calendar)();
    return 0;
}

class Aizu {
    def ctor() {
        p( "A" );
    }

    def op +(v: ptr!int8) {
        p(v);
        return u("z");
    }
}

class u {
    def ctor(v: ptr!int8) {
        this.f(v);
    }

    def f(v: ptr!int8): ref(u) {
        p(v);
        return this;
    }
}

template(T: type)
def advent(_: u, c: T) {
    p("Advent");
    return \() => p(c);
}

これをコンパイルして実行すると

bytes => A
bytes => i
bytes => z
bytes => u
bytes => Advent
bytes => Calendar

と出力されます.(bytes =>はランタイムのデバッグログ)

pは標準ライブラリに含まれる関数です.ptrint8typeも標準ライブラリで定義されるクラスです.(標準ライブラリ)
このサンプルではテンプレートや演算子オーバーロード,UFCS,ラムダ式を使ってみました.

その他のサンプルはここにあります!

おわり

プログラミング言語を作るのは楽しすぎてつらいですよね.
Rillは全体的に構文や意味付けも未完成ですので,issueやpullreqメッチャください.一緒に文鳥言語を作りませんか?とてもアットホームな鳥小屋です.

次は〜

(◔⊖◔)つ @youxkei