LINUX.ORG.RU

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

 , ,


0

2

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

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

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

★★★★★

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

Проверка исходника не решает проблему чистоты первого комплиятора, который в бинарном виде.

то сабж тебе точно будет не нужен

Дак и тем, кто пилит stage0 bootstrap тоже сабж не нужен, они давно до самописного ассемблера дошли, который собирют программой, написаной напрямую в машкодах. Может сабж заинтересует ZilchOS, чтобы он убрал statically linked seed tcc, если кто сможет сабжем собрать tcc :)

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

нафиг промежуточное генерить.

Чтобы кто-то другой линковал. А тут, получается, что он генерит ELF и туда ничего не подлинковать. Так то, в этом и была цель — никакого лишнего кода в исполняемом файле, но может лучше было лучше полновесный компилятор brainfuck, чем настолько урезаный Си :)

есть puts

Есть. Только там такой puts(), что можно и самому через write() сделать. А вот переписывать какой-то другой исходник, где printf(), fopen() и пр. потоковый ввод/вывод будет муторно.

mky ★★★★★
()

Ваще ничего не может. я в детстве и то лучше компялитор с на паскале нарисовал - там даже простые макросы работали. а тут даже buf[0] = ‘\0’; не работает.

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

Так одно дело обычные портянки, которых в обучающей выборке много, а другое дело компилятор на шелле, который является довольно уникальным продуктом.

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

Чтобы кто-то другой линковал. А тут, получается, что он генерит ELF и туда ничего не подлинковать.

И подсовывал левые вредоносы в твой код?! NO WAY! Своих вредоносов хватает. (%

но может лучше было лучше полновесный компилятор brainfuck, чем настолько урезаный Си :)

Это слишком просто и звучит не так эпично как «компилятор C на POSIX Shell!!!11»

Только там такой puts()

Вам шашечки или таки ехать? Если ехать, то следует взять нормальные компилятор+линковщик и не насиловать мозг. (=

Сабж не про удобства, это proof-of-concept. Ну и козырнуть скиллом (если это не бредогенератором написано, конечно) написания шелл-скриптов.


// Я как-то писал свой формат конфигов (чем-то напоминающий Pascal) и парсер оного на POSIX Shell…

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

Если ты ему прямо напишешь «Сделай мне компилятор», то конечно, не получится. А вот по шажочкам, описывая частично задачи, вполне может выстрелить.

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

формат конфигов (чем-то напоминающий Pascal)

Не перестаю уважать тебя за степень упоротости.

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

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

В компиляторе, не поддерживающем #include и stdio, оптимизации не требуются)

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

Вам шашечки или таки ехать?

Мне не нравится, когда шашечки не тем цветом рисуют. Если нет потокового ввода-вывода, то не надо такой код:

int fputs(char *s, int fd) {
        sys_write(fd, s, strlen(s));
	return 0;
}
fputs должен брать не файловый дескриптор (int fd), а указатель FILE.

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

buf[0] = ‘\0’; не работает

Похоже, в этом коде зря наставлено по два слеша в одиночных кавычках:

	C46) # Character literal: 'x' → ASCII value
		local _charval
		case "$_v" in
		'\\n') _charval=10;;
		'\\t') _charval=9;;
		'\\0') _charval=0;;
		'\\\\') _charval=92;;
		"\\'") _charval=39;;
		'\\r') _charval=13;;
		*) _tool_c89cc_c2d "$_v"; _charval=$REPLY;;
		esac
		_tool_c89cc_emit "48 C7 C0"
		_tool_c89cc_emit_le32 $_charval;;
а может так и задумано, и надо писать: buf[0]='\\0'.

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

Проверка исходника не решает проблему чистоты первого комплиятора, который в бинарном виде.

Верификация кода первого компилятора сама по себе даёт определённые гарантии. Что до бинарного патча у первого компилятора который к примеру может «заражать» продукт своей компиляции, то мало вероятно что эта «зараза» перейдёт к продукту компиляции второго компилятора.

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

Мне не нравится

Ну перепиши этот компилятор, это же оперсорц! (%

Там всего-то ≈7.8 килострок. (%

mord0d ★★★★★
()

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

Это типа теперь на какой-нибудь embedded железяке на которой linux с vi и sh, но без компиляторов можно перепечатать этот код и компилировать c-шный код?!

Kolins ★★★★★
()

Читая эту новость я думаю, что на лоре всё-таки нужна реакция с «кот вылизывает яйца». Простое «не нужно» не выражает полного спектра эмоций.

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

Зато «полный спектр эмоций» вполне выражает формулировка «флуд реакциями»... ;P ;))

Или правильнее было бы сказать не «выражает», а «вызывает»? ;D ;P ;)))

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

А ещё лучше если будет компилятор Brainfuck`а на Rust`е. Учитывая, что раст работает на LLVM, то сразу подтягивается туева хуча платформ, растёт популярность Brainfuck`а, и, учитывая его низкий уровень тогда точно C-капец наступает 😆😆😆

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

Автор Клода Боря Чёрный с вами категорически не согласен. Большая статья вышла в последнем журнале Time, где, по словам Бори, Клод дописывает сам себя для улучшения обучения. Не остаться бы скептикам на обочине цивилизации как это было и с кибернетикой и с генетикой. Так и будете яблоки на берёзах выращивать.

Сейчас серьёзное опасение вызывает то, что технология может оказаться в руках очень маленькой кучки людей, способных автономно проводить исследования многократно быстрее и эффективнее остальных. А вы до сих пор код вручную пишете!

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

cpp всю дорогу существовал отдельно от компилятора, внутрь его засунули ради удобства. Но ещё я сам писал в те времена, когда сначала вызываешь cpp для обработки команд препроцессора, а уже потом cc для собственно компиляции. Отсюда и их названия. cpp - Си ПреПроцессор, cc - Си Компилятор, в переводе с английского.

А по поводу библиотек, если можно генерировать исполняемый код, то сгенерировать объектный вообще не вопрос. Просто автору хотелось «покрасивше», а на как практичнее.

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

Кто тебе сказал, что я «скептик»? Я практик.

Я на регулярной основе использую ИИ и понимаю их возможности и ограничения.

Байки про миллионные промпты слушать не надо. Уже на контексте порядка 60-70 тысяч символов (хз сколько это в токенах) llm перестаёт четко помнить детали.

Традиционно тут лучше всего показывает себя семейство от OpenAI. Хотя в настоящее Клод в среднем лучше пишет код и в среднем лучше работает в качестве чат-бота,, но по мере роста контекста он случается быстрее, чем GPT.

С Qwen3.5 и GLM-5 у меня тоже опыт есть.

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

случается

сдувается

А, понятно. А то сперва вспомнился анекдот про срыв сроков и вязку собак :)

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

А современным процессорам не пофиг?

Если было бы пофиг, то можно было бы выкинуть процентов 90 кода у того же GCC.

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

Это типа теперь на какой-нибудь embedded железяке на которой linux с vi и sh, но без компиляторов можно перепечатать этот код и компилировать c-шный код?!

Он порождает бинарники для x86_64.

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

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

И какие расширения были у файла до/после препроцессора?

И я не против вызова cpp вручную, но не понятна позиция автора кода. Собирается ли он писать препроцессор на bash или советует использовать cpp от gcc или ещё что?

Просто автору хотелось «покрасивше»

Непонятно чего хотелось автору. Очень давно компилятор, препроцессор, линковщик шли вместе. Может их и вызывали раздельно, но поставлялось вместе. И это всё вместе и подразумевается под названием «Компилятор Си». Иначе получается неполноценный обрубок. С одной стороны, для «proof of the concept» компилятора Си на sh хватило бы компиляции уровня «hello world», без malloc(), строковых функций и т.д., то есть заметно меньше строк sh-кода. С другой стороны, до скомпилить и собрать реальную программу не дотягивает.

то сгенерировать объектный вообще не вопрос.

Вопрос будет потом, если на bash писать линковщик, чтобы из объектников собрал рабочий ELF. Может будет проще какой-то свой формат .о файлов, чтобы bash легче их разбирал.

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

И какие расширения были у файла до/после препроцессора?

cpp -E a.cpp -o a.c

Непонятно чего хотелось автору.

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

Может будет проще какой-то свой формат .о файлов

Совместимость с другими пострадает.

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

осталось найти проверенный интерпретатор shell

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

Ну и это тоже, да. Особенно если не смотреть каждую букву в результате.

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

8 тысяч строк и полная поддержка C89?

Видишь, какая экономия для технических писателей и комитета по стандартизации.

pacify ★★★★★
()

Ну чего вы взъелись-то со своим «не нужно». Если у чела есть возможность писать чисто по фану, чего ему хочется, так давайте порадуемся за него. И пожелаем всем нам такой возможности. Я бы вот тоже хотел много чего написать чисто для собственного удовольствия, но работа сейчас отнимает все силы… Пусть хоть у кого-то будет такая возможность. Больше софта, хорошего и разного!

nobody ★★
()

То есть, это взяли Си-компилятор и автоматически конвертнули в Bash-скрипт? Или весь проект писали вручную?

Xintrea ★★★★★
()

Можно использовать в качестве проверки уровня знаний для программиста, устраивающегося на должность «разработка лингвистического обеспечения на языке шелл»!

«Взгляните на предложенный файл c89cc.sh. Покажите, где в нём находится лексический анализатор, где синтаксический и семантический. Какой алгоритм использован для лексического анализатора? Относится ли реализованная грамматика к классу леворекурсивных? Доработайте код, чтобы компилятор поддерживал стандарт C++26»

PeleWin
()

интересный мазохизм

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