問題タブ [symbol-table]

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

python - コンパイラでシンボル テーブルを実装する別の方法は何ですか?

私は今学期に自分のクラスの 1 つのコンパイラを書いています。シンボル テーブルの実装は機能していますが、その実装には少し不安があります。私は Python でプロジェクトを行っているので、OO アプローチを採用することにしました。私の AST ノードにはすべてaccept、ビジター パターンを実装する方法があります。私は持っていpreVisitますpostVisitすべてのタイプのノードのメソッドであり、それらを使用して新しいスコープに出入りし、新しいバインディングをテーブルに追加します。それは機能しますが、私のシンボルテーブルが「一時的」であり、このビジタークラスにバインドされているという事実に不安を感じています. シンボル テーブル ビジター クラスをサブクラス化することで型チェックを実装しました。スーパー クラスへの呼び出しを正確に正しい場所に配置するには、細心の注意を払う必要がありました。この実装の脆弱性と、コンパイラのどのフェーズでもビジター クラスと密接に結合する必要があるという事実が、私を不安にさせています。

シンボル テーブルを一般的に実装する方法として、他にどのような方法があるのでしょうか。その情報は純粋に静的なので、AST ノードに直接追加できますか? 一度作成でき、正しいコンテキストでシンボルを検索できるテーブルを作成する方法はありますか? また、純粋関数型プログラマーはこの問題にどのように対処するのでしょうか?

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

matlab - Matlab 変数のカウント制限

Engine C API を介して Matlab と通信する C++ コードがいくつかあります。私のコードは、Matlab ワークスペースに一時変数を作成し、clearできるだけ早く呼び出しを介して入念にクリーンアップします。ただし、ある時点で、アプリケーションが失敗し、次の Matlab 一時変数を作成できないことが通知されます (通常、このような操作が ~65530 回行われた後)。

Matlab コマンド ラインでいくつかの実験を行った後、純粋な Matlab でこの問題を再現できることを発見しました (つまり、C++ コードとエンジン API の使用に関係なく)。次のコードを検討してください。

Matlab R2008B (古い、私が知っている) を搭載した 32 ビット Windows ラップトップでこのコードを実行すると、ループは最終的にエラー メッセージで中止されます。

現在のワークスペースにはすでに変数が多すぎます。「x_65532」の余地はありません。

したがって、少なくともこの廃止されたバージョンの Matlab には、64K のシンボル テーブル制限があるようです。おそらく、Matlab の新しい (64 ビット) バージョンでは制限が大きくなっています。

ただし、より興味深い問題は、clear呼び出しがどのような影響を与えているか、およびその奇妙な動作を回避する方法です。以下は、中止の少し前の反復からの出力です。

ご覧のとおりwhos、前の反復からの一時オブジェクトがワークスペースから削除されたことを出力が明確に示しており、クリアは期待どおりに機能しているように見えます。それにもかかわらず、シンボル テーブルは明らかに容量に達しています。

それで、SO忠実な人への2つの質問:

  1. このやや恣意的な制限を回避するにはどうすればよいですか? つまり、私のclear呼び出しを何に置き換える必要がありますか?
  2. この動作は、Matlab の新しいバージョンや 64 ビット バージョンで変更されましたか?
0 投票する
1 に答える
1012 参照

linux - elf ファイルでユーザー定義の関数範囲 (開始アドレスと終了アドレス) を取得する方法は?

以下の関数 main と foo のように、シンボル テーブルを読み取ることで、elf でユーザー定義関数の開始アドレスを取得できることがわかっています。

しかし、特定の関数の終了アドレスを取得する方法は?

誰か助けてくれませんか?ありがとうございました!

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

linux - ストリップされたバイナリ ファイルが逆アセンブル ファイルにライブラリ呼び出し情報を保持できるのはなぜですか?

テスト プラットフォームは 32 ビット Linux です。

シンボル情報を削除せずに ac プログラムをコンパイルし、objdump を使用して elf 実行可能ファイルを逆アセンブルします。

こちらが結果の一部です。

私が使用する場合:

シンボル情報を削除し、objdump を使用して elf 実行可能ファイルを再度逆アセンブルすると、次のような結果が表示されます。

だから私の質問は:

すべてのシンボル情報を削除した後、objdump のような逆アセンブリ ツールは特定のライブラリ関数の名前をどのように認識できますか?

ありがとうございました!