【问题标题】:CoffeeScript-like language for C/C++用于 C/C++ 的类 CoffeeScript 语言
【发布时间】:2011-09-05 15:01:22
【问题描述】:

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

【问题讨论】:

    标签: c++ c compiler-construction


    【解决方案1】:

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

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

    例如,假设您想添加隐式返回。这似乎是一个小功能,但请考虑一下:为了使该功能有用,您必须(至少)在最后一个表达式的值与函数的返回类型。这意味着您的编译器需要检查像

    这样的行
    a->b
    

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

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

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

    【讨论】:

    • 我不确定这是如何回答这个问题的,我认为你在混淆事情。 CoffeeScript 生成相对可读且没有特殊运行时的 javascript 文件。这里的目标应该是相同的:从语义上接近它的高级语言生成 C++。添加执行垃圾收集的运行时是题外话。您必须接受某些东西在语义上与 C++ 相关联并且无法删除,但您仍然可以制作一种更易于编写和阅读的语言。 ...
    • ... 即使是在头文件/实现文件中不必重复自己的低级成果也已经是一个巨大的胜利,但可以解决更复杂的问题。举个例子,你提到了静态类型,它在这个线程中提到的一些项目没有完全删除它的情况下得到了改进,如果你阅读他们的文档,你会看到他们出色解决的许多其他示例(vala/genie without GObject,ooc(不幸的是,他们走的是垃圾收集之路)),或者是 Grigory Javadyan 在 cmets 中提到的 inv)。
    • 此评论在发布时属实。但是现在 C++14 可以像“auto f () { return 42; }”一样返回 auto。 decltype 和 auto 应该足够了。弄清楚何时释放()不仅仅是一个语法问题。 Coffeescript++ 可能会为智能指针和值语义提供语法。我想列表理解将成为一个向量值,并且它的破坏将与在 C++ 中一样进行管理。 Coffeescript++ 只需要实现 std 智能指针的逻辑就可以做到这一点。
    【解决方案2】:

    我认为 OOC 可能是最接近 C 的 Coffeescript 的东西。它是一种编程语言,具有许多动态语言所期望的特性(对象、一等函数、干净的语法),可直接编译成 C99。

    http://ooc-lang.org/

    【讨论】:

    • 我喜欢!看起来很有希望。
    • ooc 非常酷,但不幸的是,它添加了垃圾收集。所以它不像 CoffeeScript 方法那样灵活和可移植,而且对于像游戏这样的高性能代码来说有点不可用。显然,可以禁用 GC,但目前“如果您使用当前的 SDK 没有 GC,它只会从每个孔泄漏”:docs.ooc-lang.org/compilers/no-gc.html
    【解决方案3】:

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

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

    我不知道输出的可读性如何,但如果您通过漂亮的打印机运行它,它可能与您要查找的内容非常接近。

    【讨论】:

      【解决方案4】:

      SugarCpp 是一种可以编译为 C++11 的语言。它应该是你正在寻找的东西。访问https://github.com/curimit/SugarCpp了解更多详情。

      【讨论】:

      • 看起来没有积极开发:-(
      【解决方案5】:

      特别是对于 Python,看看这个问题: Convert Python program to C/C++ code?

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

      Cython 通常用于创建 Python 扩展模块,但如果 Python 解释器是 embedded,则可以创建独立程序。不过,这听起来不像您要找的东西。

      Cython 基于Pyrex,它们在许多方面相互兼容。

      对于您提到的其他一些语言,似乎有类似的项目:RubyPHPToba 用于 Java(尽管不再维护),Marst 用于 Algol,BCX 用于 BASIC,COB2CPtoC 用于 Pascal,在这变成“从 Foo 到C/C++。”

      希望有帮助!

      【讨论】:

        【解决方案6】:

        看看这个全新的项目: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";
        }
        

        【讨论】:

          【解决方案7】:

          由于已经提到了 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。

          【讨论】:

            【解决方案8】:

            好吧,这不是你想要的,但是.. :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 中得到很好的利用,如果您喜欢该语言的理念,那么您有机会塑造它。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-01-22
              • 1970-01-01
              • 2017-07-31
              • 1970-01-01
              • 2022-08-19
              • 1970-01-01
              • 2010-10-13
              相关资源
              最近更新 更多