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

37

我一直在寻找一种与Coffeescript相似的语言,但是用于C/C++。我的意思是一种将代码转换为C语言的语言,但是保持可读性,就像Coffeescript转换为Javascript一样,易于阅读。

8个回答

23
我认为这是可能的,甚至是可取的(我在编写Node.js本地模块时会不情愿地处理C ++),但比使用像JavaScript这样的高级语言更具挑战性。
你要求的是一种可以提供语法糖而不损失性能或灵活性的语言。一些语法糖(比如语法空格或Ruby风格的def/end块而不是花括号)很容易添加。但是,如果添加任何更高级的内容,你将遇到两个主要障碍:静态类型和垃圾回收。
例如,假设你想添加隐式返回。这似乎是一个小功能,但请思考一下:为了使该功能有用,您必须至少在最后一个表达式的值与函数的返回类型不匹配时抛出编译时错误。这意味着您的编译器需要检查类似于以下行的内容:
a->b

理论上可以弄清它是什么类型,但这比CoffeeScript编译器做的要多很多。

或者说你添加了列表推导式。这意味着你正在分配一个长度在编译时不确定的数组,这意味着你以后需要自己处理它的释放。因此,语法糖实际上可能会对你造成伤害。规则"如果你malloc它,你就需要free它"是行不通的,除非编译器为您添加了malloc并且能够找出放置free的位置(通常是可能的,但需要大量的工作)。

因此,虽然我希望有人能够像对待CoffeeScript一样对待C++,但我不指望它会在不久的将来,甚至是永远。我认为更有可能的是世界最终会转向像D或Go这样的系统级编程语言。


6
我不确定这是否回答了问题,我认为你混淆了一些概念。CoffeeScript 生成的 JavaScript 文件相对易读,并没有特殊的运行时。这里的目标应该是相同的:从一个与 C++ 语义接近的高级语言生成 C++。添加一个进行垃圾收集的运行时不在讨论范围内。你必须接受有些东西与 C++ 语义紧密相关且不能被移除,但你仍然可以制作一个更易于编写和阅读的语言。... - Steph Thirion
3
即使是像不用在头文件/实现文件中重复自己这样的低挂果,已经是一个巨大的成功,但更复杂的问题也可以得到解决。就像你提到的静态类型,一些在本帖中提到的项目已经通过改进而不完全删除它来解决了它,如果你阅读它们的文档,你会看到他们解决了许多其他的问题(如没有 GObject 的 vala/genie,ooc(不幸的是,它们采用了垃圾回收方法),或 Grigory Javadyan 在评论中提到的 inv)。 - Steph Thirion
当此评论发布时,它是正确的。但现在C++14可以返回auto,例如“auto f() { return 42; }”。decltype和auto应该足够了。弄清何时释放内存不仅仅是一个语法问题。Coffeescript++可能会为智能指针和值语义提供语法。我想象一个列表推导式将成为一个向量值,并且它的销毁将像C++中一样被管理。Coffeescript++只需要实现std智能指针的逻辑即可。 - Samuel Danielson

13

我认为OOC可能是最接近Coffeescript的C语言。它是一种编程语言,具有许多动态语言的特性(对象、一级函数、简洁的语法),可以直接编译成C99。

http://ooc-lang.org/


1
我喜欢它!看起来非常有前途。 - Ian
4
OOC非常酷,但不幸的是,它添加了垃圾回收。因此,它不像CoffeeScript方法那样灵活和可移植,并且对于像游戏这样高性能的代码来说有点难以使用。显然,可以禁用GC,但目前“如果您在不使用GC的情况下使用当前的SDK,则会从每个漏洞中泄漏”:http://docs.ooc-lang.org/compilers/no-gc.html - Steph Thirion

11

看起来没有积极开发 :-( - Peter Ehrlich

11

杰辛达列出的一项你可能想知道的是:Vala/Genie 是一个针对使用 GObject 库实现对象的 C 编译器,由 Gnome 编写。 Vala 是类似于 C# 的语法,而 Genie 则类似于 Python 的语法,但在其余方面它们是相同的系统。实际上,它是因为裸的 C + GObject 对于 Gnome 的人来说太难处理了而被创建的。 Vala 做了对象和基于引用计数或所有权跟踪的自动内存管理,以及其他许多你在类似于 C# 的语言中期望的东西。

至于像 CoffeeScript 一样的属性,我 刚刚 看到 有一个实验性功能可以禁用生成的代码对 GObject 的依赖,因此它只生成没有任何运行时依赖关系的纯 C 代码。这样做会禁用许多更高级的 OO 功能,但仍然给你留下了更好的语法、基本的对象系统和(半)自动内存管理。

我不知道输出的可读性如何,但如果你通过一个漂亮的打印机运行它,它可能非常接近你要找的东西。


6
针对Python,可以参考这个问题:将Python程序转换为C/C++代码? 他们提到了Shed Skin,它可以将纯Python的子集转换为独立的C++代码。 Cython通常用于创建Python扩展模块,但如果嵌入Python解释器,则可以创建独立程序。不过这似乎不是你要找的。
Cython基于Pyrex,在许多方面都是兼容的。
对于您提到的其他语言,似乎也有类似的项目:RubyPHP。Java有Toba(虽然不再维护),Algol有Marst,BASIC有BCX,Pascal有COB2CPtoC。在这变成“从Foo到C/C++转换器列表”之前,我应该停止了。
希望这能帮到您!

4
请看这个全新的项目:https://bixense.com/coffeepp/

Coffee++

Coffee++是一种编译成C ++的小语言。它的创建是为了让C ++有类似于CoffeeScript的东西。目前,Coffee++处于α状态,不可用或最终版本。请在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";
}

1

既然已经提到了Vala和Genie,那么我想为那些怀念从月刊手工编写程序但又想使用现代GUI的人介绍BaCon(Basic Converter)。

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。


1

嗯,这不是你想要的,但是... : http://www.campbell.nu/oscar/cython/index.html - 这个Cython / Cytoc是我在1999/2000年编写的一个重要的空间(类似python)转换器,用于C / C ++,它与七年后到来的Cython项目没有关系。

坦白地说,我用Perl编写了它,它是启发式的,使用正则表达式。我将其用于Gameboy Color游戏项目(常规ansi C)。但我不会相信它...这就是为什么我也在寻找其他替代方案,而不是使用那个陈旧的老家伙的原因 ;)

跟进: 我已经在Onyx(https://github.com/ozra/onyx-lang)上工作了一年多,最终意识到明显的事情是将其重写为编译成C ++,而不是LLVM-IR。重新定位的想法非常新鲜,因此重写仍然是虚无缥缈的。但是,如果您喜欢该语言的想法,则可以在RFC中很好地利用您的输入,这是您塑造它的机会。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接