OberonCore https://forum.oberoncore.ru/ |
|
Java, внезапный сюрприз синтаксиса. https://forum.oberoncore.ru/viewtopic.php?f=27&t=2192 |
Страница 1 из 1 |
Автор: | Alexey Veselovsky [ Среда, 09 Декабрь, 2009 00:38 ] |
Заголовок сообщения: | Java, внезапный сюрприз синтаксиса. |
Пришла мне как-то в голову идея нового стиля коментариев -- коментирование не строк, а крупных элементов синтаксиса, ну например модуль, функция, блок и т.п. в пределе любого нетерминала грамматики языка. Идея в общем то не жизнеспособная, ибо имеет множество побочных эффектов. Но дело не в ней. В процессе обсеждения её я беседовал в т.ч. и с одним начинающим явистом. В качестве контр довода (чем таковые коментарии плохи) он привел пример: а что если я хочу закоментировать не всю функцию, а лишь объявление её, а тело (блок в фигурных скобочках) оставить? Т.е. как-то так: Код: // 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. А тот явист не знал, что оставляя такие вот безимянные блоки кода он тем самым создает новый конструктор по умолчанию. Мелкий побочный эффект, да. |
Автор: | kreol [ Среда, 09 Декабрь, 2009 03:16 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
Это можно было предугадать учитывая возможность инициализировать поля класса при их объявлении. Думаю, это не специально задуманная фича, а побочный эффект при разработке компилятора. |
Автор: | kemiisto [ Среда, 09 Декабрь, 2009 10:59 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
Только это не конструктор по-умолчанию, а нестатический блок инициализации (non-static initializer block). И код, который в нём находиться компилятор копирует во все конструкторы. Используется для недопущения "копи-пасты" между разными конструкторами. Слишком уж Вам "зелёный" Джавист попался. |
Автор: | Alexey Veselovsky [ Среда, 09 Декабрь, 2009 11:33 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
kreol писал(а): Это можно было предугадать учитывая возможность инициализировать поля класса при их объявлении. Думаю, это не специально задуманная фича, а побочный эффект при разработке компилятора. Да нет, это именно специально задуманная и задокументированная фича языка. |
Автор: | Alexey Veselovsky [ Среда, 09 Декабрь, 2009 11:41 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
kemiisto писал(а): Только это не конструктор по-умолчанию, а нестатический блок инициализации (non-static initializer block). И код, который в нём находиться компилятор копирует во все конструкторы. Используется для недопущения "копи-пасты" между разными конструкторами. Слишком уж Вам "зелёный" Джавист попался. Борьба с копипастой это конечно хорошо, но, с другой стороны, что мешает общую для всех конструкторов часть оформить в виде отдельной функции? Зачем оно в виде безъимянных блоков то сделано? Чтобы предотвратить использование этого кода вне конструкторов (т.е. сделать невозможным явный вызов)? А зачем дали возможность разбивать это на несколько блоков? Судя по тому что "зеленый" джавист об этом вообще понятия не имел, а сильно не зеленый, который мне объяснял что же это такое, сказал сперва что это будет конструктор по умолчанию (правда потом нарыл какую-то доку и сказал что там не все так просто), эта фича используется редко, она не очевидна => потенциального вреда от нее больше чем пользы. |
Автор: | kemiisto [ Среда, 09 Декабрь, 2009 12:23 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
Alexey, да Вы не подумайте, что я Java защищать собираюсь. Указанный синтаксический сахар, конечно же, бесполезен. И, как Вы правильно заметили, крайне редко используется. Тем не менее, я вот на Java уже год не пишу, но эту фичу почему-то помню. Видимо, сталкивался. Возможно, в чужом коде. А вот то, что можно несколько блоков иметь, так это и для меня была новость. А вообще, всё познаётся в сравнении. Из мейнстрима Java, пожалуй, очень даже ничего. Ещё вот Objective-C тоже ничего, но нестрогая динамическая типизация - это ой-ой-ой. |
Автор: | Alexey Veselovsky [ Среда, 09 Декабрь, 2009 12:35 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
kemiisto писал(а): Alexey, да Вы не подумайте, что я Java защищать собираюсь. Указанный синтаксический сахар, конечно же, бесполезен. И, как Вы правильно заметили, крайне редко используется. Тем не менее, я вот на Java уже год не пишу, но эту фичу почему-то помню. Видимо, сталкивался. Возможно, в чужом коде. А вот то, что можно несколько блоков иметь, так это и для меня была новость. Это не сахар, это сахар с пургеном. Вроде бы вначале и сладко а потом опа... kemiisto писал(а): А вообще, всё познаётся в сравнении. Из мейнстрима Java, пожалуй, очень даже ничего. Java как язык может быть и ничего, но вот j2ee (а это то что реально используется, число применений чисто j2se минимально) -- это очень даже чаво. Как это было в одном известном текстике.. Цитата: Из точки А в точку Б никто никуда не едет, зато есть framework. В котором можно задать plug-in, который конфигурирует другой plug-in, который читает третий plug-in и посылает event четвертому, а тот уже знает, что делать. Через Inversion of Control, так интереснее. В совокупности решения на С/С++ в результате оказываются проще чем на Java, несмотря на язык. Т.е. в них проще разобраться. kemiisto писал(а): Ещё вот Objective-C тоже ничего, но нестрогая динамическая типизация - это ой-ой-ой. Именно нестрогая? Вот скажем в erlang'e строгая динамическая типизация |
Автор: | Сергей Губанов [ Среда, 09 Декабрь, 2009 12:50 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
Alexey Veselovsky писал(а): Это не сахар, это сахар с пургеном. Вроде бы вначале и сладко а потом опа... "Синтаксический пурген" - прикольно, надо запомнить... |
Автор: | kemiisto [ Среда, 09 Декабрь, 2009 12:53 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
Alexey Veselovsky писал(а): Именно нестрогая? Вот скажем в erlang'e строгая динамическая типизация Именно. Посылаете экземпляру класса MyClass сообщение myMessage, которое отсутствует и в его объявлении и в объявлениях всех его суперкласов. Получите Цитата: warning: 'MyClass' may not respond to '-myMessage' Канешна, можно выставить опцию компилятора Treat Warnings as Errors... Ну да, в Python вон тоже строгая динамическая. Но, как по мне, хлам тот ещё. Erlang в глазе не видел. |
Автор: | Alexey Veselovsky [ Среда, 09 Декабрь, 2009 22:40 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
kemiisto писал(а): Alexey Veselovsky писал(а): Именно нестрогая? Вот скажем в erlang'e строгая динамическая типизация Именно. Посылаете экземпляру класса MyClass сообщение myMessage, которое отсутствует и в его объявлении и в объявлениях всех его суперкласов. Получите Цитата: warning: 'MyClass' may not respond to '-myMessage' Канешна, можно выставить опцию компилятора Treat Warnings as Errors... А что будет если таковое сообщение таки будет доставлено? Объект его просто проигнорирует? kemiisto писал(а): Ну да, в Python вон тоже строгая динамическая. Но, как по мне, хлам тот ещё. Erlang в глазе не видел. Динамическая типизация в питоне во-первых не обоснована, во-вторых она там усугубляется императивностью оного питона, точнее, мутабельностью типов. Там можно не то что ногу, руку в которой ружьё держишь прострелить не проблема. |
Автор: | kemiisto [ Среда, 09 Декабрь, 2009 23:45 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
Alexey Veselovsky писал(а): А что будет если таковое сообщение таки будет доставлено? Объект его просто проигнорирует? Нет, будет возбУждено исключение NSInvalidArgumentException. |
Автор: | Alexey Veselovsky [ Четверг, 10 Декабрь, 2009 00:44 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
kemiisto писал(а): Alexey Veselovsky писал(а): А что будет если таковое сообщение таки будет доставлено? Объект его просто проигнорирует? Нет, будет возбУждено исключение NSInvalidArgumentException. Ну, значит ловить потенциальное исключение надобно Типa "нас не поняли". |
Автор: | Trurl [ Четверг, 10 Декабрь, 2009 09:00 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
kemiisto писал(а): Нет, будет возбУждено исключение NSInvalidArgumentException. Значит, типизация таки строгая. |
Автор: | kemiisto [ Четверг, 10 Декабрь, 2009 15:10 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
Trurl писал(а): Значит, типизация таки строгая. Ну тут ситуация "как корабль назовёшь..." Согласен, правда, что если Python причислять к строго типизированным языкам, то и Objective-C тогда туда же. Всё это дело (Python, Ruby, Objective-C) растёт, видимо стоит считать, из Smalltalk. Т.е. ошибки типизации отлавливаются, но в runtime, а не на этапе компиляции. Хотя лучше, видимо, называть такую типизацию динамической. А точнее утиной (duck typing). |
Автор: | Илья Ермаков [ Четверг, 10 Декабрь, 2009 17:51 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
А как не назови - всё тот же "сахар с пургеном" (С) |
Автор: | kemiisto [ Четверг, 10 Декабрь, 2009 18:38 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
Илья Ермаков писал(а): А как не назови - всё тот же "сахар с пургеном" (С) А что делать-то. На чём писать, скажем, кросс-платформенный GUI? Java + Swing, C++ + Qt (undefined behaviour поличился? ). Пощупав, остановился на втором. Можно ещё поизвращаться 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 там тоже мама не горюй подводных камней. Вообще, все эти коммитеты по стандартизации - враги народа. От них больше проблем, чем реальной пользы. А что делать? А на чём писать под тот же Mac OS? Objective-C, Java, C++. Первое существенно выгоднее. А какие там наборы библиотек. Уммм. Сокровища просто. .NET нервно курить в сторонке (если речь о desktop). Получается, что Oberon остаётся "вещью в себе"? Он ведь так и задумывался (Project Oberon)? Или я не прав? Вот тут есть люди, которые используют нечто под названием A2. Вот там, видимо, да. Oberon во всей красе... |
Автор: | Илья Ермаков [ Четверг, 10 Декабрь, 2009 19:05 ] |
Заголовок сообщения: | Re: Java, внезапный сюрприз синтаксиса. |
ББ тоже работает "в красе..". И кросс, если брать пару Вин-Лин. Но пока не легкодоступно каждому, что правда - то правда. Хотя... Вспомнил, что Вы про ГУИ. Проблема стоит, да. Дмитрий Соломенников вот упорно её долбит вроде. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |