Здравствуйте, ути-пути, Вы писали:
N>>3. Полный zero runtime. По-моему, обычно это уже спортивный результат, а не практически обусловленный.
УП>До сих пор широко распространены микроконтроллеры с десятками-сотнями байтов памяти. В основном из-за совместимости, но все равно, их еще много. Там это вполне практически обусловлено.
Для них разве пишут на С? Насколько я знаю, там просто на ассемблере пишут и всё. Сотня байтов памяти это же несколько десятков машинных команд.
S>Но дело даже не в этой экономии (размера исполняемого файла — Прим. авт.)…
S>Намного важнее сам принцип: язык Си позволяет полностью отказаться от возможностей стандартной библиотеки. Кроме Си, таким свойством — абсолютной независимостью от библиотечного кода, также иногда называемым zero runtime — обладают на сегодняшний день только языки ассемблеров; ни один язык высокого уровня не предоставляет такой возможности.
Я ничего не понял. Почему надо не зависеть от библиотечного кода? Если на С++ мы делаем статическую линковку, то мы получаем абсолютно независимый исполняемый файл. Этого достаточно или надо что-то ещё?
Здравствуйте, Baiker, Вы писали:
B>К слову, на языке Ди написана даже целая ОСь XOmB, так что клоуны с "ваш язык Ди плохой, патамучта там GC" постыдно идут нафиг.
И кому нужна эта ось? Думаю, даже у немерле целевая аудитория на порядки шире.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, B0FEE664, Вы писали:
BFE>Я ничего не понял. Почему надо не зависеть от библиотечного кода? Если на С++ мы делаем статическую линковку, то мы получаем абсолютно независимый исполняемый файл. Этого достаточно или надо что-то ещё?
Потому что "вы не платите за то, чего не используете".
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, ути-пути, Вы писали:
BFE>>Я ничего не понял. Почему надо не зависеть от библиотечного кода? Если на С++ мы делаем статическую линковку, то мы получаем абсолютно независимый исполняемый файл. Этого достаточно или надо что-то ещё? УП>Потому что "вы не платите за то, чего не используете".
Ээээ.... Это задача линковщика — выкинуть всё лишнее.
Здравствуйте, B0FEE664, Вы писали:
BFE>Ээээ.... Это задача линковщика — выкинуть всё лишнее.
Рантайм, как правило, монолитен, его нельзя выкинуть частично. А в большинстве языков он еще и довольно большой: в нем куча того, что в С реализуется библиотеками.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, ути-пути, Вы писали:
BFE>>Ээээ.... Это задача линковщика — выкинуть всё лишнее.
УП>Рантайм, как правило, монолитен, его нельзя выкинуть частично. А в большинстве языков он еще и довольно большой: в нем куча того, что в С реализуется библиотеками.
С чего бы?
Ну, а если вдаваться в детали, то обычно зависит, как объектники собирались, каждая функция в отдельную секцию, или в одну кучу. Ну и тут смотря что ты под рантаймом подразумеваешь
Здравствуйте, ути-пути, Вы писали:
УП>Рантайм, как правило, монолитен, его нельзя выкинуть частично.
Ты про какой язык то? Для С и С++ это утверждение в целом неверно
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Откуда мне знать?
M>Ну, а если вдаваться в детали, то обычно зависит, как объектники собирались, каждая функция в отдельную секцию, или в одну кучу. Ну и тут смотря что ты под рантаймом подразумеваешь
Это та библиотека, которая является частью языка. Например, строки, которых в C нет. А еще тот код, который что-то там инициализирует до входа в main.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, ути-пути, Вы писали:
CC>>Ты про какой язык то? Для С и С++ это утверждение в целом неверно УП>У C и C++ — это код, исполняемый до входа в main, он более чем монолитен, выкинуть его по частям не получится.
Запросто выкидывается, надо только подготовить это (обычно, платформенно-зависимыми средствами). Я видел несколько примеров.
Например, iostreams могут использовать локализацию, но если не вызвано setlocale(), то весь блок с локалями не подключается. Или, при отсутствии вызова pthread_create(), всякие pthread_self() заменяются на, грубо говоря, return 1.
Типовой подход в Unix — функции с целевыми именами представлены "слабой ссылкой" линкера
на реализации-пустышки. Если тянется какая-то функция по сильной ссылке, подтягиваются перекрытия с реальным телом.
Здравствуйте, ути-пути, Вы писали:
M>>Ну, а если вдаваться в детали, то обычно зависит, как объектники собирались, каждая функция в отдельную секцию, или в одну кучу. Ну и тут смотря что ты под рантаймом подразумеваешь
УП>Это та библиотека, которая является частью языка. Например, строки, которых в C нет. А еще тот код, который что-то там инициализирует до входа в main.
Строки вроде хидер-онли. Код инициализации — ну, обычно это вызов конструкторов глобальных объектов, нет глобальных объектов, нет и этого кода. Или, например, iostreams. Вот это точно не хидер-онли. Но если их не использовать, то и линковаться ничего не будет. В итоге того рантайма, который жизненно необходим, оказывается с гулькин фиг
Здравствуйте, Marty, Вы писали:
M>Строки вроде хидер-онли.
Это в C++, а в C их вообще нет. А вот практически во всех других языках — есть, и являются частью рантайма, а не библиотеками.
M>В итоге того рантайма, который жизненно необходим, оказывается с гулькин фиг
В С — да, маленький рантайм, в других языках — большой. Но по частям не расчленяется ни там, ни там. При этом С без рантайма вполне работоспособен.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, ути-пути, Вы писали:
УП>В С — да, маленький рантайм, в других языках — большой. Но по частям не расчленяется ни там, ни там.
Неверно. В С прилинкуется только то, что используется.
В других языках, если они претендуют на использование как системных, должно быть так же.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, B0FEE664, Вы писали:
BFE>Я ничего не понял. Почему надо не зависеть от библиотечного кода? Если на С++ мы делаем статическую линковку, то мы получаем абсолютно независимый исполняемый файл. Этого достаточно или надо что-то ещё?
Потому что ты не совсем понимаешь, что такое run-time языка. В твоём примере на С++ мы получим файл со статически слинкованым рантаймом. Просто потому, что RTTI, new/delete, исключения и т.д. и т.п. — это и есть рантайм. Это буквально часть языка. Всё-таки C++ без new/delete — это не совсем обычный C++?
А почему это надо ответ простой. Когда мы пишем тоже ядро ОС или драйвер для него, или прочие низкоуровневые штуки — то штатный рантайм языка программирования оказывается неработоспособен. Он-то расчитан на работу с операционной системой, а не на то, что программа сама является операционной системой. И второй аспект — рантайм делает скрытую работу, и это усложняет написание кода и не всегда допустимо в принципе. Где-нибудь в планировщике, дернутом с высоким IRQL, например нельзя делать какие-то вещи (те же исключения создавать) — и программист должен явно понимать, во что будет откомпилирован код.
Не хочу убеждать, что это прям супер-надо. Но, если ты с таким не сталкивался, сделай скидку на то, что кому-то может быть надо. И категоричные утверждения, что давайте всё напишем на С++ иногда упираются в отсутствие опыта с другими технологическими стеками.
Здравствуйте, m2l, Вы писали:
m2l>Потому что ты не совсем понимаешь, что такое run-time языка. В твоём примере на С++ мы получим файл со статически слинкованым рантаймом. Просто потому, что RTTI, new/delete, исключения и т.д. и т.п. — это и есть рантайм. Это буквально часть языка. Всё-таки C++ без new/delete — это не совсем обычный C++?
C++ без new и delete — тот же самый C++. Просто не используются какие-то библиотеки
m2l>Не хочу убеждать, что это прям супер-надо. Но, если ты с таким не сталкивался, сделай скидку на то, что кому-то может быть надо. И категоричные утверждения, что давайте всё напишем на С++ иногда упираются в отсутствие опыта с другими технологическими стеками.
Здравствуйте, m2l, Вы писали:
m2l>Просто потому, что RTTI, new/delete, исключения и т.д. и т.п. — это и есть рантайм.
В библиотеках будут только функции-хелперы, и их там будет весьма немного. Существенную часть реализации этих фич будет таки генерировать компилятор.
m2l>Это буквально часть языка. Всё-таки C++ без new/delete — это не совсем обычный C++?
Надо таки заметить что на самом деле в самих имплементациях new/delete кода с гулькин нос — это тупо врапперы над системным аллокатором.
А вот частью самого языка будет тот код, который генерит компилятор для вызова конструкторов и десттрукторов. И он не библиотечный а именно что генерируемый по месту.
m2l>Когда мы пишем тоже ядро ОС или драйвер для него, или прочие низкоуровневые штуки — то штатный рантайм языка программирования оказывается неработоспособен.
Да банально берётся заточенный под кернел рантайм. Понятие "штатный" довольно размыто. Есть API+ABI а реализация уже какая захочешь.
m2l> Он-то расчитан на работу с операционной системой, а не на то, что программа сама является операционной системой.
Это примерно как std, стандартная либа чтоб можно было сразу что то лабать. Хош пользуйся, хош — нет.
m2l>И категоричные утверждения, что давайте всё напишем на С++ иногда упираются в отсутствие опыта с другими технологическими стеками.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, m2l, Вы писали:
BFE>>Я ничего не понял. Почему надо не зависеть от библиотечного кода? Если на С++ мы делаем статическую линковку, то мы получаем абсолютно независимый исполняемый файл. Этого достаточно или надо что-то ещё? m2l>Потому что ты не совсем понимаешь, что такое run-time языка.
Именно. Я не понимаю, что ещё такое "run-time языка".
m2l>В твоём примере на С++ мы получим файл со статически слинкованым рантаймом. Просто потому, что RTTI, new/delete, исключения и т.д. и т.п. — это и есть рантайм. Это буквально часть языка. Всё-таки C++ без new/delete — это не совсем обычный C++?
Допустим.
m2l>А почему это надо ответ простой. Когда мы пишем тоже ядро ОС или драйвер для него, или прочие низкоуровневые штуки — то штатный рантайм языка программирования оказывается неработоспособен. Он-то расчитан на работу с операционной системой, а не на то, что программа сама является операционной системой.
Это откуда следует?
У меня такое впечатление, что вы путаете API системы с чем-то ещё. Возьмём, к примеру, функцию fopen — она не будет работать в C если операционная система не имеет файловой системы. Так в чём отличие от C++?
m2l>И второй аспект — рантайм делает скрытую работу, и это усложняет написание кода и не всегда допустимо в принципе.
Это так, но ведь это совсем другой аспект.
m2l>Где-нибудь в планировщике, дернутом с высоким IRQL, например нельзя делать какие-то вещи (те же исключения создавать) — и программист должен явно понимать, во что будет откомпилирован код.
И что? Например, может для C быть запрещена динамическая аллокация памяти. Можно ли при этом писать программу на C? Можно. И на С++ можно. В чём разница? В исключениях? Ну так их можно не использовать.
m2l>Не хочу убеждать, что это прям супер-надо. Но, если ты с таким не сталкивался, сделай скидку на то, что кому-то может быть надо. И категоричные утверждения, что давайте всё напишем на С++ иногда упираются в отсутствие опыта с другими технологическими стеками.
Меня не надо убеждать — я просто понять хочу. Допустим у нас вообще нет операционной системы. Можно ли без операционной системы сделать запускаемый (статически слинкованый) экзешник на C? Можно, я делал. Можно ли без операционной системы сделать запускаемый экзешник на C++? Такого я не делал — у меня не было такой задачи. Быстрый поиск показывает, что есть операционная система написанная на C++, что, как бы, намекает на.
Я не вижу причин из-за которых невозможно написать приложение на С++, которое бы не нуждалось в операционной системе. Так что такое "run-time языка"?