いくつかの背景
私は、デジタル メディア プログラミング用のプログラミング言語の構築に取り組んでいます。これは、非共有メッセージ パッシングとソフト リアルタイムを使用して同時実行をサポートする必要があります (つまり、サンプルやフレームを失うことなく、一定のスループットでオーディオ/ビデオを計算するために最善を尽くします)。 .
これらの機能を組み合わせるのは驚くほど難しいことがわかりました。これは主に、リアルタイム コードが動的にメモリを割り当ててはならないという 1 つの特定の制約が原因です。
私の言語は、次のようなものを簡単に実装できるようにする必要があります。
- 1 つのスレッドは、パラメーターに基づいてオーディオ サンプルを計算します。これらは、たとえば、シンセサイザーのさまざまなコントロールの値である可能性があります。このスレッドは「リアルタイム」で実行されます。
- 1 つのスレッドが、ユーザーまたは別のコンピューターから入力を受け取り、これらの値を変更します。これは、たとえば、ユーザーがマウスでノブを回したことに反応する GUI スレッドである可能性があります。
ユーザーが設定した新しい値を、キューを介してシンセサイザー エンジンに送信したいと考えています。フロートやその他の原子値のみを送信したい場合、問題は面白くありません。実際には、複雑なオブジェクトやデータ構造であっても、あらゆる種類のデータをあるスレッドから別のスレッドに流すことができるようにしたいと考えています。これは、スレッドと優先順位のあらゆる構成で可能になるはずです。リアルタイム側での動的メモリ割り当てがなければ、プログラマーに恣意的な制限のように見えるものを課すことなく、これは非常に困難になります。
Erlang は、リアルタイム システムに適していると宣伝されることがよくあります。私の理解では、Erlang は決してメモリ割り当てを禁止しません。私が同じことをしたら、それらの割り当てを実行するコードに非決定論的なタイミングが導入されるという犠牲を払って、多くの問題が解消されます。
質問
では、Erlang がこれほど適している理由は何でしょうか? メモリ割り当てによって引き起こされる問題を回避するための特別なトリックを実装していますか、それとも問題を完全に無視していますか? リアルタイムへの別のアプローチはありますか?
質問を説明する例
Erlang で 50 ミリ秒ごとに 64 のサンプルを生成する必要があるシンセサイザーを作成していると仮定しましょう。また、文字列上でスライダーを動かしたときに、小さなオブジェクト (パラメーターの名前と新しい値を含むリストまたはタプルとしましょう) を GUI プロセスからオーディオ プロセスに送信する必要があるとします。コピーが作成されます。これには、動的メモリ割り当てが必要です。この割り当てが音声計算を遅らせないようにするために、Erlang はどのように役立ちますか?