类似CoffeeScript的C/C++语言

CoffeeScript-like language for C/C++

本文关键字:C++ 语言 CoffeeScript 类似      更新时间:2023-10-16

我一直在寻找一种语言,它提供与Coffeescript相同的功能,但适用于C/C++。我指的是一种将代码转换为C,但可读的语言,就像CoffeeScript转换为Javascript一样,可读。

我认为这是可能的,甚至是可取的(在编写Node.js本机模块时,我不情愿地使用C++),但比使用JavaScript等高级语言更具挑战性。

你想要的是一种在不牺牲性能或灵活性的情况下提供语法糖的语言。一些语法糖(比如,语法空白或Ruby风格的def/end块,而不是大括号)添加起来很简单。但是,添加任何更高级的东西,都会遇到两个主要障碍:静态类型和垃圾收集。

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

a->b

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

或者说你添加了列表综合。这意味着您正在分配一个在编译时长度未知的数组,这意味着您以后需要自己解除分配它。所以句法糖实际上可能会伤害你。如果编译器为您添加malloc,则"如果您malloc,则您free"规则不起作用,除非它能找出将free放在哪里(同样,这通常是可能的,但需要大量工作)。

所以,虽然我很想有人给C++CoffeeScript处理,但我不希望它很快发生——如果有的话。我认为世界最终更有可能转向D或Go这样的系统级编程。

我认为OOC可能是最接近C的Coffeescrapt。它是一种编程语言,具有许多动态语言(对象、第一类函数、干净语法)的功能,可以直接编译到C99中。

http://ooc-lang.org/

您可能想知道的Jacindas列表中缺少一项:Vala/Genie是一个以C为目标的编译器,由Gnome编写的GObject库实现对象。Vala是类似C#的语法,Genie是类似Python的语法,但对于其他语法,它们是相同的系统。它的创建实际上是因为裸露的C+GObject对Gnome的人来说太痛苦了。Vala基于引用计数或所有权跟踪进行对象和自动内存管理,以及在类似C#的语言中所期望的许多其他功能。

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

我不知道输出的可读性有多强,但如果你用一台漂亮的打印机打印,它可能非常接近你想要的。

SugarCpp是一种可以编译到C++11的语言。这应该是你想要的。参观https://github.com/curimit/SugarCpp了解更多详细信息。

具体针对Python,看看这个问题:将Python程序转换为C/C++代码?

他们提到了Shed-Skin,它将采用纯python的一个子集,并转换为独立的C++代码。

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

Cython基于Pyrex,它们在许多方面都是兼容的。

对于您提到的其他一些语言,似乎也有类似的项目:Ruby和PHP。Java的Toba(虽然不再维护),Algol的Marst,BASIC的BCX,COB2C,Pascal的PtoC,我可能应该在这变成"从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(Basic Converter),供那些回忆起每月打印出版物中手工编码程序,但想将其与现代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。

好吧,这不是你想要的,但..:http://www.campbell.nu/oscar/cython/index.html-这个cython/cellc是我在1999/2000年左右编码的C/C++的一个重要的空间(蟒蛇)转译器,它与七年后到来的cython项目无关。

坦率地说,我是用Perl写的,它是启发式的,使用正则表达式。我把它用于Gameboy Color游戏的整个项目(常规ansi C)。但我不会相信它……这就是为什么我也四处寻找,而不是使用那个尘土飞扬的老家伙;)

后续行动:我一直在研究Onyx(https://github.com/ozra/onyx-lang)经过一年多的时间,终于意识到要做的显而易见的事情是重写它,将其编译为C++,而不是LLVM-IR。重新定位的想法是全新的,所以重写仍然是蒸汽。但是你的输入会在RFC中得到很好的利用,如果你喜欢这种语言的想法,那就是你塑造它的机会