似乎过去20年中出现的大多数新编程语言都是用C写成的。这完全有意义,因为C可以看作是一种便携式组装语言。但是我很好奇的是,这是否以任何方式限制了语言的设计。促使我的问题是考虑如何直接在Python中使用C堆栈来调用功能。显然,编程语言设计师可以用他们想要的任何语言做任何他们想做的事情,但是在我看来,您选择写新语言的语言使您处于某种心态,并给您某些难以忽视的捷径。这些语言的其他特征是否来自用这种语言(好是坏)写的?

有帮助吗?

解决方案

即使有C实施,您就可以在实施方面免费免费。例如, 鸡肉计划 使用C作为中级,但仍设法将堆栈用作其垃圾收集器中的苗圃。

也就是说,在某些情况下有限制。例子:GHC HASKELL编译器具有一个名为The的Perl脚本 邪恶的曼格勒 更改GCC输出的汇编代码以实现一些重要的优化。因此,他们一直在内部生成的组装和LLVM转移到部分原因。也就是说,这并没有限制语言设计 - 仅编译器选择可用的优化。

其他提示

我倾向于不同意。

我认为语言的编译器或解释器在C中实现并不多 - 毕竟,您可以用C与主机环境完全不同的虚拟机实现虚拟机,这意味着您 能够 远离C /接近组装的语言心态。

但是,更难声称C语言 本身 对以后的语言的设计没有任何影响。以卷曲牙套的使用为例 { } 要将语句分组为块,关于空格和凹痕大多不重要的观念,本地类型的名称(int, char, 等等)和其他关键字,或定义变量的方式(即首先键入声明,然后是变量的名称,可选的初始化)。当今许多流行和广泛的语言(C ++,Java,C#,而且我敢肯定还有更多)与C分享这些概念(这些可能并不完全是C,但Afaik C提出了这一点语言语法的特殊组合。)

不,简而言之。现实情况是,请四处寻找用C. lua编写的语言,远离C的远处,而无需成为Perl。它具有一流的功能,完全自动化的内存管理等。

除非所述语言包含严重的局限性,否则新语言受到其实施语言的影响是不寻常的。虽然我肯定不赞成C,但这并不是一种有限的语言,而与更现代的语言相比,它很容易出错,而且编程缓慢。哦,除了CRT。例如,LUA不包含目录功能,因为它不是CRT的一部分,因此他们不能在标准C中实现它。这是C有限的一种方式。但是就语言功能而言,它不受限制。

如果您想构建一个论点,说C中实现的语言具有XYZ的限制或特征,则必须证明C.

C堆栈只是系统堆栈,此概念早于C。如果您研究计算理论,您会发现使用堆栈非常强大。

使用C实施语言可能对这些语言的影响很小,尽管对设计和实施语言的人的C(和其他C语言)的熟悉程度可能很大程度上影响了他们的设计。即使您没有积极复制另一种语言的最佳位,也很难不受之前见过的事物的影响。

不过,许多语言确实将C作为它们与其他事物之间的胶水。部分原因是许多OS提供了C API,因此访问它易于使用C。此外,C是如此普遍和简单,以至于许多其他语言都有某种方式与之接口。如果您想将两个模块粘合在一起,这些模块用不同的语言编写,那么使用C作为中间人可能是最简单的解决方案。

在C中实施语言的地方可能影响了其他语言,这可能是类似于逃逸在字符串中的方式,这可能不是限制。

唯一有限的语言设计的是语言设计师的想象力和技术技能。正如您所说,C可以被认为是“便携式组装语言”。如果这是真的,那么询问C是否限制了一个设计类似于询问汇编是否具有限制语言设计。由于所有用任何语言编写的代码最终都以汇编的形式执行,因此每种语言都会受到相同的约束。因此,C语言本身并没有通过使用其他语言来克服的约束。

话虽如此,有些事情是 更轻松 用一种语言与另一种语言做。许多语言设计师考虑了这一点。如果将语言设计为在字符串处理方面的功能强大,但性能不引人注目,那么使用具有更好的内置字符串处理设施(例如C ++)的语言可能会更加最佳。

许多开发人员选择C的原因有几个。首先,C是一种非常普遍的语言。特别是这样的开源项目比在其他某些语言中找到等效的开发人员相比,找到经验丰富的C语言开发人员相对容易。其次,c通常将自己适合于微观优化。在为脚本语言编写解析器时,解析器的效率对用该语言编写的脚本的整体性能产生了很大的影响。对于编译语言,更有效的编译器可以减少编译时间。许多C编译器非常擅长生成极为优化的代码(这也是C中许多嵌入式系统编程的部分原因),并且可以用内联汇编编写至关重要的绩效代码。同样,C是标准化的,通常是静态目标。代码可以写入ANSI/C89标准,而不必担心它与C的未来版本不相容。C99标准中的修订添加功能,但不要破坏现有代码。最后,C非常便携。如果给定平台至少存在一个编译器,则很可能是C编译器。使用诸如C之类的高度便携式语言,可以更轻松地最大化可以使用新语言的平台数量。

想到的一个限制是可扩展性和编译器托管。考虑C#的情况。编译器用C/C ++编写,完全是本机代码。这使它变得如此 非常 在C#应用程序中很难在过程中使用。

这对C#的工具链具有广泛的影响。任何想要利用真实C#解析器或绑定引擎的代码都必须具有至少一个用本机代码编写的组件。最终,这导致了用C ++编写的C#语言的大多数工具链,这对语言有点倒。

这不会限制每句话的语言,但肯定会影响该语言的体验。

垃圾收集。 Java或.NET之上的语言实现使用VM的GC。在C之上的那些倾向于使用参考计数。

我能想到的一件事是,功能不一定是该语言中的一流成员,这不能单独归咎于C(我不是在谈论传递功能指针,尽管可以说C可以说C为您提供使用该功能)。

如果要在groovy(/schemp/lisp/haskell/lua/javascript/等)中编写DSL,以及我不确定的其他一些),则功能可以成为头等舱成员。制作函数一级成员并允许匿名功能可以编写简洁和更可读的代码(如Linq所示)。

是的,最终,所有这些都在C下运行(如果您想达到该水平),但是就为语言提供更好表达自己的能力而言,这些抽象做得很好。

在C中实施编译器/解释器没有任何重大限制。另一方面,将语言X实现到C编译器确实可以。例如,根据 Wikipedia关于C-的文章, 将更高级别的语言汇编成C时,您无法进行精确的垃圾收集,有效的异常处理或尾随递归优化。这是C- - 旨在解决的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top