Подтвердить что ты не робот

CoffeeScript-подобный язык для C/С++

Я искал язык, который предоставляет ту же функциональность, что и Coffeescript, но для C/С++. Я имею в виду язык, который преобразует код в C, но читаемый, так же как CoffeeScript преобразует в Javascript, читаемый и все.

4b9b3361

Ответ 1

Я думаю, что это возможно и даже желательно (я неохотно занимаюсь С++ при написании собственных модулей Node.js), но более сложным, чем с языком более высокого уровня, например JavaScript.

То, о чем вы просите, - это язык, который обеспечивал бы синтаксический сахар, не жертвуя производительностью или гибкостью. Некоторые синтаксические сахара (например, синтаксические пробелы или блокировки в стиле Ruby def/end вместо фигурных скобок) были бы тривиальными для добавления. Но добавив что-нибудь более продвинутое, вы столкнетесь с двумя основными препятствиями: статической типизацией и сборкой мусора.

Например, скажем, что вы хотите добавить неявные возвращения. Похоже, что это небольшая функция, но подумайте над этим: чтобы функция была полезной, вам придется, по крайней мере, выбросить ошибку времени компиляции, когда значение последнего выражения не соответствует возвращаемый тип функции. Это означает, что вашему компилятору необходимо проверить строку типа

a->b

и выяснить, какой тип. Это возможно в принципе, но это чертовски много больше, чем компилятор CoffeeScript.

Или скажите, что вы добавили понимание списка. Это означает, что вы выделяете массив, длина которого неизвестна во время компиляции, а это значит, что вам нужно будет позже освободить его самостоятельно. Таким образом, синтаксический сахар может навредить вам. Правило "Если вы malloc он, вы free он" не работает, если компилятор добавляет в malloc для вас, если только он не может выяснить, куда положить free (который, опять же, как правило, возможно, но потребуется много работы).

Итак, хотя мне бы хотелось, чтобы кто-то дал С++ обработку CoffeeScript, я не ожидаю, что это произойдет в ближайшее время - если когда-либо. Я думаю, что более вероятно, что мир в конечном итоге перейдет к чему-то вроде D или Go для программирования на системном уровне.

Ответ 2

Я думаю, что OOC, вероятно, ближе всего к Coffeescript для C. Это язык программирования с множеством функций, которые вы ожидаете от динамических языков (объектов, функций первого класса, чистого синтаксиса), который компилируется непосредственно на C99.

http://ooc-lang.org/

Ответ 3

SugarCpp - это язык, который может скомпилировать С++ 11. Это должно быть то, что вы ищете. Подробнее см. https://github.com/curimit/SugarCpp.

Ответ 4

Из списка Jacindas, о котором вы могли бы узнать, может потребоваться один элемент: Vala/Genie - это компилятор, нацеленный на C с библиотекой GObject, реализующей объекты, написанные Gnome. Вала - синтаксис, похожий на С#, и синтаксис Genie, подобный Python, но для остальных это одна и та же система. Это было фактически создано, потому что голый C + GObject стал слишком большой болью для работы с парнями Gnome. Vala делает объекты и автоматическое управление памятью на основе подсчета ссылок или отслеживания собственности, а также многое другое, что вы ожидаете на языке С#.

Что касается свойства CoffeeScript, я просто saw существует экспериментальная возможность отключить зависимость сгенерированного кода в GObject, поэтому он генерирует только обычный C без каких-либо зависимостей во время выполнения. Это приводит к отключению нескольких дополнительных функций OO, но по-прежнему дает вам лучший синтаксис, базовую систему объектов и (полу) автоматическое управление памятью.

Я не знаю, насколько читаем вывод, но если вы запустите его через красивый принтер, он может быть очень близок к тому, что вы ищете.

Ответ 5

Для Python специально рассмотрите этот вопрос: Преобразование программы Python в код C/С++?

Они упоминают Shed Skin, который возьмет подмножество чистого python и преобразуется в автономный код С++.

Cython обычно используется для создания модулей расширения Python, но может создавать автономные программы, если Python интерпретатор внедрен. Это не похоже на то, что вы ищете.

Cython основан на Pyrex, и они совместимы друг с другом разными способами.

Для некоторых других языков, о которых вы говорили, похоже, есть похожие проекты: Ruby и PHP. Toba для Java (хотя больше не поддерживается), Marst для Algol, BCX для BASIC, COB2C, PtoC для Pascal, и я должен, вероятно, остановиться там до того, как это превратится в "Список преобразователей от Foo до C/С++".

Надеюсь, что это поможет!

Ответ 6

Так как vala и genie уже упоминались, я поставлю 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" ) и плагинов для почти каждой среды ID с открытым исходным кодом или вы можете использовать BACON IDE.

Ответ 7

Взгляните на этот новый новый проект: https://bixense.com/coffeepp/

Кофе ++

Кофе ++ - это небольшой язык, который компилируется в С++. Он был создан, чтобы иметь что-то похожее на CoffeeScript для С++. В настоящее время Coffee ++ находится в альфа-состоянии и вовсе не используется или окончательно. Посмотрите источник на Github, чтобы принять участие.

Золотое правило Coffee ++: "Это просто С++". Код компилируется один-к-одному в эквивалентный С++, и нет библиотеки времени выполнения. Вы можете свободно использовать любую существующую библиотеку С++ из Coffee ++ (и наоборот).

Обзор:

исходный файл 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";
}

Ответ 8

Ну, это не то, что вы хотите, но..: http://www.campbell.nu/oscar/cython/index.html - Этот cython/cytoc является значительным пространством (pythonish ) transpiler для C/С++, который я закодировал в 1999/2000 году, он не имеет никакого отношения к проекту cython, который появился через семь лет.

Честно говоря, я написал его в Perl, и он эвристический, используя регулярные выражения. Я использовал его для всего проекта игры Gameboy Color (обычный ansi C). Но я не верю в это... Вот почему я тоже оглядываюсь, вместо того, чтобы использовать этого пыльного старого педераста;)

Последующие действия: Я работаю над Onyx (https://github.com/ozra/onyx-lang) на год плюс сейчас, и, наконец, понял, что нужно сделать, это переписать его на скомпилируйте вместо С++ вместо LLVM-IR. Идея повторной цели - это бренд свежий, поэтому переписывать все еще пар. Но ваш вход будет хорошо использован в RFC, если вам нравится идея языка, это ваш шанс сформировать его.