Tim*_*Tim 18 language-agnostic
我想知道以下问题:
几乎所有现有语言都是用少量低级语言实现/编写的吗?例如,大多数语言是用C语言编写的吗?C++是用C语言编写的吗?
实现关系和语言子集/超集的概念之间是否存在某种关系?
在语言功能方面,某些语言比其他语言更多.在某些情况下,有些功能具有其他功能,例如,C++是否具有C的所有功能?
根据特征集和语言之间的子集/超集关系,子集/超集关系之间是否存在某种关系?
感谢致敬!
sep*_*p2k 19
它是什么意思"某些语言是另一种语言的子集/超集"?
语法A语言A是语言B的子集,如果语言A中有效的每个程序在语言B中也有效.语义上它是一个子集,如果它是一个语法子集,并且每个有效的A程序在语言中也表现出相同的行为B.
可以用数学来定义吗?它与基本集理论中的子集/超集概念有关吗?
句法子集:If P_A是语言A P_B中所有有效程序的集合,是语言B中所有有效程序的集合,那么语言A是语言的语法子集,B如果P_A是语言的子集P_B.
语义子集:让我们A(p)成为描述p语言A 中程序行为的函数,并B(p)用p语言B 描述程序的行为.A是B的子集,当且仅当定义了所有p的A(p)定义时,才B(p)定义和A(p) = B(p).
几乎所有现有语言都是用少量低级语言实现/编写的吗?
这取决于你对"几乎全部"的定义,但我倾向于拒绝.许多编译器和解释器都是用C和C++编写的(仅仅因为很多软件通常用C和C++实现),但到目前为止还不是全部.
例如,大多数语言是用C语言编写的吗?C++是用C语言编写的吗?
正如已经在评论中指出的那样,C++是一种语言,而不是一种软件.g++GNU C++编译器是用C语言编写的,但也有用不同语言编写的C++编译器(可能).
在语言功能方面,某些语言比其他语言更多.在某些情况下,有些功能具有其他功能,例如,C++是否具有C的所有功能?
是(除非您将简单性视为一项功能).
根据特征集和语言之间的子集/超集关系,子集/超集关系之间是否存在某种关系?
如果一种语言是另一种语言的超集,那么该语言特征的集合也必须是另一种语言特征的超集(除非你将简单性或"语言不允许X"作为特征).
然而,这不适用于其他方向(即,因为A的特征是B特征的超集,A不必是B的超集).
我想拿起这个:
几乎所有现有语言都是用少数低级语言实现/编写的吗?例如,大多数语言都是用 C 编写的吗?C++是用C写的吗?
据我所知,实际上,几乎所有起源于 C 之后的语言都是用 C 编写的,因为 C 在一段时间内非常流行——直到它们准备好实现自己的编译器。大多数编译为本机代码的语言都会实现自身 - 也就是说,现代 C++ 编译器是用 C++ 编写的。这是通过使用已知良好的以前版本的编译器(LKG 或“最后的正确”编译器)来编译新编译器来实现的。我知道 Visual C++ 编译器就是这样做的,而且我记得有 Haskell IDE 也是这样做的,甚至 PROLOG 也是这样做的。最初的 C++ 编译器是用 C 编写的,但自从 C++ 凭借其自身的能力成为一种通用的强大语言后,人们就用它编写了 C++ 编译器。
当然,对于不编译为本机代码的语言来说,这个过程是不可能的,因为它们必须始终有一些底层解释器或虚拟机来执行无法用该语言编写的代码,从而不可能使用托管或解释性语言。
实现关系和语言子集/超集的概念之间是否存在某种关系?
就在这里。如果您正在实现 C#,为什么要放弃 C++ 多年来在快速进行多态函数调用方面的良好经验呢?最简单的事情就是依靠该实现 - 据我所知,在 .NET 框架上运行的 C# 中,这确实是发生的情况 - 他们使用基本上直接取自 C++ 的实现。如果您正在实现某种语言中已经存在的语言功能,那么如果您从头开始实施新的实现,您就会失去经验和创新。当然,如果这些实现是专有的或其他什么,情况会有所不同,但总的来说。
是否还有其他方面来表征语言之间的关系?
是的,有。最明显的一个是语法——考虑 C、C++、C# 和 Java 之间的语法关系,尽管 Java 和 C# 显然不是 C 的超集。然后考虑解决软件开发中主要问题的方法。例如,Java 和 C# 都是静态类型、垃圾收集、基于虚拟机的语言。然后你可以考虑设计错误。在我看来,设计错误是最大的暗示之一,表明两种语言的相关性比其实际应有的密切程度要大得多。这里,可以再考虑一下Java和C#。协变数组已损坏。AGiraffe[]不是Animal[],但 Java 和 C# 都允许转换。这是一个明显的设计错误,但两种语言都有这个错误,这表明它们的关系太密切了。
当然,C++ 在这里处于一个独特的位置,我不知道有任何语言可以像这样直接继承另一种语言,而 C/C++ 是您能找到的最接近语言超集的东西。C++ 标准委员会仍在对 C++ 中的功能进行标准化,纯粹是为了保持与 C99 的兼容性。