問題タブ [dynamic-compilation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
522 参照

ocaml - OCaml コードがコンパイルされるかどうかをチェックするための OCaml プログラム

compileOCaml プログラムを含む文字列を受け取り、コンパイルの結果を Correct または Error として出力する関数を持つ OCaml モジュールを書きたいと思います。また、Error の場合は、最初のエラーの行と文字に関する情報を出力します。エラーが何であったかは気にしません(少なくとも今のところ)。

このための基本的なモジュール タイプは次のとおりです。

それを実装するには、少なくとも 2 つの根本的に異なる方法があります。

  1. 簡単なハック方法-- プログラムで文字列をファイルに書き込み、Unix プロセスを使用ocamlcしてコマンド ラインで呼び出し、stderr を解析します。
  2. 適切な方法-- OCaml ツールを使用してコードを分析します。

(1)については、stderrの中身がつかめず困っています。を使用することから始めました 。これによりUnix.open_process_in、stdout が in_channel にリダイレクトされ、それを読み取ることができます。コンパイルエラーは標準エラー出力に出力されるocamlcため(標準出力には出力されません)、使用しようとしました

stderr の内容がコマンド ラインで stdout にリダイレクトされるようにします。ic このようにすると、コンパイルエラーが含まれると思います。残念ながら、これは事実ではなくicEnd_of_file.

次にUnix.create_process、out、in、err の新しいチャネルを選択できるコマンドに移動しました。しかし、これらのチャネルを選択するのに問題があります。プログラムでそれを読み取ることができるようにするには、出力チャネルをどのようにする必要がありますか?

(2)に関して、(合理的に)簡単な方法は何だと思いますか?

助けてくれてありがとう!

0 投票する
0 に答える
465 参照

c# - アプリケーション ドメイン間でのデータ共有、両側での linq クエリの実行など

最初から、サードパーティ アプリケーションのログを解析して確認するためのユーティリティに取り組んでいます。これには、極端な柔軟性が明示的に要求されます。

それを達成するために、私はLINQを最大限に活用しています(そしておそらくそれを超えています:/ )。

ユーザーはユーティリティの UI を介して独自のクエリを作成することになっているため、クエリを動的にロードおよびアンロードできる必要があります。この目的のために、クエリの結果を返す単一のメソッド (文字通り「DoStuff」という名前) を持つダミー クラスを構築し (多くの場合 LINQ ベースですが、例外がある場合があります)、それらを (CSharpCodeProvider を介して) 一時的にコンパイルします。アセンブリを「使い捨て」の AppDomain にロードし、クエリを実行してから、AppDomain とアセンブリを削除します。

ここでアラームが発火します: LINQ + AppDomains = 問題が発生する可能性がたくさんあります。

さらに悪いことに、各ドメインで何が実行され、何がドメインの境界を越える (または越えようとしているか) かを確実に把握するのは非常に困難です。stackoverflow のナレッジ プールが、この問題の解決に役立つことを願っています。

したがって、詳細を詳しく説明します。ここに、私が持っているものの簡略版を示します。

メイン アセンブリ (ユーティリティの実際の .exe ファイル) では、ユーザーが実行することによってのみ "通常の方法" で読み込まれますが、次のようなものがあります。

(一部のフォーム、定型的なスタートアップ コードなどは別として)。プログラムは、ユーザーにログ ファイルのコレクションを提供するように要求し (FileOpenDialogs、従来の "*" および "?" ワイルドカードを使用したファイル名パターンをサポートするテキスト フィールドなどを使用)、それらを使用して LogData の単一インスタンスを初期化します。 .

その後、クエリを実行する Doom's Day Button を含む、クエリを作成および微調整するための光沢のある GUI がユーザーに表示されます。そして、それが楽しみの始まりです。アイデアは、ユーザーのクエリを表すコードを生成し、それを次のようなものにラップすることです (ここでは "using" ステートメントとその他の部分を省略しました)。

次に、これを CSharpCodeProvider にフィードして、(定義済みの構成可能な参照のリストを使用して) 一時アセンブリにコンパイルします。次に、アセンブリを "破棄" AppDomain にロードし、"whatever" のインスタンスを作成し、その DoStuff メソッドを呼び出し (LogData のインスタンスを渡します)、結果を取得し、ドメインをアンロードして、アセンブリを取り除きます。

さて、幕の下で何が起こっているのでしょうか?それが本題です^^。各ドメインで実行されているコードと、ドメイン間でやり取りされているデータを追跡するのはかなり困難です。いくつかの調査の後、私はいくつかの経験に基づいた推測を行っているので、誰かが私が正しいかどうかを教えてくれれば十分です:

1、LogData は MarshalByRefObject から継承する必要があるため、ユーザーのクエリ (DoStuff) に渡されると、列挙子は引き続き「既定の」アプリ ドメインで実行され、正常に動作します。

2,) 上記は、LogData インスタンスが AppDomain の境界を超えることはない (そのメンバーへの呼び出しは別の話です) ことを意味しますが、ログが DoStuff から繰り返されるときに、そのエントリ (LogEntry インスタンス) が行われます。それで、それらはシリアライズ可能である必要がありますか?逆シリアル化はまったく難しくありませんが、解析作業が2倍になるような気がします。代わりに MarshalByRefObject の子孫にすることはできますか?

3. DoStuff が返すものは何でも、参照ではなくコピーする必要があるため、「破棄」したものをアンロードした後もメインの AppDomain から引き続き使用できます。そのため、クエリが結果に含めることができる型はすべて、シリアル化可能である必要があり、決して MarshalByRefObject ではありません。

4. DoStuff が LINQ クエリを返したとしても ("return from entry in Input ..." のようなものを使用)、クエリの列挙子は "throw away" ドメインでのみ実行され、個々のアイテム (これは、上記のポイントで、これらはとにかくシリアライズ可能であるべきだとすでに述べました)実際にドメインの境界を越えます。

これらの結論は正しいですか?何か不足していますか?

ご回答ありがとうございます。

PS: 以下の Daniel のコメントに基づいて、プロジェクトのいくつかの側面についてもう少し詳しく説明する必要があると思います。

  1. 「クエリビルダー」はクエリを定義するための主要なメカニズムになることを目的としていますが、プログラムは、ビルダーだけでは不十分な場合にユーザーが生のコードを導入できるようにもします (また、プログラミングに精通していて、いくつかのクエリを入力することを好むユーザーのためにも)ドロップダウン、メニュー、およびその他のファンシーなものをナビゲートするためのコード; プロジェクトの対象ユーザーのかなりの部分である)。

  2. 言及しなかったもう 1 つの機能は、後で使用するためにクエリを保存できることです。C# コードで表されるクエリを使用すると、クエリを永続化するのは簡単です (コンパイル前は単なる文字列です)。式ツリー (またはそれに類似したもの) を永続化することは、すぐに大きなハードルになる可能性があります。

  3. CodeProviderクラスに飛び込むのはこれが初めてではありません。アセンブリを動的にロードします。LINQ でもありません。しかし、これほど深く掘り下げたのはおそらく初めてです。そして間違いなく、これらすべてをまとめようとするのは初めてです。私はこれらの各機能の可能性に精通しており、それらの相互作用に関するトリッキーな詳細が整理されれば、私が試みていることは比較的簡単になると確信しています. この質問はそれらの詳細についてのみです。それ以外はすべて処理できます。

0 投票する
1 に答える
997 参照

java - Google App Engine で Java クラスを動的にコンパイルする方法

この質問への回答で、Java コンパイラーをjavax.toolsGAE アプリから呼び出すことができないことを知りました。

  • この制限は引き続き適用されますか?

  • もしそうなら、Javaソースコードを「その場で」ロード可能なクラスファイルにコンパイルするための私のオプションは何ですか?

0 投票する
1 に答える
703 参照

c# - Visual Studio 2010 c# winforms のランタイム コンパイル

次の問題があります。簡単に説明します。

私のプログラムでは、ボタンをクリックして winform を .exe にコンパイルする可能性があります。

今、私は CodeDom でそれをやろうとしたので、私のプログラムには次の行があります:

ここで、codeProviderは CodeDomProvider であり、textはコンパイル元のソースです。

問題は、.exe の背後に他のクラスとフォームを使用するクラスがあるため、保存する必要がある winform です。パラメーター 'text' は文字列パラメーターであるため、これらのクラスをすべて含める必要があり、膨大な量の多くの間違いは言うまでもありません。これが私の言いたいことの例です。

他の方法があるに違いありません。質問は、それらは何ですか? 前もって感謝します!

0 投票する
1 に答える
284 参照

java - JDK6 を使用して src を動的にコンパイルしますが、JDK 環境に切り替えた後も ToolProvider.getSystemJavaCompiler(); から null を取得します。

JDK6 を使用して、UI からの入力 src をコンパイルし、すぐに実行しています。

しかし、問題は、デフォルトで私のアプリが jdk ではなく jre を使用していることです。

常に null を返します。

そして、各サーバーにJDK6もインストールされていることに気付いたので、この問題の解決を期待してこれを書きます:

しかし、それは機能しませんでした。おそらく Java 環境は、設定したばかりの場所に変更されず、まだ null オブジェクトを取得しています。

では、私の質問は、どのように jre 環境を jdk に切り替えて、JavaCompiler オブジェクトを取得できるようにするかということです。

ありがとう。

0 投票する
1 に答える
4758 参照

winforms - 'Rectangle' は名前空間 'System.Drawing' に存在しません

.NET 2.0 を使用しています。

System.Drawingは私の参照リストにあります。

これが私のusing声明です:

コードは次のとおりです。

この行のエラーは次のとおりです。

エラー テキスト: タイプまたは名前空間名 'Rectangle' が名前空間 'System.Drawing' に存在しません (アセンブリ参照がありませんか?)

なんで?

編集: コンパイル コードを追加:

他のすべての ReferencedAssemblies は機能し、長い間機能しています。こんなエラーは初めてです。

参照が追加されていることを確認し、再確認しました。プロジェクトに再度追加しようとすると、参照が既に存在するというメッセージが表示されます。

ありがとう

0 投票する
1 に答える
2766 参照

c# - CodeDomProviderコンパイルによって作成されたアセンブリの削除中にアクセスが拒否されましたか?

コンパイルの完了後に.NETでCodeDomProviderクラスを使用する場合、出力アセンブリを削除することはできません。出力アセンブリを削除できるようにしたい。File.Deleteは、アクセス拒否の例外を返します。

編集回避策として、一時フォルダーを検索し、以前に作成されたアセンブリを削除するクラスで静的コンストラクターを使用しています。

0 投票する
2 に答える
441 参照

c# - 実行時の C# コード?

実行時に生の C# コードをコンパイルするにはどうすればよいですか? コードの重要な部分を削除してサーバー経由でダウンロードし、アプリケーション内から実行することでセキュリティを追加したい場合はどうすればよいでしょうか?

0 投票する
1 に答える
164 参照

c# - AppDomain /「動的にコンパイルされたコード」の制限はありますか?

私はゲームを書くことを計画しています。そこでは、ユーザーがそれをプレイするために彼自身のC#コードを書かなければなりません。ユーザーが送信したコードを信頼できないため、ユーザーごとにAppDomainを作成します。各ユーザーは複数のクラスを作成できるため、各クラスを動的にコンパイルしてインスタンス化する必要があります。それらのクラスのいくつかが複数のインスタンスを持つ場合。

ユーザー数を制限したくありませんが、数百人のユーザーが登録されているとしましょう。つまり、数百のAppDomainが必要であり、さらに多くのユーザーコードクラスをコンパイル/インスタンス化しています。

前述のユーザー数に達する前に、はるかに早くヒットする制限はありますか?(CPU /メモリ)

0 投票する
2 に答える
969 参照

c# - C# スクリプトとセキュリティ

私のゲーム (これも C# で記述されています) に、何らかのカスタマイズ サポートを含めたいと考えています。ゲームプレイの大部分をスクリプトにオフロードすることを計画しているため、速度は大きな懸念事項です。その結果、ゲーム内イベントなどのスクリプト作成に C# を使用することにしました。また、ユーザーは C# でゲームのスクリプトとアドオンを記述できる必要があります。(私は、C# がスクリプト言語ではないことを知っています。)

ゲームと対話するために必要なすべての機能を含む (静的) クラスをユーザーに提供します。ユーザーはコードをソースとして提供することもできます (その場合、ゲームはそれをコンパイルします)。 コンパイルされたユーザー「スクリプト」は、場合によっては他のプレイヤーに送信される可能性があります。たとえば、ユーザーは自分の家などにスクリプト化されたトラップを構築できます。

ここに私の質問があります:

  1. 安全

    提供されたコードが、提供された API (クラス) の呼び出しのみを強制されるようにするにはどうすればよいですか? スクリプトによる不正行為や悪意のある行為を防ぐために...

    コンパイルされたコードを一種の VM または低信頼環境で実行する方法はありますか??

  2. スピード

    このアプローチは十分に高速ですか?(毎秒または毎秒のフレームで最大 100 個のカスタム アセンブリから関数を呼び出します)。これに関するヒントはありますか?

    すべてのユーザー コンテンツを 1 つの大きなアセンブリなどにコンパイルすることで、速度の利点を得ることができるのではないでしょうか??

  3. サイズ

    コンパイルされたコードのサイズを小さくするにはどうすればよいですか (圧縮する以外に) ? プレイヤーは何十ものスクリプトをダウンロードする必要があるかもしれないので...

    絶対に必要ではないものを取り除く方法はありますか? デバッグ情報やクラス名など...

ランタイム コンパイルは私にとってかなり新しいものです (そのため、ここで質問します)。したがって、いくつかの主要な初心者の間違いやセキュリティ上の懸念を指摘していただけると幸いです。

編集:

明確にするために:ユーザープラグイン/スクリプトまたはそれを呼び出したいものは、「GetAddonInfo」、「Init」、「Update」などの特定の機能を実装する必要があるクラス(C#でも記述)になります...私の抽象「アドオン」クラスから派生した通常の C# クラス。