リリースノート #
v2.2.2 #
Bug fix #
- 関数型の型チェックのバグを修正
- 高階関数の型推論が正しく行われない問題を修正
include
が自身のファイルを読み込もうとして無限ループが起きる問題を修正(相互依存による無限ループのチェックはできてません)include
のエラーレポートの改善
v2.2.1 #
updated examples
v2.2.0 #
Improvement #
include("file.mmm")
が${HOME}/.mimium/lib
にあるファイルを読み込めるようになりました(#109).- Exampleに"reactive.mmm"を追加
Bug fix #
- 組み込み関数ののlogの実装の修正(#107)
v2.1.1 #
Bug fix #
- 最終行にコメントをおいた場合に正しくパースできない問題の修正 (#106)
- WSL環境でMIDIが利用できない際クラッシュする問題の修正(#105)
v2.1.0 #
Improvement #
- 複数のシンタックスエラーや型エラーがある場合、これまでは初めのエラーを発見して終了していましたが、複数のエラーをまとめて報告できるようになりました。(#84).
- VMの
PopState/ShiftState
が16bitの値しか取れなかったのを、より長いディレイタイムに対応するため24bitで保持できるようにしました。(#102)
Bug fix #
- コメントパーサーのバグ修正 (#97)
- 軽微なリファクタ(#103)
v2.0.0(2024-11-01) #
V2 での変更を参照
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
}
これは以下の点で破壊的変更になります。
- v0.2 以前は
dsp
の入力パラメータがtime
であったこと (これはnow
が実装される前の一時的な解決策でした)、 - 出力型が
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)` で取得できます。