LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Компиляторы Си существуют под все хоть чуть-чуть актуальные платформы. Различается уровень поддержки ими новых стандартов, однако ничто не мешает мне преобразовывать новый синтаксический сахар в другой вид (возможно, в будущем добавлю опции типа «генерировать C89 код»). Даже LLVM не может похвастаться такой распространённостью.

Если бы мне был нужен просто «Си с классами», то было бы логично написать гору макросов для какого-нибудь M4 и препроцессить исходник, но я планирую добавить и другие фичи, в том числе те, которых нет и в C++ (в синтаксисе тех же структур я конечно же оглядываюсь на С++), а для них уже нужно побольше информации, чем у простых макросов.

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

void f() {
    char buffer[100];
    file.read(buffer, sizeof(buffer));
    printf("%s\n", buffer);
}

Которое превращается в:

void FileStream_read(FileStream *stream, void *buffer, size_t count, void (*callback)(void*), void *callbackArg);
...
struct State {
    char buffer[100];
};

void f() {
    struct State *state = malloc(sizeof(State));
    f1(state);
}

void f1(struct State *state) {
    FileStream_read(&file, state->buffer, sizeof(state->buffer), f2, state);
}

void f2(struct State *state) {
    printf("%s\n", state->buffer);
}

Ну это я схематично обрисовал. Я ещё продумываю механизм как всё это будет работать.

Помимо этого ещё хочу сделать что-то типа C++ шаблонов, но с большими возможностями. В смысле, что должно быть возможно налету генерировать имя функции (не MyClass<int, int>::myFunc, а произвольное в том числе) и некоторые другие мелочи.

Исходная версия KivApple, :

Компиляторы Си существуют под все хоть чуть-чуть актуальные платформы. Различается уровень поддержки ими новых стандартов, однако ничто не мешает мне преобразовывать новый синтаксический сахар в другой вид (возможно, в будущем добавлю опции типа «генерировать C89 код»). Даже LLVM не может похвастаться такой распространённостью.

Если бы мне был нужен просто «Си с классами», то было бы логично написать гору макросов для какого-нибудь M4 и препроцессить исходник, но я планирую добавить и другие фичи, в том числе те, которых нет и в C++ (в синтаксисе тех же структур я конечно же оглядываюсь на Си), а для них уже нужно побольше информации, чем у простых макросов.

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

void f() {
    char buffer[100];
    file.read(buffer, sizeof(buffer));
    printf("%s\n", buffer);
}

Которое превращается в:

void FileStream_read(FileStream *stream, void *buffer, size_t count, void (*callback)(void*), void *callbackArg);
...
struct State {
    char buffer[100];
};

void f() {
    struct State *state = malloc(sizeof(State));
    f1(state);
}

void f1(struct State *state) {
    FileStream_read(&file, state->buffer, sizeof(state->buffer), f2, state);
}

void f2(struct State *state) {
    printf("%s\n", state->buffer);
}

Ну это я схематично обрисовал. Я ещё продумываю механизм как всё это будет работать.

Помимо этого ещё хочу сделать что-то типа C++ шаблонов, но с большими возможностями. В смысле, что должно быть возможно налету генерировать имя функции (не MyClass<int, int>::myFunc, а произвольное в том числе) и некоторые другие мелочи.