代码之家  ›  专栏  ›  技术社区  ›  guidoism

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

  •  22
  • guidoism  · 技术社区  · 14 年前

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

    9 回复  |  直到 14 年前
        1
  •  5
  •   Robert Harvey    14 年前

    即使有了C实现,在实现方面您也可以获得惊人的自由。例如, chicken scheme 使用C作为中间层,但仍然设法将堆栈用作垃圾收集器中的托儿所代。

    也就是说,有些情况下会有限制。举个例子:ghc haskell编译器有一个名为 Evil Mangler 修改gcc输出的汇编代码以实现一些重要的优化。出于这个原因,他们一直在转移到内部生成的程序集和llvm。也就是说,这并没有限制语言设计——只是编译器对可用优化的选择。

        2
  •  8
  •   stakx - no longer contributing Saravana Kumar    14 年前

    我倾向于不同意。

    我不认为一种语言的编译器或解释器是用C实现的——毕竟,你可以用C实现一个虚拟机,它完全不同于它的主机环境,这意味着你 可以 远离C/Near汇编语言思维。

    但是,更难断言C语言 它本身 对后来的语言设计没有任何影响。以大括号的用法为例 { } 要将语句分组为块,可以认为空白和缩进基本上不重要,这就是本机类型的名称。( int , char 等)和其他关键字,或定义变量的方式(即先声明类型,再声明变量名,可选初始化)。许多当今流行的和广泛流传的语言(C++,爪哇,C语言,我相信还有更多)与C.共享这些概念(这些可能不是C语言完全新的,但是Afik C提出了特定的语言语法组合)。

        3
  •  5
  •   Puppy    14 年前

    不,简而言之。事实是,看看用C.Lua编写的语言,比如说,在不变成Perl的情况下,它离C的距离是尽可能远的。它具有一流的功能,全自动内存管理等。

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

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

        4
  •  4
  •   nategoose    14 年前

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

    使用C来实现语言可能对这些语言没有什么影响,尽管设计和实现语言的人对C(以及其他类似C的语言)的熟悉可能对他们的设计有很大影响。即使你没有积极地复制另一种语言中最好的部分,也很难不受你以前见过的事物的影响。

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

    在C语言中实现一种语言可能对其他语言产生了影响的地方,最可能的情况是如何在字符串中进行转义,这可能不受限制。

        5
  •  3
  •   bta    14 年前

    唯一限制语言设计的是语言设计师的想象力和技术技能。正如您所说,C可以被认为是一种“可移植的汇编语言”。如果这是真的,那么询问C是否约束了一个设计类似于询问汇编是否约束了语言设计。由于所有用任何语言编写的代码最终都作为程序集执行,因此每种语言都会受到相同的约束。因此,C语言本身不施加任何约束,这些约束将通过使用不同的语言来克服。

    也就是说,有些事情 更容易的 用一种语言和另一种语言做比较。许多语言设计者都考虑到了这一点。如果语言在字符串处理中被设计为强大,但是性能不是一个问题,那么使用具有更好的内置字符串处理设施(如C++)的语言可能更为理想。

    许多开发人员选择C有几个原因。首先,C是一种非常常见的语言。尤其是开源项目,与在其他语言中找到同等技能的开发人员相比,找到有经验的C语言开发人员要容易得多。其次,C通常用于微观优化。当为脚本语言编写解析器时,解析器的效率对用该语言编写的脚本的整体性能有很大影响。对于编译语言,更高效的编译器可以减少编译时间。许多C编译器非常擅长生成非常优化的代码(这也是许多嵌入式系统在C中编程的原因之一),性能关键的代码可以在内联汇编中编写。此外,C是标准化的,通常是静态目标。代码可以写入ANSI/C89标准,不必担心它与未来版本的C不兼容。在C99标准中所做的修订增加了功能,但不会破坏现有代码。最后,C非常便携。如果给定平台至少存在一个编译器,则很可能是C编译器。使用像C这样的高度可移植语言可以更容易地最大化使用新语言的平台的数量。

        6
  •  3
  •   JaredPar    14 年前

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

    这对C的工具链有广泛的影响。任何想要利用真正的C解析器或绑定引擎的代码必须至少有一个用本机代码编写的组件。这最终导致C语言的大部分工具链用C++编写,这对于语言来说有点落后。

    这并没有限制每个人说的语言,但肯定会对语言周围的体验产生影响。

        7
  •  2
  •   dan04    14 年前

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

        8
  •  1
  •   Gangadhar    14 年前

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

    如果要在groovy中编写DSL(/scheme/lisp/haskell/lua/javascript/和其他一些我不确定的东西),函数可以成为第一类成员。使函数成为第一类成员并允许匿名函数允许编写简洁且更具可读性的代码(如Linq所演示的代码)。

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

        9
  •  1
  •   dsimcha    14 年前

    在C语言中实现编译器/解释器没有任何主要限制。另一方面,实现语言x到c编译器可以做到。例如,根据 Wikipedia article on C--, 当将更高级别的语言编译为C时,您不能执行精确的垃圾收集、有效的异常处理或尾部递归优化。这就是C-想要解决的问题。

    推荐文章