ОТ МОДЕРАТОРА
Выделена тема по просьбе:
> -- Info21 писал(а):
> Коллеги, очень интересно про инициализацию. Может быть, выделить в отдельную темку про "Чем хороши настоящие модули"? И вставить там в начале ссылочку на текст Сергея Юрьевича.
Ссылка на статью С.Ю. Губанова "Секреты модульных систем":
http://oberoncore.ru/index.php?option=c ... &Itemid=23


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