LINUX.ORG.RU

собираемся портировать компилятор Си на Common Lisp

 , ,


0

7

Мы с Монком начали портировать portable C compiler на Common Lisp. Получится тот же самый компилятор, но написанный на лиспе. Есть желающие подобровольничать? Репозиторий здесь

★★★

Есть. Но с CL я сильно на вы, вам нужны пуллреквесты от новичков? Было бы здорово завести на проекте issue с тегами по сложности. Да и readme файл с общими правилами ведения проекта не помешал бы. Но в целом проект забавный, я бы поучаствовал.

Weres ★★ ()
Ответ на: комментарий от Weres

Но с CL я сильно на вы, вам нужны пуллреквесты от новичков?

Знание CL требуется минимальное. Актуальней знание Си. Нужны.

За исходник берётся ftp://pcc.ludd.ltu.se/pub/pcc/pcc-20161026.tgz Помощник нужен на каталог cc/cpp. В результате должен получится препроцессор Си.

Файлы ожидаются cpp.lisp, cpp-cpc.lisp, cpc-token.lisp.

Алгоритм переносится 1-в-1. Перенесённый кусок (пока не запускается): https://github.com/Kalimehtar/pcc — можно посмотреть стиль перевода.

monk ★★★★★ ()
Ответ на: комментарий от reprimand

Если честно - не хочу говорить, но в целом, хотим экспериментировать с различными расширениями, бекендами, генерить FFI и пр. В этом случае выгодно написать компилятор на языке более высокого уровня, чем Си.

den73 ★★★ ()

О, а почему бы не портировать GCC? :-) Лол :-)

Если серьёзно, была у меня такая идея :-) Только вот я не нашёл аргументов зачем это надо :-) Копирование уже чего-то существующего - это всегда отставание в общем :-) Потому что пока кто-то что-то копирует, кто-то другой создаёт что-то новое :-) Дело, конечно, ваше :-) Желаю вам удачи! :-)

anonymous ()
Ответ на: комментарий от DarkEld3r

Почему не на Racket?

Заказчика нет :-). После обкатки на CL, возможно будет версия и на Racket.

Сейчас главное не сломаться, а то я балдею от конструкций в коде вида

typedef struct node {
        int     n_op;
        union {
                int _reg;
                struct regw *_regw;
        } n_3;
#define n_reg   n_3._reg
#define n_regw  n_3._regw
        TWORD   n_type;
        TWORD   n_qual;
        int     n_su;
        union {
                char *  _name;
                int     _label;
#ifdef LANG_CXX
                union   dimfun *_df;
#endif
        } n_5;
        struct attr *n_ap;
        union {
                struct {
                        union {
                                struct node *_left;
                                CONSZ _val;
                        } n_l;
                        union {
                                struct node *_right;
                                int _rval;
#ifdef LANG_CXX
                                struct symtab *_sp;
#endif
                        } n_r;
                } n_u;
                void *_dcon;
#if 0
#ifdef SOFTFLOAT
#ifdef FDFLOAT
                /* To store F- or D-floats */
                struct softfloat {
                        unsigned short fd1, fd2, fd3, fd4;
                } _dcon;
#else
#error missing softfloat structure definition
#endif
#else
                long double     _dcon;
#endif
#endif
        } n_f;
} NODE;

#define n_left  n_f.n_u.n_l._left
#define n_val   n_f.n_u.n_l._val
#define n_slval n_f.n_u.n_l._slval
#define n_right n_f.n_u.n_r._right
#define n_rval  n_f.n_u.n_r._rval
#define n_sp    n_f.n_u.n_r._sp
#define n_dcon  n_f._dcon

И дальше p.n_rval подразумевает p.n_f.n_u.n_r._rval

monk ★★★★★ ()
Ответ на: комментарий от den73

В этом случае выгодно написать компилятор на языке более высокого уровня, чем Си.

задача выше среднего конечно
но лозунг - даешь компиляторо-строение а массы - весьма актуален

kto_tama ★★★★★ ()
Ответ на: комментарий от anonymous

Если тебя интересует первая часть вопроса, то было где-то на stack overflow. Общая идея - нужно грязными руками лезть в буфер, возвращаемый setjmp и воровать оттуда куски стека.

den73 ★★★ ()
Ответ на: комментарий от Shadow

Спасибо, но Си развивается и старый компилятор уже устарел. Хотя если скажете, как книжка называется, может быть, мы посмотрим.

den73 ★★★ ()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от monk

В GNU C есть __asm__ { ... }.

А в sbcl есть VOPы.

А у нас в CL будет (cc ...). Вставки на Си удобней делать.

Вставкам на Си придется договариваться с ГЦ - это непросто. Или выделять в образе отдельную область, неподконтрольную ГЦ, как в ЛиспВорксе.

anonymous ()