web-dev-qa-db-ja.com

単純な言語で書かれた分散アルゴリズムのシミュレーターを作成する方法

言語Cで分散アルゴリズムのシミュレーション用シミュレータの開発を始めました。私の仕事は、アルゴリズム記述のための単純な言語シミュレーターを作成することで構成されています。これは、記述されたアルゴリズムを取得してシミュレートします。

最初に、分散環境を表現する方法を決定しました。このシミュレーターは単一のマシンで実行されるため、分散環境を作成し、提供されたアルゴリズムに従っていくつかのタスクを実行するエンティティを何らかの方法でシミュレートする必要がありました。すべてのエンティティはEntityと呼ばれるデータ構造として表されます。このデータ構造には、エンティティの状態、エンティティのローカルレジスタなど、エンティティに関連するすべてのデータが含まれます。

トポロジと接続を表すために、Cのグラフ用のライブラリを使用して、トポロジを頂点エッジのセットとして表します。この頂点とエッジは確かにEntityの一部であるため、たとえばデータを送信しているときに、隣接する頂点にアクセスできます。

次のステップは、ユーザーがアルゴリズムを簡単に記述してシミュレートできるように、単純な言語を作成することでした。

ここでは、わかりやすくするために、アルゴリズムフラッディングの例を示します。

STATUS = INITIATOR, IDLE, DONE;
INIT = INITIATOR, IDLE;
TERM = DONE;
REGISTERS = ;

INITIATOR
  RANDOM
    begin
      SEND(x, NEIGHBORS);
      BECAME(DONE);
    end

IDLE
  RECEIVE(x)
    begin
      SEND(x, NEIGHBORS - SENDER)
      BECAME(DONE);
    end

この段階で私はこの言語の仕様に取り組んでいて、行き詰まりました。この言語を正しく指定する方法がわかりません。それは単純なはずですが、たとえば、別のエンティティにメッセージを送信するためのコマンドを実装する場合、ターゲットはさまざまであると考える必要があります。ターゲットは、送信者を除くすべてのネイバーまたはすべてのネイバー、あるいは送信者のみ、または開発の後半である可能性があり、環境内のすべてのエンティティから特定のターゲットを宣言できる必要があります。

この時点で、私は2つのオプションを念頭に置いています。

1つ目は、FlexおよびBisonを使用して入力を分析および解析することです。次に、必要なすべてのデータを収集してスレッドを実行し、アルゴリズムを使用して入力ファイルで可能なすべての動作に従って動作させます。

2番目のオプションはFlexおよびBisonを使用せず、すべてのコマンドをCマクロとして実装することです。ユーザーはこのマクロを使用してアルゴリズムで入力ファイルを書き込み、このファイルはgcc compilerでシミュレーターにリンクされるため、ユーザーがマクロを間違って使用すると、コンパイラーがエラーをスローします。

誰かが似たようなものを開発していたのか、それともどのようなアプローチやテクニックが存在するのかを尋ねたいと思います。私はそれをCで実装したいのですが、この種のことには他の言語の方が良いかもしれません。

3
M.Puk

このような複雑なタスクに、可能な限り最低レベルの言語Cを使用するのはなぜですか?または、むしろいくつかタスク?

迅速かつ簡単に結果が必要な場合は、ErlangやElixirなどの専用ツールを使用して分散システムを実行します。利点:これらは実際の分散システムで使用され、単一のボックスでも非常に多くの並列処理を可能にし、実際に何が起こっているかを監視するためのトレース/診断/イントロスペクションツールを備えています。

入力言語の要素に多かれ少なかれ単純にマッピングするErlang関数を記述します。パーサーがなくても、システムで遊ぶことができます。

表現力は大幅に低下しますが、言語は簡単ですが、パフォーマンスを向上させたい場合は、Goをご覧ください。それは箱から出して並行処理をうまく処理します。

Cでパーサーを作成することも、私にとっては非生産的に見えます。 Python、Ruby、さらにはJavaまたはHaskellなどの高級言語は、これをより速く、より便利に行うのに役立ちます。eppyparsingを使用してパーサーを定義し、入力言語をElixirまたはErlangにコンパイルします。かなり簡単なはずです、そしてway Cで同等のことをするよりも簡単です。

階層化アプローチが役立つのは、一度に1つの小さな明確なことを行うことです。 (一度にすべてを実行しようとする試みは、確実に失敗する方法です。)

2
9000

実際のパーサジェネレータを使用する必要があるかどうかわからない場合は、それを使用する必要があります。 FlexやBisonのような本物のパーサジェネレーターは、完全にポジティブな場合にのみ避けてください。

このように書くすべての言語は成長します。それは目前のタスクの性質です。あなたの言語は成長します。それが成長するとき、Cマクロを使用した場合、その成長をC言語の一般的な構文に適合させる必要があります。 FlexまたはBisonで成長する場合、この種の成長に役立つように文字通り設計されたパーサージェネレーターがあります。

また、誰かがCマクロを台無しにした場合、エラーメッセージは恐ろしくて理解できない可能性があります。

また、言語文法が手元にある場合は、Pythonスクリプトがあなたの言語でコンテンツを生成するスクリプトのようなソリューションを許可することに一歩近づきます。

私が個人的にCマクロスタイルの言語を使用する唯一のケースは次のとおりです。

  • コードを直接操作する必要があり(メンバーへのポインターの取得など)、何らかの理由で、リフレクションなどのより堅牢なアプローチを使用してそれらのメンバーを公開できなかった場合
  • 私はすべての1バイトが重要な組み込みマシンで動作していました。

また、シミュレーターを使用するためにコードをコンパイルする必要があるソフトウェアのすべてのユーザーに100%問題がないことを確信している場合にのみ、これを使用します。

Cプリプロセッサーの能力を本当に活用したい場合は、プリプロセッサーのステップを実行してから、lexx/bison/antlr/flexを使用して結果を処理できる完全な文法があります。

1
Cort Ammon

ポイントが実際にそれを検証することである場合は、プロメラとスピン。これらはプロトコルシミュレーションツールです。

0
Rob