リリースノート#
v4.0.0(V4 での変更)#
破壊的変更#
Slider!はControl!に置き換わりました。Control!はジェネリック関数です。初期値にレコード型やタプル型を渡すと、複数のスライダーが表示されます。最小値・最大値は自動推論されます。Probe!もジェネリック関数になりました。length_arrayはlenに置き換わりました。Sampler_monoの返り値は`{player:(float)->float,length:float}になりました。
新機能 / 改善#
- モジュール記法を導入し、標準ライブラリをそれに合わせて書き換えました(#180)。
includeは引き続き利用できますが、今後は推奨されません。 - WASM バックエンドと動的プラグインローディングを導入しました(#185)。
--backend=vmオプションで従来の native VM バックエンドに切り替えられます。 - ジェネリクス(パラメトリック多相)を導入しました(#188)。
- タプル間の基本演算と自動展開を導入しました(#187)。
- バリアント型(ADT)と型エイリアスを導入しました(#183, #184)。
- GUI スライダーに OSC 制御サポートを追加しました(#189)。
- Language Server に Signature Help と Completion Provider を追加しました(#190)。
- パーサコンビネータを使った mini-notation サブセットのインタプリタを含む pattern ライブラリを追加しました。
- WASM バックエンドのホットスワップを改善し、グローバルコンテキスト評価がオーディオをブロックしないようにしました。
- マクロ実行を VM 上で行うことで性能を改善しました。
バグ修正#
- Windows でライブコーディング時のファイル変更イベント監視が正しく動かない問題を修正しました。
- ディレイタイム変調時のグリッチノイズを修正しました。
v3.2.0#
3.2.0 では言語機能に大きな追加が入りました。
追加機能#
- バリアント宣言と型エイリアスを含む Abstract Data Type を導入しました。
match式によるパターンマッチ分解にも対応し、List や Tree のような再帰データ構造も扱えます。(#183, #184) - Module Semantics を導入しました。Rust に近いモジュール機構で、関数・型の名前空間を export/import できます。(#180)
これらに伴い、特にガベージコレクション周りで VM 設計と実装の再構成も行われています。
改善#
- パーサコンポーネントのリファクタにより、Language Server の semantic highlighting が安定して動作するようになりました。コードフォーマットも利用可能になり、コメントなどの trivia を落とさず整形できるようになりました(不安定なケースは一部あり)。(#179, #181)
v3.1.2#
バグ修正#
- コピー用パッチが正しく適用されない問題を修正しました。(#177)
v3.1.1#
バグ修正#
- 関数の追加・削除時に
dsp関数の参照インデックスが不正になり、ライブコーディングでクラッシュする問題を修正しました。(#176 by @karnpapon) - システムプラグインのスレッド安全性と live state update の安定性を改善しました。(#173, #175)
v3.1.0#
バグ修正#
- 乗算系演算子の優先順位と結合規則の不具合を修正しました。(#172 by @karnpapon)
- then 式が MIR 生成時に正しい state size を生成せずクラッシュする問題を修正しました。(#171)
追加機能#
- 将来のライブラリ実装向けに、
split_tailやlift_arrayfなど配列向けのプリミティブ演算を追加しました(experimental)。(#168, #169)
v3.0.1#
バグ修正#
- 0-input デバイス利用時にクラッシュする問題を修正しました。(#167 by @karnpapon)
v3.0.0(V3 での変更)#
追加機能#
- ライブステート更新(Live State Updating)を追加し、実行中ファイルを上書き保存したときに音を止めず再生成できるようにしました。(#159)
- グローバルステージ宣言構文
#stage(main) / #stage(macro)を追加しました。(#154) - ステージ0評価での破壊的代入を許可し、標準ライブラリ関数
unoiseをこの方式で実装しました。(#162) - レコード更新構文
{rec_var <- field1 = 100, field2 = 200}を追加しました。(#158)
破壊的変更#
gen_sampler_monoはSampler_mono!("file_path")マクロに置き換わりました。(#161)make_probeはProbe("name")マクロに置き換わりました。(#156)
v2.4.2#
- Language Server がクラッシュする問題を修正しました。
v2.4.1#
- マルチステージ計算に基づく hygiene macro 機能を追加しました(experimental)。(#136)
- レコード型と parameter-packing 機能を追加しました(experimental)。(#128, #134, #130)
- Language Server の基本サポートを追加しました。(#151)
- シンプルなスライダー UI を追加しました。(#147)
- (開発者向け)多数のクレートを整理するためディレクトリ構造を大きく変更しました。
v2.3.1#
(2.3.0 は release workflow の都合でスキップされています)
追加機能#
- Array の基本実装を追加しました。(#124)
cargo-distを Astral フォーク版へ切り替えました。(#125 by @yutannihilation)- 最小 Rust edition 要件が 2024 になりました(
coreaudio-sysの制約による)。
その他#
- CI キャッシュを改善しました。(#120 by @yutannihilation)
- LLM を使った開発実験として
.clinerulesと.cline/を追加し、関連ドキュメントコメントを整備しました。(#119)
v2.2.7#
バグ修正#
selfを使う関数の初期返り値を制御するオプションを追加し、デフォルト挙動を更新しました。(#118)- 1行コメントの字句解析が改行を誤って消費してパースエラーになる問題を修正しました。(#119)
その他#
- GitHub Actions のリリースワークフローを手動トリガできるようにしました。
v2.2.6#
バグ修正#
- ローカル変数探索順が不正になる問題を修正しました。(#116)
- 波括弧ブロックがローカルスコープを作るよう型チェッカを修正しました。(#117)
その他#
- Node.js をファイルシステムホストとして、wasm ビルドでも統合テストを実行するようになりました。
v2.2.5#
バグ修正#
このリリースは Web プラットフォームで入ったいくつかの退行を修正しています。
- オーディオドライバのクラッシュを修正。
- ネイティブ環境で file loader が動かない問題を修正。
v2.2.4#
新機能#
- WASM ビルドの基本設定を完了しました。(#112)WebAudio 向けエントリポイントは mimium-webaudio です。エディタ WebComponent は mimium-web-component で動作し、利用例もそちらにあります。
バグ修正#
let宣言における型推論バグを修正しました。(#114)
v2.2.3#
ライブラリ更新#
- ping-pong delay を含む
delay.mmmを追加。 - freeverb を含む
reverb.mmmを追加。
バグ修正#
- パースエラー表示のフォーマット不具合を修正。
core.mmm実装の不具合を修正。
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*50v0.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)` で取得できます。