如何实际形成/创建新的编程语言?

Hor*_*lea 13 compiler-construction computer-science programming-languages

Fortran-> Algol-> Cpl-> Bcpl-> C-> C++ - > Java .....

似乎每种语言都建立在祖先语言之上.我的问题:新语言扩展为父语言还是有某种技巧?

例如Java中的System.out.print(); 它实际上是C中的printf(),依此类推(printf实际上是......在Cpl中)?

如果是这样,这是否会使每一种语言变慢并需要更多内存?新语言与框架之间的区别是什么?

Nor*_*sey 17

如何实际形成/创建新的编程语言?

这是一个多阶段的过程:

  1. 尖头型理论家和其他专业人士不断提出新的语言特征.您可以在自1973年以来每年举办的ACM Symposium on Programming of Programming Languages(POPL)会议记录中阅读相关内容.

  2. 其中许多提案实际上是用某种研究语言实现的 ; 我个人觉得有些研究语言包括Coq和Agda.Haskell以前的研究语言很大.获得10个用户的研究语言通常被其设计师认为是成功的.许多研究语言从未如此遥远.

    从研究到部署我知道两个模型:

  3. 模特A:一个才华横溢的业余爱好者出现并将一大堆现有的特征,包括一些新的想法,综合成一种新的语言.这位业余爱好者有天赋,魅力,也许是杀手锏.因此,C,Perl,Python,Ruby和Tcl诞生了.

  4. 模式P:一个才华横溢的专业人士为了建立和发布一种新语言而做出职业牺牲.专业人士有天赋,对该领域有深刻的了解,也许是一个杀手级的应用程序.因此,Haskell,Lua,ML,Pascal,Scala和Scheme诞生了.

    你提出另一个模型:

  5. E型:无论是业余爱好者还是专业人士,都会扩展或修改另一种语言.有一个内置的用户群可能对扩展感兴趣.也许用户可以在不花费大量转换成本的情 因此C#和C++诞生了.

我对专业人员的定义是指了解编程语言,传授知识并开发编程语言新知识的人.不幸的是,这与设计和实现新语言不同,它与许多人可以使用的实现不同.这就是为什么大多数成功的编程语言都是由业余爱好者而不是专业人士设计和构建的.

有相当多的有趣的研究语言已经有数百甚至数千用户,但从来没有做过大.其中一个我最喜欢的可能就是Icon.我曾在别处争论说,没有人真正知道为什么语言会变得流行.

新语言是否扩展为父语言?

这实际上是非常罕见的.C++是最受欢迎的例子,也许Algol-W或PL/S也很接近.但是,使用母语仅仅是灵感更为常见,而一些语言(Python会浮现在脑海中)承认多个"父母"作为灵感来源.

这不会使每一种语言都变慢,需要更多内存吗?

不必要.C++速度较慢,使用的内存较多,不是因为它是C的后代,而是因为它是随着时间的推移而逐渐形成的,只有非常熟练的用户能够可靠地编写与类似C代码一样快的C++代码.(我想非常清楚:不是C++不能快速;而是C代码的成本在阅读源代码时总是显而易见的,而C++代码的成本有时在读取源代码时并不明显. )有关C++发展的更多信息,请阅读Jim Waldo的书" The C++".

由于实时编译和其他古怪的东西,Java最初很慢.他们还背负着这种动态类加载的东西,这很难让事情变得快速(因为一个类可以随时动态扩展).Kenny Zadeck,Roger Hoover和David Chase为Java构建了一个非常快速的本机代码编译器,没有动态类加载.

对于一个反例,我认为Scheme程序运行速度更快,使用的内存比之前的Lisp程序少 - 部分原因是Guy Steele既是杰出的设计师,也是出色的实现者.(罕见的组合,那.)

但是你说的有些东西:那些缺乏从头开始构建优秀编译器的专业知识或者缺乏从头开始设计整个语言的专业知识的人可能会破坏与父母没有太大差别的实现.在这种情况下,人们很可能会使用一种设计不太好,实现不太好,速度慢,并且比前一代使用更多内存的语言.(Tony Hoare有名的说Algol 60是对其大多数接班人的改进[原文如此]).

同样,最近设计的语言也是如此,以相同的价格提供的计算资源就越多.早期的C编译器必须在低至128K的RAM中有效运行.今天的C++编译器不会面临这样的限制,并且他们有充分的理由使用更多内存:使用千兆字节的RAM填充机器非常便宜,并且限制使用仅仅几兆字节的内存就可以节省; 已经支付了更大的内存.

摘要:语言应运而生,因为人们希望更好地编程,并且他们有新的想法.当有人接受了大量的想法,一些新的和一些被证明的,并将它们合成为一个连贯的整体时,语言就开始了.这是一项很重要的工作.使工作更轻松的一种方法是不仅要绘制一种或多种先前语言的经过验证的功能,还要提供经过验证的设计.这种设计产生了"父母身份"的印象,但实际的扩展或接近扩展(在C++扩展C的情况下)很少见.随着语言的发展,时间和空间成本不一定会变大,但人们通常会通过使现有设计更复杂来创建语言,设计越复杂,有效实施就越困难. 因此,使用新语言编写的程序比使用祖先语言编写的类似程序看起来更慢或使用更多内存并不罕见.最后,与所有其他形式的软件一样,最近设计和构建的编译器倾向于使用比十年前构建的编译器更多的RAM和CPU,这仅仅是因为以低廉的价格提供大量的RAM和CPU周期.


Ear*_*rlz 6

语言并不慢,实现[由编译器创建到汇编]很慢.从理论上讲,你可以使用比PHP编译器运行速度慢的C++解释器.语言也不消耗内存,实现消耗内存.

当语法(或语法)不同时,项目是一种语言.(您可以在同一个项目中同时拥有语言和框架)

语言是由一般的创作过程形成的.有人看到一些很酷的东西,并认为它可能会更好,所以他们这样做,最终你会得到一种完全不同的语言.


Bil*_*l K 2

每种语言都建立在另一种语言的概念之上(语言设计)。每种新语言都会学习以前的语言中哪些有效,哪些无效。语言也针对不同的群体。如果您编写一种语言是为了实现长期可维护性和可靠性,那么该语言可能不适合 shell 脚本。

许多语言正在测试功能或概念。这些通常非常灵活和有趣,并且可以非常快速地编写代码。Basic 就是其中之一,Perl、Ruby 等也是如此。

其他语言被减少到最低限度并且很少改变——它们专注于向后兼容性和一致性。新功能将被避免,并且当添加新功能时,将在添加到标准之前进行深入测试(是的,它们往往比前一组更基于标准)。C、Java、Ada 和 C++ 的设计就是为了适应这种情况。C# 可能是一个交叉,比其他组添加了更多功能,但比前一组更稳定。

现在,除了驱动语言功能的因素之外,还有语言的构建方式。语言通常最初是用另一种语言编写的,但不是以您假设的方式编写的。Java 现在主要是用 Java 编写的,但 JVM 可能主要是手工编码的汇编,但是您可以肯定,C 的 printf 在 Java 中找不到。

编译语言通常由简化为特定代码集(机器语言或字节码)的程序组成,然后与一组例程一起打包(如 System.out.println)。然而,println 不仅仅调用 C 的 println,而是创建了一个库(用 Java、C、汇编的某种组合编写),它知道如何本身进行输出。

在 C 中,库将以相同的方式生成,C 和汇编的组合生成可以执行“printf”的汇编代码