問題タブ [vm-implementation]

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 投票する
5 に答える
177 参照

javascript - 次世代の JavaScript エンジンを高速化するために現在採用されている手法は何ですか?

私は現在の JavaScript エンジンについてかなりのことを知っています。その間にどのような技術が生まれましたか? 自由に入手できる情報へのリンクを提供してください。

編集:

明確にするために、JavaScriptの実行速度を向上させるために実装されている、または最近考えられた新しい手法を探しています。

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

input - 仮想マシンにI/Oを実装するためのより良い方法は?

私は、Virtualboxのような既存のアーキテクチャエミュレータではなく、JVMやBEAMのようなもので、独自の命令セットやメモリモデルなどを備えた仮想マシンを作成しています。最終的には、非常に小さくシンプルなものを実装する予定です(ただしturing-complete)楽しみのために、バイトコードにコンパイルされる高レベルの言語。

もちろん、マシンはI / Oをある程度サポートしている必要がありますが、stdin/stdoutを使用した操作だけに制限したくはありません。モジュール式の「仮想デバイス」のようなものを想像します。これは、共有ライブラリとして実装できるため、VMは実行時にそれらをロードし、標準のインターフェイスを介して通信できます。このようにして、たとえば、標準の入出力、グラフィックス(VMプログラムがSDLウィンドウ内にデータを描画できる仮想デバイスを想像してください)、またはネットワーク用の「仮想デバイス」を使用できます。

問題は、VM用に作成されたプログラムが仮想デバイスとどのように通信する必要があるかということです。実際のハードウェアで採用されている手法を模倣することにし、ポートベースのI/OとメモリマップドI/Oについて学びました。しかし、どちらが私の目標に適しているかはわかりません。どちらが優れているか、あるいは入出力を処理するためのまったく異なる手法を指摘することさえできますか?

前もって感謝します。

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

vm-implementation - クロス コンパイルと仮想マシン

明確化

クロス コンパイルについて言及するとき、ホスト プラットフォームからターゲット プラットフォームへではなく、ある言語から別の言語 (GWT を考えてください) へのコンパイルを意味します。

バックグラウンド

私は Java にクロスコンパイルしたアラビア語プログラミング言語を開発しています。これにより、プラットフォーム固有の手間が省けました。今、私はこれを保留にする必要があり、さまざまな理由でCへのクロス コンパイルに切り替えました。

コンパイル時に実行されているシステムの同等のライブラリに置き換えられる単一のライブラリを開発したいと考えています。

たとえば、プログラマーが GUI 描画関数をアラビア語プログラミング言語で記述してコンパイルすると、Windows でコンパイルされた場合は win32 コードにクロス コンパイルされ、Gnome で GTK+、KDE ​​で Qt などにコンパイルされます。ライブラリも。

質問

コンパイルされた実行可能ファイルで終わるために、このすべての問題を経験する価値がありますか、それとも仮想マシンのアプローチを使用したほうがよいでしょうか? どちらかを選択することの長所と短所 (言語を使用するプログラマーではなく、言語開発者の観点から)? 他に考慮しなければならない要因はありますか?

さらに読むための参照リンクは大歓迎です:)

0 投票する
4 に答える
445 参照

compiler-construction - 並列化をサポートするSchemeのVM

私は、いくつかの並列化のトリックを行うJavaでSchemeエバリュエーターを作成しました。今のところ私以外は使えませんが、結果は出ています。

フロントエンドとミドルエンドは私の目的には問題がなく、集中したい部分ですが、バックエンドは最悪です。最適化されておらず、低速であるか、適切な末尾呼び出しの最適化が不足しています。

その代わりに、既存のVMをターゲットにします。誰かがこれの候補を知っていますか?エンタープライズ対応のVMである必要はありませんが、少なくとも

  • スキームから(比較的)簡単にターゲットにできます
  • (合理的に)ポータブルであること
  • 箱から出して並列構造をサポート
0 投票する
2 に答える
2086 参照

assembly - Lua 5.1 アセンブラーは存在しますか?

退屈から、Lua 5.1 VM オペコードをしばらく勉強してきました。

そして何かコーディングしてみたい!

Lua Assembly を Bytecode にアセンブルする既存の方法はありますか?

0 投票する
8 に答える
6094 参照

java - VMとは何ですか?動的言語でVMが必要なのはなぜですか?

したがって、たとえば、PythonとJavaにはVMがありますが、CとHaskellにはありません。(私が間違っている場合は私を訂正してください)

両側の言語が何であるかを考えると、理由がわかりません。Javaは多くの点で静的ですが、Haskellは多くの動的機能を提供します。

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

c - 仮想マシンを強制終了するパフォーマンスでの関数呼び出し

私はCで仮想マシンを作成しました。この仮想マシンには、VMのオペコードの機能を提供する関数へのポインターが入力された呼び出しテーブルがあります。仮想マシンが実行されると、最初にプログラムが解釈され、提供されたオペコードの呼び出しテーブルに適切な関数に対応するインデックスの配列が作成されます。次に、配列をループして、最後に到達するまで各関数を呼び出します。

各命令は非常に小さく、通常は1行です。インライン化に最適です。問題は、実行時に決定されるため、コンパイラが仮想マシンの命令がいつ呼び出されるかを認識しないため、それらをインライン化できないことです。関数呼び出しと引数の受け渡しのオーバーヘッドにより、VMのパフォーマンスが低下しています。これを回避する方法について何かアイデアはありますか?

0 投票する
6 に答える
2214 参照

performance - C 仮想マシンでのレジスタの実装

私は趣味のプロジェクトとして C で仮想マシンを作成しました。この仮想マシンは、Intel シンタックス x86 アセンブリと非常によく似たコードを実行します。問題は、この仮想マシンが使用するレジスタが名前だけのレジスタであることです。私の VM コードでは、レジスタは x86 レジスタと同じように使用されますが、マシンはそれらをシステム メモリに格納します。VM コードでシステム メモリを介してレジスタを使用しても、パフォーマンスは向上しません。(ローカリティだけでも多少パフォーマンスは上がると思っていたのですが、実際には何も変わっていません。)

プログラムを解釈するとき、この仮想マシンは命令への引数をポインターとして格納します。これにより、仮想命令はメモリアドレス、定数値、仮想レジスタ、またはほぼ何でも引数として取ることができます。

ハードウェア レジスタにはアドレスがないため、VM レジスタをハードウェア レジスタに実際に格納する方法が思い浮かびません。仮想レジスタ タイプで register キーワードを使用しても機能しません。これは、仮想レジスタを引数として使用するには、仮想レジスタへのポインタを取得する必要があるためです。これらの仮想レジスタをネイティブのカウンターパートのように動作させる方法はありますか?

必要に応じて、アセンブリを詳しく調べてもまったく問題ありません。この VM コードを JIT コンパイルすることでハードウェア レジスタを利用できることは承知していますが、解釈されたコードでもそれらを使用できるようにしたいと考えています。

0 投票する
7 に答える
23266 参照

assembly - x86アセンブリで自己変更コードを作成する方法

最近取り組んでいる趣味の仮想マシン用のJITコンパイラを作成することを検討しています。私は少しアセンブリを知っています(私は主にCプログラマーです。理解できないオペコードを参照してほとんどのアセンブリを読み、いくつかの簡単なプログラムを書くことができます)が、いくつかの例を理解するのに苦労しています。私がオンラインで見つけた自己修正コードの。

これはそのような例の1つです:http://asm.sourceforge.net/articles/smc.html

提供されているサンプルプログラムは、実行時に約4つの異なる変更を行いますが、いずれも明確に説明されていません。Linuxカーネル割り込みは数回使用され、説明も詳細もされていません。(作成者は、割り込みを呼び出す前にデータをいくつかのレジスタに移動しました。彼は引数を渡していたと思いますが、これらの引数はまったく説明されておらず、読者に推測を任せています。)

私が探しているのは、自己変更プログラムのコードの中で最も単純で最も単純な例です。私が見て、x86アセンブリの自己変更コードをどのように記述しなければならないか、そしてそれがどのように機能するかを理解するために使用できるもの。あなたが私に指摘できるリソース、またはこれを適切に示すことができるあなたが与えることができる例はありますか?

私はアセンブラとしてNASMを使用しています。

編集:私はLinuxでもこのコードを実行しています。

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

python - python vm は毎回メソッドをコンパイルしますか?

モジュール内のいくつかの場所で呼び出される関数がある場合、仮想マシンはその関数が最初に実行されるときにのみネイティブ コードにコンパイルし、他の呼び出しではキャッシュされたコードを使用しますか? (.NET jit コンパイラのように)