расширение языка программирования c с помощью gcc - PullRequest
12 голосов
/ 19 января 2011

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

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

будет переводиться в:

void* TcpConnection_connect(char *addr)

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

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

Ответы [ 4 ]

14 голосов
/ 19 января 2011

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

2 голосов
/ 19 января 2011

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

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

1 голос
/ 19 января 2011

Я сделал что-то похожее, чтобы встроить язык ассемблера для пользовательского формата байт-кода, используя некоторую магию макросов 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 для получения

((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 запускался раньше моего пользовательского препроцессора, и мне также понравилось, что с помощью прагм источник остается допустимым C.

1 голос
/ 19 января 2011

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

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

...