OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 16:25

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




Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Java, внезапный сюрприз синтаксиса.
СообщениеДобавлено: Среда, 09 Декабрь, 2009 00:38 

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

В процессе обсеждения её я беседовал в т.ч. и с одним начинающим явистом. В качестве контр довода (чем таковые коментарии плохи) он привел пример: а что если я хочу закоментировать не всю функцию, а лишь объявление её, а тело (блок в фигурных скобочках) оставить? Т.е. как-то так:
Код:
// void foo()
{
    // some code
}


На что я удивился, и сказал что мол смысла такой блок не имеет, и по идее, должна быть синтаксическая ошибка. Следовательно одну голову функции придется всё равно заменить на другую:
Код:
// void foo
void boo
{
    // some code
}

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

Однако я оказался не прав. Оказывается первый пример вполне себе скомпилируется. Т.е.
Код:
class A {

    // void foo()
    {
        System.out.println(10);
    }
}


Компилируется и имеет смысл! Более того:
Код:
class A {
    {
        System.out.print(100);
    }

    void boo() {
        System.out.print("boo\n");
    }

    // void foo()
    {
        System.out.println(10);
    }
}


Также компилируется и имеет смысл -- безимянный блок в классе в яве это оказывается конструктор по умолчанию! Причем таких блоков может быть множество. Выполняться они вроде как будут последовательно -- сверху вниз. Т.о. Конструктор по умолчанию может быть размазан тонким слоем по всему классу.

PS. А тот явист не знал, что оставляя такие вот безимянные блоки кода он тем самым создает новый конструктор по умолчанию. Мелкий побочный эффект, да.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Декабрь, 2009 03:16 

Зарегистрирован: Суббота, 12 Май, 2007 08:41
Сообщения: 102
Откуда: Беларусь, Минск
Это можно было предугадать учитывая возможность инициализировать поля класса при их объявлении. Думаю, это не специально задуманная фича, а побочный эффект при разработке компилятора.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Декабрь, 2009 10:59 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
Только это не конструктор по-умолчанию, а нестатический блок инициализации (non-static initializer block). И код, который в нём находиться компилятор копирует во все конструкторы. Используется для недопущения "копи-пасты" между разными конструкторами.

Слишком уж Вам "зелёный" Джавист попался. :)


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

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


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


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

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
kemiisto писал(а):
Только это не конструктор по-умолчанию, а нестатический блок инициализации (non-static initializer block). И код, который в нём находиться компилятор копирует во все конструкторы. Используется для недопущения "копи-пасты" между разными конструкторами.

Слишком уж Вам "зелёный" Джавист попался. :)


Борьба с копипастой это конечно хорошо, но, с другой стороны, что мешает общую для всех конструкторов часть оформить в виде отдельной функции?

Зачем оно в виде безъимянных блоков то сделано? Чтобы предотвратить использование этого кода вне конструкторов (т.е. сделать невозможным явный вызов)? А зачем дали возможность разбивать это на несколько блоков?

Судя по тому что "зеленый" джавист об этом вообще понятия не имел, а сильно не зеленый, который мне объяснял что же это такое, сказал сперва что это будет конструктор по умолчанию (правда потом нарыл какую-то доку и сказал что там не все так просто), эта фича используется редко, она не очевидна => потенциального вреда от нее больше чем пользы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Декабрь, 2009 12:23 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
Alexey, да Вы не подумайте, что я Java защищать собираюсь. :) Указанный синтаксический сахар, конечно же, бесполезен. И, как Вы правильно заметили, крайне редко используется. Тем не менее, я вот на Java уже год не пишу, но эту фичу почему-то помню. Видимо, сталкивался. Возможно, в чужом коде. А вот то, что можно несколько блоков иметь, так это и для меня была новость.

А вообще, всё познаётся в сравнении. Из мейнстрима Java, пожалуй, очень даже ничего. Ещё вот Objective-C тоже ничего, но нестрогая динамическая типизация - это ой-ой-ой. :o


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Декабрь, 2009 12:35 

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

Это не сахар, это сахар с пургеном. Вроде бы вначале и сладко а потом опа... ;-)

kemiisto писал(а):
А вообще, всё познаётся в сравнении. Из мейнстрима Java, пожалуй, очень даже ничего.

Java как язык может быть и ничего, но вот j2ee (а это то что реально используется, число применений чисто j2se минимально) -- это очень даже чаво. Как это было в одном известном текстике..
Цитата:
Из точки А в точку Б никто никуда не едет, зато есть framework. В котором можно задать plug-in, который конфигурирует другой plug-in, который читает третий plug-in и посылает event четвертому, а тот уже знает, что делать. Через Inversion of Control, так интереснее.

В совокупности решения на С/С++ в результате оказываются проще чем на Java, несмотря на язык. Т.е. в них проще разобраться.

kemiisto писал(а):
Ещё вот Objective-C тоже ничего, но нестрогая динамическая типизация - это ой-ой-ой. :o

Именно нестрогая? Вот скажем в erlang'e строгая динамическая типизация :-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Декабрь, 2009 12:50 
Аватара пользователя

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

"Синтаксический пурген" - прикольно, надо запомнить... :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Декабрь, 2009 12:53 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
Alexey Veselovsky писал(а):
Именно нестрогая? Вот скажем в erlang'e строгая динамическая типизация :-)

Именно. Посылаете экземпляру класса MyClass сообщение myMessage, которое отсутствует и в его объявлении и в объявлениях всех его суперкласов. Получите
Цитата:
warning: 'MyClass' may not respond to '-myMessage'

:wink: Канешна, можно выставить опцию компилятора Treat Warnings as Errors...

Ну да, в Python вон тоже строгая динамическая. Но, как по мне, хлам тот ещё. Erlang в глазе не видел.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Декабрь, 2009 22:40 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
kemiisto писал(а):
Alexey Veselovsky писал(а):
Именно нестрогая? Вот скажем в erlang'e строгая динамическая типизация :-)

Именно. Посылаете экземпляру класса MyClass сообщение myMessage, которое отсутствует и в его объявлении и в объявлениях всех его суперкласов. Получите
Цитата:
warning: 'MyClass' may not respond to '-myMessage'

:wink: Канешна, можно выставить опцию компилятора Treat Warnings as Errors...

А что будет если таковое сообщение таки будет доставлено? Объект его просто проигнорирует?

kemiisto писал(а):
Ну да, в Python вон тоже строгая динамическая. Но, как по мне, хлам тот ещё. Erlang в глазе не видел.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Декабрь, 2009 23:45 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
Alexey Veselovsky писал(а):
А что будет если таковое сообщение таки будет доставлено? Объект его просто проигнорирует?

Нет, будет возбУждено исключение NSInvalidArgumentException. :mrgreen:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Декабрь, 2009 00:44 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
kemiisto писал(а):
Alexey Veselovsky писал(а):
А что будет если таковое сообщение таки будет доставлено? Объект его просто проигнорирует?

Нет, будет возбУждено исключение NSInvalidArgumentException. :mrgreen:

Ну, значит ловить потенциальное исключение надобно :-) Типa "нас не поняли".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Декабрь, 2009 09:00 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
kemiisto писал(а):
Нет, будет возбУждено исключение NSInvalidArgumentException. :mrgreen:


Значит, типизация таки строгая.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Декабрь, 2009 15:10 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
Trurl писал(а):
Значит, типизация таки строгая.

Ну тут ситуация "как корабль назовёшь..." :) Согласен, правда, что если Python причислять к строго типизированным языкам, то и Objective-C тогда туда же. Всё это дело (Python, Ruby, Objective-C) растёт, видимо стоит считать, из Smalltalk. Т.е. ошибки типизации отлавливаются, но в runtime, а не на этапе компиляции.

Хотя лучше, видимо, называть такую типизацию динамической. А точнее утиной (duck typing).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Декабрь, 2009 17:51 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Декабрь, 2009 18:38 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
Илья Ермаков писал(а):
А как не назови - всё тот же "сахар с пургеном" (С) :)

А что делать-то. На чём писать, скажем, кросс-платформенный GUI? Java + Swing, C++ + Qt (undefined behaviour поличился? :lol: ). Пощупав, остановился на втором. Можно ещё поизвращаться Puthon, Ruby, whatever + Qt bindings. Ну или там wxWidgets. Но это себе дороже. :)

Да даже и не GUI. Нет же даже просто кроссплатформенного компилятора.
Native XDS - только Windows и Linux. И только x86. oo2c собрать не получилось. Да и к тому же возможность использовать third-party library with a plain C API это, конечно, может кому-то и развязывает руки. А мне вот нафиг не нужно. В смысле бестолковый я в этом плане. Я же не программист. А пишите же, что Oberon - самое то, для непрофессиональных программистов. Физиков там, химиков и т.п. (сам - химик) И как Вы себе это представляете? Развлекаться изготовлением привязок для того же Qt? Или на каждой платформе под родной API затачивать? Это знаете, С++ быстрее изучить. :) Или тот же Fortran. Вот и учу. В Frotran там тоже мама не горюй подводных камней. Вообще, все эти коммитеты по стандартизации - враги народа. :evil: От них больше проблем, чем реальной пользы. А что делать?

А на чём писать под тот же Mac OS? Objective-C, Java, C++. Первое существенно выгоднее. А какие там наборы библиотек. Уммм. Сокровища просто. .NET нервно курить в сторонке (если речь о desktop).

Получается, что Oberon остаётся "вещью в себе"? Он ведь так и задумывался (Project Oberon)? Или я не прав?

Вот тут есть люди, которые используют нечто под названием A2. Вот там, видимо, да. Oberon во всей красе... :?:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Декабрь, 2009 19:05 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
ББ тоже работает "в красе..". И кросс, если брать пару Вин-Лин.

Но пока не легкодоступно каждому, что правда - то правда.

Хотя... Вспомнил, что Вы про ГУИ. Проблема стоит, да. Дмитрий Соломенников вот упорно её долбит вроде.


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

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


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

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


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

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