【发布时间】:2011-09-05 15:01:22
【问题描述】:
我一直在寻找一种语言,它提供与 Coffeescript 相同的功能,但用于 C/C++。我的意思是一种将代码转换为 C 的语言,但可读,就像 CoffeeScript 转换为 Javascript,可读等等。
【问题讨论】:
标签: c++ c compiler-construction
我一直在寻找一种语言,它提供与 Coffeescript 相同的功能,但用于 C/C++。我的意思是一种将代码转换为 C 的语言,但可读,就像 CoffeeScript 转换为 Javascript,可读等等。
【问题讨论】:
标签: c++ c compiler-construction
我认为这是可能的,甚至是可取的(我在编写 Node.js 原生模块时不情愿地使用 C++),但比使用 JavaScript 等高级语言更具挑战性。
您需要的是一种能够在不牺牲性能或灵活性的情况下提供语法糖的语言。添加一些语法糖(例如,语法空格或 Ruby 样式的 def/end 块而不是花括号)将是微不足道的。但是添加任何更高级的东西,您会遇到两个主要障碍:静态类型和垃圾收集。
例如,假设您想添加隐式返回。这似乎是一个小功能,但请考虑一下:为了使该功能有用,您必须(至少)在最后一个表达式的值与函数的返回类型。这意味着您的编译器需要检查像
这样的行a->b
并弄清楚它是什么类型。原则上这是可能的,但它比 CoffeeScript 编译器做的工作要多得多。
或者说你添加了列表推导。这意味着您正在分配一个长度在编译时未知的数组,这意味着您稍后需要自己解除分配。所以语法糖实际上可能会伤害你。如果编译器正在为您添加malloc,则规则“如果你malloc 它,你free 它”将不起作用,除非它可以找出将free 放在哪里(同样,通常是可能的,但需要做很多工作)。
因此,虽然我希望有人将 CoffeeScript 处理为 C++,但我不希望它很快发生——如果有的话。我认为世界最终更有可能转向 D 或 Go 之类的系统级编程。
【讨论】:
我认为 OOC 可能是最接近 C 的 Coffeescript 的东西。它是一种编程语言,具有许多动态语言所期望的特性(对象、一等函数、干净的语法),可直接编译成 C99。
【讨论】:
Jacindas 列表中缺少您可能想知道的一项:Vala/Genie 是一个以 C 为目标的编译器,它使用 GObject 库实现对象,由 Gnome 编写。 Vala 是一种类似 C# 的语法,而 Genie 是一种类似 Python 的语法,但对于其余部分,它们是同一个系统。实际上创建它是因为裸 C + GObject 对 Gnome 家伙来说太痛苦了。 Vala 执行基于引用计数或所有权跟踪的对象和自动内存管理,以及您在类似 C# 的语言中所期望的许多其他事情。
至于类似于 CoffeeScript 的属性,我 just saw 说有一个实验性功能可以禁用生成的代码对 GObject 的依赖,因此它只生成纯 C,没有任何运行时依赖。这样做会禁用一些更高级的 OO 功能,但它仍然为您提供更好的语法、基本的对象系统和(半)自动内存管理。
我不知道输出的可读性如何,但如果您通过漂亮的打印机运行它,它可能与您要查找的内容非常接近。
【讨论】:
SugarCpp 是一种可以编译为 C++11 的语言。它应该是你正在寻找的东西。访问https://github.com/curimit/SugarCpp了解更多详情。
【讨论】:
特别是对于 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++。”
希望有帮助!
【讨论】:
看看这个全新的项目:https://bixense.com/coffeepp/
Coffee++ 是一种编译成 C++ 的小语言。它被创建为具有类似于 C++ 的 CoffeeScript 的内容。目前 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";
}
【讨论】:
由于已经提到了 vala 和 genie,我将把 BaCon(BaCon现代图形用户界面。
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。
【讨论】:
好吧,这不是你想要的,但是.. :http://www.campbell.nu/oscar/cython/index.html - 这个 cython/cytoc 是我在 1999/2000 年左右编写的 C/C++ 的重要空间(pythonish)转译器,它与七年后到来的 cython 项目。
坦率地说,我是用 Perl 编写的,它是启发式的,使用正则表达式。我将它用于 Gameboy Color 游戏(常规 ansi C)的整个项目。但我不相信它......这就是为什么我也在环顾四周,而不是使用那个尘土飞扬的老家伙;)
跟进: 我已经在 Onyx (https://github.com/ozra/onyx-lang) 上工作了一年多,终于意识到要做的显而易见的事情是重写它以编译为 C++ 而不是 LLVM-IR。重新定位的想法是品牌新鲜的,所以重写仍然是蒸汽。但是您的输入将在 RFC 中得到很好的利用,如果您喜欢该语言的理念,那么您有机会塑造它。
【讨论】: