Расширение языка программирования c с помощью gcc

Я хочу написать свой собственный язык программирования как расширение языка программирования c. Весь язык программирования, который я изобретаю, - это просто короткие слова, которые переводят на действительный код. Например:

namespace TcpConnection {
    void* connect(char *addr)
}

переводится на:

void* TcpConnection_connect(char *addr)

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

В любом случае, результат вполне допустимый C-код. Есть ли способ сделать это, не вдаваясь в код gcc?

Ответ 1

Вы можете написать препроцессор, который анализирует ваш язык и компилирует его на C, который затем передается в gcc. Именно так работали ранние реализации С++. Тем не менее, вы можете предпочесть взломать Clang LLVM, который предназначен для поддержки нескольких языков семейства C и, как часть LLVM, также предназначен для более модульной и простой в расширении.

Ответ 2

Для прототипирования, возможно, просто пойдите с препроцессором, написанным на выбранном вами языке (C, Perl, Python...), а затем создайте его в своих правилах Makefile. Просто чтобы получить простой, недорогой способ попробовать все это...

Используйте другое расширение файла и включите .foo в .c.

Ответ 3

Я сделал что-то похожее на встраивание языка ассемблера для пользовательского формата байт-кода, используя некоторые макросы макросов C99 и Perl.

Макросы

#define x3_pragma_(...) _Pragma(#__VA_ARGS__)
#define x3_asm(...) ((const struct x3instruction []){ \
    x3_pragma_(X3 ASM __VA_ARGS__) \
})

преобразования

x3_asm(exit = find val(0))

в

((const struct x3instruction []){
#pragma X3 ASM exit = find val(0)
})

который передается через Perl script, чтобы получить

((const struct x3instruction []){
{ { { X3_OPFINDVAL, { .as_uint = (0) } }, { X3_OPEXIT, { 0 } } } },
})

Образец вызова gcc и perl будет выглядеть так:

gcc -E foo.c | perl x3pp.pl | gcc -o foo.o -x c -

Это сложнее, чем необходимо, но мне показалось, что препроцессор C работает до моего пользовательского препроцессора, и мне также понравилось, что с помощью прагм, источник остается законным.

Ответ 4

Вы можете взломать что-то поверх http://cil.sourceforge.net/

Clang - еще один вариант, но это не самый полезный инструмент для перезаписи кода, а также изменение его интерфейса для парсера не так просто.