Ремесло программиста

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Ремесло программиста » Нерусские компиляторы » Tiny C Compiler от Fabrice Bellard


Tiny C Compiler от Fabrice Bellard

Сообщений 1 страница 12 из 12

1

Автор QEMU — Fabrice Bellard — написал еще нескольно занимательных программ.

Одной из них является TCC — Tiny C Compiler. Это ультра быстрый и ультра маленький компилятор С. Сразу возникает подозрение — слово “tiny” в название, да еще и “ультра быстрый” и “ультра маленький”. Главный вопрос — какие у него ограничения?

Как заявляет автор, TCC полностью поддерживает стандарт языка С вплоть до ISO C99 включительно, но целевая платформа только x86. Компилятор имеет также мини версию системной библиотеки libc. Когда это возможно, компилятор совмещает фазы компилирования, ассемблирования и линковки для дополнительного ускорения, хотя поддерживаются стандартные ABI и можно подлинковать что-то готовое.

Компилятор доступен в исходных текстах и в двоичном виде под Windows. Скомпилировать его можно вручную, например, самим же TCC.

Занимательная статья о применении возможностей этого компилятора - ссылка

2

Яр написал(а):

Компилятор доступен в исходных текстах и в двоичном виде под Windows.

- Надо облегчить читателям поиск ссылок на исходники...

Скачать

ISO демо-изображения: tccboot.iso (5.9 MB).
Создайте компакт - диск из него и загрузите его, чтобы увидеть TCCBOOT в действии (ПК с требуется не менее 64 МБ оперативной памяти). Вы также можете попробовать его с ПК эмулятор QEMU .

TCCBOOT исходный код: tccboot-0.1.tar.gz и README файл.

Отредактировано Сандро (2016-12-14 15:46:27)

3

Замечательный компилятор! Балдею от него :) Есть, конечно, некоторые претензии к нему. Во-первых, это C, а не C++. Во-вторых, использование компилятора в качестве интерпретатора имеет некоторое ограничение. Допустим, я в результате компиляции получил myprog.exe. Тогда я её могу вызвать, передав программе аргументы командной строки. Если же я вызываю tcc для компиляции "на лету", то я передаю tcc аргументы командной строки: собственно исходник на Си и плюс опции при компиляции. Но как потом передать аргументы командной строки откомпилированному модулю, да ещё в той же самой строке, в которой передаются аргументы для tcc? Пока что не нашёл ответа на такой вопрос. Может, его задать Белларду?

4

А если не секрет что может быть за задача в которой нужно собрать программы и сразу же ее запустить с параметрами?
тесты:?

через "&&" не пробовали

Код:
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install

или разделитель точка с запятой

Код:
cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install

5

Есть несколько схем преобразователей. А какая вам из них нравится и почему?
К примеру Глагол. Минимум постороннего кода. Я бы даже сказал непонятно где он компилируется скорее это ассемблер с переведенными словами.
LCC это си в том виде переносимого ассемблер. Тут отчётливо видно где и что упростили. Нет секции деклорации типы только простые. Нет вложенных функций.  Человеко понятные автоматы. Сам такие использую, только у меня они ещё проще.
TCL - минимальная граматика. А разбор и компиляция зависит от первого слова в строке. Этакий бесик только функциональгой парадигмы. Причём с запретом смешиват целые и рациональные числа.
И тд.

У меня компилятор не такой элегантный. Он по запутанее будет. Но и возможностей, вернее потенциал больше.  У меня разбор текста идёт в синтаксическое дерево. Но с элементами семантики, вместо дублирования имён идёт ссылка на их декларацию.
В последствии думаю над разделением.

6

А если не секрет что может быть за задача в которой нужно собрать программы и сразу же ее запустить с параметрами?

Возьмите ЛЮБУЮ задачу, которой передаются аргументы командной строки. Вариант 1, файл "exe" уже существует:

Код:
myprog.exe arg1 arg2 arg3

Так мы запускаем ЛЮБУЮ откомпилированную программу с параметрами. А теперь вариант 2, "exe" не существует, но существует исходник, тогда на компилируется на лету так:

Код:
tcc <myprog.c> <опции для компилятора> <а как передать arg1 arg2 arg3 
                                 полученному на лету исполняемому коду?>

Решили Вы, например, написать архиватор. А ему передаются параметры при запуске:

arh  from to

А как ещё Вы бы  сообщали программе, какой файл надо архивировать, если у неё нет графического интерфейса? Самое простое - передать недостающую программе информацию через командную строку.

Отредактировано Юрий (2016-12-27 23:22:49)

7

Тем и хорош лисп, что в нём подобные вопросы решены лет этак 40 назад.

Код:
(defun Сложить-два-числа (Икс Игрек)
  (+ Икс Игрек))
;; с этого момента функция Сложить-два-числа существует как интерпретируемая
(compile 'Сложить-два-числа)

(Сложить-два-числа 2 2)
4
(disassemble 'Сложить-два-числа)
; disassembly for Сложить-два-числа
; Size: 57 bytes. Origin: #x1008D9A1FA
; 1FA:       498B4C2460       MOV RCX, [R12+96]               ; thread.binding-stack-pointer
                                                              ; no-arg-parsing entry point
; 1FF:       48894DF8         MOV [RBP-8], RCX

; 203:       84042500000F20   TEST AL, [#x200F0000]           ; safepoint

;;; [3] (BLOCK Сложить-два-числа (+ Икс Игрек))

; 20A:       49837C246800     CMP QWORD PTR [R12+104], 0      ; thread.stepping
; 210:       7402             JEQ L0
; 212:       CC0F             BREAK 15                        ; single-step trap (before)

;;; [4] (+ Икс Игрек)

; 214: L0:   488BD6           MOV RDX, RSI
; 217:       488BFB           MOV RDI, RBX
; 21A:       41BBC0010020     MOV R11D, 536871360             ; GENERIC-+
; 220:       41FFD3           CALL R11
; 223:       488B5DE8         MOV RBX, [RBP-24]
; 227:       488B75F0         MOV RSI, [RBP-16]

; 22B:       488BE5           MOV RSP, RBP
; 22E:       F8               CLC
; 22F:       5D               POP RBP
; 230:       C3               RET
; 231:       CC10             BREAK 16                        ; Invalid argument count trap

То же самое можно будет и в Яре.

8

budden написал(а):

(Сложить-два-числа 2 2)

Честно говоря, я не уверен что это подходящий способ наименования - с запихиванием кол-ва и типа параметров словами.
Ну, кол-во в подобных языках обычно пишут числом а-ля "сложить2числа".
По смыслу же это вообще скорее "сумма", а не "сложить" - переводя Лисп следует избегать глаголов.

Отредактировано MihalNik (2016-12-28 01:55:38)

9

Мне кажется, одна из проблем данного сообщества - попытка обсуждать всё в каждой теме. Давайте не отвлекаться от смысла примера - он вовсе не в том, как названа функция. Впрочем я и сам хорош - обсуждать лисп в теме про tcc, но тут всё же речь идёт о "компиляции на лету", так что более-менее в тему (я надеюсь).

Отредактировано budden (2016-12-28 11:44:51)

10

Юрий написал(а):

Но как потом передать аргументы командной строки откомпилированному модулю, да ещё в той же самой строке, в которой передаются аргументы для tcc?

Самым логичным образом. Покажем на примере:

Код:
echo 'main(int c,char**v){while(c > 1){c-=1;printf("%s\n", v[c]);}}' | tcc -w -run - some arg "some arg"
Код:
some arg
arg
some

11

http://s5.uploads.ru/7eqa1.jpg

12

Я не знаю, что эта строка означает в командной строке Windows. В Bash GNU/Linux это вывод через echo программы через стандартный выход, который в параллели переводится в стандартный ввод  tcc, который через указание "-" понимает, что программу следует считывать именно оттуда.

Отредактировано Comdiv (2018-12-22 01:00:35)


Вы здесь » Ремесло программиста » Нерусские компиляторы » Tiny C Compiler от Fabrice Bellard