类似于CoffeeScript的C/C++语言

Ian*_*Ian 37 c c++ compiler-construction

我一直在寻找一种语言,它提供与Coffeescript相同的功能,但是对于C/C++.我的意思是一种语言,将代码转换为C,但可读,就像CoffeeScript转换为Javascript,可读和所有.

Tre*_*ham 22

我认为这是可能的,甚至是可取的(我在编写Node.js本机模块时勉强处理C++),但比使用像JavaScript这样的高级语言更具挑战性.

您所要求的是一种能够在不牺牲性能或灵活性的情况下提供语法糖的语言.添加一些句法糖(比如句法空白或Ruby风格的def/end块而不是花括号)是微不足道的.但是添加更高级的东西,你会遇到两个主要障碍:静态类型和垃圾收集.

例如,假设您想要添加隐式返回.它似乎是一个小功能,但请考虑一下:为了使该功能有用,当最后一个表达式的值与之不匹配时,您必须至少抛出一个编译时错误.函数的返回类型.这意味着您的编译器需要检查一行

a->b
Run Code Online (Sandbox Code Playgroud)

并弄清楚它是什么类型.原则上这是可能的,但它比CoffeeScript编译器的工作要多得多.

或者说你添加了列表推导.这意味着你要分配一个在编译时不知道长度的数组,这意味着你需要自己以后再释放它.所以句法糖实际上可能会伤害你.如果编译器正在为你添加malloc,那么规则"如果你,你就是free它"不起作用malloc,除非它可以找出放在哪里free(这通常是可能的,但需要做很多工作).

所以,虽然我喜欢有人给C++做CoffeeScript处理,但我不认为它会很快发生 - 如果有的话.我认为世界最终可能会转向类似D或Go的系统级编程.

  • 我不确定这是如何回答这个问题的,我认为你会让事情变得混乱.CoffeeScript生成相对可读且没有特殊运行时的javascript文件.这里的目标应该是相同的:从语义上接近它的更高语言生成C++.添加执行垃圾收集的运行时是偏离主题的.你必须接受一些与C++语义相关的东西并且无法删除,但你仍然可以创建一种更容易编写和阅读的语言.... (5认同)
  • ...即使是较低的悬挂水果,如不必在标题/实现文件中重复自己已经是一个巨大的胜利,但更复杂的问题可以解决.举个例子,你提到静态类型,它已被改进而没有通过这个线程中提到的一些项目完全删除它,如果你阅读他们的文档,你会看到很多其他的例子,他们解决得非常出色(vala/genie没有GObject,ooc(不幸的是,他们去了垃圾收集之路)),或Grigory Javadyan在评论中提到的inv). (3认同)

max*_*ins 13

我认为OOC可能是最接近Coffeescript的C语言.它是一种编程语言,具有许多你期望从动态语言(对象,一流函数,干净语法)中直接编译成C99的功能.

http://ooc-lang.org/

  • ooc非常酷,但不幸的是,它增加了垃圾收集.因此,它不像CoffeeScript方法那样灵活和便携,而且对于像游戏这样的高性能代码来说无法使用.显然,GC可以被禁用,但是目前"如果你使用没有GC的当前SDK,它将只是泄漏每个漏洞":http://docs.ooc-lang.org/compilers/no-gc.html (4认同)

yan*_*gzh 11

SugarCpp是一种可以编译为C++ 11的语言.它应该是你正在寻找的.有关更多详细信息,请访问https://github.com/curimit/SugarCpp.


Jan*_*nis 10

您可能想知道的Jacindas列表中缺少一个项目:Vala/Genie是一个编译器,目标是使用GObject库实现对象,由Gnome编写.Vala是一种类似C#的语法,而Genie是一种类似Python的语法,但对于其他语法,它们是相同的系统.它实际上是因为裸露的C + GObject与Gnome家伙一起工作变得太麻烦了.Vala基于引用计数或所有权跟踪以及C#类语言中的许多其他内容来进行对象和自动内存管理.

至于类似CoffeeScript的属性,我 看到有一个实验性功能来禁用生成的代码对GObject的依赖性,因此它只生成普通的C而没有任何运行时依赖性.这样做会禁用许多更高级的OO功能,但它仍然会为您提供更好的语法,基本对象系统和(半)自动内存管理.

我不知道输出的可读性如何,但是如果你通过漂亮的打印机运行它可能非常接近你正在寻找的东西.


Jac*_*nda 6

对于Python,请看一下这个问题: 将Python程序转换为C/C++代码?

他们提到了Shed Skin,它将采用纯python的一部分并转换为独立的C++代码.

Cython通常用于创建Python扩展模块,但如果嵌入了Python解释器,则可以创建独立程序.但这听起来并不像你想要的那样.

Cython基于Pyrex,它们在很多方面相互兼容.

对于你提到的其他一些语言,似乎有类似的项目:RubyPHP. Toba for Java(虽然不再维护),Marst for Algol,BCX for BASIC,COB2C,PtoC for Pascal和我应该在此之前停止转变为"从Foo到C/C++的转换器列表".

希望有所帮助!