我一直在寻找一种语言,它提供与Coffeescript相同的功能,但是对于C / C ++。我的意思是一种将代码转换为C语言的语言,但可读,就像CoffeeScript转换为Javascript一样,可读且全部。
答案 0 :(得分:22)
我认为这是可能的,甚至是可取的(我在编写Node.js本机模块时勉强处理C ++),但比使用像JavaScript这样的高级语言更具挑战性。
您所要求的是一种能够在不牺牲性能或灵活性的情况下提供语法糖的语言。添加一些句法糖(比如句法空白或Ruby样式的def/end
块而不是花括号)是微不足道的。但是添加更高级的东西,你会遇到两个主要障碍:静态类型和垃圾收集。
例如,假设您想要添加隐式返回。它似乎是一个小功能,但请考虑一下:为了使该功能有用,当最后一个表达式的值与之不匹配时,您必须至少抛出一个编译时错误。函数的返回类型。这意味着您的编译器需要检查类似
的行a->b
并弄清楚它是什么类型。原则上这是可能的,但它比CoffeeScript编译器的工作要多得多。
或者说你添加了列表推导。这意味着你要分配一个在编译时不知道长度的数组,这意味着你需要自己以后再释放它。所以句法糖实际上可能会伤害你。规则“如果您malloc
它,那么free
它”如果编译器正在为您添加malloc
,则不起作用,除非它可以找出放置{{}的位置1}}(这通常是可能的,但需要做很多工作)。
所以,虽然我喜欢有人给C ++做CoffeeScript处理,但我不认为它会很快发生 - 如果有的话。我认为世界最终可能会转向类似D或Go的系统级编程。
答案 1 :(得分:13)
我认为OOC可能是最接近Coffeescript的C语言。它是一种编程语言,具有许多你期望的动态语言(对象,一流函数,干净语法)可以直接编译成C99的功能。 / p>
答案 2 :(得分:11)
SugarCpp是一种可以编译为C ++ 11的语言。它应该是你正在寻找的。请访问https://github.com/curimit/SugarCpp了解详情。
答案 3 :(得分:10)
您可能想知道的Jacindas列表中缺少一个项目:Vala / Genie是一个编译器,目标是使用Gbject编写的实现对象的GObject库。 Vala是一种类似C#的语法,而Genie是一种类似Python的语法,但对于其他语法,它们是相同的系统。它实际上是因为裸露的C + GObject与Gnome家伙一起工作变得太麻烦了。 Vala基于引用计数或所有权跟踪以及您在C#语言中期望的许多其他事情来执行对象和自动内存管理。
对于类似CoffeeScript的属性,我just saw有一个实验性功能来禁用生成的代码对GObject的依赖性,因此它只生成普通的C而没有任何运行时依赖性。这样做会禁用许多更高级的OO功能,但它仍然会为您提供更好的语法,基本对象系统和(半)自动内存管理。
我不知道输出的可读性如何,但是如果你通过漂亮的打印机运行它可能非常接近你正在寻找的东西。
答案 4 :(得分:6)
对于Python,请看一下这个问题: Convert Python program to C/C++ code?
他们提到Shed Skin,它将采用纯python的一部分并转换为独立的C ++代码。
Cython通常用于创建Python扩展模块,但如果Python解释器为embedded,则可以创建独立程序。但这听起来并不像你想要的那样。
Cython基于Pyrex,它们在很多方面相互兼容。
对于您提到的其他一些语言,似乎有类似的项目:Ruby和PHP。 Toba用于Java(虽然不再维护),Marst用于Algol,BCX用于BASIC,COB2C,PtoC用于Pascal,我应该在此之前停止这变成了“从Foo到C / C ++的转换器列表。”
希望有所帮助!
答案 5 :(得分:1)
由于已经提到了vala和genie,我会把BaCon(Basic Converter)放在那里,以便那些从月刊 print 出版物中回忆手动编码程序的人,但是想要用它来现代GUI。
Must run on each Unix/Linux/BSD platform, including MacOSX
Converted sourcecode must be compilable with GCC
Must resemble genuine BASIC with implicit variable delarations
Spoken language constructs are preferred
网站http://www.basic-converter.org/有很多例子(一些主题非常复杂的“BASIC”)和几乎所有开源IDE的插件,或者你可以使用BACON IDE。
答案 6 :(得分:1)
看看这个全新的项目:https://bixense.com/coffeepp/
Coffee ++是一种编译成C ++的小语言。它的创建与CoffeeScript for C ++类似。目前Coffee ++处于alpha状态,并且根本不可用或最终。查看Github上的来源参与。
Coffee ++的黄金法则是:“它只是C ++”。代码一对一地编译成等效的C ++,并且没有运行时库。您可以从Coffee ++无缝地使用任何现有的C ++库(反之亦然)。
源文件Test.cf ++
include iostream
int main():
age := 5
dog := Dog(age)
if age != 7:
dog.bark()
class Dog:
public Dog(int age):
this->age := age
public void bark():
std::cout << "Woof!\n"
private int age
};
编译Test.hpp
#pragma once
int main();
class Dog {
public:
Dog();
void bark();
private:
int age;
};
编译了Test.cpp
#include "test.hpp"
#include <iostream>
int main() {
auto age = 5;
auto dog = Dog(age);
if (age != 7) {
dog.bark();
}
}
Dog::Dog(int age) : age(age) {
}
void Dog::bark() {
std::cout << "Woof!\n";
}
答案 7 :(得分:0)
嗯,这不是你想要的,但是......:http://www.campbell.nu/oscar/cython/index.html - 这个cython / cytoc是一个重要的空间(pythonish)的C / C ++转换器,我在1999/2000年左右编码,它没有任何关系七年后到达的cython项目。
坦率地说,我是用Perl编写的,并且使用正则表达式来启发式。我将它用于Gameboy Color游戏的整个项目(常规ansi C)。但是我不相信它......这也是我为什么环顾四周,而不是使用那个尘土飞扬的老人;)
跟进: 我已经在Onyx(https://github.com/ozra/onyx-lang)工作了一年加上,最后意识到显而易见的事情就是重写它以编译成C ++而不是LLVM-IR。重新定位的想法是品牌新鲜,所以重写仍然是蒸汽。但是你的输入将在RFC中得到很好的使用,如果你喜欢这种语言的概念,那么你就有机会塑造它。