OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 23 Август, 2019 01:02

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 16 Июль, 2015 17:20 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 805
Откуда: Казань
В книги Вирта "Конструирование компиляторов" есть глава о том, как данные представляются во время исполнения, где говорится, что если данные не выровненные, то может потребоваться два обращения к памяти, для чтения какого-нибудь поля и необходимо выравнивать поля в структурах по границе слов.
Допустим, есть структура RECORD a: CHAR; b: INTEGER END; то поле a, допустим будем иметь смещение 0 (от начала структуры), а поле b смещение 4.
Чаще всего никто не обращает на это никакого внимания, но иногда требуется передавать данные между различными системами и может так случится, что настройки выравнивания там другие. В языке C++ есть специальная конструкция для задания параметров выравнивания #pragma pack(x)

И мне пришла идея, а почему бы не отказаться от автоматического выравнивания, а выравнивать поля всегда явно.
Если кто-то хочет, чтобы обращение к полю b происходило по адресу кратному 4, то можно просто создать структуру RECORD a: CHAR; dummy: ARRAY 3 OF CHAR; b: INTEGER END; а по умолчанию выравнивание не использовать.

В этом случае размер структуры всегда будет равен сумме размеров его членов, а не округленному в большую сторону размеру. И можно будет создавать такие типы данных, как, например, WCHAR = RECORD c1, c2: CHAR END и использовать массив таких символов, как аналог типа wchar_t.

Кто что думает по этому поводу?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Июль, 2015 21:10 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Между какими системами вы собрались данные передавать? И почему протокол передачи зависит от выравнивания?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Июль, 2015 11:43 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 805
Откуда: Казань
Проблема с выравниванием возникает при передаче данных из программы, написанной на одном языке программирования, в программу на другом.
Вот, пример:
http://rsdn.ru/forum/philosophy/6075407.1


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 19 Июль, 2015 12:40 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Уплотнение полей записи должно быть опциональным, поскольку зависит от реализации компилятора. В БлэкБоксе выравнивание полей задаётся уточняющим системным флагом к записи в квадратных скобках (требуется подключение модуля SYSTEM).
Т.е.,
Код:
T = RECORD [align2]
(* ... *)
END


Для взаимодействия со сторонним ПО, использование модуля SYSTEM в Оберонах просто неизбежно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 19 Июль, 2015 12:57 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2599
Откуда: Россия, Ярославль
В 2015-м году люди все ещё вынуждены взаимодействовать с системами 70-х годов, раскладывать байты и специализировать компиляторы на совместимость с низкоуровневыми экосистемами. При всем при этом негативную оценку получает не сама экосистема, а модуль SYSTEM в Обероне, который по большому счету обычному человеку нужен только чтобы соединяться с Си. Не слишком-то прогрессивный подход, обвинять в недостаточной интегрированности в позор индустрии.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 19 Июль, 2015 14:31 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Rifat писал(а):
Проблема с выравниванием возникает при передаче данных из программы, написанной на одном языке программирования, в программу на другом.


Думается, что это больше к конкретным компиляторам относится, чем к языкам.
Зачем привязывать язык к реализации?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Август, 2015 09:42 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1113
Откуда: СССР v2.0 rc 1
В одной из веток уже эта тема поднималась. Не актуально. Современные камни успешно переваривают такие данные. И по времени, даже быстрее, чем выровненные по границам машинного слова -- попадание в кеш выгодней выравнивания.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB