我找不到任何有用的东西来确定某种语言是第三代还是第四代。我发现的所有内容都是“更高级别”和“更接近英语”的开放式声明,有些消息来源说它们是像SQL这样的特定领域语言,而其他人则认为它们可以是通用的。我真的很困惑。
如果2GL是汇编语言而5GL是像Prolog那样的推理语言,那么如何确定编程语言是3GL还是4GL?
答案 0 :(得分:4)
大多数使用这些术语都是纯粹的营销 - “哦,你还在使用第三代生成语言?那是所以最后周!“
在这之后,有一个 tiny 位技术意义(至少在一段时间内,虽然许多“4GL”忽略了它)。基本的区别是(应该是这样的)第三代语言允许您仅操作单个数据项,其中第四代语言允许您作为一组而不是单独操作项目组。
两个明显的例子是SQL和APL。在SQL中,您主要使用集合。查询的结果是一组(不完全是数学集,但至少有些相似)。您可以将该集合作为一个整体使用和操作,将其与其他集合合并等等。除非您将其暴露给外部世界(例如,使用光标),否则您不必处理单个记录/组成该组的行/元组。
在APL中你会得到一些相同的想法,除了你正在使用数组而不是集合。为了弄清楚这意味着什么,让我们假设您想要“旋转”一个数组,以便当前第一个元素被移动到最后,而另一个元素则向前移动了一个点。要在典型的3GL(Fortran,Pascal,C等)中执行此操作,您需要编写一个与数组中各个元素一起使用的循环。但是,在APL中,您只需一个操作符就可以在一个操作中对整个数组执行此操作。即使使用单个项目的操作通常也很容易使用/
运算符同时应用于整个数组,因此(例如)可以计算名为a
的数组中所有元素的总和使用+/a
(或者可能是/+a
- 自从我编写任何APL以来,这是很长时间。
但是,对于那里所涉及的区别的一般概念存在一些相当严重的问题。一个是它非常强调语法 - 显然所涉及的操作需要内部循环之类的东西,因此这种区别等同于隐式循环的语法。另一个问题是,在很多情况下,你最终得到了两代混合的东西 - 例如,大多数BASIC能够将字符串视为单一事物,但需要在数组/矩阵上进行类似操作的循环。最后,有一点相关的问题:尽管在一些特殊情况下(比如SQL)能够使用一个组/集/数组/整个数据真的产生了很大的不同 - 但对于大多数情况下,它没有让人们思考和使用更高层次的抽象(至少显然是最初的意图)。
这与语言的结合相结合,模糊了内置内容与图书馆内部(或其他内容)之间的区别。在C ++,大多数ML系列语言等中,编写一个具有任意操作(包括但不限于循环)的函数并将其附加到一个与该语言内置的操作符基本无法区分的操作符是微不足道的。
这是一个吸引人的短语,意思是大多数无法解释,甚至更少关心 - 成为纯粹的市场高峰的主要候选人,通常大致翻译为:“你应该为我的缓慢,丑陋付出很多,有缺陷的CRUD应用程序生成器。“
答案 1 :(得分:2)
“语言世代”在20世纪80年代和90年代初是一个热门话题。他们总是定义不明确,很少用于实际的学术讨论。
这些术语当时没什么意义,现在也没有。