IPB
ЛогинПароль:

> Портирование реализации сильных ссылок на Ada 95
сообщение
Сообщение #1


Большевик–концептуал
***

Группа: Пользователи
Сообщений: 194
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: bu_gen@octagram.name
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


Требуется склонировать основное хранилище

https://osdn.net/projects/referencing/scm/hg/Referencing/

Поменять в gpr ключ -gnat12 на -gnat95 и добиться, чтоб тестовый пример собирался. Я делал на GNAT GPL 2017. Если собранный другой GNAT поддерживает -gnat95, сойдёт.

Я думал сам это сделать, чтоб начало положить, но не вывожу никак, рубит после китайского намертво, так и не довёл до конца.


Должен собираться и запускаться проект Referencing_Tester.gpr

Пока я пытался портировать, я столкнулся со следующим:

Limited_Reference — всё, что так называется, делается просто Reference. «subtype Limited_Reference is Reference;»

Limited_Reference принуждает не делать лишние копирования. В Delphi Result для больших объектов сразу по месту назначения выделяется, а в языке Ада, даже если написать return-do-end-return, компилятор временную переменную заводит, и только limited даёт возможность вкрутить ему мозги. В другом проекте, где контейнеры портируются, я делаю Ada 2012-подобый Ada 95-совместимый аналог, но в данном случае смысла в этой затее не увидел.

Limited_Reference в проекте используется в паре с Move. Move требует доступ на запись ко второму параметру. Все функции написаны так, что возвращают Limited_Reference. Возвращаемый Limited_Reference доступен только на чтение, но механизмы Ada 2012 приводят его к доступному на запись Reference, и Move работает. Чем-то это похоже на «&&» и семантику копирования в C++. Если же для Ada 95 объявлено «subtype Limited_Reference is Reference;», то Move такое не может пережевать. Надо заменять Move на Assign, где ругается. Ещё в Referencing.Tester.Main.adb есть строчки с объявлениями «… renames …», и компилятор в режиме Ada 95 на них жалуется. Там надо renames заменить на «… := …».

В версии Ada 95 нет записи методов через точку, поэтому X.Move (Y) и X.Assign (Y) надо переписывать на Move (X, Y) и Assign (X, Y), а поскольку Move меньше, где работает, то часть Move становится Assign.

Аспекты Pure и Preelaborate переделываются в pragma. Аналогично Inline_Always. overriding убирается. В одном месте процедуры стали dispatching, там Inline_Always надо заменить на Inline. Функция Release берёт параметр in out, что в Ada 95 не допускается. Надо переделать в процедуру с out параметром.

private with заменяется простым with.

Это всё, что я успел увидеть, пока занимался этим вопросом.

Перед фиксацией в https://osdn.net/projects/referencing/scm/hg/Referencing/ установить новую именованную ветку ada-95

В default там пусть остаётся Ada 2012 версия. Я, может, потом сведу ветки вместе, но в разных директориях, и когда видно будет, что насколько разъезжается.


Как получится на GNAT, можно переносить на AdaMagic.


Но, наверное, лучше файлы в хранилище Experiments скопировать и коммитить в Experiments, а не в Referencing.

Там система сборки, правда, нетривиальная. В Referencing для GNAT тестовый пример добавляет крючки на события копирования и освобождения, а в просто Referencing.gpr (как библиотека) этих крючков нет. Хоть как-нибудь для начала нужно запустить эту штуку.

Чтобы получать по почте уведомления о новых темах, на раздел форума нужно подписаться здесь


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Большевик–концептуал
***

Группа: Пользователи
Сообщений: 194
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: bu_gen@octagram.name
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


Да, только портировав Tester, можно понять, что всё действительно работает


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: Сергей Дюков
Skype: sergey.dukov54
Ада: Разработчик
Компонентный Паскаль: Сторонник

Репутация: -  0  +


Я закончил портирование пакета "Referencing". В файле "Referencing.Tester.Main.adb" у меня синтаксис ОБЪЕКТ-ПАСКАЛЬ не проходит. Перед точкой можно использовать только квалификатор АДА-пакета, а не имя объекта. При портации я, наверное, изменил логику тестера. Проверьте, пожалуйста, правильность работы пакета.

Я пока не освоил работу с "TortoiseHg". Посылаю пока ссылку на упакованный пакет: Referencing.tar.xz. В файле build/build.txt инструкции по сборке пакета.

Что мне делать дальше?

PS: Я понял откуда появилось подобие синтаксиса ОБЪЕКТ-ПАСКАЛЬ: это результат добавления аспекта "with Implicit_Dereference => Data" к limited-типам. Но в АДА95 аспектов не существует и поэтому такой возможности не существует. В АДА95 нужно иметь доступ к полю "Data". В варианте пакета для АДА2012 это поле публично, так как является дескриптором типа. Но в АДА95 поля типа указателя не могут быть дескрипторами типа. И тут я допустил ошибку -- сделал это поле приватным не обеспечив публичного механизма доступа к этому полю. Какой мне вариант выбрать: сделать поле публичным или создать программный механизм доступа к приватному полю?


Сообщение отредактировано: Sergey Dukov -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Большевик–концептуал
***

Группа: Пользователи
Сообщений: 194
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: bu_gen@octagram.name
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


Цитата(Sergey Dukov @ 5.09.2019 4:11) *
Я закончил портирование пакета "Referencing". В файле "Referencing.Tester.Main.adb" у меня синтаксис ОБЪЕКТ-ПАСКАЛЬ не проходит. Перед точкой можно использовать только квалификатор АДА-пакета, а не имя объекта.


Такие конструкции заменяются на просто вызов функции. X.Assign (Y); → Assign (X, Y);

В Ada 2005+ оба варианта работают для любой примитивной операции tagged record, разве, может, для второго синтаксиса больше use надо подключить. В Ada 95 второй синтаксис безальтернативен, от чего у адаистов пригорало до самой Ada 2005, но виртуальные методы всё равно диспетчеризуются, как и положено в объектно-ориентированном языке программирования.

Цитата(Sergey Dukov @ 5.09.2019 4:11) *
При портации я, наверное, изменил логику тестера. Проверьте, пожалуйста, правильность работы пакета.


В точности логика воспроизведена не будет, это так. Но должны получиться такие сильные ссылки, на которых все дальнейшие разработки смогут быть построены.

Цитата(Sergey Dukov @ 5.09.2019 4:11) *
Я пока не освоил работу с "TortoiseHg". Посылаю пока ссылку на упакованный пакет: Referencing.tar.xz. В файле build/build.txt инструкции по сборке пакета.

Что мне делать дальше?


Таки освоить работу с TortoiseHg. Установить ветку ada95, написать сообщение ревизии, создать ревизию и отправить.

Цитата(Sergey Dukov @ 5.09.2019 4:11) *
PS: Я понял откуда появилось подобие синтаксиса ОБЪЕКТ-ПАСКАЛЬ


Нет, это для любого tagged типа так. Ada 2005+ контейнеры — все tagged, для любого контейнера в Ada 2005+ можно написать My_Vector.Append (Value) или My_Set.Include (Element).


Цитата(Sergey Dukov @ 5.09.2019 4:11) *
это результат добавления аспекта "with Implicit_Dereference => Data" к limited-типам.


Этот аспект даёт возможность Ada 2012-ссылке быть неявно приведённой к тому, на что она указывает своим Data.all. То, на что в Ada 2012+ версии Refererencing указывают Limited_ ссылки, является tagged record, поэтому к ним применим синтаксис Объект.Метод. Сами Limited_* типы объявлены не как tagged. Я насколько помню, я им никаких примитивных операций, берущих их как параметр, не объявлял, но если бы объявил, для них синтаксис Объект.Метод не работал, до тех пор, пока Limited_* тип не сделать tagged. Делать это было совершенно незачем, так он и остался без тега.

Как я уже писал, вся эта затея с Limited_* уменьшает количество копирований в Ada 2012. И без этого можно обойтись. Обойтись — значит, все функции вроде Tester.Plus возвращают обычную копируемую сильную ссылку, без Limited_*. В Ada 95 версии, наверное, лучше не subtype сделать, а совсем выпилить, чтоб не сбивала с толку.

Цитата(Sergey Dukov @ 5.09.2019 4:11) *
Но в АДА95 аспектов не существует и поэтому такой возможности не существует. В АДА95 нужно иметь доступ к полю "Data". В варианте пакета для АДА2012 это поле публично, так как является дескриптором типа. Но в АДА95 поля типа указателя не могут быть дескрипторами типа.


Могут. Но такие дискриминанты превращают тип в limited, а с limited в Ada 95 работу ещё не сделали удобно. Кроме указательных дескрипторов (синтаксис Data : access Name_Of_Type) ещё бывают дискриминанты именованных указательных типов (синтаксис Data : Stream_Access := null). Я рассматриваю их как возможность в Ada 95 делать трюки, похожие на Ada 2012+, но до конца не проверял. Если функция выделяет в динамической памяти нечто и возвращает копируемое (не limited) значение с именованным указательным дискриминантом, а в declare-begin-end используется синтаксис Some_Value : Some_Type renames Some_Function (Some_Parameter).Data.all, будет ли результат функции жить до конца end, как это сделано для указательных дискриминантов.


Цитата(Sergey Dukov @ 5.09.2019 4:11) *
И тут я допустил ошибку -- сделал это поле приватным не обеспечив публичного механизма доступа к этому полю. Какой мне вариант выбрать: сделать поле публичным или создать программный механизм доступа к приватному полю?


Заменить пока все ссылки Limited_* их копируемыми аналогами.


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
OCTAGRAM   Портирование реализации сильных ссылок на Ada 95   26.08.2019 17:58
Sergey Dukov   ------------------------------ -- Crea…   3.09.2019 14:54
OCTAGRAM   Mutable_Result : Mutable_Limited_Reference перекры…   4.09.2019 18:16
Sergey Dukov   Я с этим разобрался. Я портировал проект "Ref…   4.09.2019 19:34
OCTAGRAM   Да, только портировав Tester, можно понять, что вс…   4.09.2019 20:13
Sergey Dukov   Я закончил портирование пакета "Referencing…   5.09.2019 4:11
OCTAGRAM   Я закончил портирование пакета "Referencing…   5.09.2019 15:25
Sergey Dukov   Закончил портирование и влил результат на сервер в…   9.09.2019 3:45
OCTAGRAM   Наблюдается прогресс. Что я вижу. https://osdn.n…   9.09.2019 16:44
Sergey Dukov   А как узнать текущий номер задачи? И ещё, как дел…   9.09.2019 21:56
OCTAGRAM   А как узнать текущий номер задачи? В адресе нап…   9.09.2019 22:53
Sergey Dukov   Вы мне показывали как делать "commit" дл…   10.09.2019 3:05
Sergey Dukov   В последнем предложении я ошибся. операторы …   10.09.2019 16:24
OCTAGRAM   Вы мне показывали как делать "commit" дл…   10.09.2019 16:51
Sergey Dukov   А как расшифровать шаблон "\#(\d+)…   10.09.2019 18:28
OCTAGRAM   \d = любая цифра. + = жадно 1 или более раз с…   10.09.2019 19:15


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 15.04.2025 8:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name