OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 14 Июль, 2025 10:02

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 26 Октябрь, 2010 10:39 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Код:
TYPE
   (* Delphi types *)
   Cardinal = INTEGER;
   PChar* = POINTER [untagged] TO ARRAY [untagged] OF SHORTCHAR;
  Pointer* = INTEGER;
  Integer* = INTEGER;

  (*LongWord = DWORD;
  THandle = Cardinal;*)
  (* SDL_types.h types *)
  (* Basic data types *)

  Bool = Integer; (* SDL_FALSE, SDL_TRUE *)

  PSInt8 = ^SInt8;
  SInt8 = Shortint;



В интерфейсных модулях сторонних библиотек (большей частью, написанных на C) я считаю верных подходом отделять определение базовых типов в специальные модули. Такие модули, как правило, аппаратно- и компиляторо-зависимы.
Вместо такого описания (как в примере кода) я бы создал отдельный модуль, в котором определил такие типы, как UInt8, Pointer, Integer, Cardinal, PChar и прочие. Затем импортировал бы их в интерфейсном модуле. Так мы добиваемся универсальности при переносе на другие платформы и компиляторы, даже в пределах совместимости между различными компиляторами Оберонов.


Последний раз редактировалось Роман М. Вторник, 26 Октябрь, 2010 12:19, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Октябрь, 2010 11:17 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Резонно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Октябрь, 2010 11:52 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Роман М. писал(а):
Вместо этого ...
Пож., уточните формулировку (чего этого?) или измените.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Октябрь, 2010 12:31 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Уточнил.

Ещё добавлю. На мой взгляд, при подготовке интерфейсных модулей очень ощущается нехватка соглашений о том как следует описывать типы из сторонних библиотек. Не помешал бы модуль для описания базовых типов, такой как:

Код:
DEFINITION LibsTypesC   (* nonportable (i386) *);

   TYPE
      String = POINTER TO ARRAY [untagged] OF SHORTCHAR;

      BOOL = INTEGER;

      DWORD = UInt32;

      SInt32 = INTEGER;

      UInt32 = INTEGER;

      UInt8 = BYTE;

END LibsTypesC.


Причём, полезно создать для разных компиляторов. Более того, возможно, даже указывать рядом с каждым базовым типом сколько бит он занимает и ссылку на документ, в котором эти соглашения указаны. А то, в будущем, неизвестно как придётся видоизменять программы, чтобы они соответстовали новым нормам типов.


Последний раз редактировалось Роман М. Вторник, 26 Октябрь, 2010 12:39, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Октябрь, 2010 12:37 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Роман М. писал(а):
В интерфейсных модулях сторонних библиотек (большей частью, написанных на C) я считаю верных подходом отделять определение базовых типов в специальные модули. Такие модули, как правило, аппаратно- и компиляторо-зависимы.
Вместо этого я бы создал отдельный модуль, в котором определил бы такие типы, как UInt8, Pointer, Integer, Cardinal, PChar и прочие. Затем я бы импортировал их в интерфейсном модуле. Так мы добиваемся универсальности при переносе на другие платформы и компиляторы, даже в пределах совместимости между различными компиляторами Оберонов.
1) Для ББ (про прочие компилеры не знаю) введением особого модуля для типов Вы не избавитесь от SYSTEM, т.к. его сразу тянет MODULE Aaa ["os-lib.file"].
2) На базе опыта и ощущений: не стал бы я гоняться за универсальностью реализации в интерфейсных модулях (поминая макросы, воркэраунды и проч.). Основная цель, по-моему, сделать интерфейс как можно ближе к [задокументированному] оригинальному. А из-за разницы в языках (напр. Си-Оберон) это не всегда делается одинаково. Например, unsigned int можно как INTEGER перевести, а можно как SET...
3) я придерживаюсь такой схемы: в документации пишу соответствие типов

Думаю, лучше говорить о единообразности процесса переноса, когда будет использоваться не особый модуль, а общие соглашения (именование, выбор правильного типа) по переводу типов, записанные (и обновляемые) в общедоступном месте.

Особые ситуации, по-моему, бывают довольно часто. Если есть общие соглашения --- в случае исключения им можно не следовать. Если есть набор модулей, претендующий на универсальность, придётся часто и сильно ломать голову над тем, как эту универсальность (отсутсвтвие особых ситуаций) обеспечить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Октябрь, 2010 13:09 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Евгений Темиргалеев писал(а):
Роман М. писал(а):
В интерфейсных модулях сторонних библиотек (большей частью, написанных на C) я считаю верных подходом отделять определение базовых типов в специальные модули. Такие модули, как правило, аппаратно- и компиляторо-зависимы.
Вместо этого я бы создал отдельный модуль, в котором определил бы такие типы, как UInt8, Pointer, Integer, Cardinal, PChar и прочие. Затем я бы импортировал их в интерфейсном модуле. Так мы добиваемся универсальности при переносе на другие платформы и компиляторы, даже в пределах совместимости между различными компиляторами Оберонов.
1) Для ББ (про прочие компилеры не знаю) введением особого модуля для типов Вы не избавитесь от SYSTEM, т.к. его сразу тянет MODULE Aaa ["os-lib.file"].
2) На базе опыта и ощущений: не стал бы я гоняться за универсальностью реализации в интерфейсных модулях (поминая макросы, воркэраунды и проч.). Основная цель, по-моему, сделать интерфейс как можно ближе к [задокументированному] оригинальному. А из-за разницы в языках (напр. Си-Оберон) это не всегда делается одинаково. Например, unsigned int можно как INTEGER перевести, а можно как SET...
3) я придерживаюсь такой схемы: в документации пишу соответствие типов

Думаю, лучше говорить о единообразности процесса переноса, когда будет использоваться не особый модуль, а общие соглашения (именование, выбор правильного типа) по переводу типов, записанные (и обновляемые) в общедоступном месте.

Особые ситуации, по-моему, бывают довольно часто. Если есть общие соглашения --- в случае исключения им можно не следовать. Если есть набор модулей, претендующий на универсальность, придётся часто и сильно ломать голову над тем, как эту универсальность (отсутсвтвие особых ситуаций) обеспечить.

1. Желательно минимизировать присутствие модуля SYSTEM где бы то ни было.
2. Никаких отличий я не предлагаю. Лишь alias для базовых типов, определённых в отдельном модуле. Сегодня INTEGER занимает 32 бита, завтра - 128. Именно поэтому нужно иметь независимое от компилятора представление типа. Ведь не спроста во многих библиотеках определяются типы UInt32, gchar и тому подобные. Они позволят избежать перелопачивания кода при изменении среды, в которой будет работать ПО.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Октябрь, 2010 13:59 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Роман М. писал(а):
1. Желательно минимизировать присутствие модуля SYSTEM где бы то ни было.
2. Никаких отличий я не предлагаю. Лишь alias для базовых типов, определённых в отдельном модуле.
1. Присутствие в смысле "импорт" или "зависимость"? (для ББ) введение модуля с "alias для базовых типов" зависимость от SYSTEM не убирает. Вообще --- желательно, согласен.
2. Конкретный нюанс, с которым сталкивался на практике. Можете записать, как будет выглядеть решение с использованием модуля алиасов?
OglGLUT docu писал(а):
Соответствие между типами Компонентного Паскаля и типами GLUT
...
- int и unsigned int используется тип INTEGER, если они представляют числа;
- int и unsigned используется SET, если они представляют набор битов (например, см. GetModifiers и InitDisplayMode);


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Октябрь, 2010 14:00 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Роман М. писал(а):
Сегодня INTEGER занимает 32 бита, завтра - 128. Именно поэтому нужно иметь независимое от компилятора представление типа...
Моё текущее мнение (навязывать не собираюсь): точный прогноз что и как будет "завтра", чтобы найти 100% решение сегодня --- дать не возможно. А тратить силы на полурешение не охота.

"Утро вечера мудренее": надо --- перепишем (если эта библиотека ещё будет существовать, если в ней ещё будет потребность, если .......)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Октябрь, 2010 15:18 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Евгений Темиргалеев писал(а):
Роман М. писал(а):
1. Желательно минимизировать присутствие модуля SYSTEM где бы то ни было.
2. Никаких отличий я не предлагаю. Лишь alias для базовых типов, определённых в отдельном модуле.
1. Присутствие в смысле "импорт" или "зависимость"? (для ББ) введение модуля с "alias для базовых типов" зависимость от SYSTEM не убирает. Вообще --- желательно, согласен.
2. Конкретный нюанс, с которым сталкивался на практике. Можете записать, как будет выглядеть решение с использованием модуля алиасов?
OglGLUT docu писал(а):
Соответствие между типами Компонентного Паскаля и типами GLUT
...
- int и unsigned int используется тип INTEGER, если они представляют числа;
- int и unsigned используется SET, если они представляют набор битов (например, см. GetModifiers и InitDisplayMode);


1. Избегать присутствия при импорте, конечно.
2. Можно так:
Код:
MODULE LibsGLUTTypes;

   IMPORT SYSTEM;
   
   TYPE
      Address = POINTER TO RECORD [untagged] END;
      (*
      Address* = INTEGER;
      *)
      Enum* = INTEGER;
      Boolean* = SHORTCHAR;
      Bitfield* = SET;
      Int* = INTEGER;
      Sizei* = INTEGER;
      Ubyte* = SHORTCHAR;
      Byte* = BYTE;
      Short* = SHORTINT;
      Ushort* = SHORTINT;
      Uint* = INTEGER;
      Float*     = SHORTREAL;
      Clampf* = SHORTREAL;
      Double* = REAL;
      Clampd* = REAL;
      
      PtrSTR* = POINTER TO ARRAY [untagged] OF SHORTCHAR;
      int* = INTEGER;

END LibsGLUTTypes.


Код:
MODULE LibsGLUT ["glut32"];

   IMPORT Types := LibsGLUTTypes;
   
   TYPE
      int* = Types.int;
      PtrSTR* = Types.PtrSTR;

   (* GLUT Initialization sub-API *)
   PROCEDURE Init* ['glutInit'] (VAR argc: int; VAR argv: PtrSTR);

END LibsGLUT.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Октябрь, 2010 17:30 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Роман М. писал(а):
Сегодня INTEGER занимает 32 бита, завтра - 128.
В КП INTEGER зафиксирован в 32 бита. 128 -- это HUGEINT.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Октябрь, 2010 10:16 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Info21 писал(а):
Роман М. писал(а):
Сегодня INTEGER занимает 32 бита, завтра - 128.
В КП INTEGER зафиксирован в 32 бита. 128 -- это HUGEINT.

Если завтра выйдет новая версия сообщения об языке КП с указанием размера нового размера INTEGER, то что делать с ПО, написанным под предыдущие версии? Возможен вариант, что ПО придётся адаптировать под новые версии компилятора.
С другой стороны, тип INTEGER имеет различный размер среди разных версий компиляторов Оберонов. Как тогда можно гарантировать компиляцию программы?

Чтобы не перелопачивать весь код, я могу лишь заменить alias базового типа в одном модуле, а затем скомпилировать проект заново. Разве так не выгоднее?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Октябрь, 2010 14:41 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Смотря для чего. Если ПО уже было написано для 32, то значит, что оно сможет корректно работать и на машине с 128 (правда, возможно, медленнее при прочих равных).

А если делается обновление программы для работы со 128 (допустим, эти 128 открывают новые возможности), то перелопачивание кода будет долгим.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Октябрь, 2010 16:10 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Роман М. писал(а):
Если завтра выйдет новая версия сообщения об языке КП с указанием размера нового размера INTEGER, то
А с какого бодуна это может произойти?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Октябрь, 2010 16:11 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
Евгений Темиргалеев писал(а):
Думаю, лучше говорить о единообразности процесса переноса, когда будет использоваться не особый модуль, а общие соглашения (именование, выбор правильного типа) по переводу типов, записанные (и обновляемые) в общедоступном месте.
Соответствие между типами данных удобно собрать в одной таблице, как сделано, например, на http://www.zel.org/oberon/osci.htm


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

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


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

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


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

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