是否有一种语言可以更好地转换为C语言?[关闭]


19

CoffeeScript是一种受Ruby启发的具有清晰语法的语言,可以转换为JavaScript。有没有类似的语言可以转换成C语言,从而在不影响性能的情况下提供更具可读性的代码?如果没有类似的东西存在,是否有充分的理由不创建它?


10
但是请注意,“编译为C” 并不等同于“与原始C程序一样快”。当某些东西编译为C时,它通常会生成(而不是完全)不同于任何普通人用C语言编写的代码。它很容易比通常用手工编写的代码要慢得多(有时甚至更快)。
杰里·科芬

4
我不喜欢这些答案中的任何一个,因为它们提出了完全不同的语言,例如Vala。关于CoffeeScript的事情是,它是Javascript,但是语法不同。
Falken教授支持Monica

2
pascalfortran吗?

5
我真的希望“ transcompile”(单词)会死掉。它是“编译”和“编译器”。您不需要仅仅因为输出语言不是x86而需要一个新单词(如果您认为这样做的话,您就不会理解编译器)。
Leushenko

2
单词transpile的意思是(或最近已经成为意思)将代码翻译为具有相同语义的另一种语言的源代码,通常是等效语句的声明(允许创建源映射)。没有人声称编译器所做的事情与编译器有所不同。编译器是一种特定类型的编译器。
卡尔·史密斯

Answers:


23

CoffeeScript编译为JavaScript的原因很简单,JavaScript是事实上的客户端语言,如果浏览器供应商提供的是另一种语法,那么期望浏览器供应商本地支持CoffeeScript是不合理的。

以非常相似的方式,高级语言对C转换器的重点是即时可移植性,因为几乎每个平台都有一个C编译器和丰富的C库。例如,Vala 旨在

  1. 成为GObject的编译器,
  2. 构建本机可执行文件(通过计算机的C编译器),
  3. 自动引用计数,以及
  4. GNOME C程序员仍然可以访问

GNOME是一个传统的面向C的项目,而GObject是专门用C编写的,如果Vala编译成机器代码,无论其友好的性质(和语法)如何,Vara都不会在GNOME开发人员中找到很多爱。并不是每个人都喜欢这种语法,以至于要开发另一种语言Genie来改进它。

对于一个C ++示例,Facebook开发了HipHop,这是PHP到C ++的转换器。他们试图解决一个非常具体的问题,即CPU使用率,而不必替换所有PHP代码并重新培训工程师(或者更糟糕的是,替换他们)。这是一个更为具体的示例,因为Facebook可伸缩性问题非常独特,并且再次访问中间C ++代码可能很有用,因为PHP扩展是用C和C ++编写的。

因此,从高级语言到另一种语言的翻译是一个好主意,主要是在需要访问中间代码时。对于CoffeeScript,由于广泛使用浏览器,因此JavaScript代码是必需的;对于Vala,Genie和HipHop,由于现有代码库,因此JavaScript代码是必需的。显然,可以访问中间代码意味着您可以根据需要进一步优化它。

但是总的来说,如果您不使用生成的代码,那么构建一种可转换为C的语言或任何其他语言并不是一个好主意。那里有很多语言,如果您不能应付C语言,请选择其他语言。碰巧的是,由Bjarne Stroustrup编写的第一个C ++编译器CFront是将类从C转换为C的C语言,但这主要是因为作为一种新语言,不可能用类来引导 C。


3
还有尼姆。
noɥʇʎԀʎzɐɹƆ

Swift也可以编译为C。
Quazi Irfan

9

要讲的Yannis Rizos在他原本不错的答案中没有提到的几点。

是的,存在多种语言。C是编译器后端的通用目标,因为它具有难以置信的可移植性,并且经过了高度优化,尽管使用LLVM并没有太多意义。

我知道可以这样做的一些实现是:

  • C ++(至少在早期)
  • GHC Haskell(尽管主要代码生成器是C--)
  • 甘比/鸡/比格鲁计划
  • ECL(通用Lisp)
  • 佩尔
  • 瓦拉与精灵

与原始C程序一样快

不,仅仅因为它使用C作为中间语言并不意味着您会达到它的速度。C之所以快是因为编写代码的方法与其他语言明显不同。它只是一个便携式组件,没什么特别的。


1
C离程序集很远……
Sarge Borsch 2014年

1
有人认为C是“高级汇编程序”。它与机器非常接近,但是当然不是一堆操作码。
dstromberg

6

Rock是一个Ooc编译器,可生成C99源代码。该OOC浪是一种编程语言与对象,一流的功能,和粉红色的独角兽。该OOC是一个动态语言,走那么远。它生成更胖和更慢的c代码。您需要进行更多修改以满足您的要求。但这是一个很好的起点。



4

OCaml中可以编译为字节码,为本地代码,可以直接解释,或者可以编译至C


1
您介意进一步解释它的功能吗,为什么在回答所提问题时推荐它?在Stack Exchange上不太欢迎“仅链接的答案”
gnat

3
我看不到我的答案是“仅链接的答案”。实际上,我可以删除链接,它仍然是有效的答案。问题是“是否有使用X的语言”,我的回答是“使用X的语言Y”。此评论也适用于Bilijk的答案。
barjak

3
  • Bjarne Stroustrop的原始C ++编译器“ cfront”将C ++编译为C,然后可以选择对它运行C编译器以生成目标代码。C ++可以说是“非理论性的” :-)
  • Unix“ yacc”和GNU“ Bison”编译器将其输入语言转换为C。已经编写了许多复杂的系统。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.