- 论坛徽章:
- 0
|
starwing83 发表于 2012-09-26 14:01 ![]()
[quote]
我觉得不是这样的。因为我是基本上从动态语言(python/ruby/lisp)身上理解语法形式的,所以一开始我就把value和variable分得很清楚(动态语言里面value和variable毫无关系,variable除了指向某个value以外别无用处。本质上variable就是某个数组元素或者某个哈希表项而已,本身不会包含value)。
这里我得说一下,我们理解上有偏差。我觉得不是这样的。因为我是基本上从动态语言(python/ruby/lisp)身上理解语法形式的,所以一开始我就把value和variable分得很清楚(动态语言里面value和variable毫无关系,variable除了指向某个value以外别无用处。本质上variable就是某个数组元素或者某个哈希表项而已,本身不会包含value)。所以我在思考的时候,着重会注重一个概念“字面量”。在我认为,字面量、变量等等都是必须要**求值**的,他们的求值结果就是他们包含的值本身。这就是主表达式形式的外延含义。比如说"abc"你认为它仅仅包含一个匿名字符串字面量。是的,但是我认为如果它出现在表达式中,在求值过程中它本身被求值,没有副作用,求值类型是char*,求值结果是一个指向"abc"的指针,同时这个指针虽然是char*,但是语义限定其只读。我的意思是,我们不能说“变量只存值,在表达式求值中他们唯一做的事情是贡献出自己的值”,不是的,这里有更深的一个层次,应该是“变量包含值,在表达式求值中,变量名作为的主表达式本身也是一个表达式,它也会被求值,它求值的结果是就是这个变量名对应的变量所包含的值,它求值出的类型就是这个变量名对应变量的类型”。这么说才是完整的,而且这个前提和这个层次是无法被剃刀掉的,因为只有这样才能保存C的表达式系统概念上的完整性。
如果有动态语言基础,就可以很清晰地分清楚value,eval和variable。比如Python:
a = 1
a = a + 1
这句话是什么含义呢?第一句,a这个指针指向一个value,value的内容是int类型的1,第二句话的含义是,首先求值表达式a+1,然后让a指向这个求到的新值。注意这里值和a完全没关系,a仅仅具有一个“指向”和“重指向”的作用而已。虽然大多数动态语言会做优化,将int这种值保存在a所占的槽里,但是至少Python3不是这样,integer实实在在地是另外分配的不可变对象,而a仅仅是个指针而已。在这个前提下,a += 1和a = a + 1其实没有任何区别,并没有一个静态语言里面的“累加”含义。
关于字面量,其实也要被求值,但和变量的关系不大。仍以C++举例:字面量是和标识符一样的语法元素。字面量和一个无名实体——更确切地说是一个静态存储期的数组类型的对象(对于字符串字面量)或一个值(右值,对于其它字面量)对应。它的求值被反映到引用到这个无名实体上。
我想我明白了关于理解的根本差异。换种方式重新表达吧。
如果要略形式一点,理想情况下:
variable = (name, value)
name和value在形式上是对等的,必须存在,否则无所谓variable。
不过有个问题:什么样的variable是同一个variable?不同语言有不同的做法。
至少对于像C这样的存在词法作用域的静态语言来说,name一经引入就不可更改,而且是因为上下文受限的;value则不是。
对于这样的语言,更恰当的形式是:
variable = (name, value_entity)
这里value_entity和value被我刻意区分了。因为value在语言中其实是不同的概念,它们之间的等价性由它的类型和其它内容根据相关语义规则确定。value_entity则受限于适用于entity的不同的规则:同一性。例如对于C++来说,value_entity的原则应该是由ODR确定的这个variable是否引用了同一个对象——具有唯一定义,类型、存储和生存期都完全相同、不可分辨的对象——来分辨是不是同一个变量。而name是可变的,只是被声明限制具体应该是什么。(当然name也决定了一些重要的性质,如linkage。)value_entity的同一性决定variable的同一性,这样variable也就顺理成章具有作为entity的资格。
可以看出和literal的不同,也可以看出variable并不只是value,比如说C++这样就可以和存储直接关联。
而对于name可变或者使用动态作用域的语言来说,variable直接取代了entity的地位,恰当的形式可能是:
variable = (name_entity, value)
正好相反,不通过value来确定同一性,name体现entity的作用,在这里称为name_entity。variable的同一性由name_entity的同一性决定。于是不需要额外强调entity,value在这里的所谓被“包含”其实只是松散的关联。这也就是你理解的variable的真面目。但这类风格的定义如果不论具体的语言,看来只是遵从习惯,有被正式地明确过吗?
实际上,你之前引用的wiki的说法还是比较传统的,倾向于第一种。你使用的定义和里面的说法相悖,那里面可是明白地说了which contains some known or unknown quantity or information, a value。你之前对这个有异议过吗?
对于C适用的“变量”的概念,我的意见在这里与此相同。variable和value不可分割,所谓“变量”,总要有体现某种可变性的能力,这体现在它的value的可以变化上,而不是variable和value之间关联的变化。
变量名不是变量的组成部分,变量名依赖于变量而非相反。不考虑具体语言时,讨论变量同时可以不考虑变量名具体是什么,尽管变量名的总需要存在(否则无法使用这个变量)。需要考虑变量名时,变量名是变量外部关联的属性。
变量的值是变量的唯一必要组成部分。区分变量和变量值的原因是变量值和名称彻底无关,而变量总是和名称关联。
|
|