Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C实现其他语言是否以任何方式限制了他们的设计?_C_Programming Languages_Stackless_Compiler Construction - Fatal编程技术网

使用C实现其他语言是否以任何方式限制了他们的设计?

使用C实现其他语言是否以任何方式限制了他们的设计?,c,programming-languages,stackless,compiler-construction,C,Programming Languages,Stackless,Compiler Construction,似乎在过去20年中出现的大多数新的编程语言都是用C编写的。这完全有道理,因为C可以被看作是一种可移植的汇编语言。但我好奇的是,这是否以任何方式限制了语言的设计。引发我的问题的原因是思考如何在Python中直接使用C堆栈来调用函数。显然,编程语言设计师可以用他们想要的任何语言做他们想要做的任何事情,但在我看来,你选择的语言编写你的新语言使你处于某种心态,并给你一些难以忽视的捷径。这些语言的其他特征是否来自于用这种语言书写(好或坏)?简言之,不是。现实情况是,看看用C编写的语言。例如,Lua在不使用

似乎在过去20年中出现的大多数新的编程语言都是用C编写的。这完全有道理,因为C可以被看作是一种可移植的汇编语言。但我好奇的是,这是否以任何方式限制了语言的设计。引发我的问题的原因是思考如何在Python中直接使用C堆栈来调用函数。显然,编程语言设计师可以用他们想要的任何语言做他们想要做的任何事情,但在我看来,你选择的语言编写你的新语言使你处于某种心态,并给你一些难以忽视的捷径。这些语言的其他特征是否来自于用这种语言书写(好或坏)?

简言之,不是。现实情况是,看看用C编写的语言。例如,Lua在不使用Perl的情况下离C有多远。它具有一流的功能、全自动内存管理等

新语言受其实现语言的影响是不常见的,除非所述语言包含严重的限制。虽然我绝对不赞成C语言,但它不是一种有限的语言,只是与更现代的语言相比,它非常容易出错,编程速度也很慢。哦,除了在CRT里。例如,Lua不包含目录功能,因为它不是CRT的一部分,所以它们不能在标准C中移植实现它。这是限制C的一种方式。但就语言特征而言,它并没有局限性


如果你想构造一个论点,说用C实现的语言有XYZ限制或特性,你必须证明用另一种方式在C中是不可能的。

我能想到的一件事是,函数不一定是语言中的第一类成员,这不能仅仅归咎于C(我不是说传递函数指针,尽管可以说C提供了该特性)

如果要用groovy编写DSL(/scheme/lisp/haskell/lua/javascript/以及其他一些我不确定的东西),函数可以成为第一类成员。让函数成为第一类成员并允许匿名函数可以编写简洁、更易读的代码(如LINQ所演示的)


是的,最终所有这些都在C下运行(如果您想达到该级别,可以使用汇编),但在为语言用户提供更好的表达能力方面,这些抽象做得非常出色。

即使使用C实现,您在实现方面也出人意料地自由。例如,使用C作为中间语言,但仍然设法将堆栈作为垃圾收集器中的苗圃代

也就是说,有些情况下存在约束。举个例子:GHC haskell编译器有一个名为的perl脚本,用于更改GCC输出的汇编代码,以实现一些重要的优化。部分原因是,他们已经转移到内部生成的汇编和LLVM。也就是说,这并没有约束lan语言设计-只有编译器选择可用的优化。

我倾向于不同意

我不认为语言的编译器或解释器是用C实现的,毕竟,你可以用C实现一个完全不同于主机环境的虚拟机,这意味着你可以摆脱C/接近汇编语言的思维方式


然而,更难断言C语言本身对后来语言的设计没有任何影响。例如,使用大括号
{}
将语句分组成块,空白和缩进基本上不重要的概念,本机类型的名称(
int
char
,等等)和其他关键字,或者变量的定义方式(即先声明类型,然后是变量名称,可选初始化)。当今许多流行和广泛传播的语言(C++、Java、C#,我相信还有更多)与C共享这些概念。(这些对于C来说可能并不完全是新的,但AFAIK C提出了这种特殊的语言语法组合。)垃圾收集。Java或.NET之上的语言实现使用VM的GC。C之上的语言实现倾向于使用引用计数。

C堆栈只是系统堆栈,这个概念比C早很多。如果你学习计算理论,你会发现使用堆栈是非常强大的

使用C实现语言可能对这些语言没有什么影响,尽管熟悉C(以及其他类似C的语言)许多设计和实现语言的人可能已经对他们的设计产生了很大的影响。即使你没有积极地复制另一种语言的精华,也很难不受你以前见过的事物的影响

然而,许多语言确实使用C作为它们与其他事物之间的粘合剂。部分原因是许多操作系统提供了C API,因此访问C很容易。此外,C非常常见和简单,以至于许多其他语言都有某种方式与之交互。如果您想将两个用不同语言编写的模块粘合在一起,那么然后使用C作为中间人可能是最简单的解决方案


在C语言中实现一种语言可能对其他语言影响最大的地方,可能是字符串中转义的方式,这可能没有那么大的限制。

限制语言设计的唯一因素是语言设计师的想象力和技术技能。正如你所说,C可以被认为是“可移植汇编语言”。如果这是真的,那么询问C是否约束了一个设计就类似于询问汇编是否约束了语言设计