免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wwwsq
打印 上一主题 下一主题

531,继续抽某昏昏 [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
161 [报告]
发表于 2012-09-26 01:02 |只看该作者
回复 158# 幻の上帝


    先问问我的理解对不对:entity就是变量除了变量名(不管是不是变量的一部分)之外的那部分。是个集合,包含一个variable除了变量名以外的所有属性。对不对?

我要说的是,即使是这样,即使一个语言允许名字与变量名不绑定。在某个**瞬间**(无论是编译时运行时解释时还是按照标准理解代码时),一个名字都只会和一个“活跃entity”绑定,你也说了,这是确定无疑的。在这个角度上,这个identifier的制定是绝对没有歧义的,而且绝对是个变量(请举出不是变量的情况?函数吗?除了函数呢?即使函数也在这种情况内而且不属于variable的entity(它可能属于constexpr的那个entity),但是这里的具体含义还是没改变),如果是这样,变量作为表达式就完全没有歧义可言。注意Ager说过符号学中符号的一个重要特性就是符号是一维的,我们说的不是“所有的变量都是表达式”,这不可能,至少声明时绝对不是,你我都知道这个,但是,“在这一瞬间,这个变量被作为表达式使用”这是绝对可能的,而且在大部分情况(确切的说,除了声明以外的情况)都是这样的。在这个意义上,变量就是表达式。

这里说说函数:这里要提到常量和变量的关系的话题了,这其实也和表达式的话题有关,可以讨论下下~~

论坛徽章:
0
162 [报告]
发表于 2012-09-26 01:06 |只看该作者
回复 159# starwing83

看出你的思维死角了。
你真的确定你图里的“?”就是“是”么?是is-a、等价关系还是其它什么?你真确定有必要事先假定这种关系的存在
PS.你对公共object父类有什么看法?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
163 [报告]
发表于 2012-09-26 01:10 |只看该作者
回复 160# wwwsq


    果然………………

是这样的,标示符是符号,而表达式也是符号。没错。

但是,正如同你说“变量a”的时候,你指的绝对不是符号。正如你说24号的时候,你指的绝对不是24这个数字。同样,表达式这个符号不对应具体的实体是没有意义的。你之前好像一直没有提到过表达式这个符号对应的是什么实体吧?我提到过,但是没明确表达,因为那时我还没意识到这个。是的,表达式是具体计算过程这个实体的符号。

那么这个说法就很明确了。我说“24号”和“XX大厦”都是汉字,这显然合法。我说24号和XX大厦都是楼房,这显然合法。我说变量参与表达式计算(注意表达式除非在极特殊情况下,都是直接指代实体,这里没有矛盾,甚至比变量这个概念的矛盾更少),这显然说的是24号地址和XX大厦楼房之间的关系,而不是数字和楼房的关系。我说标示符是表达式,这更加强调了我说的并不是计算过程,而仅仅是语言的组成部分。

作为教学,仅仅说语言组成部分,肯定不够吧?教学的目的,是肯定得涉及到这个组成部分如何产生实际的效果吧?正如同学习地理,肯定不会是去学习地理这两个汉字吧?因此,这里的”变量是表达式“实际上是毫无歧义地在指代——变量参与表达式的计算,是表达式计算过程的一部分。这显然毫无歧义。在这个基础上,变量是表达式这个说法是没有问题的。正如同我说24号是XX大厦,你一定明白我说的是24号这个地址所指代的在这个地球上的某个空间位置,而绝对不会认为我说24号单指地址,你绝对不会认为我在说”地址就是大厦“或者(二次引用一下)”两个数字就是大厦“,你只要不会产生这样的歧义,那么这个理解就是正确的。然而上面已经说明,说变量就是表达式,并不会产生这个歧义。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
164 [报告]
发表于 2012-09-26 01:14 |只看该作者
回复 162# 幻の上帝


    上面那个图是有问题的,我其实一直有这个死角,还是多亏wwwsq指出“表达式和标示符是同级的”我才反应过来呢。

这个图应该是这样的:


  1.      标示符    --代表->     变量
  2.        |                     |
  3.        是                   参与
  4.        |                     |
  5.      表达式    --代表->   计算过程
复制代码
在这个基础上。严格说法是“变量参与了表达式指代的计算过程”,而表达式在C标准里面,是一定指代的这个计算过程而不会有歧义的(这个过程是不是一定会被计算,又是另外一回事了),因此说“变量时表达式”应该是(在了解这个图以后)是没有歧义的。

论坛徽章:
0
165 [报告]
发表于 2012-09-26 01:18 |只看该作者
回复 161# starwing83

理解大致正确,除了entity和属性不见得是集合的包含或属于关系。

但某个“瞬间”说不通。因为这里可能导致歧义的,是空间上的问题:不同代码片段有可能有不同的含义;这不是你强调的在“某个瞬间”解释这个代码时的情形。正确的代码一旦写下,语义就被确定(行为倒可以unspecified),所以要解释意义也不见得非要“某个瞬间”,可以利用之前的信息。如果你要讲某个瞬间,也绕不开这个瞬间实际上你关注的的变量名可以有不是一处变量名有关,你必须明确指定你说的变量名是指哪个才能导致无歧义——认识到需要明确时,就是承认了变量名和变量的区别。
具体地说,C++有name lookup来寻找name中各个identifier的声明,C同样需要寻找identifier的声明。实现对表达式的语义分析必然需要表达式以外得到的状态——“某个瞬间”它能够正常工作,是因为具有之前不同瞬间得到的信息。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
166 [报告]
发表于 2012-09-26 01:25 |只看该作者
回复 165# 幻の上帝


    但是就算是这一瞬间,这个变量名和变量的关系就是一定的啊,无论a = 1中的a是重名的无数个a的哪一个,但是只要第一次确定了,那么就一定就是那一个,不管变量名和变量是什么关系,最终确定的变量名是一个(a)确定的变量是一个(根据作用域神马的),这个变量名和变量绝对有特殊关系(作用域规则等等规则),因此一定是无歧义的。

然而,即使是所谓动态语言,变量名下可以动态地指代不同的变量(大多数动态语言依然不是这样),即使是这样,这样指代也是无歧义的。我说的是变量是表达式,是变量的总体,是某个变量,而不是说的这个叫做a的第二个变量是表达式。不是的,在这个上下文下,我说的是a一定指代一个变量(我不知道是哪一个),这个变量一定参与了表达式的计算(返回1被赋值后的值),一定决定了a = 1的最终类型,一定参与了表达式副作用的产生(类比的,我也不知道副作用什么时候发生,但我知道它一定会发生),这一系列过程都是没有歧义的——淫威这里不是特指。

而且,这还是退一步说的,这里的确可以是特指,因为根据语法规则,我们的确可以**静态地**知道这个a到底是哪一个具体的名字为a的变量。

由此,变量名的确是变量的一部分,变量名相同的变量可以有好几个,它们身上都有一个相同的变量名,a = 1只是从这么多个相同名字(名字是它们的属性)的变量中按照规则挑选的一个而已,而这个过程是无歧义的。

论坛徽章:
0
167 [报告]
发表于 2012-09-26 01:28 |只看该作者
回复 164# starwing83

用ISO C/C++(反正两家标准委员会这方面是一伙的。。。unsequenced被WG21提出来之后也在C11里用,不过我奇怪为什么C11还是选择保留sequence point……好吧扯远了)的行话,大致是表达式的求值包含值的计算和副作用的产生。表达式本身是死的,只是遵从语法规定的一堆记号的序列而已;求值才是真正体现语义的机制。你说的实际上已经是承认在对表达式求值(或者对于unevaluated operand,确认它不用被求值——但类型还是得知道的吧)了。于是至少对于C/C++,有一点无法回避:求值时必须明确name/identifier是什么,也就是说区分变量和变量名这类事是你把表达式和具体计算关联起来的前提。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
168 [报告]
发表于 2012-09-26 01:35 |只看该作者
回复 167# 幻の上帝


    见上面回复:一旦确认,那么identifier/name所指代的那个变量就确定了。这个确定类似于根据某个rule去lookup,见这个:

struct variable {
   string name;
   ...
}

void lookup_variable(context ctx, string name);

请问,仅仅是因为我在lookup-variable的时候必须得提供name,你就确定这个name不是variable的一部分么?表达式提供的标示符,只是为了通过某种规则查找变量从而完成语义导向的一个“引子”而已,它未必就是变量(它肯定不是变量,变量是实体而他是符号),但是你无法说变量这个概念不包含一个长得和他很想但意义完全不同的某个属性——变量名。

论坛徽章:
0
169 [报告]
发表于 2012-09-26 01:38 |只看该作者
回复 166# starwing83

对啊,只要第一次确定了就行了,总之是有需要确定的对吧。嗯,之后的求值包括类型确定等等,都依赖于这个第一次确定的东西。而这个“确定”的过程中你就无法回避实体和名称之间的固有区别。
那你为什么非要在后来这个“瞬间”把第一次确定的东西忘记呢?这样过河拆桥了有什么好处和必要?
至于变量名可以动态地指代不同的变量,那变量名就和一种特定的实体产生额外的关联,这种实体体现的语义能够起到普通变量名的作用,如此而已。但是某一“瞬间”,你还是得知道它体现的是变量名的作用还是和其它实体一样的特征。既是名称又是实体的概念是不需要的,因为既是字面上又不是字面上的东西在这里是没有意义的

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
170 [报告]
发表于 2012-09-26 01:45 |只看该作者
回复 169# 幻の上帝


    好吧,如果这么说,我承认变量名可以不是变量的一部分(还是参见上面最后回的那个贴),但是不能排除变量可以有个属性代表了它对应的变量名(肯定是一一对应,最多是重名),如果这个属性没用,那就直接奥卡姆剃刀了,如果有用,那么就有了这个论点的有力支持,我没找正面支持,似乎也找不到吧,没仔细想。

好,即使是这样,上面提到的“变量参与表达式求值”所以“变量是表达式”这个说法无歧义这个观点似乎依然不受影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP