我如何访问对象被实例化的当前包的符号表?例如,我有这样的事情:
my $object = MyModule->new;
# this looks in the current package, to see if there's a function named run_me
# I'd like to know how to do this without passing a sub reference
$object->do_your_job;
Run Code Online (Sandbox Code Playgroud)
如果在do_your_job我使用的实现中__PACKAGE__,它将在MyModule包中搜索.我怎么能让它看起来正确的包装?
编辑:我会尽量让这个更清楚.假设我有以下代码:
package MyMod;
sub new {
return bless {},$_[0]
}
sub do_your_job {
my $self = shift;
# of course find_package_of is fictional here
# just for this example's sake, $pkg should be main
my $pkg = find_package_of($self); …Run Code Online (Sandbox Code Playgroud) 我目前正在为具有全局变量和嵌套子例程功能的语言构建编译器。以前,我只为只有局部变量而没有嵌套子例程的语言构建了一个编译器。
我在代码生成阶段如何重用在语义分析阶段填充的符号表有问题。我将符号表作为一个链表堆栈,其中每个链表代表在特定范围内声明的标识符。每次它进入一个范围时,都会创建一个新列表并将其推送到堆栈中,它成为当前范围。同样,每次离开作用域时,栈顶的列表都会被弹出。最后,在语义分析完成后,我实际上有空符号表,就像它开始时一样。但是,代码生成器需要一个完全填充的符号表才能正确生成代码。如何在不重新做语义分析期间所做的事情(即向符号表输入标识符)的情况下做到这一点?
compiler-construction code-reuse code-generation semantic-analysis symbol-table
根据此ELF 规范:ELF 目标文件包含各种部分,其中之一是符号表部分 .symtab,其中包含所有符号(文件、函数、对象等)的信息。
ELF 包含符号表中每个符号的名称、属性标志、类型、值和绑定等信息。
文件、函数或对象(数组、变量、字符串)等的对象名称实际上暴露了代码的内部信息。这样,任何人都可以分析ELF(使用strings,objdump或readelf工具),看到此信息,并获得对事物的内部,其应当保密的代码的想法。
为了可读性和可维护性,我们编写了开发人员可以理解的代码。所以,我们需要继续使用正确的文件名和变量名等。我们不能使用代码混淆来掩盖它们,因为它会导致难以维护。
问题(已编辑):有什么方法可以在可执行 ELF 的符号表中隐藏或删除符号“名称”,以便没有人可以了解代码并且可执行文件仍然可以运行?
假设我们有:
在f1.c
#include <stdio.h>
static int x = 10;
void f1() {
printf("f1.c : %d\n", x);
}
Run Code Online (Sandbox Code Playgroud)
main.c中
extern void f1();
int main(int argc, char **argv) {
f1();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们将编译和读取两个ELF文件符号表(rel.ELF和exec ELF):
$> gcc -c *.c
$> readelf -s f1.o | grep x
Num: Value Size Type Bind Vis Ndx Name
5: 0000000000000000 4 OBJECT LOCAL DEFAULT 3 x
$> gcc *.o
$> readelf -s a.out | grep x
Num: Value Size Type Bind Vis Ndx Name
38: 0000000000601038 …Run Code Online (Sandbox Code Playgroud) 符号表给出按键排序的结果,但我们如何按值对符号表进行排序.我用了Arrays.sort(st,st.get(key))但是给了我一个错误:
找不到符号:方法排序(ST,java.lang.Integer)
我的程序看起来像这样.仍然有错误:
import java.util.Comparator;
import java.util.Arrays;
public class DictionaryCounter {
private final String key;
public DictionaryCounter (String key){
this.key = key;
}
public static class Frequency implements Comparator<DictionaryCounter>{
public int compare(DictionaryCounter x, DictionaryCounter y){
return x.get(key).compareTo(y.get(key));
}
}
public static void main(String[] args) {
ST<String, Integer> st = new ST<String, Integer>();
//String key;
while (!StdIn.isEmpty()) {
key = StdIn.readString();
if (!st.contains(key))
{ st.put(key, 1); }
else
{ st.put(key,st.get(key) + 1 ); }
}
Arrays.sort(st,new Frequency (key));
for …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一种动态类型检查编译语言,现在我对此有点困惑:
- 编译语言总是有静态类型检查
- 任何编译器的阶段必须具有相同的顺序 -
例如,符号表必须在词法分析阶段创建,并且必须与每个阶段连接,如下图所示。
上述条款是否属实?
真正的问题是什么时候(哪个阶段)必须为这种语言创建符号表?
compiler-construction typechecking symbol-table compile-time-type-checking
symbol-table ×6
c ×1
code-reuse ×1
elf ×1
gcc ×1
java ×1
linker ×1
object-files ×1
perl ×1
typechecking ×1
unix ×1