Release Notes

Update/Deprecation infos on each update

v0.4.0(2021-04-03)

言語機能

構造体型と、それに伴って型エイリアス構文が導入されました。以下のサンプルのように使えます。

type stereo = (float,float)
type composite = {signal:stereo , id:float}
fn test2(){
    ogya = composite{(100,200), 100}
    ho,fu = ogya.signal
    he = ogya.id
    println(ho)
    println(fu)
    println(he)
}
test2()

構造体型にはまだいくつか不完全な部分もあります。

  • 構造体やタプルのメンバとして関数を指定した場合は、クロージャ(引数以外の自由変数を含む関数)を代入することができません
  • hoge.a = 100のような構造体への破壊的代入構文はパーサー部分のみ実装されていますが、コード生成部分が未実装です。

バグ修正

  • CLIへ存在しないファイルの相対パスを渡した時の挙動がおかしかったのを修正しました。(#62,by @t-sin).

リファクタ

  • 再帰バリアントなど内部的に使われているヘルパーテンプレートクラスをリファクタリングしました。

v0.3.1(2021-02-25)

Bugfixes

  • if文がvoid型のブロックを持つときコード生成に失敗するバグを修正
  • ==!=演算子が実装されていなかったのを修正

Refactoring

  • Runtimeクラスから実際にJITコンパイルやGlobalコンテキストを実行する部分をExecutionEngineクラスとして切り出しました。これは後々インタプリタバックエンドを作るときや、環境変数機能を実装することを見越した変更です。

New Function

パッチリリースではあるものの、新しい関数も追加されています。

  • 1サンプルだけディレイするmem関数が追加されました。これを利用することでbiquadフィルタが現実的に実装しやすくなります。mimium-core/filter.mmmにサンプルコードを追加しました。

Other updates

全コントリビューターをall-contributorsを用いてReadme.mdに表示するようにしました。

v0.3.0 (2021-02-03)

新しい言語機能

タプルと配列型

aggregate typeとしてタプル、配列が追加されました。

タプル型は括弧とカンマで構築できるようになりました。 現在のところ、タプル型の値を取得するには、C++のstructual bindingのような方法しかありません。

# タプル構造
triples = (100,200,300)//型シグネチャは (float,float,float)

one,two,three = triples

将来的には triples.0 のようなドットアクセス演算子が追加される予定です。

配列型は角括弧とカンマで構築することができます。 現在のところ、すべての配列は mutable , fixed size で、llvm モジュールの中で private global variable として宣言されています。 ユニークな機能として、オーディオファイルの読み込みと同様に、フローティングポインタインデックスによる補間がサポートされています。

# Array Construction
myarr = [100,200,300]
internalv = myarr[0]//zero-based index
myarr[2] = 400//the array is now [100,200,400]
interp = myarr[0.5]//the result will be 150(linear interpolation)

dsp機能のマルチチャンネル対応

ステレオ出力/チャンネルをサポートしました。。

入出力の数は dsp 関数の型によって決まります。 例えば、ステレオパンナーのコード以下のように書くことができます。

fn panner(input:float,pan:float) -> (float,float){
    return (input*pan,input*(1-pan))
}

fn dsp(input:(float,float))->(float,float){
    src = random()*0.2
    res = panner(src,sin(5*now/48000)+1*0.5)
    return res
}

これは以下の点で破壊的変更になります。

  1. v0.2以前は dsp の入力パラメータが time であったこと (これは now が実装される前の一時的な解決策でした)、
  2. 出力型が float であったが、現在は dsp の型は (float のタプル)->(float のタプル) とすべきであること、つまり、モノラル処理をしたい場合でも、1つの変数を float のタプルで受け取り、float のタプルを返す関数であること、ということです。

この言語仕様に合わせて、いくつかのexampleを書き換えました。

C++ライブラリとしてのmimium

ライブラリヘッダとfrontend(アプリケーションインスタンスとCLI)の依存関係を整理しました。 C++ライブラリとしてmimiumが使えるようになりました。CMakeを使えば簡単にインポートできます。

最低限の例は https://github.com/mimium-org/mimium-libimport-example にあります。

その他の変更点

  • LLVMのサポートバージョンが11になりました。
  • Code_Of_Conduct.mdを追加しました。

v0.2.0 (2020-12-24)

改善点

  • Windowsビルド(MSYS2上)の準備ができました。ビルドしたい場合はGitHub Actionsのワークフローを確認してください。
  • プリミティブ関数delay(input,delaytime)`を追加しました。
    • 最大遅延時間は現在44100サンプルに固定されています。
  • (実験的な)シンプルなマクロプリプロセッサが追加されました。
    • グローバルコンテキストに include "otherfile.mmmと書くことで、他のソースファイルをインクルードできるようになりました。
  • 中間レベルの内部表現をリファクタリングしました。

v0.1.5 (2020-09-28)

バグを修正しました。

  • if文の中にfcallが1つしか入っていない場合のコンパイルエラーを修正した(Thanks @t-sin)。

改善点

  • GitHub Actionsで、Changelogをリリースの中に自動的にふむめるようにしました。

その他

現在、v0.2.0に含まれる予定の遅延プリミティブ関数などの新機能を開発中です。

v0.1.4 (2020-09-11)

バグを修正しました。

  • clangとlibstdc++の組み合わせでのコンパイルエラーを修正した。
  • 関数内で if を式として返すとクラッシュする問題を修正した。

改善点

  • 開発環境でのアドレスサニタイザと簡易ファジングテストを導入しました。
  • ランタイムのデストラクタ呼び出し時にユーザコードのメモリ確保が解放されるようにした。
    • 以前のバージョンでは、ユーザコードによるヒープ確保は解放されていなかったが、ランタイムのデストラクタが呼ばれるとプログラム自体が終了するので、大きな問題ではない。この改善は、同じプロセスで何度もコンパイルを繰り返すようなファジングテストでは、主に意味があります。

v0.1.3 (2020-09-09)

バグを修正しました。

  • linuxでifステートメントを使用した場合の異常なクラッシュを修正
  • 式として使用される場合のif文の演算子の優先順位を修正
// 数学演算子は if や else よりも優先度が高いです!
myvar = if(cond) 100+20 else 200*50

v0.1.2 (2020-09-07)

バグを修正しました。

  • 以前のリリースでは、if文のためのllvm生成が含まれていませんでした。if文/式が正しく動作するようになった。
  • 改行で終わるコメントアウトが正しく解析されないバグを修正した。

リファクタリング

MIR(Mid-Level Representation)関連のクラスの実装を簡素化しました。 v0.1.0でリファインされた ast クラスと同様に、データはメンバ関数を持たず、集約初期化で初期化されます。

v0.1.1 (2020-09-05)

バグを修正しました。

このリリースでは、主にパーサの修正を行いました。

括弧内のblock文の仕様はRustと同様です。

ブロック内の文の最後の行に単一の式を入れたり、return文を入れたりすると、ブロックは関数呼び出しやインフィックス操作のように、単なるとして扱うことができます。その値はブロックの値そのものになります。

したがって、以下の例はすべて有効です。

fn test(x,y){
    localvar = x*y+100
    localvar //last line is expression.
}
fn test(x,y){
    localvar = x*y+100
    return localvar //last line is return statement.
}

testvar = { velylocal = 100
            verylocal*2004} * 300 // this is also valid...

この変更により、if 文は式と文の両方を扱えるようにな離ました。then/else文の内容が戻り値を持たない場合は、void型の関数と同じように扱われます。

v0.1.0 (2020-08-21)

今回のリリースは内部処理のリファクタリングが中心で、特に AST(Abstract Syntax Tree)関連のクラスは開発初期に書かれたもので、MIRやType関連のような新しく導入されたクラスとは全く異なる実装スタイルとなっています。今回のコンパイラ開発では、クラス継承ではなく、std::variantを使った方法に動的多相性を統一しています。

今回のリリースでは、新機能の追加や変更点はありませんが、多くの不安定性、特に型推論の誤りを修正しました。

また、Ubuntu上でのビルドも準備しています。依存関係はgithub アクションワークフローページから確認できます。Windowsでテストできる方を募集しています。

v0.0.0 (2020-02-15)

最初のリリースです!配列、構造体、インクルード/モジュールはありません。これは mimium の「概念実証」バージョンです。

既知のバグ

  • self` を使用する同じ関数を2回以上呼び出すと、selfのインスタンス化が正しく行われない。(関数のエイリアスを定義することでこの挙動を回避できます)
  • 関数の中では、少なくとも1つのグローバル変数を使用しなければなりません。

制限事項

  • if は複数の文ではなく式のみを持つことができます(他の言語でいうところの条件演算子((cond)? then_expr : else_expr`)のようなものです)。
  • 配列アクセス [] は,loadwav(path)を用いて読み込んだオーディオファイルに対してのみ利用できるようにした。配列アクセスには境界チェックはありません。配列のサイズはloadwavsize(path)` で取得できます。