我找不到任何有用的东西来确定一种语言是第三代还是第四代。我所找到的是像“更高级”和“更接近英语”这样的开放语句,一些来源说它们是像SQL这样的领域特定语言,而另一些来源则说它们可以是通用的。我真的很困惑。
如果2GL是汇编语言,5GL是Prolog等推理语言,那么如何确定编程语言是3GL还是4GL?
发布于 2012-01-13 04:05:18
大多数术语的使用都是纯粹的营销--“哦,你还在使用第三代语言?那是上周的事了!”
在这背后,有一点技术意义(至少在一小段时间内,尽管许多“4GL”忽略了它)。基本的区别是(应该是)第三代语言允许您仅操作单个数据项,而第四代语言允许您作为一个组而不是单独操作一组项。
两个明显的例子是SQL和APL。在SQL中,您主要使用集合。查询的结果是一个集合(不完全是一个数学集合,但至少有点类似)。您可以将该集合作为一个整体使用和操作,将其与其他集合合并,等等。直到或除非您将其暴露给外部世界(例如,使用游标),否则您不必处理组成该集合的各个记录/行/元组。
在APL中,除了使用数组而不是集合之外,您会得到一些相同的想法。为了理解这意味着什么,让我们假设您想要“旋转”一个数组,以便将当前第一个元素移到末尾,并将每个其他元素前移一个点。要在典型的3GL (Fortran、Pascal、C等)中做到这一点您可以编写一个循环来处理数组中的各个元素。然而,在APL中,只有一个运算符可以将数组作为一个整体来执行,所有操作都在一次操作中完成。即使是处理单个项的操作对于使用/
运算符一次应用于整个数组来说也是微不足道的,因此(例如)名为a
的数组中所有元素的总和可以用+/a
计算(或者这可能是/+a
--我已经很长时间没有编写过任何APL了)。
尽管如此,涉及到的区别的一般概念存在一些相当严重的问题。其一是它非常强调语法--显然涉及到的操作需要内部循环之类的东西,因此这种区别相当于隐式循环的语法。另一个问题是,在相当多的情况下,您最终得到了两代的混合--例如,大多数基础知识能够将字符串视为单个事物,但需要对数组/矩阵进行类似操作的循环。最后,还有一个与相关性有关的小问题:尽管在少数特殊情况下(如SQL),能够将组/集/数组/任何数据作为一个整体来处理确实有很大的不同--但在大多数情况下,它几乎没有让人们思考和处理更高级别的抽象(至少看起来是这样的初衷)。
这与语言的发展相结合,模糊了内置的语言和库的一部分(或其他东西)之间的区别。在C++、大多数ML系列语言等中,编写一个具有任意操作(包括但不限于循环)的函数并将其附加到一个基本上与语言中内置的运算符没有区别的运算符是很简单的。
这是一个朗朗上口的短语,它的含义大多数人都无法解释,甚至更少人关心--它是被转变为纯粹的市场语言的主要候选者,通常大致翻译为:“你应该为我的缓慢、丑陋、有缺陷的CRUD应用程序生成器支付我很多钱。”
发布于 2012-01-13 01:22:20
“语言世代”是20世纪80年代和90年代初的热门词汇。它们总是定义不清,在实际的学术话语中很少使用。
这些术语在当时几乎没有意义,现在也没有了。
https://stackoverflow.com/questions/8839071
复制相似问题