您的问题在几个方面都很有趣,因为它需要对几个问题进行仔细区分。但是在我看来,您的愿景基本上是正确的。为了避免使我的答案有偏见,在撰写大部分答案之前,我没有阅读您的参考文献。
首先,您的陈述Variables are symbolic names for memory
addresses
几乎是正确的,但是却使概念及其通常的实现感到困惑。变量实际上只是一个容器,可以包含可以更改的值。通常,此容器在计算机上以内存空间的形式实现,其特点是地址和大小,因为变量可能包含需要用或多或少的信息表示的对象。
但是我将主要考虑语言语义的更抽象的观点,而与实现技术无关。
因此,从抽象的角度来看,变量只是容器。这样的容器不需要名称。但是,语言通常具有通过将标识符与标识符相关联来命名的变量,因此可以通过标识符来表达对变量的使用。变量实际上可以通过各种别名机制具有多个标识符。变量也可以是较大变量的子部分:例如,数组变量的单元格可以通过指定数组变量和单元格的索引来命名,但也可以通过别名与标识符关联。
我故意使用有点中性的单词容器,以避免调用其他可能在语义上加载的单词。实际上,它与wilipedia中描述的引用概念非常接近,后者经常与内存地址混淆。指针一词本身通常被理解为一个内存地址,但是在考虑大多数高级语言时,我认为这没有意义,并且在您所指的讨论文件中可能不合适(尽管可以使用地址),因为它不合适。指的是特定的实现。但是,它适合于C之类的语言,该语言应该更接近于实现概念和机器体系结构。
实际上,如果您在实现级别查看变量或值,则可能存在多个间接的系统,即“机器级别的指针”,但是对于用户而言(并且应该是)不可见的,因此抽象的观点我开发可以是有效的。对于大多数编程语言,用户不必担心,甚至不必了解实现,因为对于给定的语言,实现可能有很大不同。对于某些有意接近机器体系结构的语言(例如C),它是汇编语言的高级替代品,而汇编语言几乎与显式二进制编码有直接关系,但对于大多数应用程序来说,它们的使用水平太低,这可能并非如此。情况。
语言的用户应该知道的是,值和相关的操作是什么,可以在何处包含它们,如何将它们与名称相关联,命名系统如何工作,如何使用新的语言,有时甚至应该少得多。定义各种值,等等。
612
不变值与标识符的关联通常称为常数。从这个意义上说,文学是常数。
“值容器”也可以视为值,并且它们与标识符的关联在您一直在使用的“天真”意义上是变量。因此,您可能会说变量是“容器常数”。
现在您可能想知道将标识符与值(常量声明)相关联或将值分配给变量(即,将值存储在定义为容器常量的容器中)之间的区别是什么?本质上,声明可以看作是定义符号的操作,该符号将作为语法实体的标识符与作为语义实体的某个值相关联。赋值是一种纯粹的语义操作,它修改状态,即修改容器的值。从某种意义上说,声明是一个无语义影响的元概念,除了为语义实体提供命名(即句法)机制外。
实际上,赋值是在程序执行时动态发生的语义操作,而声明具有更多的句法性质,通常独立于执行而在程序的文本中进行解释。这就是为什么静态作用域(即文本作用域)通常是理解标识符含义的自然方法。
毕竟,我可以说指针值只是容器的另一个名称,而指针变量是容器变量,即可以包含另一个容器的容器(常量)(某些人可能会对包含游戏施加限制)类型系统)。
关于代码,您声明 [pointers] might indicate the entry point
to a section of code and can be used to call that code
。其实这不是真的。从高层次或实现的角度来看,一段代码通常是没有意义的。从高级的角度来看,代码通常包含标识符,并且您必须在声明它们的静态上下文中解释这些标识符。但是实际上,由于递归是动态(运行时)现象,因此实际上可能存在相同静态上下文的重复,并且代码只能在静态上下文的适当动态实例中执行。这有点复杂,但是其结果是,正确的概念是闭包的概念,即将一段代码与要解释标识符的环境相关联。闭包是适当的语义概念,即是适当定义的语义值。然后,您可以拥有闭合常量,闭合变量,
函数是一个闭包,通常带有一些参数来定义或初始化其某些实体(常量和变量)。
我跳过了关于这些机制使用的许多变化。
闭包可用于以命令性或功能性语言定义OO结构。实际上,以这种方式完成了有关OO风格的早期工作(可能在名称之前)。
我快速浏览的您参考的论文似乎是由有能力的人撰写的有趣文章,但如果您对多种语言及其底层计算模型没有丰富的经验,则可能不容易阅读。
但是请记住:情人眼中有很多事情,只要他保持一致的看法即可。观点可能会有所不同。
这回答了你的问题了吗?
PS:这是一个很长的答案。如果您认为其中的某些部分不够充分,请明确指出它是什么。谢谢。