История изменений
Исправление 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, а произвольное в том числе) и некоторые другие мелочи.