После года разработки проект Cygwin опубликовал выпуск стандартной Си-библиотеки newlib 4.5.0, развиваемой инженерами из компании Red Hat. Библиотека нацелена на предоставление компактной реализации стандартной Си-библиотеки (libc), пригодной для использования на встраиваемых системах c небольшим объёмом постоянного хранилища и оперативной памяти. Код проекта написан на языке Си и распространяется под лицензией LGPLv2...Подробнее: https://www.opennet.me/opennews/art.shtml?num=62500
Непонятно, как можно на языке Си написать стандартную библиотеку языка Си, ведь для того, чтобы работал язык Си, сначала нужна работающая библиотека языка Си.Получается замкнутый круг.
Представь, что ты первый раз на ассемблере написал Си и теперь у тебя есть рабочий Си компилятор написанный на Си. Вывел тебя из бесконечного цикла - можешь благодарить.
Я лет в 14 задавался вопросом, как писали первый компилятор для первого языка.
> Я лет в 14 задавался вопросом, как писали первый компилятор для первого языка.А тебя не удивляло что для того чтобы сделать станок - нужны станки, которые произведут детали для этого станка? А вот поди ж ты - как-то их делают!
Первые первобытные парсеры можно было и на тетрадном листочке заассемблить. А потом - этот парсер (например простой ассмемблер для начала) - ускорит и улучшит процесс ассемблирования. Это позволит написать быстрее программу больше и жирнее, и можно попробовать небольшой компилер си. Даже если он будет и неполный, можно однако написать с его помощью более шустро - более полный вариант. А потом - и пересобрать его сам собой, например. И далее девелопать - так. Это называется - bootstrap.
когда компиляторов не было, студентов сразу обучали структуре команд процессора какой-нить бэсм-6, после чего они программы писали сразу машинными кодами и набивали их на перфокартах.после чего вся колода перфокарт относилась оператору и оставлялась в правильной коробке с твоим именем.
оператор, когда подойдёт твоя очередь, должен был это всё скормить машине, запустить, всю выдачу распечатать на очень длинной бумаге и всё вместе сложить обратно в коробку чтобы ты это потом забрал.таким образом, буфер ввода-вывода был картонной коробкой, а роль некоторых программ и устройств выполняли отдельные люди.
поэтому вся система напоминала армейскую игру дедушек в карты, намалёванные на матрацах, которые духи по плацу тасовали по команде дедов с биноклями.
Эх, были времена...
а первые версии gcc разве не протеряли? сейчас разве можно повторить всю цепочку от бинарного кода до gcc 15, чтобы убедиться в отсутствии кгб-шных закладок?
Ты бросай употреблять то, что употребляешь
Тот же Guix бутстрапится с нуля
https://guix.gnu.org/en/blog/2023/the-full-source-bootstrap-.../
Не нужна. Сишка работает без рантайма.
Скриптуха адепт не смог ничего ответить, порвался и заминусил. Зато пропаганду ретранслировать он первый. Типичная картина.
поищи gnu mes - уроборос из сишки и скриптухи
правильнее этого было бы только на асме написать или баше компилятор сей ради раскрутки
> Не нужна. Сишка работает без рантайма.В реальности опеннетных кекспертов все так. Но в нашей -- есть "нЬюансы".
https://gcc.gnu.org/onlinedocs/gcc/Standards.html
> Most of the compiler support routines used by GCC are present in libgcc, but there are a few exceptions. GCC requires the freestanding environment provide memcpy, memmove, memset and memcmp.
>
"Рантайм" (а также "эмулятор", "виртуальная машина") - это такой совоглобусонатягивательный термин. Потому что он переводится как "времени выполнения", а что там времени выполнения - додумывается по контексту. Например, "Are there any ML style languages with no runtime?".Если хочется указать на ньювансы, то проще начать с того, что настоящая точка входа находится не в main и предоставляется рантаймом https://en.wikipedia.org/wiki/Crt0
Если хочется ответить на изначальный вопрос, то рассказать про бутстраппинг компиляторов.
> Не нужна. Сишка работает без рантайма.А как ты будешь скомпилированное записывать куда-то без рантайма? :)
Интерфейс ядра в помощь
Не позорься. man gcc
Это для того, чтобы работал раст, нужна стдлиба и 100500 других пакетов из карго, а сишные компиляторы могут быть хоть со статически пришпиленной стдлибой, хоть линковаться под чужую стдлибу, хоть можно их написать без стдлибы вообще.
Ну зачем постоянно нести чушь и приплетать раст о котором ты ничего не знаешь?
Да, изначально компайлер раста собирался тем что написан на сях, так быстрей создавать первые версии. Сейчас он может пройти бутстрапинг и будет собран сам собой
И уж конечно ему не нужны пакеты из каргоНу вот зачем постоянно придумываешь чушь и приплетаешь ее к расту, к гоулэнгу и прочему, что моложе 20 лет? Вот что бы что?
>Да, изначально компайлер раста собирался тем что написан на сяхСамомнение сишников не позволяет им сказать, что изначально компилятор был написан на окамле.
А сейчас вполне начинает бутстрап с GNU Mess, например, а потом уже tinycc, gcc 2.95 и далее
> Это для того, чтобы работал раст, нужна стдлиба написанная на расте
> а сишные компиляторы могут быть хоть ЭТОДРУГОЕ!Пофиксил, не благодари.
> хоть можно их написать без стдлибы вообще.Ссылки на сишко-компиляторы "без стдлибы" (со сравнимым с растовым, уровнем оптимизации выхлопа, а не "laba4.c") ты просто забыл добавить, ага.
А то всякие шланги и gcc почему-то пишут с стдлибой, да еще и плюсы вместо сишки использовать норовят - вот жеж неосиляторы, в отличии от опеннетовцев ...
> Ссылки на сишко-компиляторы "без стдлибы" (со сравнимым с растовым, уровнем оптимизации
> выхлопа, а не "laba4.c") ты просто забыл добавить, ага.GCC, Clang - с ключем -ffreestanding. Для C99 и новее стандарт штатно регламентирует режим "freestanding", без либ вообще.
А уровень оптимизации выхлопа - у clang это тот же LLVM, на минуточку. Да и GCC не спасует. А обвес у хруста все же жирнее. И с .so это барахло работает криво.
> А то всякие шланги и gcc почему-то пишут с стдлибой, да еще
> и плюсы вместо сишки использовать норовят - вот жеж неосиляторы, в
> отличии от опеннетовцев ...Так то там стдлиба - отдельные проекты. Скажем glibc6 - отдельный проект, не связанный с gcc или clang сам по себе. Как и musl какой. Это хрустики все напихали в 1 проект, нате на лопате - и - вот - переделывают постоянно. Получив этакую пародию на питон в итоге. И период полураспада проектов под стать.
>>> а сишные компиляторы могут быть хоть [...] хоть можно их написать без стдлибы вообще.
>> Ссылки на сишко-компиляторы "без стдлибы" (со сравнимым с растовым, уровнем оптимизации
>> выхлопа, а не "laba4.c") ты просто забыл добавить, ага.
> GCC, Clang - с ключем -ffreestanding. Для C99 и новее стандарт штатно регламентирует режим "freestanding", без либ вообще.И как обычно -- читать могут не только лишь все ...
> <остальное поскипано, т.к. "уровень" и "содержание" примерно те же.>
>
Для того, что бы собрать программу на расте стдлиба не нужна. Причём куча популярных либов умеют собираться в режиме «без стдлибы».Именно поэтому на расте можно писать ядра ОС, писать под микроконтроллеры и так далее.
Иди читать про бутстрапинг компайлеров
https://en.wikipedia.org/wiki/Bootstrapping_(compilers)
В Си библиотека не является частью языка.
В любом языке не является.
Но не в любом языке без библиотеки нельзя написать ничего полезного.
Чтобы использовать С, стандартная библиотека С не нужна. Аналогично для С++: чтобы его использовать стандартная библиотека С++ не нужна.
Для C++ условно не нужна. Какой-нибудь std::initializer_list без библиотеки не получится использовать, хоть он и часть языка.
Вот и выросло поколение, не ведающее, что такое "процесс раскрутки компилятора".
Чего они там все постоянно пишут? Там всего-то надо передать управление в main ну и скажем malloc/free реализовать. Да ну системные вызовы прокинуть в заголовках.
Что они и сделали. Ещё принтф)
Мажду адресом _start и адресом main куча кода, связанного с настройкой доступа к системным вызовам. Просто посмотрите в файл /usr/include/asm/unistd*.h. Их там почти 4 сотни и все, что не связано с мультипоточностью (си не поддерживает мультпоточность), нужно обернуть, чтобы добраться к ним из программы. Собственно, можно прочитать стандарт в части libc и не задавать вопросов, насколько она велика и что делает.
Сделать так, чтобы stderr - это был UART2 на скорости 115200. Штука полезная в целом.newlib - это эмбеддед в 90% случаев. И да, какой-нибудь atoi там тоже бывает полезен.
А правда что в Apple пишут на СИ с классами?
В эпл пишут на свифте уже лет 10.
Ядро, драйвера и прочие низкоуровневое ПО то же на свифте?
На СиСи.
На BoobsLang
свифт это в свою очередь надстройка поверх си с классами.
Только продвинутые инженеры, над которыми не пыхтит менеджент.
Где? Если речь про webkit, то нет.
И не только в apple. Objective-c сам по себе неплох. Он комактнее, компилируется намного быстрее и генерирует более надежный код, нежели c++. Компилятор есть для всех платформ.
>пригодной для использования на встраиваемых системах c небольшим объёмом постоянного хранилища и оперативной памятиСудя по тому, что писали редхатовцы, встраиваемая система как минимум будет держать в себе SSD и иметь пачку ядер, чтобы на ней имело смысл запускать системд.
И конечно же хороший такой оперативки. На нём не то, что си, на нём можно будет, наверно, и жабу раскрутить.
> Судя по тому, что писали редхатовцы, встраиваемая система как минимум будет держать
> в себе SSD и иметь пачку ядер, чтобы на ней имело
> смысл запускать системд.Если посчитать uSD или eMMC за SSD - мои одноплатники вполне котируются! Да, на 32-битном ARM у меня от системд чаще всего аж 1 процесс, pid 1, жрет "аж" целые 6 мегов оперативки. Кошмар, конечно. Но даже на 256 мегах - не напрягает. А меньше уже никто и не делает, даже в 10-баксовых железках продаваемых по цене текстолита.
И самый зачуханый 1-ядерник на гигагерц (дохлее у меня просто нет уже) и то взлетает за 6 секунд. При том что я это не оптимизировал, и так нормуль. Newlib там впрочем нет - там и обычная глибса зашибись, такое - для чего-то еще более мелкого, типа openwrt - но тот с своим musl тоже так то - раздирел, да и при попытке сделать "зато не системд!" сделал нечто еще более ужасное. И жрущее по 2 мега на каждый процесс изолируемый от системы - так что если процессов в системе более 3, оно хуже системды оказывается.
> А меньше уже никто и не делает, даже в 10-баксовых железках продаваемых по цене текстолита.TinyVPS: RAM-64Mb где ваш любимый инит сожрет 10% памяти
> И самый зачуханый 1-ядерник на гигагерц (дохлее у меня просто нет уже) и то взлетает за 6 секунд.
Гон. То что вы увидели приглашение воити, - не значит, что там, заднем плане не продолжает идти загрузка сервисов.
И да, меня всегда удиляло, как легко на это повелось столько много народа, - вы только то и делаете что перезагружетесь каждую минуту чтоб смаковать как быстро появилось cli ? Или система все же для чего то более взрослого? Есть куча сервисов которые зависят друга от друга, где пока один полностью не функционален, другой просто не может работать и чудо потеринга делает тоже самое, - ждет, но невидимо для тех, кто не понимает как оно там под капотом
> TinyVPS: RAM-64Mb где ваш любимый инит сожрет 10% памятиМне за 3 бакса KVM виртуалку с гигом RAM дают. Стесняюсь спросить: с 64 мегами это что, на какой архитектуре и почем дают? И что на нем потом запускают?
Учитывая что за 10 баксов я 1-платник с 256 мегами и 4 ядрами воткну. И он мой - навечно вообще. Более того - с такими ресусами у меня пачка роутеров с owrt есть совершенно на шару - "потому что они были".
> Гон. То что вы увидели приглашение воити, - не значит, что там,
> заднем плане не продолжает идти загрузка сервисов.В моем минимальном дебиане сервисов как таковых и нет. Есть - sd и - вот - getty на uart допустим, через который начальный контроль над железкой.
И это не "приглашение войти" а "systemd-analyze". При том большую часть времени жрет старт ядра и пробинг железок, маунт фс и проч, куда без этого? Вооон там за счет bg_tree btrfs стал маунтится на добрую секунду быстрее, нахаляву. Ня.
> И да, меня всегда удиляло, как легко на это повелось столько много
> народа, - вы только то и делаете что перезагружетесь каждую минуту
> чтоб смаковать как быстро появилось cli ?Одноплатники это как правило управляющие системы и около - и там чем быстрее стартанет и получит контроль, тем в обещм то лучше.
> Или система все же для чего то более взрослого?
Это, типа, туповэйтинга по минуте когда роутер с скрипторой в опенврте ребутается - так что TCP конекции отлипнуть порой успевают даже если технологии типа вайргада и удержали абстракцию что параметры не изменились? Очень круто и удобно. Но пауза в работе девайса 6 секунд лучше чем 60.
> Есть куча сервисов которые зависят друга от друга,
Вот прям на той 64 меговой VPSке? :)
> где пока один полностью не функционален, другой просто не
> может работать и чудо потеринга делает тоже самое, - ждет, но
> невидимо для тех, кто не понимает как оно там под капотомА я как раз неплохо подружился с поттеровской штукой. И - у него есть notification api и watchdog api. То с чем у вон того барахла - не задалось. Очень упрощает мне жизню в вот именно этом аспекте + мониторинг живости лично моих критичных по части живости девайса сервисов.
>TinyVPS: RAM-64Mb где ваш любимый инит сожрет 10% памятиИ зачем она нужна? Что на ней можно делать? На ней не только инит, на ней практически всё сожрёт кучу памяти, даже ssh.
>и чудо потеринга делает тоже самое, - ждет, но невидимо для тех, кто не понимает как оно там под капотомУ системд есть куча преимуществ, вроде лёгкой изоляции сервисов и прозрачного переопределения частей юнита. Но системд-хейтеры старательно игнорируют эти, а так же другие преимущества systemd.
> У системд есть куча преимуществ,так расскажите о них. может я чего не знаю. может же такое быть ?
> вроде лёгкой изоляции сервисов
наилегчайшей: man nsenter, man chroot.
> и прозрачного переопределения частей юнита
вместо настройки демона через конфиг перетряхивать юниты. отлично.
и это все ?
>так расскажите о нихВ сообщении на которое вы отвечаете уже пару указана
>наилегчайшей: man nsenter, man chroot.Не смешно. В systemd можно создать override, не трогая оригинал, что полезно в частности при обновлении. Можно ли это сделать в баш портянках? Нет. В systemd изоляция прозрачна для юнита, добавляется какой-нибудь параметр, типа DynamicUser = true и всё. В баш портянках уже нужно будет оборачивать вызов программы во что-то, чтобы параметры программы не перепутались с параметрами nsenter. В systemd это поведение переиспользуется - для условного nginx и apache полностью одинаковое. В баш портянках нужно будет каждую простыню редактировать отдельно, руками. Поведение в systemd идёт из коробки, в баш портянках все сторонние утилиты придётся устанавливать вручную, и в случае, если в утилите нет нужного функционала, ещё и мигирировать придётся. Про дырявый chroot вообще вспоминать должно быть стыдно, не говоря уже про то, что ему вообще нужно отдельную файловую иерархию готовить.
>вместо настройки демона через конфигА как же юниксвей? Или программе мало того, что свою задачу выполнять, так ещё и часть инита содержать, в том числе и переключаться на чужого пользователя? А запускать все программы полагается от рута, правильно?
>и это все ?Нет, не всё. Вы хотя бы это осильте.
Для С нужен сборщик, который берет только нужные функции и выкидывает ненужные. Но это сложно в случае применения рефлексии. И тем не менее такие оптимизации возможны.
не вижу твоих решений по рефлексии для машиных кодов или ассембрера. может оно тебе не и нужно вовсе?
> "пригодной для использования на встраиваемых системах c"Прям история musl.
Мюсли уже стали пригодны на устройствах без MMU ?
Уточню стандартной она называется от того, что она упоминается в Стандарте языка С23.
С23 не причем -- библиотека libc входит в состав языка изначально со времен K&R и является такой же частью языка, как и любой его оператор. Именно поэтому компоновщику не требуется указывать функции из нее (-lc), в отличие, например, от libm (-lm). Во всех версиях стандарта она детально описывается.
Из книги Кернигана и Ритчи "Язык программирования Си" (перевод изд-ва Вильямс, 2009). Приложение Б. Стандартная библиотека.
"В этом приложении кратко описана библиотека, определённая стандартом ANSI.
Стандартная библиотека не вляется частью собственно языка, однако всякая среда, поддерживающая язык Си, обязана предоставить программисту объявления функций, типов и макросов, содержащиеся в этой библиотеке. Здесь опущены описания некоторых функций, имеющих слишком ограниченное применение или легко синтезируемых на основе других; нерассматриваются многобайтные символы, а также вопросы локализации, т.е. свойства библиотеки, зависящие от конкретного языка, страны или культурной среды".Я это процитировал не для того чтобы опровергнуть ваше сообщение. Интересно то, что в 1989 году авторы языка имели такую точку зрения.
В ядре Линукса запрещено использование каких-либо библиотек,и это вполне логично.
> Добавлена поддержка спецификации POSIX.1-2024.Поделитесь pdf'ом, у кого есть.