CoffeeScript-подобный язык для C / C ++ - PullRequest
37 голосов
/ 31 мая 2011

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

Ответы [ 8 ]

22 голосов
/ 18 июня 2011

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

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

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

a->b

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

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

13 голосов
/ 11 июля 2011

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

http://ooc -lang.org /

11 голосов
/ 05 июля 2013

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

10 голосов
/ 14 августа 2011

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

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

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

6 голосов
/ 08 июня 2011

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

В них упоминается Shed Skin , который возьмет подмножество чистого Python и преобразует его в автономный код C ++.

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

Cython основан на Pyrex , и они совместимы друг с другом во многих отношениях.

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

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

1 голос
/ 22 июля 2017

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

Кофе ++

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

Золотое правило Coffee ++: «Это просто C ++». Код компилируется один в один в эквивалентный C ++, и нет библиотеки времени выполнения. Вы можете использовать любую существующую библиотеку C ++ из 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";
}
1 голос
/ 22 декабря 2012

Поскольку vala и genie уже упоминались, я выложу BaCon (Basic Converter) для тех, кто вспоминает о программах ручного кодирования из ежемесячной публикации print , но хочет использовать ее с современным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 с открытым исходным кодом илиВы можете использовать бекон IDE.

0 голосов
/ 01 августа 2014

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

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

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

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