Здравствуйте, m2l, Вы писали:
m2l>Элементарно. Когда ты, пишешь на С++ и создаешь объект, под него должна быть выделена память, для этого нужен алокатор
Нет, не нужен. Потому как объект можно разместить на стеке, или в глобальном namespace.
Так что вся дальнейшая теория пошла прахом, переделывай.
m2l>чтобы выделить тебе условные 20-байт на объект он сначала дергает API операционной системы
Ващета элементарнейше делается наколенный аллокатор который не дёргает из OC вообще ничего. Но тем не менее умеет выделять память в заданных на этапе компиляции рамках.
m2l>В С++ — динамическая аллокация памяти — неотъемлемая часть языка
И такиж нет.
m2l>Вспоминая Microsoft с их проектом Singularity — где ОС была написана на C# (не то что рантайм, а целый сборщик мусора) — а смысл писать ОС на С++, если можно на Java, Go или Python?
Даже дом можно построить из навоза (и таки реально строили), вот только нафига?
Можно даже на brainfuck написать концепт, вот только вопрос в жизнеспособности получившейся "модели человека, полностью неудовлетворённого" (tm)
Здравствуйте, Kernan, Вы писали:
K>Очевидно, ты линковался с минимальным рантаймом под STM32 который был написано не тобой.
Ничо что "рантайм" может быть написан прямо в твоём же коде?
С ним не надо именно линковаться, всё что надо — чтоб линкер хоть где то нашёл нужные ему символы.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Да, без средств стандартной библиотеки будет некомфортно
Надо заметить что стандартная библиотека таки в целом не то чтобы сильно комфортная.
Здравствуйте, m2l, Вы писали:
m2l>Элементарные list, string, regexp, exception — это всё исчезает.
Зависит от опыта пишущего
m2l>Теже new/delete — часть языка. Да можно и без них. Но какой тогда вообще смысл в С++?
Да одни только шаблоны и RAII уже сильно улучшают качество жизни по сравниению с С. А new/delete это так, мелочь.
Ты точно на С++ писал всерьёз?
m2l>Я лишь попытался объяснить что такое рантайм в С++ и зачем он нужен.
У тебя не получилось.
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, m2l, Вы писали:
m2l>>Понимаешь? Ты не можешь убрать из С++ создание объектов — это одна из ключевых частей языка. А для их создания нужна "language support library" (тот самый run-time). И его почти нельзя убрать.
M>Хм, интересно, как это я пять лет писал под STM32 на плюсах... Вот если бы ты мне раньше рассказал, то я точно бы на плюсах не смог бы писать, пришлось бы на сишечке мучаться...
Вы (или за вас) просто написали этот рантайм (выделение памяти, как минимум).
M>А наш загрузчик, который умеет обновлять прошивку по UART/CAN, занимает до 1 кб/2ух (в зависимости от STMки) — тоже на плюсах написан, опять же — по незнанию
Ну, или можно писать код без динамической памяти, почему нет.
Здравствуйте, CreatorCray, Вы писали:
m2l>>Я бы отнёс этот код к рантайму языка. CC>Его нет в runtime library языка, это код, который компилятор генерит для конструкций языка.
Если оперировать к исходному тезису про zero-runtime, то, что компилятор нагенерировал лапшу непонятного и непредсказуемого кода для какой-то языковой конструкции — эти инструкции, в том числе, и есть лишний run-time. Понятно, что и С не чисто в опкоды транслируется и там компилятор может ого-го как развернуться. Но предполагается, что из-за простоты (бедности) синтаксиса такого "лишнего" кода в С будет меньше.
m2l>>Но справедливости ради, в небольших кусочках ОС даже кернет рантайм будет не приемлем и понадобиться асм. CC>Asm надо только там, где нельзя логику выразить средствами языка, например RDMSR. И то в нынешнее время с добавлением интринсиков даже асм стал не нужен.
По идеи, что бы нормально пользоваться интринсиками (на уровне больше копипасты со стек оверфлов) нужно чуть-чуть знать асм. Поэтому чистый .asm будет, вставки или интринсики — я бы сильно одно от другого не отделял.
m2l>>Это часть языка по его спецификации CC>Нет. Всё то, что можно написать на этом же языке, не является частью языка.
Я здесь имею в виду, в формальном отношении, как часть спецификации языка, описывающей что и как генерировать компилятору.
m2l>>Тебя смутило слово "иногда"? CC>Меня смутило отстуствие слова "иногда" перед словом "категоричные".
Извиняюсь, поправляюсь:
Здравствуйте, CreatorCray, Вы писали:
m2l>>new и delete сами по себе не зависят ни от каких библиотек
CC>Таки надо имплементация определённых функций. Их конечно можно прямо у себя и написать, но всё же. CC>Тогда как классам и шаблонам не надо вообще ничего со стороны.
Не помню на вскидку почему, но кажется чуть-чуть сложней чем просто свои new/delete.
Но в целом, ты прав, можно вместо дефолтного run-time языка подсунуть свой и писать на чём угодно для чего угодно. Важен программист, а не язык
Здравствуйте, CreatorCray, Вы писали:
m2l>>Элементарно. Когда ты, пишешь на С++ и создаешь объект, под него должна быть выделена память, для этого нужен алокатор CC>Нет, не нужен. Потому как объект можно разместить на стеке, или в глобальном namespace. CC>Так что вся дальнейшая теория пошла прахом, переделывай.
Ну да можно. Так ведь можно вообще писать на той части языка, что является общей между С и С++ — собираешь потом как С код, вот и всё.
m2l>>чтобы выделить тебе условные 20-байт на объект он сначала дергает API операционной системы CC>Ващета элементарнейше делается наколенный аллокатор который не дёргает из OC вообще ничего. Но тем не менее умеет выделять память в заданных на этапе компиляции рамках.
Ну да. Всегда можно заменить рантайм на свой, который делает как тебе надо. И что?
m2l>>В С++ — динамическая аллокация памяти — неотъемлемая часть языка CC>И такиж нет.
Я выше приводил пункты стандарта. Поэтом опровергай тоже там с указанием пунктов или страниц из спецификации.
m2l>>Вспоминая Microsoft с их проектом Singularity — где ОС была написана на C# (не то что рантайм, а целый сборщик мусора) — а смысл писать ОС на С++, если можно на Java, Go или Python? CC>Даже дом можно построить из навоза (и таки реально строили), вот только нафига? CC>Можно даже на brainfuck написать концепт, вот только вопрос в жизнеспособности получившейся "модели человека, полностью неудовлетворённого" (tm)
Тем не менее, мы все убедились, что и C# для этой задачи подходит ничуть не хуже C++ или С.
Здравствуйте, Marty, Вы писали:
M>Хм, интересно, как это я пять лет писал под STM32 на плюсах... Вот если бы ты мне раньше рассказал, то я точно бы на плюсах не смог бы писать, пришлось бы на сишечке мучаться...
И что, там можно было new/delete использовать? Или исключения? RTTI? Нет? Так это не C++, а его подмножество, как раз с отрезанным рантаймом.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Kernan, Вы писали:
K>>Очевидно, ты линковался с минимальным рантаймом под STM32 который был написано не тобой. CC>Ничо что "рантайм" может быть написан прямо в твоём же коде?
Написание такого кода это всегда редкостный гемор. С одной стороны, нет нормальных гайдов как это делать, с другой — нет нормальных инструментов. CC>С ним не надо именно линковаться, всё что надо — чтоб линкер хоть где то нашёл нужные ему символы.
Не всё так просто. Надо ещё правильно размещать секции кода, например, часть инициализации в начале. Могу соврать, конечно, т.к. bare metal занимался очень давно и были это это STM-ки, а SoC-и с довольно нетривиальной инициализацией.
Здравствуйте, flаt, Вы писали:
M>>А наш загрузчик, который умеет обновлять прошивку по UART/CAN, занимает до 1 кб/2ух (в зависимости от STMки) — тоже на плюсах написан, опять же — по незнанию
F>Ну, или можно писать код без динамической памяти, почему нет.
Да. И исключений нет, нет файловой системы, нет никаких потоков, ничего нет. И какой там рантайм нужен для этого? И, однако, это всё равно был C++, не сильно отличавшийся от обычного
Здравствуйте, ути-пути, Вы писали:
M>>Хм, интересно, как это я пять лет писал под STM32 на плюсах... Вот если бы ты мне раньше рассказал, то я точно бы на плюсах не смог бы писать, пришлось бы на сишечке мучаться...
УП>И что, там можно было new/delete использовать? Или исключения? RTTI? Нет? Так это не C++, а его подмножество, как раз с отрезанным рантаймом.
И что, он перестал от этого быть C++? Перегрузка — есть, шаблоны функций/классов — есть, виртуальные методы — есть. Этого вполне хватало, и это всё-таки гораздо удобнее, чем писать на голой сишечке
Здравствуйте, ути-пути, Вы писали:
M>>Строки вроде хидер-онли.
УП>Нет. Они без динамической памяти не работают. И за ней они обратятся к рантайму.
Переопределить new/delete, и всё, никакой рантайм не нужен. А если мегабайты текста обрабатывать не надо (а на контроллере обычно и не надо), то эти new/delete и вызваны могут не быть за счет SSO
Здравствуйте, ути-пути, Вы писали:
УП>Да, перестал, став урезанным подмножеством.
Нет, не перестал. Язык тот же. Библиотеки плюсовые, строки/векторы/мапы — тоже есть, просто мы ими не пользовались. К слову, в одной конторе, где я работал, STL тоже не используется, там всё своё самописное. Значит ли это, что у них тоже урезанный C++?
M>>Этого вполне хватало, и это всё-таки гораздо удобнее, чем писать на голой сишечке
УП>Разумеется удобнее, хотя, подозреваю, насчет виртуальных методов ты приврал: vtable, диспетчеризация, вот это вот все — явно не для мелких МК.
Нет никаких проблем с vtbl даже на тех камешках, где оперативки килобайта 4. Флэшка для кода, кстати, обычно пожирнее
Здравствуйте, m2l, Вы писали:
m2l>Тем не менее, мы все убедились, что и C# для этой задачи подходит ничуть не хуже C++ или С.
И явно не лучше. Весь низкий уровень там всё-равно на ASM и C (который не ++). Рантайм и прочий сопутствующий обвес на расширенном (под эту задачу) C# — Sing.