编程语言中一等/二等/三等值的数学基础是什么?


19

添加

刚发现两个相关问题

/math//q/1759680/1281

/programming//a/2582804/156458


在编程语言中,来自Michael Scott的Programming Language Pragmatics

通常,如果编程语言中的值可以作为参数传递,从子例程返回或分配给变量,则称其具有 第一类状态。在大多数编程语言中,简单类型(例如整数和字符)是第一类的值。相比之下,“第二类”值可以作为参数传递,但不能从子例程返回或分配给变量,并且“第三类”值甚至不能作为参数传递。

标签是大多数编程语言中的三等值,但在Algol中是二等值。子例程显示最多的变化。它们是所有函数式编程语言和大多数脚本语言中的一流值。它们也是C#中的第一类值,并且在某些限制下,在其他几种命令性语言中(包括Fortran,Modula-2和-3,Ada 95,C和C ++),也是第一类值。11在大多数其他命令式语言中,它们是二等值,在Ada 83中是三等值。

  1. 编程语言中一等/二等/三等值的数学基础是什么?

    该术语使我想起了一阶/二阶逻辑,但是它们有关系吗?

  2. 在我看来,它们之间的区别在于可以使用哪种特定情况下的值

    • 作为参数传递,
    • 从子例程返回,或者
    • 分配给变量。

    为什么特定案例很重要,而其他案例没有提到?

谢谢。


23
将值分类为第一类/第二类就像将语言分类为范式一样是徒劳的。您最终将得到的是模糊的概括,这使情况更加混乱。这不是理解编程语言的正确方法。重要的是理解该语言的语法,静态和动态,但这太大了以至于无法发表评论
gardenhead

3
另外:PL / I将是一流标签的一个示例。在PL / I中,您可以声明键入标签的变量,为它们分配代码位置,然后转到它们。您还可以将它们作为参数传递,甚至创建它们的数组。
Theraot

@Theraot:也许我正在约会自己,但是我是唯一一个必须处理FORTRAN中分配和计算的GOTO的人吗?不,我没有写@ $%!代码,所以我不得不重新设计它。
jamesqf

@jamesqf我知道要分配给FORTRAN和COBOL中的标签,不,我没有使用过。我不确定如何在此处对标签进行分类。但是就我所读(我拥有的手册)而言,PL / I不仅如此,而且我深信标签在那里是一流的。
Theraot

Answers:


45

没有任何东西,而且很随意。

唯一有用的区别是头等舱和其他所有舱室之间的区别。“其他”括号中的每种情况在每种情况下都有其独特的规则集,将它们放在一起并不是很有帮助。本质上,“头等舱”的意思是“您不必查找规则”,而“其他”则是“您必须学习规则”。

例如,在C ++中,单个函数是一等值,只要它们是无状态的。重载集不是,而lambda是。在C#函数中,通常是一等值,但在处理类型推断时会出现一些尴尬的情况,导致它们无法在所有情况下都被使用。


10
+1,尽管在诸如《编程语言语用学》这样的书的背景下,它比较了多种语言中的大量构造,并深入分析了异同和含意,但我认为这种速记方法可能会有用。(只是不要四处期待别人理解“二手”和“第三手”的意思。)
ruakh 16/09/27

(呃,我所说的“二手”和“第三手”当然是“二等”和“三等”。:
P

3
如果您想使用二手功能进行交易,则最好使用功能是一等公民的语言进行交易。^^
5gon12eder

@ 5gon12eder:“二手功能”就是您从第三方库调用的那些功能,不是吗?
jamesqf

11

我同意DeadMG的观点,重要的区别是一流和“其他”之间的区别。但是,有一种比较熟悉的方法可以对差异进行分类。

一等值是数据,其他是代码。(粗略地说:我敢肯定会有例外。但是,这对于真实世界的语言来说确实是一个很好的近似值。)

在某些语言中,您可以将代码视为数据。函数式语言为此而著名:其中一些函数式语言可让您在程序运行时更改其代码(遗传编程的基础)。

诸如C和C ++之类的语言使您可以获取函数的地址:虽然无法修改它们,但可以将函数作为参数传递给其他函数。C ++也有函子的语法糖。这样做的想法是创建一个表面上看起来像函数的整体对象,并且可以将其当作数据来传递。否则,价值较低的一类商品可被视为一等价值。

在数学上,我认为最好的方法是考虑程序的AST。通常,每个令牌都具有特定类型,该类型可能与其他类型兼容或不兼容。考虑一下C ++中的l值,r值和其他类型的值。然后添加关键字,作为函数的符号等。根据语言的不同,其中一些可能是一等,二等或三等值。

我不确定是否知道价值的“等级”是否那么重要,除非是在学术环境中。在现实世界中,重要的是要知道如何传递代码,将其视为数据:函子,lambda /闭包,函数指针等。


2
非代码非一流值的示例:Lua具有特殊的...“变量”,用于表示vararg函数参数。您可以在许多表达式中使用它,就好像它是一个值列表一样(例如print(...)local args = {...}),但是有些事情您无法使用它,例如在闭包(function(...) return function() return ... end end)中引用它。
三十二上校

8

指称语义为描述值和变量在编程语言中的工作方式提供了数学基础。我的计算机科学学位对此做了很好的解释,以至于我在Denotational Semantics考试中获得了最高分,然后忘记了其中的大部分,并且在20年的程序员生涯中从未使用过它。

您可以选择使用定义良好的数学基础,也可以使用非正式的术语,例如“一流的地位”。如果该课程基于Scott的Programming Language Pragmatics,我将学到很多东西,但是,要在编程语言设计中攻读PHd的人需要正规数学。

如果您阅读大多数编程语言的规范,就会发现持不同意见的人缺乏语义语义学,但是大多数设计精良的语言团队中都有一位擅长编程语言设计的人,因此很好地理解了语义语义学。

因此,Michearl Scott使用非正式的术语,该术语与正式的数学有一定关系,同时以大多数程序员都可以从中受益的方式介绍该主题。 他的术语没有被其他人使用,因此它对交流没有用,但是确实为您在首次使用新的编程语言时应该提出的问题奠定了良好的基础。

请注意,Michael L. Scott是计算机科学领域的领先研究员,因此使用正规数学将理解并感到非常高兴,但像最好的研究人员一样,他也擅长向我们其他人解释研究的应用。


谢谢。您的课程中使用了哪些书籍?您现在推荐哪些书?我是一个自我学习者
蒂姆(Tim)

@Tim,我20多年前上过课!我希望Michearl Scott的书是最好的书之一,除非您打算进行PHd级别的研究,否则它将覆盖您需要的更多内容。
伊恩

3

不,“一流”和“一阶”中的“第一”一词含义不同。

但是是的,“一等”和“一阶”的概念是相关的。它们都是关于对一种语言可以描述的概念进行抽象的分类。

如果一种语言的通常抽象机制可以对该概念进行抽象,则该概念是一流的。

例如,Java编程语言可以描述整数,并且所有抽象整数的常用机制(将它们作为方法参数接受,将其作为函数结果返回,将它们存储在数据结构中,...)都适用于整数。

如果一个概念不能用于抽象本身,则它是一阶的

例如,再次在Java中,我们可以使用方法对某些事物进行抽象。但是我们不能使用方法来抽象方法,因为方法名称不能作为方法参数传递。这在JavaScript中是不同的,在JavaScript中,您可以使用方括号表示法通过对象名称作为字符串来访问对象的属性,并且可以对字符串进行抽象。

如果一个概念可以用于对自身的一阶用途进行抽象,而不能对二阶用途进行抽象,则为二阶概念。

例如,在Java中,您可以使用泛型对类型进行抽象(如所述class Foo<T> { public List<T> content; })。但是,您不能使用泛型对泛型进行抽象(如所述class Bar<T> { public T<Int> content; })。在Scala中这是不同的。

一个概念是三阶,如果它可用于自身抽象过一阶和二阶的用途,但不超过第二阶用途。

等等。

最后,如果可以将概念抽象为任意用途,则该概念是高阶的

简介:如果抽象功能是一流的,那么它也是高阶的。而且,如果抽象功能是一阶的,那么它就不可能是一等的。


1
可以List<List>在Java中,虽然。也许您可以阐明这部分的意思?
Polygnome

1
好点子。我的意思是:class Foo<A> { A<Int> ... }。也就是说,我的意思是将泛型类型参数用作泛型类。然后,Foo<List>将实例化A<Int>List<Int>。在Java中,这是不可能的。稍后,我将尝试将其编辑为答案。
Toxaris

确实,那是不可能的。
Polygnome

我现在替换了误导性的List<List>示例。感谢您指出问题@Polygnome。
Toxaris

@Toxaris我认为这只是您自己编写的特殊术语。“概念”不是一阶或二阶,逻辑量词不是。
Miles Rout

2

编程语言中一等/二等/三等值的数学基础是什么?

我所不知道的。

该术语使我想起了一阶/二阶逻辑,但是它们有关系吗?

并不是的。

编程语言元素的“类”只是思考这个问题的一种简便方法,我的语言的用户希望通过编程来操纵什么?例如,C#为您提供了丰富的操作集来操作,为您提供了较少的操作集类型,并且没有给您提供操作标签的操作。

但是,您直觉这里没有连接并不完全放错了位置。从一阶逻辑到过程编程,从高阶逻辑到函数编程,都有一个类比。一阶逻辑是关于值的逻辑操作;程序化编程是关于值的程序化操纵。高阶逻辑是关于逻辑语句的逻辑操纵,函数编程是关于函数的编程操纵。

为什么特定案例很重要,而其他案例没有提到?

您必须要问作者一个明确的答案。

我不会太迷恋这种“阶级”的概念。这不是正式定义的东西。这是语言设计师用来讨论可以通过编程方式处理哪种类型的简写形式。


2

在这种情况下,“一流的价值”是编程语言理论中的标准术语。一等值是可以在语言中作为普通值处理的值,可以在运行时计算的值。当然,这是一个重言式的定义,直到您为语言定义了语义,然后值才是语义定义为值的内容。该概念的重点是确定可以直接操作的内容,而不是只能间接访问的内容。

例如,在几乎每种编程语言中,有界大小的机器整数(例如8位整数或32位整数或64位整数等)都是一等值。您可以将它们存储在变量中,传递给它们,然后将它们返回给函数,等等。在大多数语言中,但不是低级语言(例如汇编语言和C语言),字符串是一等值;但在C语言中,它们不是,仅是获取指向字符串的指针。在C中,字符串和数组不是一等值:例如,您不能将数组传递给函数,不能将数组分配给数组变量,等等。在C中,函数不是一等值任一个:您不能将函数存储在变量中,只能存储指向函数的指针。相反,字符串和函数是大多数高级编程语言中的一流值:您可以将它们存储在字符串中,等等。

类型是许多设计语言中并非一流的概念的一个示例。在像C或Java这样的语言中,类型存在于编译时,您不能使用语言构造来操纵它们。(Java也有一个基于类的动态类型系统;类是通过反射实现的一等值。)相反,Python之类的语言具有type返回表示其参数类型的值的函数。

标准术语中对“一流价值”的否定是“不是一流价值”。术语“二等值”并不常用,而“三等值”则更少。不要期望在本书之外看到它们。绝对没有依据将“秒”定义为“可以作为参数传递”,将“第三”定义为“不能作为参数传递”,没有东西的范围可以有意义地编号。很少有语言会在可以作为参数传递给函数的值与可以分配给变量的值之间产生区别,因此为该概念定义名称没有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.