問題タブ [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.
python - コンパイラでシンボル テーブルを実装する別の方法は何ですか?
私は今学期に自分のクラスの 1 つのコンパイラを書いています。シンボル テーブルの実装は機能していますが、その実装には少し不安があります。私は Python でプロジェクトを行っているので、OO アプローチを採用することにしました。私の AST ノードにはすべてaccept
、ビジター パターンを実装する方法があります。私は持っていpreVisit
ますpostVisit
すべてのタイプのノードのメソッドであり、それらを使用して新しいスコープに出入りし、新しいバインディングをテーブルに追加します。それは機能しますが、私のシンボルテーブルが「一時的」であり、このビジタークラスにバインドされているという事実に不安を感じています. シンボル テーブル ビジター クラスをサブクラス化することで型チェックを実装しました。スーパー クラスへの呼び出しを正確に正しい場所に配置するには、細心の注意を払う必要がありました。この実装の脆弱性と、コンパイラのどのフェーズでもビジター クラスと密接に結合する必要があるという事実が、私を不安にさせています。
シンボル テーブルを一般的に実装する方法として、他にどのような方法があるのでしょうか。その情報は純粋に静的なので、AST ノードに直接追加できますか? 一度作成でき、正しいコンテキストでシンボルを検索できるテーブルを作成する方法はありますか? また、純粋関数型プログラマーはこの問題にどのように対処するのでしょうか?
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つの質問:
- このやや恣意的な制限を回避するにはどうすればよいですか? つまり、私の
clear
呼び出しを何に置き換える必要がありますか? - この動作は、Matlab の新しいバージョンや 64 ビット バージョンで変更されましたか?
linux - elf ファイルでユーザー定義の関数範囲 (開始アドレスと終了アドレス) を取得する方法は?
以下の関数 main と foo のように、シンボル テーブルを読み取ることで、elf でユーザー定義関数の開始アドレスを取得できることがわかっています。
しかし、特定の関数の終了アドレスを取得する方法は?
誰か助けてくれませんか?ありがとうございました!
linux - ストリップされたバイナリ ファイルが逆アセンブル ファイルにライブラリ呼び出し情報を保持できるのはなぜですか?
テスト プラットフォームは 32 ビット Linux です。
シンボル情報を削除せずに ac プログラムをコンパイルし、objdump を使用して elf 実行可能ファイルを逆アセンブルします。
こちらが結果の一部です。
私が使用する場合:
シンボル情報を削除し、objdump を使用して elf 実行可能ファイルを再度逆アセンブルすると、次のような結果が表示されます。
だから私の質問は:
すべてのシンボル情報を削除した後、objdump のような逆アセンブリ ツールは特定のライブラリ関数の名前をどのように認識できますか?
ありがとうございました!