OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 02:17

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




Начать новую тему Ответить на тему  [ Сообщений: 76 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 12:04 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1449
Откуда: Киев
ОТ МОДЕРАТОРА
Выделена тема по просьбе:
Info21 писал(а):
Коллеги, очень интересно про инициализацию. Может быть, выделить в отдельную темку про "Чем хороши настоящие модули"? И вставить там в начале ссылочку на текст Сергея Юрьевича.

Ссылка на статью С.Ю. Губанова "Секреты модульных систем":
http://oberoncore.ru/index.php?option=c ... &Itemid=23


================================================
Хочу вернуться к первоначальному вопросу об инициализации переменных по месту объявления.
В Обероне инициализация переменных сделана близко к тому, что в итоге будет скомпилировано. Какая в этом польза для писателя компилятора - очевидно. Но есть ли от этого выгода для программиста? Ведь как неудобно - инициализировать не по месту объявления, а в отдельной секции в конце модуля. На мой взгляд, выгода есть.
Расскажу на примере. Недавно у меня возникла проблема с портированием приложения для мобильного телефона, написанного на Яве, на несколько непривычных аппаратов: после выхода из приложения, оно уже не хотело выполняться второй раз. Оказалось, что проблема заключалась в неправильной инициализации статических переменных класса.
На большинстве телефонов при завершении мидлета (аналога апплета для мобильного) все классы выгружаются, и при повторной загрузке все статические переменные инициализируются заново. Поэтому в абсолютном большинстве мидлетов допущена одна и та же ошибка: те переменные, которые должны инициализироваться при загрузке приложения, инициализируется при загрузке классов. Поскольку для большинства телефонов это всегда происходит одновременно, то проблемы не возникает, но на устройствах, выпавших мне, классы не выгружаются, и в результате у меня проблема на 40 классов с кучей неправильных значений в переменных. В Яве - это проблема, поскольку объявления статических переменных (переменных модуля) перемешаны с объявлениями нестатических (переменных объекта) и телами функций. К тому же в портируемом приложении инициализация напичкана перекрёстными ссылками, а потому зависит от порядка загрузки классов, но проследить этот порядок проблематично.
Представим, что это глючное приложение было бы написано на Обероне. Моя задача была бы очень простой: достаточно было бы перенести компактные секции инициализации в процедуры, проследить порядок загрузки модулей, выведя при загрузке имена модулей в лог, и при запуске мидлета выполнить в этом порядке процедуры. Хочу отметить, что допустить такую ошибку в Обероне было бы сложней, из-за более чёткого разнесения понятий по сравнению с Явой, где инициализация переменных размазана по всему классу и всё свалено в кучу: и класс, и модуль. То есть одним лишь правильным выбором языка, как минимум на одну головную боль становится меньше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 13:37 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Comdiv писал(а):
К тому же в портируемом приложении инициализация напичкана перекрёстными ссылками, а потому зависит от порядка загрузки классов, но проследить этот порядок проблематично.

Меня в C# "радует" вот такая возможность:
Код:
public static class A
{
   public static readonly int a = B.b + 1;
}

public static class B
{
   public static readonly int b = A.a + 1;
}

Всё компилируется и даже "работает".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 15:21 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1449
Откуда: Киев
Сергей Губанов писал(а):
Меня в C# "радует" вот такая возможность:
Код:
public static class A
{
   public static readonly int a = B.b + 1;
}

public static class B
{
   public static readonly int b = A.a + 1;
}

Всё компилируется и даже "работает".

Попробовал в Яве. Тоже работает, причём
System.out.println("A.a == " + A.a + "; B.b == " + B.b); //выдаёт A.a == 2; B.b == 1
System.out.println("B.b == " + B.b + "; A.a == " + A.a); //выдаёт B.b == 2; A.a == 1
А вот, что ещё можно:
Код:
public class A {
   public static int a;
}
public class B {
   public static final int B = A.a;
}

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 16:16 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Comdiv писал(а):
Представим, что это глючное приложение было бы написано на Обероне. Моя задача была бы очень простой: достаточно было бы перенести компактные секции инициализации в процедуры, проследить порядок загрузки модулей, выведя при загрузке имена модулей в лог, и при запуске мидлета выполнить в этом порядке процедуры.

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

В С++ эта проблема решается. В Аде она решается ещё проще и возможностей по контрою элаборации там значительно больше. Вплоть до явного указания кто и после кого.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 16:19 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Сергей Губанов писал(а):
Comdiv писал(а):
К тому же в портируемом приложении инициализация напичкана перекрёстными ссылками, а потому зависит от порядка загрузки классов, но проследить этот порядок проблематично.

Меня в C# "радует" вот такая возможность:
Код:
public static class A
{
   public static readonly int a = B.b + 1;
}

public static class B
{
   public static readonly int b = A.a + 1;
}

Всё компилируется и даже "работает".


Кстати, если мне мой склероз не изменяет, то в C# есть т.н. конструкторы статических классов. Или статические конструкторы... Как-то так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 16:32 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Alexey Veselovsky писал(а):
И это было бы ошибкой. Насколько я помню, описанием языка никак не гарантирована очередность инициализации модулей.


Гарантирована. Семантика импорта предполагает, что к началу "жизни" модуля A (т.е. моменту его инициализации, независимо от того, есть дин. загрузка или нет) все импортированные им модули готовы к использованию. Т.е. инициализированы. Ациклический направленный граф простым и ясным образом задаёт частичный порядок инициализации. Что частичный - пугать не должно, т.к. неупорядоченными остаются только независящие друг от друга модули.

Конечно, если разрешить циклическое использование модулей - вот тогда возникает букет проблем типа элабораций и проч.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 16:53 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
Alexey Veselovsky писал(а):
И это было бы ошибкой. Насколько я помню, описанием языка никак не гарантирована очередность инициализации модулей.


Гарантирована. Семантика импорта предполагает, что к началу "жизни" модуля A (т.е. моменту его инициализации, независимо от того, есть дин. загрузка или нет) все импортированные им модули готовы к использованию. Т.е. инициализированы. Ациклический направленный граф простым и ясным образом задаёт частичный порядок инициализации. Что частичный - пугать не должно, т.к. неупорядоченными остаются только независящие друг от друга модули.

Конечно, если разрешить циклическое использование модулей - вот тогда возникает букет проблем типа элабораций и проч.


Тут имеется один нюанс.

Код:
 MODULE A;
   VAR a* : INTEGER;
 BEGIN
   a:=0;
 END A.

 MODULE B;
   IMPORT A;
   VAR b* : INTEGER;
 BEGIN
   b:=A.a;
   A.a:=a+1;
 END B.

 MODULE C;
   IMPORT A;
   VAR c* : INTEGER;
 BEGIN
   c:=A.a;
   A.a:=a+1;
 END C.


Что будет в B.b и что будет в C.c ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 17:02 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да, такой момент есть.
Но обсуждается проблема констант. Т.е. CONST либо VAR только для чтения, которые изменять из другого модуля нельзя.

(экспорт на запись запретить бы вообще...)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 17:19 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1449
Откуда: Киев
Илья Ермаков писал(а):
(экспорт на запись запретить бы вообще...)

В данном случае это ничего не даст. Раз переменную так объявили, значит есть необходимость менять её значение в других модулях. Если запретить экспорт на запись, то эта потребность будет удовлетворена созданием уродливой процедуры, которая делает только то, что устанавливает новое значение переменной. Это инкапсуляция, доведённая до абсурда.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 17:53 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Коллеги, очень интересно про инициализацию. Может быть, выделить в отдельную темку про "Чем хороши настоящие модули"? И вставить там в начале ссылочку на текст Сергея Юрьевича.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 19:08 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Comdiv писал(а):
Илья Ермаков писал(а):
(экспорт на запись запретить бы вообще...)

В данном случае это ничего не даст. Раз переменную так объявили, значит есть необходимость менять её значение в других модулях. Если запретить экспорт на запись, то эта потребность будет удовлетворена созданием уродливой процедуры, которая делает только то, что устанавливает новое значение переменной. Это инкапсуляция, доведённая до абсурда.


Запретить изменение "не своих" переменных в блоке инициализации модуля. Также ввести понятие константных функций/процедур (аля vod foo() const; в с++) которые не меняют какие-либо переменные и разрешить вызывать в блоке инициализации только их.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 19:16 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
"Ввести... ввести... ввести..."
Как же нам хочется чего-нибудь ввести, вместо того, чтобы неспеша поразмыслить...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 19:21 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
"Ввести... ввести... ввести..."
Как же нам хочется чего-нибудь ввести, вместо того, чтобы неспеша поразмыслить...


А что, кто-то уже бросился реализовывать новые фичи в компиляторе оберона или КП?

По моему, мы тут как раз и размышляем. Неспешно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 19:30 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Кстати, вот за C# не скажу, но вот в яве import это совсем не аналог #include, также это не аналог и IMPORT'a оберонова или же адского with. На самом деле это аналог using (С++) или use (Ada). Т.е. просто позволяет с типами/функциями/переменными обращаться фамильярно, без полного упоминания фамилии.имени.отчества.

Всё что доступно, доступно сразу без import'a.

Какие классы/модули будут загружены определяет класслоадер и его параметры/пути. Естественно можно написать свой класслоадер который будет грузить то что нужно тебе и так как тебе нужно.

PS. Это сильно напоминает С, где #include как бы тоже не особо нужен. Т,е. без которого вполне можно обойтись.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Пятница, 07 Ноябрь, 2008 20:00 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1449
Откуда: Киев
Alexey Veselovsky писал(а):
Запретить изменение "не своих" переменных в блоке инициализации модуля. Также ввести понятие константных функций/процедур (аля vod foo() const; в с++) которые не меняют какие-либо переменные и разрешить вызывать в блоке инициализации только их.

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

Тот пример, что Вы привели, в том или ином виде может иметь смысл.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 08 Ноябрь, 2008 16:35 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
А один мидлет может запустить другой?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Воскресенье, 09 Ноябрь, 2008 00:27 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Alexey Veselovsky писал(а):
Кстати, если мне мой склероз не изменяет, то в C# есть т.н. конструкторы статических классов. Или статические конструкторы... Как-то так.

Да есть. Приведённый ранее пример есть ещё один образец синтаксического сахара C#, который компилятор раскрывает в следующий код со статическими конструкторами:
Код:
public static class A
{
   public static readonly int a;

   static A ()
   {
      a = B.b + 1;
   }
}

public static class B
{
   public static readonly int b;

   static B ()
   {
      b = A.a + 1;
   }
}

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Воскресенье, 09 Ноябрь, 2008 08:03 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Alexey Veselovsky писал(а):
Тут имеется один нюанс.

Это же совсем другая проблема.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 09 Ноябрь, 2008 11:56 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Ткачёв Ф.В. писал(а):
Это же совсем другая проблема.
В чем проблема? Поменять заголовки в cообщениях?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2008 13:45 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1449
Откуда: Киев
GUEST писал(а):
А один мидлет может запустить другой?

Нет


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 76 ]  На страницу 1, 2, 3, 4  След.

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


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

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


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

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