LINUX.ORG.RU

Компилятор Си в виде shell-скрипта

 , ,


0

2

На Гитхабе выложен компилятор C89 в ELF64 на языке shell (sh, не bash). 7796 строк, лицензия ISC (isc.org) (эквивалентна MIT).

>>> Новость на opennet.ru

>>> Скрипт на GitHub

★★★★★

Проверено: dataman ()
Последнее исправление: CrX (всего исправлений: 2)

Это конечно прикольно, но не нужно я полагаю. Ибо оптимизации там скорее всего отсутствуют.

Rodegast ★★★★★
()

У Doom на CSS появился достойный конкурент за звание «Самое хитровыдуманное ненужно»

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

Да ладно бы это человек написал… Там хоть можно было бы его поуважать за упоротость и целеустремлённость. Но это ж поди бредогенератором сделано.

Zhbert ★★★★★
()

Должно быть хацкеры оценят удобство создания кроссплатформенных руткитов на базе этой штуки

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Zhbert

Да ладно бы это человек написал… Там хоть можно было бы его поуважать за упоротость и целеустремлённость. Но это ж поди бредогенератором сделано.

Этот же человек пишет и другие сложные скрипты на шелле.

P.S. Хотя у него в блоге самая новая заметка — про использование ИИ. Может и им.

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

Я прям уверен, что это не будет работать вообще никак, за исключением пары кейсов на машине разрабочтика. Как с «я написал ОС идиотом за два дня», а оно там, оказывается, и не работает нихрена.

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

Это может быть интересно для бутстрэппинга

Ну это если ты собрался свой язык с нуля придумывать, но сабж только про C, так что вряд ли :)

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

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

Нет, именно чтобы иметь проверенный компилятор Си, чтобы им собирать остальные компиляторы. Ограничивает только привязка к ELF64.

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

Нет, именно чтобы иметь проверенный компилятор Си, чтобы им собирать остальные компиляторы.

А то что остальные компиляторы будут сильно медленнее тебя нисколько не смущает?

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

А то что остальные компиляторы будут сильно медленнее тебя нисколько не смущает?

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

Вот только пишут, что он не поддерживает макросы.

question4 ★★★★★
() автор топика

Казалось бы уже ничего удивить не может…

gagarin0
()
Ответ на: комментарий от question4

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

Вот только такой компилятор уже не будет доверенным.

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

В комментариях показано, что он «hello world» собрать не может. Не знаю, что вы подразумевали под «макросы», но там вобще нет препроцессора. Ни ″#include″ не поддерживаюся, ни внешние библиотеки (printf()). Определён минимальный набор системных вызовов и функций из libc. Но, как бы ладно, какой-то код можно писать, но он hello.c ругается:

c89cc.sh: line 7435: INTERNAL: command not found

То есть портровать под него код с таким уровнем сообщений об ошибках будет тот ещё цирк. Компилятор Си им не собрать, только если tiny C под него портировать и дальше начать движение.

привязка к ELF64

К x86, там прямо в коде HEX опкоды, и я не увидел тестовых примеров к этому компилятору. Так, конечно, всё хорошо, но не понятно, автор как проверял, что нигде в опкодах не опечатался?

для бутстрэппинга.

А разве этим можно под Линуксом заниматься, где всё в закладках? Только что-то древнее, загружаемое с перфоленты, где все дырочки проверены, а там ELF64 нету и __syscall() нету :)

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

Почему? Принимается, что исходник прочитан и в нём закладок не найдено. Закладка в бинарном компиляторе и она во все новые бинарники «плохо» код добавляет.

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

Принимается, что исходник прочитан и в нём закладок не найдено

«На 2019 год, GCC насчитывал примерно 15 миллионов строк кода» как ты все их прочитаешь?

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

Чтобы собрать GCC 2.95 без закладок, например.

А ты хоть пробовал запускать сие? Ну вот прежде чем нести бред в комменты просто скопипастить hello world и скормить ему? Это же не требует каких-то невероятных усилий, долгих размышлений, вдумчивого чтения… Просто тестовая среда и 2 файла, микроскопическая интеллектуальная ступенька на которую можно шагнуть прежде чем распахивать болтливый рот.

Когда вас всех уже на ИИ позаменяют, а?

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

там вобще нет препроцессора

Но, как бы ладно, какой-то код можно писать, но он hello.c ругается

У меня тоже поругался, ибо думал, что #include отработает.

Определён минимальный набор системных вызовов и функций из libc.

Вот с ними можно выдавить заветное приветствие:

$ cat hello.c 
int main()
{
	puts("Hello, world!");
	return 0;
}
$ sh c89cc.sh < hello.c > hello
$ chmod +x hello
$ ./hello
Hello, world!

Но без препроцессора да – грустновато.

Jullyfish
()

Я слышал легенду, что когда-то давно, сишный компилятор был в виде shell-скрипта… Может это возвращение к истокам?

Jullyfish
()
Ответ на: комментарий от Rodegast

15 миллионов строк кода

Ну, исходно речь шла про старый gcc, там поскромнее:

[mky /tmp-ram/gcc-2.95.3]# cloc .
    2775 text files.
    2655 unique files.                                          
     700 files ignored.
---------------------------------------------------------------------------------------
Language                             files          blank        comment           code
---------------------------------------------------------------------------------------
C                                      851         118418         128527         598359
...
---------------------------------------------------------------------------------------
SUM:                                  2075         186076         209018         944587

Но и в более свежей версии cloc даёт данные поменьше 15 млн.:

[mky /tmp-ram/gcc-10-20221208]# cloc .
  101333 text files.
  100465 unique files.                                          
    4953 files ignored.
Language                             files          blank        comment           code
---------------------------------------------------------------------------------------
C                                    42900         660608         864518        3367242
C++                                  26112         213083         271381         957872
...
---------------------------------------------------------------------------------------
SUM:                                 96422        2005305        2565377        9172129

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

Не слышал такой легенды, вроде, прообраз Си появился раньше, чем shell. Вот здесь Нашлась единственная уцелевшая копия ОС Unix v4 ссылка на исходники unix v.4, там вполне Си написаный на Си (только ещё даже не K&R-Си), в комментариях 1972 год.

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

то что остальные компиляторы будут сильно медленнее тебя нисколько не смущает?

Не будут. Поскольку тот же GCC при сборке сначала собирает временную версию себя, а потом еще раз пересобирает себя уже ею.

Так что медленным будет только процесс сборки компилятора. А тут можно и подождать.

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

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

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

Там большую часть кода занимает гигантская машина состояний.

Явно это было написано на каком-то высокоуровневом представлении, возможно с использованием одного из DSL для создания парсеров, а затем машинно транслировано в shell и вручную доработано.

Что касается ИИ, он не способен решать подобные нестандартные задачи. Это вам не сайт на NodeJS накалякать по шаблонам из обучающей выборки. В такой работе ИИ возможно применять чисто локально, например, для ревью набора функций.

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

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

Кстати, мне недавно пришлось консультироваться с ИИ на предмет задач обработки натурального языка. И это было печально. ИИ может хорошо объяснить каждую особенность локально, потому что он понимает грамматику, словарь, имеет в своей «памяти» кучу примеров употребления на каждый кейс. Но у меня таких кейсов - несколько тысяч образцов, и на их основе нужно написать алгоритм обработки строк с учётом всех нюансов.

Никакой Клод Опус с такой задачей не справляется., код нужно писать ручками, консультируясь с ИИ на предмет отдельных правил.

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

Компьютеры должны были укрепить доверие между людьми, а не примкнуть к злу.

kaldeon ★☆
()

Скрипт на GitHub

По ссылке у автора погоняло alganet. Звучит как резидент Иннополиса.

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

Но и в более свежей версии cloc даёт данные поменьше 15 млн

Ну хорошо, не 15, а 1 млн... Тебе будет от этого сильно легче? А теперь представь что там где то вроде такого написано программа из одной строчки ни Perl :D

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

А теперь представь что там где то вроде такого написано программа из одной строчки ни Perl

Значит надо разбираться и патчить :)

Но да, аудит компилятора — работа не для энтузиаста-одиночки.

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

Команда из десятка кодеров вполне может 1 млн. строк просмотреть, изучить. В нормальном коде упомянутый однострочник на perl сразу бросается в глаза, что это какая-то хрень. Если бы gcc был весь из подобных однострочников, даже если бы он компилил код, никто бы его сопровождать не стал.

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

Если есть довереная система, в которой первый компилятор ничего лишнего в код не добавляет, то можно спокойно пересобирать и пересобирать всё остальное, каждый раз добавляя более сложные аналазиторы.

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

Макросы — фигня, можно же, ЕМПНИ, gcc -E, или ещё чем развернуть макросы/инклуды. Или дождаться препроцессора Си-кода на sh :) Оно линковаться со сторонней библиотекой не умеет, там printf и кучи всего нет. Если весь этот код из библиотеки добавлять в исходник, будет страшно.

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

Или дождаться препроцессора Си-кода на sh :)

Вейп-кодеры родят, надо только верить! (%

Оно линковаться со сторонней библиотекой не умеет, там printf и кучи всего нет.

И не должно. Это ж компилятор, а не линковщик.

Если весь этот код из библиотеки добавлять в исходник, будет страшно.

Как будто уже сейчас оно не страшное. (%

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

Команда из десятка кодеров вполне может 1 млн. строк просмотреть, изучить.

Если у тебя есть команда которая может верифицировать код GCC, то сабж тебе точно будет не нужен :D

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

А откуда вы уверены что в шелле нет закладок? А то чем шелл собрали?

Где-то видел безумное решение с виртуальной машиной, как раз только для бутстрапинга.

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

А откуда вы уверены что в шелле нет закладок?

Я этим вопросом не задавался. А вот автор последние месяцы этот вопрос внимательно изучает.

И кроме того, маловероятна закладка, предусматривающая такое неожиданное и неэффективное применение шелла :)

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

Это ж компилятор, а не линковщик.

Он же ELF-файл делает, а не .o (obj).

сейчас оно не страшное.

Я подразумевал, в исходный компилируемый код на Си добавить исходный код printf() и прочих недостающих функций. Будет страшно неудобно искать ошибки и страшно долго компилироваться.

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

Это ж компилятор, а не линковщик.

Он же ELF-файл делает, а не .o (obj).

Он просто из схемы .c.o→ELF минует .o. И это резонно — линковать-то он всё равно не умеет, нафиг промежуточное генерить.

Я подразумевал, в исходный компилируемый код на Си добавить исходный код printf() и прочих недостающих функций. Будет страшно неудобно искать ошибки и страшно долго компилироваться.

Если очень хочется, там есть puts. (%

mord0d ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.