From e9ab2e8cfaafd4405f6212028b79be52f7daeb0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Thu, 28 Nov 2024 10:23:26 +0000 Subject: [PATCH] finished basic writing --- README.md | 5 + src/comparison.tex | 11 + src/fbdelay_spos.pdf | Bin 0 -> 14706 bytes src/instructions.tex | 42 ++++ src/lambdammm_vm_structure.pdf | Bin 0 -> 20892 bytes src/main.tex | 382 ++++++++++++++++++++++++++++++++- src/ref_bibtex.bib | 24 ++- src/syntax.tex | 1 + 8 files changed, 450 insertions(+), 15 deletions(-) create mode 100644 README.md create mode 100644 src/comparison.tex create mode 100644 src/fbdelay_spos.pdf create mode 100644 src/instructions.tex create mode 100644 src/lambdammm_vm_structure.pdf diff --git a/README.md b/README.md new file mode 100644 index 0000000..479b4ae --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# プログラミング・シンポジウム2024 予稿 + +## 開発メモ + +.bibのdoiにアンダーバーが入ってるとエラーになるので、Zoteroからインポートしたら手動で修正 \ No newline at end of file diff --git a/src/comparison.tex b/src/comparison.tex new file mode 100644 index 0000000..df7e2e3 --- /dev/null +++ b/src/comparison.tex @@ -0,0 +1,11 @@ +\begin{table*}[ht] +\centering +\begin{tabular}{c|c|c}\hline + \ & パラメトリックな信号処理グラフの生成 & 実際の信号処理 \\\hline + Faust & 項書き換え系マクロ & ブロックダイアグラム代数 \\ + Kronos & 型レベルの計算 & 値の計算 \\ + mimium & グローバル環境の評価 & \texttt{dsp}関数の評価 \\\hline +\end{tabular} +\\ +\caption{\label{tab:comparison}{\it Faust、Kronos、mimiumにおけるパラメトリックな信号処理グラフと実際の信号処理で使われる意味論の違いを示した表。}} +\end{table*} \ No newline at end of file diff --git a/src/fbdelay_spos.pdf b/src/fbdelay_spos.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e7578e26f6a35f054886397a2a75c0d3e161c302 GIT binary patch literal 14706 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 YNh~U(float,float)->float){ + if (n>0){ + let filter = filter_factory() + let next = filterbank(n-1,filter_factory) + |x,freq| filter(x,freq+n*100) + + next(x,freq) + }else{ + |x,freq| 0 + } +} +let myfilter = filterbank(3,| | bandpass) +fn dsp(){ + myfilter(x,1000) +} +\end{verbatim} +\caption{\label{fig:filterbank_good}{再帰関数とクロージャを使ってパラメトリックにフィルターを複製するコードの例。}} +\end{figure} + + +さらに別の例として図\ref{fig:filterbank_good}に高階関数\texttt{filterbank}を使うものを示す。この関数は、別の関数\texttt{filter}(これは入力と周波数を引数として受け取る)を引数として受け取り、\texttt{filter}のインスタンスを\texttt{n}個複製し、それらを足し合わせるものである\footnote{以前のmimiumの仕様\cite{Matsuura2021}では、変数束縛と破壊的代入の構文は同じ(\texttt{x = a})だった。しかし、新しいバージョンの構文では、変数の束縛に\texttt{let}キーワードを使用している。}。 + +以前のmimiumのコンパイラは、内部状態のツリー全体をコンパイル時に静的に決定する必要があったため、このような内部状態を引数に取る関数をコンパイルすることができなかった。しかし、$\lambda_{mmm}$ のVMではこれを動的に解決することができる。図\ref{fig:bytecode_filterbank}に、このコードをVM命令にコンパイルした例を示す。\texttt{filterbank}の1行目の再帰呼び出しや、引数として渡された関数や(\texttt{filter}のように)upvalueとして取得した関数の呼び出しは、\texttt{CALL}命令ではなく\texttt{CALLCLS}命令を使って実行される。ここで、\texttt{GETSTATE}命令や \texttt{SETSTATE} 命令はこの関数では使用されない。これは、\texttt{CALLCLS} 命令が実行される際に、使用する内部状態記憶領域が動的に切り替わるためである。 + +\begin{figure}[ht] +\centering +\begin{verbatim} +CONSTANTS[100,1,0,2] +fn inner_then(x,freq) + //upvalue:[local(4),local(3), + // local(2),local(1)] + GETUPVALUE 3 2 //load filter + MOVE 4 0 + MOVE 5 1 + GETUPVALUE 6 1 //load n + ADDD 5 5 6 + MOVECONST 6 0 + MULF 5 5 6 + CALLCLS 3 2 1 //call filter + GETUPVALUE 4 4 //load next + MOVE 5 0 + MOVE 6 1 + CALLCLS 4 2 1 //call next + ADDF 3 3 4 + RETURN 3 1 + +fn inner_else(x,freq) + MOVECONST 2 2 //load 0 + RETURN 2 1 + +fn filterbank(n,filter_factory) + MOVE 2 0 //load n + MOVECONST 3 2 //load 0 + SUBF 2 2 3 + JMPIFNEG 2 12 + MOVE 2 1 //load filter_factory + CALL 2 2 0 //get filter + MOVECONST 3 1 //load itself + MOVE 4 0 //load n + MOVECONST 5 1 //load 1 + SUBF 4 4 5 + MOVECONST 5 2 //load inner_then + CALLCLS 3 2 1 //recursive call + MOVECONST 4 2 //load inner_then + CLOSURE 4 4 //load inner_lambda + JMP 2 + MOVECONST 4 3 //load inner_else + CLOSURE 4 4 + CLOSE 4 + RETURN 4 1 +\end{verbatim} +\caption{\label{fig:bytecode_filterbank}{図\ref{fig:filterbank_good}のフィルタバンクの例をVM命令列にコンパイルした例。}} +\end{figure} + +\section{議論} +\label{sec:discussion} + +\input{comparison.tex} + +\texttt{filterbank}の例で示したように、mimiumではグローバル環境の評価においてフィルタの複製などのパラメトリックな信号処理内容を高階関数として計算し、\texttt{dsp}の中で生成された関数を利用して実際の信号処理を評価している。 + +表\ref{tab:comparison}で示すように、Faustでは項書き換えマクロを、Kronosでは型レベルの計算を用いるように、既存の言語ではパラメトリックな信号処理内容の生成とその実行に異なる意味論を持つ体系を混在させているのに対して、mimiumではグローバル環境と実際の信号処理の実行に同じ値レベルの意味論を用いている。 + +この単一の意味論による体系の利点としては、初心者が言語の体系の理解を簡単にする、また他の汎用言語との実行時の相互運用性を高められる、といったことが考えられる。一方で、意味論が統一されていることによって、 $\lambda_{mmm}$ は普通のラムダ計算で期待される振る舞いから逸脱した挙動を見せる問題がある。 + +\subsection{Let束縛の位置の違いによる挙動の変化} +\label{sec:letbinding} + +\begin{figure}[ht] +\centering +\begin{verbatim} +fn filterbank(n,filter){ + if (n>0){ + |x,freq| filter(x,freq+n*100) + + filterbank(n-1,filter)(x,freq) + }else{ + |x,freq| 0 + } +} +fn dsp(){ + filterbank(3,bandpass)(x,1000) +} +\end{verbatim} +\caption{\label{fig:filterbank_bad}{図\ref{fig:filterbank_good}におけるパラメトリックなフィルター複製のコードの間違った例。}} +\end{figure} + +mimiumでは時間の経過とともに変化する内部状態を持つ関数を使用することで、一般的な関数型プログラミング言語と比較して、高階関数を使用した場合に直感に反する振る舞いを引き起こす。 + +図\ref{fig:filterbank_bad}に、図\ref{fig:filterbank_good}のフィルタバンクのコード例を少しだけ変更して、間違った処理の例を示す。図\ref{fig:filterbank_bad}と図\ref{fig:filterbank_good}の主な違いは、\texttt{filterbank}関数内の再帰呼び出しを直接書いているか、内部関数の外側で\texttt{let}式で束縛しているかである。同様に、\texttt{dsp}関数(mimiumのオーディオドライバから呼び出される)でも、\texttt{filterbank}関数が\texttt{dsp}内で評価されるか、グローバル環境でで一度だけ\texttt{let}で束縛されているかという違いがある。 + +典型的な関数型プログラミング言語では、関数の破壊的代入を伴わない限り、図\ref{fig:filterbank_good}から図\ref{fig:filterbank_bad}への変換に見られるように、\texttt{let}で束縛された変数をその項にで置き換えた(ベータ簡約)としても、計算処理の内容は変化しない。 + +しかしmimiumでは、評価の段階が グローバル環境の評価(信号処理グラフの具体化)および \texttt{dsp} 関数の繰り返しの実行(内部状態の暗黙の更新を伴う実際の信号処理)の2つに分かれている。 + +例に挙げたmimiumのコードには破壊的な代入は含まれていないが、図\ref{fig:filterbank_good}では、グローバル環境の評価中に\texttt{filterbank}関数の再帰的な実行が1回だけ発生する。逆に、コード\ref{fig:filterbank_bad}では、\texttt{dsp}関数が毎サンプル実行されるたびに再帰的な関数が実行され、クロージャが生成される。クロージャの内部状態はクロージャのアロケーション時に初期化されるため、図\ref{fig:filterbank_bad}の例では、\texttt{filterbank}が評価された後クロージャの内部状態は毎時刻リセットされてしまうことになる。 + + +この問題に対処する方法として、グローバル環境評価(ステージ0)と実際の信号処理(ステージ1)のどちらで項を使うべきかを示す区別を型システムに導入することが考えられる。これは多段階計算\cite{Taha1997}を用いて実現できる。コード\ref{fig:filterbank_multi}は、BER MetaOCamlの構文を使った\texttt{filterbank}のコード例である。\verb|..|は次のステージで使われるプログラムを生成し、\verb|~term|は前のステージで評価された項を埋め込むことを意味する\cite{kiselyov2014}。\texttt{filterbank}関数はステージ0で評価され、\texttt{dsp}関数の中で\verb|~|で評価結果を埋め込んでいる。FaustやKronosとは対照的に、この多段階計算の記述は信号処理グラフの生成と信号処理の実行の両方で統一された意味論を保持している。 + +\begin{figure}[ht] +\centering +\begin{verbatim} +fn filterbank(n,filter: + &(float,float)->float)-> + &(float,float)->float{ + .< if (n>0){ + |x,freq| ~filter(x,freq+n*100) + + ~filterbank(n-1,filter)(x,freq) + }else{ + |x,freq| 0 + } >. +} +fn dsp(){ + ~filterbank(3,..)(x,1000) +} +\end{verbatim} +\caption{\label{fig:filterbank_multi}{mimiumの将来的な仕様における、多段階計算を使用した\texttt{filterbank}関数の例。}} +\end{figure} + +\subsection{外部言語で定義される状態付き関数呼び出しの可能性} +\label{sec:ffi} + +クロージャのデータは、図\ref{fig:vmstructure}で示したように、関数と内部状態の組み合わせで表現されている。\verb|filterbank|の例で内部状態に対して特別な操作を必要としていないということは、mimiumからCやC++で書かれた発振器やフィルターなどのUGenを、通常のクロージャと同じように呼び出すことができることを意味する。さらに、外部UGenをパラメトリックに複製・合成することも可能になる。この機能はFaustや類似の言語では実装が難しいが、 $\lambda_{mmm}$ の設計では簡単に実現できる。 + +ただし、現在mimiumはサンプル単位の処理を基本にしており、バッファ単位の信号を扱うことができない。ほとんどのネイティブに実装されたUGenはバッファ単位でデータを処理するため、今のところ、既存の外部UGenが使用可能な実用的ケースは多くない。しかしその上で、厳密にサンプル単位の処理を必要とするのは$feed$ の項のみであるため、一度に1サンプルしか処理できない関数と、一括して複数サンプルを処理する関数とを型レベルで区別することは可能なはずである。Faustでマルチレートの仕様が検討されているように、バッファ単位で処理できる部分をコンパイラが自動的に判断することで、外部ユニットジェネレータ間とバッファ単位での連携も可能かもしれない。 + +\section{結論} +\label{sec:conclusion} + +本稿では、音楽・信号処理用プログラミング言語の中間表現 $\lambda_{mmm}$ と、それを実行するための仮想マシン・命令セットを提案した。 $\lambda_{mmm}$ は、信号処理グラフの生成と、その実際の処理を統一された構文と意味論で記述可能にする。ただし、関数がグローバル環境で評価されるかDSPの繰り返し実行で評価されるかの判別はユーザーの責任となり、初学者にはその区別が難しいという欠点がある。 + +また本論文では、VMの動作を記述する擬似コードとに加えて、mimiumでのコードの例とそれに対応するバイトコードの例を示すことでコンパイル過程を説明したのみである。より正式な意味論と詳細なコンパイル過程の提示は、今後多段階計算の導入も踏まえ検討する必要がある。 + +この研究が、デジタル/コンピュータ上での音・音楽のより一般的な表現に貢献し、音楽のための言語理論とプログラミング言語理論のより広範な分野との間のより深いつながりを促進することを期待する。 -本テンプレートに関する質問・バグ報告は, -第56回プログラミングシンポジウム予稿集担当(松崎公紀)\verb|matsuzaki.kiminori@kochi-tech.ac.jp| -まで連絡下さい. \begin{acknowledgment} mimiumの開発は、2019年度未踏IT人材発掘・育成事業の支援の元開発された。また本研究は、日本学術振興会科研費若手研究「音楽と工学の相互批評的実践としての「音楽土木工学」の研究 」(23K12059)の助成を受けている.ここに感謝の意を表する。 diff --git a/src/ref_bibtex.bib b/src/ref_bibtex.bib index 5d2745e..e98f419 100644 --- a/src/ref_bibtex.bib +++ b/src/ref_bibtex.bib @@ -93,7 +93,7 @@ } @inproceedings{kiselyov2014, - title = {The {{Design}} and {{Implementation}} of {{BER~MetaOCaml}}}, + title = {The {{Design}} and {{Implementation}} of {{BER MetaOCaml}}}, booktitle = {Functional and {{Logic Programming}}}, author = {Kiselyov, Oleg}, editor = {Codish, Michael and Sumii, Eijiro}, @@ -101,8 +101,7 @@ pages = {86--102}, publisher = {Springer International Publishing}, address = {Cham}, - doi = {10.1007/978-3-319-07151-0_6}, - abstract = {MetaOCaml is a superset of OCaml extending it with the data type for program code and operations for constructing and executing such typed code values. It has been used for compiling domain-specific languages and automating tedious and error-prone specializations of high-performance computational kernels. By statically ensuring that the generated code compiles and letting us quickly run it, MetaOCaml makes writing generators less daunting and more productive.}, + doi = {10.1007/978-3-319-07151-0\_6}, isbn = {978-3-319-07151-0}, language = {en} } @@ -220,7 +219,7 @@ volume = {39}, number = {4}, pages = {30--48}, - doi = {10.1162/COMJ_a_00330}, + doi = {10.1162/COMJ\_a\_00330}, abstract = {Kronos is a signal-processing programming language based on the principles of semifunctional reactive systems. It is aimed at efficient signal processing at the elementary level, and built to scale towards higher-level tasks by utilizing the powerful programming paradigms of "metaprogramming" and reactive multirate systems. The Kronos language features expressive source code as well as a streamlined, efficient runtime. The programming model presented is adaptable for both sample-stream and event processing, offering a cleanly functional programming paradigm for a wide range of musical signal-processing problems, exemplified herein by a selection and discussion of code examples.}, file = {/Users/tomoya/Zotero/storage/THAKVEM6/m-api-574ff3be-cfe2-7867-406a-df50770bf1cb.pdf} } @@ -295,3 +294,20 @@ urldate = {2024-11-27}, howpublished = {http://modlfo.github.io/vult/} } + +@article{Taha1997, + title = {Multi-{{Stage Programming}} with {{Explicit Annotations}}}, + author = {Taha, Walid and Sheard, Tim}, + year = {1997}, + month = dec, + journal = {SIGPLAN Notices (ACM Special Interest Group on Programming Languages)}, + volume = {32}, + number = {12}, + pages = {203--214}, + publisher = {Association for Computing Machinery (ACM)}, + issn = {03621340}, + doi = {10.1145/258994.259019}, + urldate = {2021-05-12}, + abstract = {We introduce MetaML, a statically-typed multi-stage programming language extending Nielson and Nielson's two stage notation to an arbitrary number of stages. MetaML extends previous work by introducing four distinct staging annotations which generalize those published previously [25, 12, 7, 6] We give a static semantics in which type checking is done once and for all before the first stage, and a dynamic semantics which introduces a new concept of cross-stage persistence, which requires that variables available in any stage are also available in all future stages. We illustrate that staging is a manual form of binding time analysis. We explain why, even in the presence of automatic binding time analysis, explicit annotations are useful, especially for programs with more than two stages. A thesis of this paper is that multi-stage languages are useful as programming languages in their own right, and should support features that make it possible for programmers to write staged computations without significantly changing their normal programming style. To illustrate this we provide a simple three stage example, and an extended two-stage example elaborating a number of practical issues.}, + file = {/Users/tomoya/Zotero/storage/KFYY25CM/Taha, Sheard - 1997 - Multi-Stage Programming with Explicit Annotations.pdf;/Users/tomoya/Zotero/storage/X3DDM6HN/full-text.pdf} +} diff --git a/src/syntax.tex b/src/syntax.tex index 71f2aba..171e9e3 100644 --- a/src/syntax.tex +++ b/src/syntax.tex @@ -39,6 +39,7 @@ &e&::=& \; x \;\; (x \in {v_p}) & [value] &\\ & & |& \; \lambda x.e & [lambda] &\\ & & |& \; e_1 \; e_2 & [app] &\\ +& & |& \; let\; x = e_1\; in\; e_2 & [let] &\\ & & |& \; if\; (e_c)\; e_t\; else\; e_e & [if] &\\ & & |& \; delay\; n \; e_1 \; e_2 \;\; (n \in \mathbb{N})& [delay] &\\ & & |& \; feed \; x.e & [feed] &\\