[obsidian] vault backup: 2025-11-03 12:42:27[
All checks were successful
Build / build (push) Successful in 7m29s
All checks were successful
Build / build (push) Successful in 7m29s
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -44,13 +44,25 @@ Faust[@Orlarey2009]やMaxのGen、のように、サンプル単位レベルで
|
||||
|
||||
mimiumは、Rustに近いシンタックスを持った関数型の音楽信号処理をターゲットにしたプログラミング言語である[@matsuura2021]。現在の内部実行モデルとして、値呼び単純型付きラムダ計算を拡張し、最小限の内部状態を持つプリミティブ操作:ディレイとフィードバックを加えたLambda-mmm[@matsuura_lambda-mmm_2024]という計算体系を持っている。
|
||||
|
||||
mimiumはコードを専用
|
||||
mimiumはコードを専用のVMバイトコードへコンパイルし実行する。実行モデルは、一般的なレジスタマシンの命令セットに、内部状態操作用の操作が加わったものとなる。ディレイやフィードバックで用いられる内部状態は、状態ストレージという1次元の配列領域と単一の読み出し位置ポインタを組み合わせたデータ領域に保存される。
|
||||
|
||||
コンパイラは、状態ストレージの読み出し位置ポインタを相対的に前後させる命令を適切に出力することで、VM実行時にはストレージの一部分をディレイ用のリングバッファとして解釈しデータを読み書きする。
|
||||
|
||||
内部状態はDelayかMem、Feedのいずれかに還元される。
|
||||
Memは1サンプルのみのディレイであるため、最終的な計算結果としてDelayに与える遅延時間を1としたものと同一に見做せるが、実行モデル的に1サンプルのみのディレイはリングバッファの読み書きインデックスの追跡が必要ないため、区別しておく方が効率的に実行できる。
|
||||
mimiumでは高階関数などを使うことによって任意の数のフィルタバンクのような、パラメトリックなプロセッサを生成することもできるが、こうしたプロセッサは状態ストレージのレイアウトとメモリサイズを決定できない。そのため、グローバルな関数の呼び出しとクロージャ(実行時に高階関数から生成される関数)の呼び出しは区別され、クロージャのインスタンスに個別の状態ストレージを生成し、クロージャ呼び出し時に使用する状態ストレージそのものを切り替えることで対応している。
|
||||
|
||||
今回提案するライブコーディング機能は、2つの機能によって実現される。
|
||||
|
||||
1つは、状態ストレージのレイアウトをコンパイル時に可能な限り確定させるために、多段階計算という型安全なマクロの体系を言語に導入することである。
|
||||
|
||||
もう1つは、生成されたプログラム同士の状態ストレージのレイアウトを比較することで、可能な限り前の内部状態を引き継いだ新しい状態ストレージを計算する解析プログラムの導入である。
|
||||
|
||||
この2機能を組み合わせることで、mimiumは単純にソースコードを毎回最初からコンパイルし、前のプログラムとの比較を行い、新しい内部状態ストレージを含むVMを生成しインスタンスを入れ替えるることで、エディタとの連携なしにライブコーディング機能を実現する。
|
||||
|
||||
## 多段階計算
|
||||
|
||||
多段階計算は、型付きラムダ計算に対して、計算のステージを複数段階に分割する明示的なシンタックスを導入するものである。Lisp系言語のquote/splice機能[@lisp]のように、部分的に計算したコード片を埋め込むようなものを想定しているが、不正な値が埋め込まれないことを型システムとして保証することが特徴である。
|
||||
|
||||
実用的な例では、Scala 3でのマクロや、関数型組版処理エンジンSaTysFi[@suwa2024]のように、言語内DSLを型安全にライブラリとして実装することを想定しているものがある。
|
||||
|
||||
## コールツリーの解析
|
||||
|
||||
|
||||
Reference in New Issue
Block a user