問題タブ [stack-based]
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.
language-agnostic - レジスタとスタック
レジスタベースの仮想マシンとスタックベースの仮想マシンを使用することの利点と欠点は何ですか?
私には、レジスター・ベースのマシンの方がプログラミングがより簡単で効率的であるように思えます。では、JVM、CLR、および Python VM がすべてスタックベースであるのはなぜでしょうか?
factor-lang - Factor を使用した Web アプリケーションの構築
Factorで Web アプリケーションを構築した人はいますか? プロセス中に遭遇したつまずきや問題は何でしたか?
c++ - 固定サイズでスタックベースであり、デフォルトのコンストラクターを必要としないC++配列クラステンプレートが必要です
だから、私はboost :: arrayを見てきましたが、デフォルトのコンストラクターが定義されている必要があります。この配列をデータで埋める最良の方法は、push_back(const T&)メソッドを使用することだと思います。SIZE(コンパイル時に認識される)よりも多く呼び出すと、ビルド構成に応じて、アサートまたは例外が発生します。このようにすると、常に意味のあるデータが含まれます。この概念の効率的で、移植性があり、信頼できる実装を知っている人はいますか?
.net - Microsoft の開発者が .NET をスタック ベースのマシンにすることを選択したのはなぜですか?
今日、VS2008 で提供されるツールの間に逆アセンブラー IL を見つけました。プログラムを逆アセンブルして結果を見てみました。オペコードを理解するのはそれほど難しくありませんでしたが、1 つ驚いたことがあります。.NET はスタック ベースなのですか?! 「優れたコードを書く、第 2 巻」を読んでも、スタック ベースのマシンは非常に遅いため、よく理解できませんでした。実装も簡単ですが、コードを実際のマシンコードに変換する必要があるため、問題を移動するだけなので、MS 開発者がその単純さのためにこのアプローチを選択したとは思いません。
この奇妙な選択を説明できる人はいますか?
PS:
このトピックについて読んだことをここに投稿します:
13.1.1 スタックベースのマシン スタックベースのマシンは、ほとんどの計算にメモリを使用し、メモリ内のスタックを使用してすべてのオペランドと結果を保持します。スタック アーキテクチャを採用するコンピュータ システムには、他のアーキテクチャに比べていくつかの重要な利点があります。
残念ながら、スタック マシンには深刻な欠点もあります。
- 命令は通常、オペランドを指定する必要がないため、他のアーキテクチャに見られる命令よりも小さい (それぞれの消費バイト数が少ない) ことがよくあります。
- 算術式を一連のスタック操作に変換するのは非常に簡単であるため、スタック アーキテクチャ用のコンパイラを作成する方が、他のマシン用のコンパイラよりも一般的に簡単です。
- スタック自体がその目的を果たすため、スタック アーキテクチャで一時変数が必要になることはめったにありません。
スタックは、スタックのいくつかの制限された要素 (多くの場合、スタックのトップおよびスタックの次と呼ばれる) でのみ操作を許可するデータ構造です。スタックでは、通常、新しいデータをスタックにプッシュする、スタックからデータをポップする、現在スタックの一番上にあるデータ (およびそのすぐ下のデータ) を操作する、の 3 つのいずれかを行います。
- ほとんどすべての命令がメモリを参照します (最新のマシンでは遅い)。キャッシュはこの問題を軽減するのに役立ちますが、メモリ パフォーマンスは依然としてスタック マシンの主要な問題です。
- HLL からスタック マシンへの変換は非常に簡単ですが、他のアーキテクチャよりも最適化の機会が少なくなります。
- スタック マシンは常に同じデータ要素 (つまり、スタックの一番上にあるデータ) にアクセスしているため、パイプライン処理と命令の並列処理を実現するのは困難です (パイプライン処理と命令の並列処理の詳細については、「優れたコードを書く」第 1 巻を参照してください)。
と
13.1.1.5 実際のスタックマシン
スタック アーキテクチャの大きな利点は、そのようなマシン用のコンパイラを簡単に作成できることです。スタックベースのマシン用のエミュレーターを作成するのも非常に簡単です。これらの理由から、スタック アーキテクチャは、Java 仮想マシンや Microsoft Visual Basic p-code インタープリターなどの仮想マシン (VM) で人気があります。Java VM のハードウェア実装など、実際のスタックベースの CPU はいくつか存在します。ただし、メモリ アクセスのパフォーマンスが制限されるため、あまり一般的ではありません。それにもかかわらず、スタック アーキテクチャの基本を理解することは重要です。多くのコンパイラは、実際のマシン コードに変換する前に HLL ソース コードをスタック ベースの形式に変換するためです。実際、最悪の場合 (まれではありますが)、
編集: @EricLippert のブログで、質問に回答し、@Aaron の回答を確認する記事を見つけました。
c - charをchar*(文字列)の最後のアドレスにコピーできませんか?
char*
のデータを別の最後のアドレスにコピーしたいchar*
図
最初の一歩
var2
にコピーvar1
結果
var1 -> OK
書かれたコード
走る
質問
なぜ私のコードが機能しないのですか?または、これらを実行するための機能がすでに存在していましたが、私はまだそれを知りませんか?
どんな注意のためのthx
javascript - スタックベース言語の認識
これがどの言語か知っている人はいますか?
objective-c - Objective-Cのスタックベースの配列宣言?
Objective-C では、次のように C 配列を宣言します。
int 長さ = 10;
int a[長さ];
これにより、Xcode ではエラーが発生しませんが、Visual Studio などの他のコンパイラではエラーが発生します。仕組みを教えてください。それを使用するか、代わりに malloc/calloc を使用する必要がありますか?
language-agnostic - スタックベースの仮想マシンよりもレジスタベースの仮想マシンの方が優れているのはなぜですか?
スタックベースの仮想マシンよりもレジスタベースの仮想マシンの方が優れているのはなぜですか?
具体的には、Parrot VM のドキュメントで、設計者はレジスタ マシンの利点を説明しています。
[...] 高水準言語の多くのプログラムは、ネストされた関数とメソッドの呼び出しで構成されており、中間結果を保持するためのレキシカル変数を使用する場合もあります。非 JIT 設定では、スタックベースの VM は同じオペランドを何度もポップしてからプッシュしますが、レジスターベースの VM は単純に適切な量のレジスターを割り当ててそれらを操作するため、操作量を大幅に削減できます。そしてCPU時間。
しかし、同じオペランドが何度もプッシュされるのはなぜですか?
javascript - javascript用のc ++のスタックベースのオブジェクトのようなもの
スタックベースのデストラクタまたは C++ のローカル オブジェクトのように機能する JavaScript のコンストラクトを探します。
したがって、これは、スコープが終了するとき(「スコープ外になる」とき)にアクションを実行する構造を探していることを意味します。C++ のデストラクタ (mutex-alloc と release をラップするために使用される) のように、スコープの最後で特別なアクションを必要としないという点で堅牢である必要があります。
乾杯、mg
parsing - 単純なスタックベースのプログラミング言語を実装するにはどうすればよいですか
スタックベースのプログラミング言語を実装することで、コンピュータープログラミングの知識を広げることに興味があります。pushint 1
値1の整数をスタックの一番上にプッシュし、「」のようなラベルを介してフロー制御を行う「」のような関数を使用することを意図しているため、どこから始めればよいかについてアドバイスを求めていますL01: jump L01:
。
これまでのところ、自分の言語をどのように動作させたいか(リンクしたいのですが、IDEOneがブロックされています)のC#実装を作成しましたが、非常に面倒で最適化が必要です。入力をXMLに変換してから、解析します。私の目標は低水準言語(おそらくC / C ++)に移行することですが、私の問題は、さまざまなデータ型を保持でき、サイズが固定されていないスタックを実装することです。
最終的には、配列と関数も実装したいと思います。さらに、私はより良いレクサーが必要だと思います。そのような単純な言語には、構文解析ツリーが良いアイデアになるのではないかと思います。
アドバイスや批評は大歓迎です。私はまだプログラミングにかなり慣れていないことを考慮してください(私は最近AP CompSci Iを完了しました)。また、オープンソースのスタックベースの言語へのリンクも歓迎します。
これが私が試して解釈/コンパイルしたい基本的なプログラムです(ここで[this is a comment]
):
期待される出力は次のようになります。