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

Compiler construction 新的编程语言实际上是如何形成/创建的?,compiler-construction,programming-languages,computer-science,Compiler Construction,Programming Languages,Computer Science,Fortran->Algol->Cpl->Bcpl->C->C++->Java 似乎每种语言都是建立在祖先语言之上的。 我的问题是:新语言扩展了父语言还是有某种技巧 e、 Java中的g.System.out.print();它实际上是C中的printf(),依此类推(printf在Cpl中实际上是..) 如果是这样的话,这难道不会使每一种语言都变得更慢,需要更多的内存吗?新语言与框架的区别是什么?语言并不慢,[由编译器创建到汇编的]实现速度慢。理论上,你可以拥有一个比PHP编译器慢的C++编译

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

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

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


如果是这样的话,这难道不会使每一种语言都变得更慢,需要更多的内存吗?新语言与框架的区别是什么?

语言并不慢,[由编译器创建到汇编的]实现速度慢。理论上,你可以拥有一个比PHP编译器慢的C++编译器。语言也不消耗内存,实现消耗内存

当语法(或语法)不同时,项目就是一种语言。(您可以在同一项目中同时使用语言和框架)


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

语言可以(而且经常)从头开始编写。但是,语言可以(而且经常)建立在先前语言的概念之上。当你脚下有一个完美的圆形轮子时,为什么要重新发明轮子呢?

在我看来,创造新语言的主要方式有两种:

1) 有人决定他们需要做一些特定的工作,一种特殊用途的语言可以帮助他们完成这些工作。此人(可能还有其他一些用户)发现该语言很有用,并开始扩展到其他用途。最终,该语言支持的内容足够多,可以将其视为通用语言

2) 精通编程语言的人认为,当前语言存在一些问题,可以通过一种新的方法来解决(这可能是一种根本性的改变,也可能是以前的增量改变)。新语言从一开始就被设计成通用语言。这可能是对Java或C#如何产生的描述

大多数语言都与其他语言有一些相似之处(比如打印示例),因为这些操作在大多数计算环境中都非常有用


还有一些类似或我无法解释的语言…

在说一种语言是建立在前身概念的基础上和实际上是建立在前身概念的基础上之间有很大的区别,这可能并不明显。C编译成ASM,因此它是在它的基础上构建的,但不是必需的。C++编译器通常是用C语言编写的,它支持C的全部频谱,并添加了一堆东西。Java与.NET完全不同。它们“编译”成伪ASM,称为.NET的IL和Java的字节码。两者都需要其他步骤或VM(虚拟机)才能运行。

编程语言建立在语言设计师和整个社区先前的经验和知识的基础上,就像新车是使用几年前制造汽车所学到的知识来制造的一样

我认为,笼统地说所有语言都是建立在它之前的其他语言的基础上是不准确的。新语言的设计者当然应该有使用多种现有语言的经验,为特定目的了解它们的优缺点,然后设计新语言以吸收他人的所有优点/伟大思想,并尽可能避免他人的缺点。从别人的成功和失败中学习。(忽视历史的人注定要重蹈覆辙)

正如在其他答复中指出的那样,建立一种新的语言与其他语言的执行情况没有任何关系。新语言和同一语言的新实现通常会替换而不是扩展先前的示例。甚至一种语言实现的性能与另一种实现相比,也有很大的不同:考虑Borland C++编译器,它围绕同一时代的其他C++编译器运行循环,或者将1.0 Java虚拟机的运行时性能与添加了性能提升功能(如hotspot编译器)的后续实现进行比较


以汽车为例:因为福特T型车是一辆汽车,喷出黑烟,而特斯拉跑车是一辆汽车,紧随T型车之后,那么特斯拉跑车也必须喷出黑烟,仅仅因为它是一辆汽车,紧随T型车之后,这是真的吗?当然不是。特斯拉是汽车理念的一个非常不同的实现。它的设计反映了自T型车制造以来学到的很多东西,但它不是T型车。

语言设计师必须考虑受欢迎程度。 我毫不怀疑,C#的流行很大程度上是因为它与Java的语法没有太大区别,而Java的语法与C没有太大区别,等等

学习一门新语言的缺点已经是一项艰巨的工作,因此,如果语法与其他语言没有太大区别,对每个人来说都会更容易

就速度而言,它不依赖于语言,而是依赖于用于将该语言转换为另一种语言的编译器,这种语言可以是直接的机器代码,也可以是汇编语言,或者在C#、Java等情况下,是在虚拟机上运行的字节码

你的最后一个问题也很有趣。C#和.NET是完全不同的两种动物。当一种语言(如C#)针对.NET时,会生成一个编译器,可以将该语言转换为可在该VM上运行的字节码。例如,这意味着C#.net代码可以非常愉快地调用用VB.net编写的程序集

这同样适用于Java和Scala,它们都是为JVM编写的。Scala是一种函数式语言,Java是一种OOP语言,但两者都可以愉快地相互调用,因为最终,它只是运行在VM上的字节码

希望这能回答你的问题