Показаны сообщения с ярлыком язык Java. Показать все сообщения
Показаны сообщения с ярлыком язык Java. Показать все сообщения

воскресенье, 16 июня 2024 г.

[prog.java] Листая старенький айпад или как же похорошела Java за последние 14 лет ;)

Довелось тут давеча вспомнить когда в последний раз программировал на Java. Почему-то думал, что было это в 2012-ом, а оказалось, что в 2010-ом. Интересно сейчас, спустя 14 лет, перечитывать собственные старые впечатления. Особенно вот эти соображения о том, чего лично мне тогда не хватало в Java. И тем забавнее обнаружить, что часть из описанного мной тогда, в современной Java уже есть: это и автоматический вывод типов переменных, и лямбда функции, и try-with-resources.

Как же похорошела Java за эти годы! ;)

Только вот желания программировать на Java как не было, так и нет :)))

PS. Да и с кроссплатформенностью у .NET и C# стало куда как лучше.

суббота, 26 марта 2016 г.

[prog.flame] Java-программисты боятся, что в Java добавят ключевое слово var

Все-таки люди, программирующие на Java, имеют особый склад ума (что, в принципе, ожидаемо, учитывая свойства этого языка программирования). Иначе сложно объяснить волнения, вызванные намерениями добавить в Java ключевое слово var (например, вот статья с попытками рассмотреть доводы "за" и "против" на Хабре и уже не маленькое обсуждение на LOR-е).

Странные люди. Смотреть нужно в первую очередь на то, что можно получить от автоматического вывода типа локальной переменной. Насколько я помню, именно необходимость такого вывода стала причиной добавления var-ов в C#, т.к. без этого реализация и использование LINQ вряд ли были бы возможны. Да и в C++11, после добавления в язык variadic templates и lambdas без auto уже никуда. Ну вот серьезно, сейчас в C++ я могу написать вот так:

std::thread first;
std::thread second;
std::thread third;
auto thr_joiner = so_5::auto_join(first, second, third);

И, на мой взгляд, это гораздо лучше, чем заставлять программиста писать вот так:

std::thread first;
std::thread second;
std::thread third;
so_5::threads_auto_joiner<3> thr_joiner = so_5::auto_join(first, second, third);

Еще веселее дела обстоят с лямбда-функциями, для которых тип генерируется самим компиляторам и который неизвестен программисту. Ключевое слово auto позволяет вот так:

std::FILE * f = std::fopen(file_name, "r");
if( f ) {
   auto f_closer = at_scope_exit([f]{ std::fclose(f); });
   ...
}

А если бы его не было, как бы пришлось извращаться? Писать что-то вроде:

std::FILE * f = std::fopen(file_name, "r");
if( f ) {
   at_exit_t< std::function<void()> > f_closer = at_scope_exit([f]{ std::fclose(f); });
   ...
}

Как говорится, нет уж, спасибо ;)

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

Так что, на мой взгляд, очень странные обсуждения ведутся в стане Java-программистов. Впрочем, там язык настолько убог, что может var просто поздно добавлять... :)


Касательно auto в C++. До тех пор, пока не работаешь плотно с навороченными шаблонными конструкциями, к auto относишься настороженно. Ведь, действительно, код, в котором сплошные auto, прочитать сложнее, чем код со всеми аннотациями типов. Однако, даже если речь идет о более-менее простых ситуациях, без шаблонных наворотов, то оказывается, что auto может повысить качество и безопасность кода. Взять, скажем, совсем свежий пример:

char *path_name(const struct name_path *path, const char *name)
{
        const struct name_path *p;
        char *n, *m;
        int nlen = strlen(name);
        int len = nlen + 1;

Ведь будь он написан вот в таком виде:

char *path_name(const struct name_path *path, const char *name)
{
        const struct name_path *p;
        char *n, *m;
        auto nlen = strlen(name);
        auto len = nlen + 1;

Менее понятным он бы не стал. А вот надежнее -- наверняка.

Впрочем, более обстоятельно эту тему раскрывают люди, разбирающиеся в C++ гораздо лучше меня.

вторник, 26 мая 2015 г.

[prog.flame] Любопытная презентация про использование Java в авиации

В связи с 20-летием Java захотелось поискать примеров использования Java в софтовой начинке для самолетов. Наткнулся на slideshare.net вот на эту презентацию:

Любопытные ощущения :)

понедельник, 2 февраля 2015 г.

[prog] Хорошая презентация про Akka

Если у кого-то на примете есть еще более интересные и полезные презенташки/статьи про Akka, поделитесь, пожалуйста, ссылочками в комментариях.

PS. Надо бы собраться с силами и сделать что-то подобное про SObjectizer.

воскресенье, 26 января 2014 г.

[prog] Немного информации о развитии архитектуры/инфраструктуры eBay с эмоциональными комментариями

Участвуя в обсуждении вчерашней заметки про перспективы .NET вспомнил, что когда-то в какой-то презентации об эволюции архитектуры eBay я видел примеры миграции платформы с Windows на Unix. Решил найти эту презентацию и утащить к себе в блог. Вот она:

Попутно нашлось еще несколько презентаций на эту тему. Для меня они оказались интересными не смотря на свой уже довольно почтенный возраст, все-таки 2007 и 2008-2009 годы -- это для ИТ очень давно :)

Upd. Еще одна презентация нашлась:

Так же нашлась PDF-ка из разряда маркетингового булшита success story, рассказывающая о том, как специалисты Sun помогали eBay создавать новую архитектуру на базе J2EE: eBay Creates Technology Architecture for the Future.

Кстати говоря, последняя PDF-ка заслуживает прочтения, т.к. дает больше информации о том, как же именно eBay переходил от старой разработки на C++ к новой архитектуре на Java. Подозреваю, что процесс был непростой и болезненный. В eBay было свое подразделение разработки с более чем 100 сотрудниками, в основном C++ разработчиками. Специалисты из eBay проанализировали технологии Java и .NET и остановили выбор на Java. Но, т.к. своих спецов по Java у них практически не было, то была нанята команда консультантов из Sun. Эти консультанты помогали как в разработке будущей архитектуры, так и в выборе подходящих инструментов (например, IBM WebSphere в качестве сервера приложений), а так же обучали разработчиков eBay (не только связанным с Java вещам, но и технологиям проектирования и разработки ПО вообще). И, как мне представляется, привлечение этой команды консультантов стало одним из факторов успеха при разработки и внедрении нового поколения софта eBay.

Почему я думаю, что этот процесс был болезненным? Потому, что мне доводилось оказываться в роли руководителя сидящей на поддержке старого решения команды, тогда как всеми явно осознается необходимость создания чего-то нового, более мощного и удобного. Да только текущая загрузка команды не позволяет это сделать в нормальном режиме. Полагаю, что на рубеже 1999-го и 2000-го годов в eBay было именно так: все силы уходили на поддержание написанного на C++ монстра (ISAPI DLL-ка, собираемая из 3.3 миллионов строк C++ кода!). Поэтому приглашение сторонней команды экспертов выглядит разумным шагом.

Однако, я не могу поверить в то, что в такой большой команде C++разработчиков eBay не оказалось ни одного инициативного разработчика с собственными идеями о перестройке архитектуры eBay. Наверняка были люди, которые задолго до 1999-го понимали, что ISAPI DLL -- это тупиковый путь, что нужно искать альтернативы. Наверняка эти альтернативы обсуждались между своими и, я просто уверен в этом, наверняка о них докладывалось руководству. Только в итоге руководство решило нанять консультантов-тренеров со стороны. Знакомая картинка... :(

Ну и еще один момент, специально для желающих похоливарить и пообсуждать, какое же говно этот ваш C++. Разработчики eBay столкнулись с внутренним ограничением компилятора на количество методов класса! Подозреваю, что речь может идти о Microsoft Visual C++ 6.0, с коим мне пришлось провести в обнимку очень много времени. Так же я прекрасно представляю возможности Java времен 1998-2001 годов. И можете делать со мной что хотите, но я не могу поверить, что в Java были и/или есть языковые возможности, не позволяющие разработчику дойти до такой степени маразма, а именно: впихнуть в один класс столько методов, чтобы компилятор был не в состоянии скомпилировать этот класс из-за своих собственных ограничений. Таких возможностей в Java не может быть в принципе. Единственный фактор, который может привести к возникновению таких проблем в C++ -- это давление со стороны менеджмента: нефиг тут думать, у нас производственные планы горят, давай-давай, time-to-market matters и пр. менеджерское дерьмо... Чтобы потом за большие деньги нанять сторонних консультантов и переписать все к едрене-фене.

четверг, 14 ноября 2013 г.

[prog.jvm] Релиз языка Ceylon 1.0.0

Оказывается, два дня назад состоялся релиз версии 1.0.0 нового языка программирования для JVM/JavaScript под названием Ceylon, который в течении нескольких лет разрабатывался в RedHat.

Интересно. В мире JVM есть Java (как по мне, так крайне убогая не смотря ни на что), Scala (которая по сложности переплюнет C++), мало кому известный Gosu и теперь вот Ceylon. Ну и не за горами Kotlin от JetBrains. Можно начинать делать ставки на то, кто выживет в итоге. Лично мне кажется, что Java :)

вторник, 6 августа 2013 г.

[prog.jvm] Язык Gosu выглядит как уже готовая замена Java

Полагаю, что среди действующих Java-разработчиков (т.е. тех, кто зарабатывает себе на жизнь разработкой на Java), найдется немало желающих сменить Java на что-нибудь более удобное, мощное, но не слишком сложное. Такой заменой лично мне ранее представлялся язык Scala. Но, предположу, что его сложность уже давно превысила все мыслимые для мейнстрима пределы :) Поэтому обычные, средние разработчики, которым язык программирования нужен не для решения головоломок и разминания мозгов для удовольствия (к коим я отношу и себя), на Scala перейдут без энтузиазма и только в приказном порядке :)

Может я преувеличиваю, но мне кажется, что есть достаточное количество Java-программистов, которые с интересом смотрят на развитие Ceylon-а и Kotlin-а. Очень надеюсь, что не без основания. Мне самому, например, очень интересно будет посмотреть на официально выпущенные релизные версии этих языков (могу ошибаться, но, по-моему, ни один из них пока не дошел до версии 1.0).

Однако, на днях с удивлением и интересом обнаружил, что для JVM уже есть очень симпатичный язык, который, по первому взгляду на него, производит впечатление правильно сделанной замены Java. Это язык Gosu.

Сразу скажу, что на Gosu я не программировал. Мои знания заканчиваются где-то вскоре за пределами краткого введения в язык + еще нескольких материалов, ссылки на которые я дам в конце заметки. Но то, что я увидел при беглом просмотре, выглядит весьма привлекательно. Так что, возникни у меня сейчас настоятельная необходимость начать делать что-то большое и серьезное на JVM, я бы в первую очередь посмотрел на язык Gosu.

Если попробовать тезисно набросать список достоинств языка, то получится что-то вроде:

  • вывод типов;
  • поддержка т.н. properties (лично для меня это не есть интересная фича, но для мира Java, где принято делать setter-ы и getter-ы на каждый чих, облегчение этой работы не может не радовать);
  • null safety (специальный синтаксис для обращения по ссылкам с проверкой нулевого значения ссылки);
  • именованные аргументы методов и аргументы со значениями по умолчанию;
  • возможность делегирования реализации интерфейса члену класса;
  • конструкция using (аналог таковой из C#, своего рода замена C++ному RAII);
  • лямбда-функции, они же closures, называемые в Gosu блоками (по аналогии с Ruby);
  • возможность расширения чужих классов своими методами под названием enhancements (что-то в духе extension methods из C#);
  • более простые и мощные генерики, чем в Java;
  • встроенный в язык string interpolation (т.е. возможность писать print ("${s1}"), где s1 -- это переменная, строковое значение которой будет вставлено в аргумент для print);
  • удобный синтаксический сахар для работы с коллекциями/контейнерами (достигнутый как синтаксическими возможностями языка, так и enhancement-ами над стандартными классами коллекций);
  • поддержка REPL;
  • при этом все статически типизированное, с полной поддержкой Java, с наличием плагина для IDEA.

В принципе, уже этого было бы достаточно, чтобы дать языку шанс в новом проекте вместо Java. Но главной killer feature языка его авторы считают такую штуку, как Open Type System. Боюсь сейчас соврать (т.к. на Gosu я не программировал), но это выглядит как система плагинов, которые расширяют компилятор Gosu информацией о новых типах/классах. Причем откуда берется эта информация для компилятора не важно -- это может быть XSD схема, описание SQL-ных таблиц, URL-сайта для Web-приложения или что-то еще. Важно, что после того, как соответствующий плагин задействован, программист может работать с подключенной через плагин сущностью как с обычным классом. Вот пример работы с XSD от разработчиков Gosu:

XSD описание:

<xs:element name=”DriverInfo”>
 <xs:complexType>
  <xs:sequence>
   <xs:element ref=”DriversLicense” minOccurs=”0″ maxOccurs=”unbounded”/>
   <xs:element name=”PurposeUse” type=”String” minOccurs=”0″/>
   <xs:element name=”PermissionInd” type=”String” minOccurs=”0″/>
   <xs:element name=”OperatorAtFaultInd” type=”String” minOccurs=”0″/>
  </xs:sequence>
  <xs:attribute name=”id” type=”xs:ID” use=”optional”/>
 </xs:complexType>
</xs:element>
<xs:element name=”DriversLicense”>
 <xs:complexType>
  <xs:sequence>
   <xs:element name=”DriversLicenseNumber” type=”String”/>
   <xs:element name=”StateProv” type=”String” minOccurs=”0″/>
   <xs:element name=”CountryCd” type=”String” minOccurs=”0″/>
  </xs:sequence>
  <xs:attribute name=”id” type=”xs:ID” use=”optional”/>
 </xs:complexType>
</xs:element>

Это то, как с ним можно работать в программе:

uses xsd.driver.DriverInfo
uses xsd.driver.DriversLicense
uses java.util.ArrayList

function makeSampleDriver() : DriverInfo {
  var driver = new DriverInfo(){:PurposeUse = “Truck”}
  driver.DriversLicenses = new ArrayList()
  driver.DriversLicenses.add(new DriversLicense(){:CountryCd = “US”, :StateProv = “AL”})
  return driver
}

При этом разработчику обеспечиваются две важные вещи. Во-первых, он имеет полную поддержку от IDE, включая автокомплит, рефакторинг, всплывающие подсказки и пр. Во-вторых, если XSD-описание изменяется (например, меняются названия элементов), то код перестает компилироваться (т.е. полностью работает статическая типизация).

Повторюсь, авторы Gosu считают Open Type System главной отличительной особенностью языка (весь остальной синтаксический сахар либо есть у аналогов, либо в том или ином виде может появится в самой Java). В доказательство важности этой фичи приведу следующую обширную цитату:

Now with Ronin, the web framework for Gosu created by Gus Prevas, and Tosa, the SQL-focused OR layer for Gosu authored by Alan Keefer and Carson Gross, programmers can be extremely productive building hardcore web applications in Gosu with IntelliJ. Where else can you build web applications where the links are statically verified? Where else can you directly reference your SQL DDL and access queries with static types using code completion, all with no code generation? What other static language lets you modify types corresponding with your web content, even the structure of the types, and immediately see the results in the browser? (I’m going to keep going with this.) Can your JVM language directly expose arbitrary XML schemas where elements are types and attributes are properties with no code generation? Unless you have Dana Lank’s XSD/XML framework and your language is Gosu, it can’t. And even if it could, it couldn’t dream of having an IDE like IntelliJ refactor the name of an XML element and automatically rename all references to it in your code.

Не пользуясь Gosu и не пробуя создать свой плагин для поддержки нужных мне типов (например, через Open Type System в Gosu можно было бы вводить описания SObjectizer-овских агентов или сериализуемых посредством ObjESSty объектов) сложно судить, насколько это действительно важная вещь для разработки прикладного ПО с использованием Gosu. Но сам факт того, что эта возможность есть и она уже встроена в довольно простой язык, который при всем прочем сильно ограничивает полет фантазии и не дает писать комбайны в духе Александреску, не может не привлекать внимание.

Однако для меня неким "знаком качества" и "страховкой", которые заставляют смотреть на Gosu серьезно, а не как на очередную потенциально интересную штуку (коими сейчас являются Ceylon и Kotlin, и которой когда-то давным-давно была Scala), является то, что Gosu создавался и уже длительное время используется для разработки реальных вещей. Он появился внутри компании Guideware в 2002-м году. Сначала как скриптовый язык, затем постепенно он начал обрастать возможностями, которые нужны были разработчикам Guideware для нормальной работы. И постепенно превратился в серьезный и "взрослый" инструмент, который в районе 2010 года был выпущен в свет в качестве открытого инструмента. Т.е. для меня намного важнее сам факт того, что его делают нормальные программисты, которые занимаются нормальной разработкой (напомню, что таковыми были, например, Деннис Ричи (С), Бьёрн Страуструп (С++), Джеймс Гослинг (Java), Андрес Хайлсберг (Dephi, C#) и таковым не был, например, Мартин Одерски (Scala)). В таких условиях вероятность получить практичный язык для повседневных задач намного выше, чем когда развитием языка занимаются ученые от computer science или же обезличенные забюрократизированные комитеты.

Еще один фактор, который сделал бы для меня Gosu более предпочтительным, чем Ceylon или Kotlin -- это объем документации по Gosu, которая доступна на сайте языка. По себе знаю, что снабдить подробной документацией самодельный инструмент, который постоянно используется и постепенно развивается, это намного сложнее, чем создать и развивать этот инструмент.

Ну и еще один очень важный фактор, который крайне субьективен, но именно поэтому и важен лично для меня. Это созвучие мыслей, мнений и идей, высказанных автором языка Gosu с моими собственными мыслями на счет того, каким должен быть мейнстримовый язык. Полагаю, что фанатам Scala или Haskell эти мысли и мнения будут казаться унылыми стенаниями замшелых старперов-ниасиляторов. Ну и флаг вам, дорогие товарищи, в руки. Работы хватит для всех.

А теперь обещанные ссылки:

  • gosu-lang.org -- сайт языка;
  • getting started -- краткая информация о языке, практически рекламного характера. Хороша для того, чтобы составить впечатление о том, привлекает ли язык с эстетической точки зрения;
  • небольшая презентация о языке Gosu в виде PDF, хорошо рассказывающая об основных особенностях языка от его автора Скотта МасКинни;
  • полная документация по языку;
  • серия блог-постов Скотта МасКинни о Gosu: Why Gosu?, Gosu’s Secret Sauce: The Open Type System, What Differentiates Gosu From Other Languages? (очень рекомендую эти заметки для того, чтобы вы сами могли понять, по пути ли вам с разработчиками Gosu или же вы совсем не разделяете их взгляды на то, каким должен быть современный язык программирования для массового применения);
  • Upd. lazygosu.org -- еще один ресурс, который рассказывает об основных особенностях языка.

PS. Понимаю, что мои слова выглядят двусмысленно: мол, сам он язык Gosu использовать не будет, но советует пристально посмотреть на него. Тем не менее, не будь у меня багажа в C++, который я не собираюсь бросать, и будь у меня необходимость работать на JVM, я бы не стал ждать стабилизации Ceylon-а и Kotlin-а, а попробовал задействовать Gosu в какой-нибудь proof-of-concept разработке уже сейчас. Ну и, кстати говоря, если возникнет необходимость портировать SObjectizer на JVM, то Gosu будет первым в списке претендентов на язык реализации SObjectizer-on-JVM.

среда, 23 ноября 2011 г.

[prog] Язык Ceylon от RedHat вышел в свет

Соответствующая новость и обсуждение на OpenNet.

Сегодня утром краем глаза глянул на сайт ceylon-lang.org. Полного впечатления о языке, конечно же, не получил. Но какие-то моменты в глаза бросились.

Из очень хороших вещей в языке встретились nullable-типы, а так же (долгожданный мной) аналог typedef из C/C++.

Так же заметно, что элементы из функциональных языков (вроде паттерн-матчинга) мигрируют в сторону мейнстрима. Но в более примитивной, а значит и более приспособленной к массовому применению ;), форме. В Ceylon это проявляется, например, в возможности указывать объединение типов. Что-то вроде:

//union type
void printName(String|Named name) {
    switch (name)
    case (is String) {
        println(name);
    }
    case (is Named) {
        println(name.first + " " + name.last);
    }
}

Здесь тип аргумента name – это или String, или Named. Чтобы работать с таким аргументом нужно использовать приведенный выше вариант оператора switch. Аналогичная штука может использоваться и для выстраивания объектных иерархий:

abstract class Node() of Leaf | Branch {}

Node node = ...;
switch (node)
case (is Leaf) { ... }
case (is Branch) { .... }

В целом же, читая Quick introduction и первые главы Tour of Ceylon складывается впечатление, что язык получился намного более простым и, вероятно, более приспособленным для “повседневных” задач мейнстрима, чем Scala. Несколько смущает количество дополнительных деклараций – shared, formal, actual, default и пр. для методов классов. Закрадывается подозрение, что авторы языка в чем-то перемудрили и напрасно отказываются от уже привычной терминологии (тех же public или override). Но, может быть, я ошибаюсь из-за незнания предмета.

Так что, на первый взгляд, у RedHat действительно получился язык, который более удобен, чем Java, и более прост, чем Scala. Но вот нужен ли он для JVM – отдельный большой вопрос. Впрочем, меня он пока не волнует, т.к. я все еще C++ программист ;)

понедельник, 7 ноября 2011 г.

[prog.flame] Ceylon, Kotlin и теперь вот Xtend – кто-нибудь выживет?

Что-то языки под JVM начинают плодиться как грибы. К давно уже заявившей о себе (но не ставшей пока мейнстримом Scala) хотят присоединиться язык Ceylon от RedHat (подробностей о котором совсем не много), Kotlin от JetBrains (пока еще не достигшем стадии стабильного релиза) и совсем свежий Xtend от Eclipse.

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

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

понедельник, 19 сентября 2011 г.

[prog] Презентация о фреймворке Akka: Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM

Презентация не новая, но попалась мне на глаза только сегодня. Любопытно.

Вообще, смотреть такие презентации без изрядной доли иронии и сарказма я лично не могу. Далеко не новые идеи преподносятся как что-то из области cutting edge :) И это даже если не брать в расчет Erlang, где почти все показанное в презентации эксплуатирует с конца 80-х (правда, широко известен он стал намного позже). Мы в КБСП подобный подход переоткрыли и начали применять в середине 90-х. Что воплотилось затем уже в Интервэйле в наш внутренний инструмент SObjectizer-4, который не много, ни мало, а уже девять лет используется нами для разработки С++ных приложений.

Тем не менее, жизнь забавная штука. Я, например, постоянно забываю, что уже выросло огромное количество разработчиков, которые приобщились к программированию уже после 2000-го и которые начинали с Java, а то и с C#. И, если начало было в обнимку с Java, то наверняка вобрали в себя такую дурную привычку Java-сообщества, как игнорирование полезных вещей до тех пор, пока не появится какой-то раскрученный фреймворк, который протолкнет эти вещи в мейнстрим (да, я большой любитель кидаться камнями в Java-огород). Посему такие презентации очень полезная штука.

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

Во-первых, для сложных актеров метод onReceive с последующим ручным определением типа сообщения посредством множества обращений к instanceof, на мой взгляд, не есть хорошо. Это черевато некрасивым кодом, провоцирующим ошибки и сложным в сопровождении. Имхо, задача фреймворка определить тип сообщения и вызвать подходящий для сообщения метод. Это как раз то, за счет чего фреймворки вроде MFC упростили программирование под Windows, когда большая WndProc с одним switch-ем внутри была разбита на простые методы, каждый из которых обрабатывает всего одно Windows-сообщение.

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

В-третьих, я не понял, зачем в агентный фреймворк засовывать еще и STM. Шоб было усё и зразу? ;)

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

среда, 13 апреля 2011 г.

[prog] Новость с OpenNet.ru: язык Ceylon от RedHat на замену Java

Для тех, кто не читает новости на OpenNet.ru: Компания Red Hat представила язык программирования Ceylon, призванный заменить Java.

Мопед не мой :) Сам пока на Ceylon не смотрел.

Update: Ссылочки на OpenNet.ru какие-то левые. Поэтому можно заглянуть на Wikipedia, там даны ссылки н оригинальную презентацию и вторую pdf-ку (правда грузится все весьма медлено)

суббота, 5 февраля 2011 г.

[prog] Пара трюков из реализации виртуальной машины Ovm для RTJS

В прошлый раз, когда я писал о Real-Time Java Specification, я дал ссылочку на список материалов от разработчиков виртуальной машины Ovm. За прошедшее время удалось прочесть большую статью A Real-Time Java Virtual Machine with Applications in Avionics оттуда. Сама статья для меня оказалась мало полезной и не очень интересной, т.к. ни виртуальными машинами для Java, ни Real-Time Java я не занимаюсь. Хотя любопытно было узнать, что под управлением этого Ovm люди умудрились запустить небольшой беспилотник. Но две вещи запомнились.

Во-первых, интересным образом разработчики Ovm поступили с многопоточностью и диспетчеризацией потоков. Поскольку Ovm работает на одной нити ОС, то всю диспетчеризацию Java-потоков Ovm делает сама. И для того, чтобы прерывать текущий поток и передавать управление другому потоку они сделали следующее: при трансляции Java-исходников просто напросто добавляются специальные вызовы в код (называемые Poll Check-ами). Т.е. если изначально программист написал что-то вроде:

void someMethod() {
   ...
   while(...) {
      ...
   }
}

То во время трансляции он будет преобразован в:

void someMethod() {
   POOLCHECK();
   ...
   while(...) {
      ...
      POOLCHECK();
   }
}

А внутри конструкции POOLCHEK происходит проверка необходимости передиспетчеризации нитей. Т.е. не внешний по отношению к коду диспетчер определяет, пора ли текущую нить прервать, а сама текущая нить время от времени озадачивается вопросом “А не пора ли дать управление кому-нибудь другому?”

Во-вторых, разработка Ovm шла еще до появления Java 1.5 с аннотациями, поэтому каких-то специальных средств связать метаинформацию с кодом у разработчиков Ovm не было. И они поступили очень остроумно, на мой взгляд – задействовали для этих целей инструкцию throws:

void storeCheck(VM_Address src, int offset, VM_Address tgt)
   throws PragmaNoPollcheck, PragmaNoBarriers, PragmaInline
{
   int sb = src.asInt() >>> blockShift;
   int tb = tgt.asInt() >>> blockShift;
   if (sb != tb) storeCheckSlow(sb, tb);
}

Здесь PragmaNoPollcheck, PragmaNoBarriers и PragmaInline – это не имена исключений, которые могут выбрасываться из метода, а инструкции для Ovm-овского компилятора.

Забавный подход. Который демонстрирует, что любые штатные возможности могут использованны самым непредсказуемым образом (здесь я с ностальгией вспоминаю игрушку Lode Runner, реализованную на алфавитно-цифровых дисплеях Robotron 1715).

понедельник, 24 января 2011 г.

[prog.flame] Попробую отрефакторить чужой Scala-код

На LOR-е прошло обсуждение присуждения гранта команде разработчиков Scala (об этом я уже писал). Свою лопату дерьма на вентилятор в этом обсуждении я мастерски вбросил и запасся попкорном. В процессе споров один из защитников Scala поделился с общественностью примером своего кода. Который, по мнению автора, демонстрирует преимущества лаконичности Scala вообще и повышения надежности за счет Option[T] и паттерн-матчинга.

Лично же мне кажется, что это обычный говнокод. Который я в данной заметке попробую отрефакторить. Чтобы получилось так, как привык писать я сам. И как я требую поступать от своих подчиненных. Т.е. не факт, что получится что-то принципиально иное. Но, будет оформлено более привычно для меня :)

Кроме того, в процессе упомянутого LOR-овского флейма мне стало более очевидно, почему на платформе JVM языку Scala не суждено стать мейнстримом. Надеюсь, что в конце заметки я смогу это продемонстрировать.

Букв будет много, поэтому продолжение под катом.

воскресенье, 23 января 2011 г.

[prog] Несколько ссылок на тему Real-Time Java

Началось все с того, что Алёна Сагалаева (aka Alena C++) сообщила в своем блоге об участи в подкасте некоего Радио Т. Прослушал я этот подкаст. Подивился ущербности наездов на C++ со стороны ведущих – обсуждение C++ там велось в стиле “Алёна, всем давно известно, что C++ унылое говно. Что вы можете сказать по этому поводу?” Отдаю должное Алёне, она держала себя в руках. Я бы на ее месте быстро бы перешел к ответам вроде “Уже давно очевидно, что вы дятел. Что вы можете сказать по этому поводу?”

Среди потоков феерического бреда в подкасте так же прозвучала фраза о том, что в Java есть ручное управление памятью. Из того, что я знаю про Java, ручное управление памятью там было только в Java-расширении под названием Real-Time Specification for Java (RTSJ). Помню, что на глаза попадались какие-то статьи с рассказом о том, что же RTSJ добавляет в Java в плане управления памятью. Но, как назло, ничего конкретного не вспомнил. Поэтому немного погуглил и нашел несколько ссылок. В общем, ничего серьезного, но в качестве отправной точки для заинтересовавшихся данной темой подойдет.

Во-первых, это краткий обзор RTSJ на сайте Sun Oracle: An Introduction to Real-Time Java Technology: Part 1, The Real-Time Specification for Java (JSR 1). Это очень краткий ввод читателя в тему. Вторая часть статьи лежит здесь.

Во-вторых, это интересная статья “Real-Time Java Scoped Memory: Design Patterns and Semantics” от 2004 года, в которой вопросы управления памятью в RTSJ рассмотрены более подробно, с небольшими схематическими примерами. Чем эта статья еще подкупает, так это тем, что ее писали не саночники-маркетологи, а люди, которые разрабатывали собственную real-time виртуальную машину для Java под названием Ovm. Кстати говоря, на сайте проекта Ovm достаточно много публикаций, касающихся Real-Time Java и попыток ее применения в авиации.

Так вот, саму статью я просмотрел бегло. Не могу сказать, что все в ней понял досконально. В конце-концов, я не Java-программист, и RTSJ никогда раньше не изучал. Просто лет двенадцать назад я был каким-то боком причастен к разработке систем реального времени. Но после прочтения статьи у меня сложилось такое мнение: чего только тупые американцы не придумают, чтобы на C и C++ не программировать :)

Поэтому, программировать на RTSJ, наверное, можно. Но просить за это нужно совсем другие деньги ;) На C++ может выйти дешевле :)))

Ну а в завершение ссылки на небольшие презентации на тему Real-Time Garbage Collector-ов:

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

понедельник, 27 декабря 2010 г.

[prog.humour] Цитата о Java порвала меня на кусочки

Читатели моего блога уже наслышаны о моем отношении к языку Java. Поэтому я надеюсь, что они не обидятся на следующую цитату:

"If Java had true garbage collection, most programs would delete themselves upon execution."
        -- Robert Sewell

Что в моем вольном переводе звучит как:

Если бы в Java был настоящий сборщик мусора, то большинство программ удаляли бы самих себя.

Пожалуй, это лучшая юмористическая характеристика Java из тех, которые мне доводилось слышать.

PS. Найдено здесь.

пятница, 12 ноября 2010 г.

[prog.flame] Apple отдает свои наработки в OpenJDK

Не успел я похоронить Java на Mac OS-ах, как пришла новость о присоединении Apple к OpenJDK. Компания Apple передаст OpenJDK свои наработки, созданные в процессе реализации Java для Mac OS.

Так же было заявлено, что Java 6 будет доступна для Mac OS X Lion, а Java 7 и последующие версии Java для Mac OS будут подготавливаться самим Oracle.

Абыдно. Как упертому Java-ненависнику мне все это не нравится :(

понедельник, 8 ноября 2010 г.

[prog.fantasy] А почему-бы кому-нибудь не сделать Java++?

В свете иска Oracle к Google из-за Android-а и из-за планов Oracle по разделению JVM на бесплатную и платные версии, озадачился вопросом:

А почему бы какому-нибудь крупному игроку IT-рынка не сделать новый язык, для которого Java будет всего лишь синтаксическим подмножеством? С трансляцией не в Java-овский байт-код, а, скажем, в нативный код.

Ну, например, Google забьет на Java и сделает Goava. И пофигу тогда будут попытки Oracle заработать на JVM для Android-ных устройств. Если для Goava обычные Java программы/библиотеки будут лишь частным случаем Goava программ, тогда Android-ный софт достаточно будет лишь перекомпилировать. Да и аппаратных платформ особо много поддерживать не нужно – ARM, Intel x86. Ну, может, еще MIPS какой-нибудь подтянется. Впрочем, сложностей особых здесь все равно не должно быть, ведь в GCC-ном бэк-енде все эти платформы сейчас, AFAIK, поддерживаются.

Впрочем, Google все это вряд ли нужно (если только от нового языка они не получат прироста производительности для своих server-side Java-приложений).

А вот, например, взять Intel. Есть же у Intel-а классный C++ный компилятор, который генерирует чуть ли не лучший код для Intel-овских процессоров. Взяли бы и сделали аналогичный но для Iava с сильной оптимизацией нативного кода для своих Atom-ов. А то ведь на рынке портативных устройств у Atom-ов сильный конкурент в лице ARM-а.

И совсем фантастическая идея – Microsoft. Возьмут и сделают новый язык для платформы .NET, который будет иметь Java-синтаксис, но генерировать будет MSIL. А потом на нем под .NET портируют Apache Harmony :)

Ну или просто какая-то компания выпускает свой язык и транслятор под него. И живет за счет продаж транслятора (например, как в варианте с EiffelStudio/GNATPro где есть бесплатная и платная версии среды разработки), тогда как runtime языка остается бесплатным.

Такие вот мысли вслух.

среда, 27 октября 2010 г.

[prog.flame] Java под Mac OS X is deprecated: еще один шаг к превращению Java в COBOL XXI-го века?

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

As of the release of Java for Mac OS X 10.6 Update 3, the version of Java that is ported by Apple, and that ships with Mac OS X, is deprecated.

This means that the Apple-produced runtime will not be maintained at the same level, and may be removed from future versions of Mac OS X. The Java runtime shipping in Mac OS X 10.6 Snow Leopard, and Mac OS X 10.5 Leopard, will continue to be supported and maintained through the standard support cycles of those products.

Т.е. Apple прекращает разработку и развитие собственного порта Java для своих Mac OS X. И, возможно, вообще выкинет Java из Mac OS X в будущем (хотя то, что вошло в версии Snow Leopard и Leopard будет сопровождаться согласно стандартному жизненному циклу).

В другом месте при обсуждении этого же события упоминают еще один фактор. Дело в том, что в Mac App Store не должны приниматься программы, которые зависят от устаревших технологий. И, поскольку Java объявлена устаревшей, то и Java приложения могут перестать принимать в Mac App Store.

Я не маркетолог и вообще далекий от бизнеса человек, но как по мне, так все выглядит довольно разумно. Apple за счет Mac OS и iOS (iPhone и iPad) создает собственный рынок программного обеспечения. И так уж повелось, что для данных платформ основным инструментом является Objective-C (а так же, по совместительству, еще и C с C++). Нужно вспомнить еще и про недавние расширения языков C-шной группы от Apple: туда были добавлены блоки кода. Т.е. Apple планомерно и непрерывно сажает разработчиков на собственную иглу. Ведь Apple должно быть выгодно, чтобы софт изначально затачивался под Mac OS/iOS и не был бы кроссплатформенным.

Итак, что получается. Хороших desktop-ных приложений на Java не так уж и много. Смысла писать Windows-only приложения на Java нет, т.к. для этих целей .NET подходит гораздо лучше (имхо, конечно). Смысла писать Mac OS-овские приложения на Java уже нет. Что остается? Большой и жирный сегмент Ынтырпрайза, где у Java уже давно очень и очень мощные позиции. Там она, похоже, и обречена оставаться. А это означает (да еще с ее темпами развития), что Java идет по пути COBOL-а.

Впрочем, для нынешних Java-разработчиков это, скорее, даже хорошие новости. Ведь тот же COBOL очень даже жив и каждый год на нем пишется огромное количество кода. А на Java, вероятно, уже написано намного больше. Так что без работы хорошие Java-программисты точно не останутся. А вот нужно ли сейчас Java изучать молодежи – вот это вопрос не праздный, имхо. Мы в свое время ни про COBOL, ни про FORTRAN, ни про PL/1 даже слышать не хотели :)

PS. Кстати, эти новости об Apple и Java прокомментировал и Джеймс Гослинг. Он сказал, что Apple сделала для Java чуть ли не больше “секретных API”, чем в свое время Microsoft. И что одной из причин этого был Oracle, который уж очень хотел, чтобы в JVM на Apple-овских системах была графика без сглаживания, как и под Windows.