已添加
刚刚发现了两个相关的问题
https://math.stackexchange.com/q/1759680/1281
https://stackoverflow.com/a/2582804/156458
在编程语言中,来自Michael Scott的编程语言语用学
通常,如果一个值可以作为参数传递,从一个子程序返回,或者分配给一个变量,那么在编程语言中的值就被称为具有first类状态。在大多数编程语言中,简单类型(如整数和字符)都是first类值。相反,“二级”值可以作为参数传递,但不能从子例程返回,也不能分配到变量中,而“第三方”值甚至不能作为参数传递。标签在大多数编程语言中是三级值,而在Algol中是二等值.子程序显示的变化最大。它们是所有函数式编程语言和大多数脚本语言中的first类值。它们也是C#中的first类值,并且有一些限制,在其他一些命令式语言中也是如此,包括Fortran、Modula-2和-3、Ada 95、C和C++。11在大多数其他命令式语言中它们是二等值,在Ada 83中是三等值.
为何具体的个案是重要的,而其他的个案却没有提及?
谢谢。
发布于 2016-09-26 21:28:21
没有,而且很武断。
唯一有用的区别是头等舱和所有其他舱。在“其他”类别中的每一种情况,在每种情况下都有自己独特的一组规则,将它们聚在一起并不是很有帮助。“头等舱”的意思是“你不必查规则”,“其他”的意思是“你必须学习规则”。
例如,在C++中,每个函数都是第一类值,只要它们是无状态的。重载集不是,而是lambdas。在C#中,函数通常是一流的值,但是在处理类型推断时会出现一些尴尬的情况,从而使它们在所有情况下都不存在。
发布于 2016-09-26 21:46:56
我同意DeadMG的观点,重要的区别是头等舱和“其他一切”之间的区别。然而,有一种更熟悉的方法来区分这种差异。
一级值是数据,其他值是代码.(粗略地说,我相信也有例外。但这是一个非常好的近似,适用于现实世界的语言。)
在某些语言中,您可以将代码视为数据。函数式语言因此而闻名:其中一些语言允许您在程序运行时更改其代码(遗传规划的基础)。
C和C++等语言允许您获取函数的地址:虽然不能修改它们,但可以将函数作为参数传递给其他函数。C++还具有函子函子的语法糖。这里的想法是创建一个完整的对象,从表面上看,它看起来像一个函数,可以像数据一样传递。否则,较低级别的值可以被视为头等值。
从数学上讲,我认为最好的方法是考虑一个程序的天冬氨酸。通常,每个令牌都有一个特定类型,该类型可能与其他类型兼容,也可能不兼容。想想L-值、r-值以及C++中其他价值类型的混乱吧。然后添加关键字、作为函数的符号等。其中一些可能是第一类、第二类或第三类值,取决于语言。
我不确定知道“有价值的类”是否如此重要,除非是在学术环境中。在现实世界中,需要知道的重要事情是如何传递代码,将其视为数据:函子、lambdas/闭包、函数指针等。
发布于 2016-09-27 10:09:44
指称语义学为描述值和变量在编程语言中的工作方式提供了数学基础。这在我的计算机科学学位中得到了很好的解释,以至于我在语义学考试中获得了高分,然后忘记了其中的大部分,并且在20年的程序员生涯中从来没有使用过它。
您可以选择使用定义良好的数学基础,也可以使用诸如“first类状态”之类的非正式术语。如果这门课程是基于Scott的编程语言语用学,我会学到更多的东西,然而,要想在编程语言设计中获得PHd,就需要正规的数学。
如果您阅读了大多数编程语言的规范,您将注意到不同的人缺乏换位语义,然而大多数设计良好的语言都有一个在编程语言设计方面的专家,因此能够很好地理解Denotational语义。
所以Michearl Scott使用了一些与正规数学有关的非正式术语,同时以一种大多数程序员可以从中受益的方式呈现这个主题。他的术语不为其他人所用,所以它对交流没有什么用处,但它确实为你在第一次看到一种新的编程语言时应该问的问题打下了良好的基础。
请注意,Michael L. Scott是计算机Sci的领先研究员,所以他会理解并非常高兴地使用正规的数学,但是和最好的研究人员一样,他有能力向我们其他人解释这项研究的应用。
https://softwareengineering.stackexchange.com/questions/332120
复制相似问题