免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
141 [报告]
发表于 2012-09-25 12:01 |只看该作者
回复 137# KanonInD

被勘误和勘误的都不算错。勘误的应该不难达成共识,而被勘误的才是实质问题。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
142 [报告]
发表于 2012-09-25 12:01 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
143 [报告]
发表于 2012-09-25 12:08 |只看该作者
回复 142# pmerofc

第二点其实我也回答过了:考虑作用域。更根本的理由是:变量名和变量的存在性并非需要同时确定。确定变量和变量名的对应关系是有条件的,而非“变量名是变量的组成部分”一笔带过。这样对于C这种有作用域的语言来说不严格限定上下文就没什么实际意义,反而可能影响理解。

论坛徽章:
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
144 [报告]
发表于 2012-09-25 12:33 |只看该作者
回复 138# 幻の上帝


    这个说法很奇怪,编译是个翻译过程,显然不存在运行期的变量概念,但是这不妨碍有个能指代变量的东西吧?难道我在一个地方仅用了某个概念的一部分,就不允许这个概念不存在了?比如说,程序是进程的静态部分,但是你能说程序不是进程的一部分么?虽然翻译的时候只有程序产生,而不是产生一个进程,但是这也不妨碍程序是进程的组成部分之一吧?拿剪刀的一片刃当刀片用难道剪刀就不是剪刀了?

论坛徽章:
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
145 [报告]
发表于 2012-09-25 12:34 |只看该作者
回复 138# 幻の上帝


    这个说法很奇怪,编译是个翻译过程,显然不存在运行期的变量概念,但是这不妨碍有个能指代变量的东西吧?难道我在一个地方仅用了某个概念的一部分,就不允许这个概念不存在了?比如说,程序是进程的静态部分,但是你能说程序不是进程的一部分么?虽然翻译的时候只有程序产生,而不是产生一个进程,但是这也不妨碍程序是进程的组成部分之一吧?拿剪刀的一片刃当刀片用难道剪刀就不是剪刀了?

论坛徽章:
0
146 [报告]
发表于 2012-09-25 12:37 |只看该作者
starwing83 发表于 2012-09-25 12:34
回复 138# 幻の上帝




表达式是一个语法形式,变量是一个实体,他们通过identifier关联起来。

表达式是在表达一种关系和运算过程,变量是实体。这关系就像交通规则和汽车的关系。你怎么能说汽车是交通规则呢?

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
147 [报告]
发表于 2012-09-25 12:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
148 [报告]
发表于 2012-09-25 12:45 |只看该作者
本帖最后由 幻の上帝 于 2012-09-25 12:52 编辑

[
编辑1:修正字体。
编辑2:禁用表情。
]

我的观点综述:
(0.以下所有引文的正文部分原样标示表示正式概念的斜体。)
1.变量(variable)是变量,变量名(variable name)是变量名,绝不可能无条件等价。否则就变量名这个概念就没存在的意义。
2.变量名是语言中变量的表达形式,用于引用变量。
鉴于C和C++之间求值方式的相似性,以下主要使用C和C++举例说明。
变量名举例:C中的声明对象的标识符、C++中对象或引用的qualified name和unqualified name(统称为name,是identifier的一种使用)。
不论是C还是C++,声明、作用域(scope)、链接这些概念作用于idntifier上。
一般语言的语法即确定了变量名就是表达式。对于C/C++,可以分别到ISO C/C++的Annex A查阅。
3.变量不仅仅存在于具体语言中。讨论变量时,不总是只讨论形式或语法上的表达。
变量不必然是语言直接抽象的实体(即便C++11里也不是,下述),但变量名应指称实体。指称是人为建立的抽象意义上的描述语义的关系,并非字面上的对语言使用时的引用,可以认为和具体语言的语法(表达式等)无关。
出现在语言外的概念,如int tmp = 1;中tmp叫作“临时变量”,应该可以理解(但这里的“临时”不同于C++中的temporary,后者有确定的含义——是个对象)。
4.关于C++里的variable:
ISO C++03 Clause 3
3 An entity is a value, object, reference, function, enumerator, type, class member, template, template specialization, namespace, parameter pack, or this.
3 An entity is a value, object, subobject, base class subobject, array element, variable, function, instance of a function, enumerator, type, class member, template, or namespace.
4 A name is a use of an identifier (2.10) that denotes an entity or label (6.6.4, 6.1). A variable is introduced by the declaration of an object. The variable’s name denotes the object.
ISO C++11 Clause 3
3 An entity is a value, object, reference, function, enumerator, type, class member, template, template specialization, namespace, parameter pack, or this.
4 A name is a use of an identifier (2.11), operator-function-id (13.5), literal-operator-id (13.5.8), conversion-function-id (12.3.2), or template-id (14.2) that denotes an entity or label (6.6.4, 6.1).
5 Every name that denotes an entity is introduced by a declaration. Every name that denotes a label is introduced either by a goto statement (6.6.4) or a labeled-statement (6.1).
6 A variable is introduced by the declaration of a reference other than a non-static data member or of an object. The variable’s name denotes the reference or object.

首先,可以看出object和variable显然不是一回事。object有storage duration,但自身没有scope或linkage等——只有和声明关联起来才讨论。
表面上C++11已经算迁就了——C++98/C++03里entity包含variable。但是,关于C++中variable的变迁:http://www.open-std.org/jtc1/sc2 ... ers/2009/n2993.html
根本原因并非是variable不够资格当entity,而是variable已经是两类entity的统称了,不适合继续出现在概念定义中。这并不妨碍variable和某种entity而不是name的直接关联。
还有一点,要在C++使用variable不可能脱离声明,而声明引入name。所以就C++的具体使用来说,只讨论变量而回避变量名是不可能的。还没写成代码之前,或者讨论语言构造的概念直接的关联时,有讨论的价值。
5.关于C的variable和entity:
ISO C没有出现entity和variable的正式定义。variable基本上用于variable length array等合成词组中。
C99 Rationale V5.10 p35
6.2.4
...
The scope of a variable starts at its declaration. Therefore, although the variable exists as soon as the block is entered, it cannot be referred to by name until its declaration is reached.

variable和object不同。object不讨论scope。讨论scope的是identifier,在这里可以是variable。对于这个上下文来说,用variable指代variable name的确是没有疑义的。但也仅此而已。
C的object、scope概念和C++等价,C的identifier在使用上是C++的name的一种特殊情况。所以套用C++的概念定义作为补充,逻辑上完全不成问题。唯一麻烦的是ISO C没说清楚什么算entity(似乎认为读者不言自明),偏偏正文中自己就在用,如:
ISO C11(N1570)
2 For each different entity that an identifier designates, the identifier is visible (i.e., can be used) only within a region of program text called its scope. Different entities designated by the same identifier either have different scopes, or are in different name spaces. There are four kinds of scopes: function, file, block, and function prototype. (A function prototype is a declaration of a function that declares the types of its parameters.)

6.其它语言如Java也有把variable当成表达式的:
The Java Language Specification/Java SE Edition 7
15.1 Evaluation, Denotation, and Result
When an expression in a program is evaluated (executed), the result denotes one
of three things:
• A variable (§4.12) (in C, this would be called an lvalue)
• A value (§4.2, §4.3)
• Nothing (the expression is said to be void)
...
ISO C11(N1570)
6.3.2.1
1 An lvalue is an expression (with an object type other than void) that potentially designates an object;...

但因为实体概念和求值方式跟C/C++有比较大的不同,只是用来说明variable可以当作的可能性,并非判断是否合适的依据。

论坛徽章:
0
149 [报告]
发表于 2012-09-25 13:06 |只看该作者
回复 144# starwing83

问题是,在编译期是没有变量存在的吧?变量是个运行期概念(详见维基百科variable说明)
这个说法很奇怪,编译是个翻译过程,显然不存在运行期的变量概念

搞不清你想说什么……到底是不是存在运行期的变量概念?

论坛徽章:
0
150 [报告]
发表于 2012-09-25 13:12 |只看该作者
回复 136# starwing83

另外变量普遍存在于抽象之中(虽然含义不同,别说能和数学里的彻底撇清关系),变量的概念其实和编译期还是运行期无关,也不应该有关。何况语言实现都不见得非得分编译期和运行期。
硬要说的话,对于C这样典型实现为编译型实现的语言,只能在编译前讨论。因为一旦编译,就不是C了(一般就是机器码)。实际程序的行为可以遵照抽象语义建立对应关系,但并非直接取代抽象。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP