2010-02-01 57 views
5

假设语言的解释器(可以是从PHP到Ruby的任何东西)用C编写。 变量(或更复杂的数据结构不仅包含名称和值)是如何定义的,它由当前正在脚本执行,存储和读出?我对C的认识很差,最终会得出这样的结论:只能用数组来完成。脚本语言如何设置/修改/读出变量?

// Variable type definition would go here 
var* variables; 

var型将包含两个字符串namevalue

好的。所以一个脚本定义了例如:30个变量。现在,如果必须读出其中一个变量,函数getVar(或类似的东西)将不得不遍历所有30个变量,并将它们的name与所请求变量的名称进行比较。想象一下,请求一个循环

  • 我是否完全错误?如果是,那么(现代?)脚本语言如何处理变量?他们如何存储和读出?

  • 在通过语法(PHP:$myVar)明确定义变量的语言中,解释器可以在解析过程中用数值替换所有变量。 (我对吗?) 这是这种情况吗?

+0

@lamas - 祝你好运。有时你会想把你的头发拉出来......但是编译器和解释器很棒。 – 2010-02-02 00:02:10

回答

3

哈希表,范围链表,引用 ...有很多吧。

你问的是半抽象的,实现是可变的。

取决于实现:

  1. 标识符可被编译成存储器地址,或相对存储器地址,或者通过字节码引用无名位置。
  2. 标识符可能在运行时

可以查找到的动态的范围。在基本脚本语言,encoutered时将被放入一个范围结构如包含哈希表中的连接表的变量名用于在该范围内查找标识符的实现。

当引用变量时,运行时代码在散列表中查找它并获取与该值相关的某个值(例如结构的内存地址)。结构可以被用来实现变量:

enum stype = { INT, STRING, FLOAT, BOOL }; 
struct scalar { 
    enum stype type; 
    generic_blob_t *heap_blob; 
}; 

还是我的一些坏榜样源的变化。

一些好书是“Modern Compiler Implementation in C”和Dragon Book。阅读这个主题是一个好主意;我会推荐给任何程序员。

2

他们几乎可以肯定地使用更复杂的数据结构。

struct Var 
{ 
    char *name; 
    int type; 
    union value; .... 
    }; 

,然后将它们存储在一个树(哈希或二进制),使他们可以通过名称检索

+1

哈希表(而不是树)很可能,因为以排序顺序访问变量不太可能需要。 – caf 2010-02-01 23:56:25

2

通常,脚本语言实现将使用相当复杂的C数据结构来表示脚本语言中的变量。对于其中C扩展明确的语言,文档是现成的:

[SO编辑:随意添加到更多的参考资料以上列表]

+0

+1破解用于绑定的C到类型交互的示例。我喜欢Python的方法。 – 2010-02-02 00:01:24