Re[9]: Самый низкоуровневый язык, ага
От: vdimas Россия  
Дата: 28.09.23 21:55
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

V>>Двухфакторная инициализация — статическая и динамическая.

ЕМ>CRT не является безусловно необходимым для этого.

Тогда будет UB. ))
Т.е. ты тогда не можешь полагаться на спецификации языка.


ЕМ>Он нужен, когда невозможно загрузить инициализированные данные вместе с программой в готовом виде. Если платформа позволяет это делать (с помощью стандартного загрузчика, отображения памяти, или еще как), CRT не требуется.


Для динамической фазы инициализации CRT требуется, тут подробней:
http://www.rsdn.org/forum/flame.comp/8608986.1


V>>Гарвардская модель удобна для встраиваемых решений, т.к. программы сидят в ПЗУ на кристалле.

ЕМ>Так ПЗУ не является необходимым элементом гарвардской архитектуры.

Ес-но.
ТУт зависимость другая: есть ПЗУ — удобней Гарвард.
И кристаллу удобней (подробности тоже по ссылке выше, почему кристаллу всегда удобней Гарвард), и программисту удобнее, когда численно совпадающие адреса данных и программы на самом деле смотрят в разную память.


ЕМ>В общем случае эта архитектура никак не мешает загрузке в память заранее подготовленных данных.


Разумеется.
Но часто делает ненужным саму эту операцию.
Считай, что это чуть другой образ мышления.


ЕМ>И даже в тех случаях, когда такой возможности нет, именно CRT не требуется. Для одномодульной программы компилятор может складывать код инициализации в заранее известную функцию, которую нужно будет явно вызвать до использования статических переменных.


Так и делается.
Одно плохо — тебе недоступна возможность явного вызова этой ф-ии, этим занимается CRT.
А в случае watch-dog таймеров иногда эту ф-ию надо бы вызывать явно.
А никак!

И вот ты целиком отказываешься от этого раздела спецификации языка и пользуешь другие решения, которые, к тому же, оказываются резко эффективней, бо каждое такое решение выходит "по-месту".

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


ЕМ>Для многомодульных программ это делается складыванием кода в секции, для обработки которых также могла бы генерироваться служебная функция, вызываемая явно.

ЕМ>По сути, это часть CRT, но поднятая чуть выше, вроде явной инициализации вместо умолчания.

Да нет такой возможности в языке, забудь. ))
Только описать такую инициализацию явно, но тогда конструкции языка объявления+инициализации глобальных переменных получаются нерабочими.

Взять простой пример — некая табличная ф-ия, например, кодировка из PCM в u-law.
По классике если, ты опишешь эту таблицу констант в данных, т.е. в ОЗУ, и будешь извлекать из таблицы константы простым обращением к глобальному массиву.

А в микриках другая техника.
Там обычно достаточно большое ПЗУ, но небольшое ОЗУ.
Занимать это ОЗУ большой таблицей — ересь, заслужить линейкой по пальцам.
И ты прошиваешь эти константы в ПЗУ, т.е. по адресу кода.
Причём, если архитектура не позволяет непосредственно читать байты из адресного пространства команд, то ты через макросы прошиваешь команду сложения рабочего регистра с константой (или загрузки константы в регистр) + операция ret.
Тогда обращение к таблице вырождается в call c предвычисленным смещением.
И никакого ОЗУ. Ву а ля! ))
Отредактировано 28.09.2023 21:56 vdimas . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.