Комментарии 80
> Еще я люблю языки высокого уровня с аккуратной архитектурой и строгой типизацией. Это — Java и C#.

С тем, что у Ruby и Python типизация тоже строгая, спорить нельзя. Выходит, вы считаете их архитектуру неаккуратной?

Или вы имели в виду «Мне довелось работать с Java и C#, и я ценю их за аккуратную архитектуру и строгую типизацию»? ;)
Каюсь, должен был уточнить. Python почти не знаю (хотя его синтаксис и подход меня, честно говоря, не ввоодушевляет, но это — дело вкуса), с Ruby пока дела не имел вовсе.
Не слишком понятно, где у Python строгая типизация? Про «утиную» слышал, но строгая?.. Я так думаю, имелось в виду строгая==статическая.

И да, Python я знаю и постоянно пользую, и мне нравится.
Про Ruby знаю только, что он есть :)
Строгая — отсутствует автоматическое приведение типов. Статическая — в переменную одного типа невозможно записать значение другого типа. Явная (противоположность «утиной») — тип переменной указывается избыточно при ее объявлении.
Пардон, ниже поправили, что «утиная» — разновидность динамической типизации.
Вам стоит освежить свои знания, прочитайте на википедии определения этих 5 терминов.
Есть строгая (сильная) и слабая типизация.
Есть статическая и динамическая (утиная — частный случай динамической).

Некоторые языки обладают строгой, но динамической типизацией. И именно такими языками являются Ruby и Python.
Или вы имели в виду «Мне довелось работать с Java и C#, и я ценю их за аккуратную архитектуру и строгую типизацию»?

наверно это и имелось ввиду, но зачем вы вобще заострили внимание на этом?
Не пробовали использовать компилятор gcj (The GNU Java compiler)? С помощью него, в частности, можно jar-файл превратить в машинный код.
> "(И нет, я имею в виду не gcj, который лишает Java всех ее прелестей. Рефлексия будет работать и даже сторонние jar вы сможете запускать)."

Вероятно пробовал.
Действительно пробовал. В другой раз буду внимательнее читать статью.
Помимо этого, насколько мне известно, он очень слабо поддерживается и в последний раз, когда я его пробовал под MinGW, он вообще не мог собрать тривиальную программу из-за какой-то баги.
AOT компиляцию java программы с помощью gcj под MIPS архитектуру так и подавно не удалось запустить
Что касается разработки Desktop-приложений, то Qt Creator (C++) мне кажется достаточно удобным. Опробовано для Linux/Windows и впечатление осталось положительное. Не приходится самому писать большой Makefile, есть графический редактор форм (Qt Designer), встроенное средство для перевода (Qt Linguist), встроенная документация (Qt Assistant). Насколько помню разработку под Java, инструмента с аналогичным набором функций для этого нет.
Ну почему же? Есть Eclipse, есть Idea, даже Netbeans. Они спокойно понимают javadoc(встроенная документация), не нужно прописывать команды java компиляции, настраиваешь билд и оно все делает за тебя. Дизайнеры так же имеются(swing, swt, android). Переводчика конечно нету, но в целом, как IDE, мне кажется IDEA/Eclipse все же лучше Qt Creator(приходилось на практике видеть и то и другое).
Java любят потому что почти весь Enterprise сегмент на нем сидит, особенно для тонких-толстных клиентов через WebStart
однажды я видел у друга сразу 3 установленных версии, причем все три были нужны разным приложениям

Вы счастливый человек, если вас это удивляет. Одна наша корпоративная система требует три версии фреймворка определенных сервиспаков. Правда она больше похожа на франкенштейна, чем на единую систему. Но тем не менее.
Меня это не то чтобы удивляет… просто как-то это грустно. Убивает идею портируемости на корню. Согласны?
автоматическая портируемость любого приложения сложнее тетриса — миф
Я где-то писал про «автоматическую»? Определенные усилия приложить несомненно придется — кто же спорит? Просто они должны быть невелики по сравнению с усилиями для написания приложения.

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

К тому же в данном случае я лишь имел в виду лишь то, что портированное приложение должно быть «лёгким», а не тянуть за собой целый фреймворк. А то проще сразу поставить VirtualBox и не мучаться
Статья навеяла воспоминания студенческих годов — мы работали в разных лабораторных, на разных OS — FreeBSD, Windows и разные линуксы, а дома у меня был Mac. Тогда и родилась у меня идея и мой будущий диплом — ICQ клиент на Java, который просто запускался с флешки и работал на любой ос, с подтягиванием истории и настроек. Вышло классно, если интересен код — обращайтесь — вышлю без проблем.
К сожалению, нет. Java не мой основной язык и был выбран чисто как инструмент. Да и было это 5 лет назад, надо вспоминать. Сходу помню одну неприятность — отсутствие unsigned типов, а протокол бинарный.
Обещают unsigned типы в jdk8. Читайте блог. Хотя конечно, пока jvm восьмерки станет production ready по стабильности сравнимой с jvm 6 версии, пройдет немало времени. Парсить бинарный протокол можно и без unsigned типов, но не так комфортно.
Конечно можно парсить, я же все-таки написал клиент :) Это просто неприятность, которую легко обойти. Но я уже давно не пишу на Java и не слежу за изменениями.
А что Вы можете сказать по поводу объема потребляемой памяти при запуске приложения, собранного таким образом? Т.е. если я запускаю, приложение, написанное на Java с использованием самой обыкновенной JMV, оно на моей машине кушает 600 МБ, причем это не само приложение, по сути, столько потребляет, а виртуальная машина. Есть ли выигрыш по памяти при использовании avian?

Плюс еще интересует, насколько ограничивает avian использование сторонних Java-библиотек в приложении?
По первому вопросу:

Берем мою программу, добавляем к ней цикл вида
		double k = 1;
		for (int i = 0; i < 100000; i++)
			for (int j = 0; j < 100000; j++)
			{
				k = i * j;
				System.out.println(k);
			}
		

Пока она мучается, выводя циферки, смотрим потребление памяти

Физической — 9.1Мб, виртуальной — 67Мб (многовато, конечно, но терпимо).

По второму вопросу:
Сам avian может быть собран с OpenJDK, причем в этом случае под ним можно успешно запускать eclipse (отнюдь не простое приложение). JVM, как я понимаю, — весьма простая вещь, если обрубить с нее всевозможные расширения, дополнения и мегафичи. А сторонние jar (включая и содержащие нативные библиотеки) грузить можно вполне успешно.
«С использованием самой обыкновенной JVM» не добавляет ясности вашему посту. У любой популярной JVM есть опции для управления памятью, вы можете дать столько, сколько сами решите. Если у вас по дефолту так настроено, чтобы 600 Мб отъедать, кто вам виноват?
Буду Вам признателен, если поможете ограничить объем потребляемой памяти. Я пробовал опции запуска -Xmn, если не ошибаюсь, но существенного влияния они не оказали, т.к. ограничивают heap, а не саму JVM. Если подскажете опцию запуска вирт машины, которая запретит ей есть больше 200 MB, скажем, Вы меня спасете)
Не знаю, откуда у вас такие цифры и что вообще за система у вас и какую версию Java вы используете. Проверял по таскменеджеру с тривиальным приложением с бесконечным циклом.

WinXP 32bit:
(HotSpot 1.6.0.21) java -client -Xms2M Test --> Mem Usage 6 848K, VM Size 17 384K.
(HotSpot 1.6.0.21) java -server -Xms2M Test --> Mem Usage 6 944K, VM Size 27 648K.
(HotSpot 1.7.0.15) java -Xms2M Test --> Mem Usage 9 688K, VM Size 27 380K
(JRockit 1.6.0.31) java -Xms8M Test --> Mem Usage 17 376K, VM Size 37 844K

Win2k3 server 64bit:
(HotSpot 32bit 1.6.0.21) java -client -Xms2M Test --> Mem Usage 8 412K, VM Size 18 004K.
(HotSpot 32bit 1.6.0.21) java -server -Xms2M Test --> Mem Usage 8 600K, VM Size 29 088K.
(HotSpot 64-bit 1.7.0.7) java -Xms2M -XX:+UseParNewGC Test --> Mem Usage 12 536K, VM Size 39 652K.

В общем, не знаю, где вы 200 Мб взяли
запустите, пожалуйста, что-то сложнее helloworld-a, например eclipse
Ну видимо у меня беда именно в самой программе. По сути там 1,5 строки, но с использованием HtmlUnit.
>но с использованием HtmlUnit
Отлично…
Что-то вроде:
— у меня 3 строчки на крутом С++, которые загружают фотошоп с картинкой в 5Гб, так вот С++ отстой, он жрет столько памяти в 3-х строчках! Посоветуйте опции, чтобы ограничить его в 100Мб.
Погодите, я не говорил, что C++ отстой, впрочем, как и Java. Я лишь ищу способ минимизировать объем занимаемой памяти за счет тюнинга среды исполнения (т.к. я не могу модифицировать HtmlUnit, естественно, а в самой программе изменять нечего из-за того, что она в 1,5 строки).
Вообще-то это был гипертрофированный стеб, по поводу того, что вы говорите «Java сама по себе потребляет 600Мб, хотя прога в 3 строчки», но при этом подключаете достаточно ресурсоемкий фреймворк. ))
Вот именно с этой опцией, выставленной в -Xmx64M программа отъедает больше 600 метров…
Идея конечно интересная со standalone JVM — но интересно как раз было бы увидеть скажем Swing/SWT аппликацию с использованием этой JVM.
Апплика́ция (лат. applicātiō — прикладывание, присоединение) — способ получения изображения; техника декоративно-прикладного искусства.
Вы меня конечно задавили под аппликацией понималось вот это: en.wikipedia.org/wiki/Application. Еще более конкретно вот это: en.wikipedia.org/wiki/Application_software. Я честно думал, что из контекста это понятно тем более ИТшникам.

Очень часто программисты говорят «аппликачка», «аппликейшн», «аппликация», «веб-аппликация» и т.п. просто потому что это проще. Не нужно делать context-switch и все понимают о чем речь.
Если application называть «аппликация», а не «аппликейшн», то скоро на file будут говорить «филé». Уж слишком режет слух.
Господа минусующие не корысти ради но тем ни менее пожалуйста поясните чем вам не угодил мой комментарий. Я не выражаю какой-либо агрессии/издевок etc. Мне просто интересно что вызывает столько негатива, если это простой вопрос автору топика?
Посмотрите www.youtube.com/watch?v=3W40tBACFbI
"- Почему Рон Фини этого не делает?
— Чего?
— Не путает английские слова и русские?
Я ответил:
— Потому что Фини в совершенстве знает оба языка..."
Постараюсь в ближайшее время аккуратно прикрутить к демке SWT и написать про это.
Да, было бы отлично. Потому что как я уже сказал выше, идея интересная но так же было бы интересно увидеть так сказать в «боевых» условиях данный подход.
На самом деле если тщательно почистить jre оверхед получается не такой уж и большой. В свое вермя чистил sun jre 1.6 для десктоп приложения на Swing, и jre занимал около 10 мб не запакованный. В наше время это крохи.
Плюсую
«Все три колоды весят сотни мегабайт» — не правда ведь. Я понимаю, папка Windows регулярно пухнет на гигатайбы от необходимости держать несколько версий .NET фреймворка, но вот с JRE таких проблем практически не бывает. Даже если держать Java5, Java6 и Java7 версии одновременно (что, к счастью, весьма редко бывает действительно нужным) — потянет меньше чем на 300 МБ, а уж одна то версия JRE и сотни метров не съест.
что то этот Avian не собирается — заткнулся на языках, неизвесно каких:

make
compiling classpath classes
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
.
.
.
compiling build/linux-x86_64/compile-x86-asm.o
compiling build/linux-x86_64/java-lang.o
classpath/java-lang.cpp:16:17: fatal error: jni.h: No such file or directory
compilation terminated.


Со сборкой (под Windows) у вас как-то неуверенно получилось:

— Mingw можно брать из mingw-builds. Там есть и х64. Qt его рекомендует.

— Библиотеки для Mingw (например zlib) можно устанавливать, используя mingw-get.

— Копировать архивы (.a) совсем не обязательно, достаточно, чтобы они были доступны по стандартным путям поиска линкновщика (gcc --verbose hellow_world.cpp 2>&1 | grep LIBRARY), или их можно указать через директиву
-L/path/to/search/for/libs.
Всё так. Но во-первых, если бы я еще описывал тут, как собрать рабочий MinGW 64 с MSYS, статья, и без того длинноватая для описания простого метода, стала бы вообще огромной. А в 90 процентах случаев, по моему опыту, 64 битность приложения не нужна (разумеется, если вы не пишете злобную математику или какой-нибудь фотошоп).

Насчет сторонних библиотек: я взял те, что рекомендовали разработчики Avian. Просто на всякий случай. zlib собирается своими руками и очень просто или его действительно можно взять из MinGW, да. Но билд-процедура Avian требует, чтобы он лежал в ../win32/lib, насколько я помню.

Что же касается копирования архивов, то я это сделал для того, чтобы всё это закоммитить на GitHub. Теперь вы можете слить себе crossbase и, только правя Java-код, собрать готовое приложение.
У mingw-builds вся фишка в том, что он уже собранный. Причем есть несколько разных конфигураций на выбор.

А так я не с целью придраться писал, а в качестве дополнения.
а у XCode можно однажды после установки Command Line Tools просто найти во временных файлах и сохранить их архив (Xcode.CLTools......dmg). Архив всего около 180-200мб, для сборки из командной строки гораздо сподручнее чем вся XCode целиком
Небольшая поправка:
какой смысл объявлять
int main(int argc, const char** argv)
для того, чтобы потом сделать
    int wac = 0;
    wchar_t** wav;
    wav = CommandLineToArgvW(GetCommandLineW(), &wac);
?

Под Windows обычно пишут
int wmain(int argc, const wchar_t** argv)

Согласен. Хотя не очень хочется ставить декларацию функции под #define. Не люблю макроопределения, которые идут вразрез со структурой кода. Хотя в данном случае, думаю, поправить стоит.

Вы абсолютно уверены в том, что результат будет в точности тот же? (А то честно говоря, я эту штуку сочинял довольно давно, для одного своего проекта, и тогда основательно намучался с этими кодировками)
Работать оно так будет, по крайней мере такое я делал для сборки MSVS и Intel C/C++. Съест ли такое MinGW — хз, но проверить не помешает.
Не будет:
$ cat >2.cpp
int wmain(int argc, const wchar_t** argv)
{}
$ g++ --version
g++ (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ 2.cpp
c:/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

Интересная тема! Жду продолжения вашей статьи и «вызревания» avian.
Жаль что пока много телодвижений надо делать, чтобы собрать приложение с jvm в один бинарник и поддержка MIPS архитектуры пока только в Post-1.0 Ideas
Что касается «вызревания», замечу, что наблюдаю за ним я уже более чем полгода, коммитят они почти что ежедневно, но номер версии за это время сменился только с 0.5 до 0.6. Ребята, повидимому, очень ответственные, код вылизывают до блеска. На мой маленький баг-тикет ответили в тот же день (бага оказалась в Windows, а не в Avian). Так что возможно версии 1 ждать придется долго.
Отлично что проект развивается! До вашей статьи не встречал эту jvm. Теперь буду следить и за ней.

Кажется что главное ее применение это embedded решения с памятью 32/64Мб и архитектурой MIPS, ARM.
Даже то что поддерживает ARM архитектуру уже отлично. Если удасться запустить приложение собранное с jetty на raspberry pi будет уже победа!
Могу предоставить автору статьи доступ к raspberry pi (model B) для экспериментов, авось чего и выйдет…
Пообщайтесь с автором bigfatbrowncat в личку, может это его и заинтересует. Я все жду своей rpi, которую мне друг из Лондона подарил) Вторая попытка доставить ее в Россию через путешествующий народ. Уже даже контроллер CNC станока собрал без нее, на mini itx x86
>Avian можно встроить в ваше приложение вместе с его весьма урезанной, но терпимой по функционалу стандартной библиотекой классов
и вдоволь нажравшись кактуса получаем урезаное нечто, в котором не факт что получится использовать нужные библиотеки + пиздецовое GUI на свинге (если оно вообще заработает).

Намного проще разрабатывать используя QtCreator или даже Lazarus (дада то самый паскаль).
С паскалем давно дела не имел, он сейчас очень далек от мейнстрима. Что же касается Qt, единственное его преимущество, на мой взгляд, заключается в его больших возможностях. Но после нескольких проектов писать верхний управляющий слой UI на C++ я бы никому не советовал. Слишком многие неочевидные вещи надо держать в голове, слишком много шансов создать трудновылавливаемую ошибку в коде. Я тратил по 4-5 часов на поиск ошибки в коде на C++, причем ошибка была такого сорта, какого в Java в принципе не может быть. Но это, конечно, уже дело вкуса. Я лишь хотел продемонстрировать способ.
Оч интересно! А SWT к ней прикрутить получается? И что там с бенчмарками?
Я таки не понял, результатом сборки получается бинарный файл? А как один бинарный файл запускается на разных ОС где тупо разный формат исполняемого бинарного файла?
Собрать, разумеется, придется под каждую ось свой. Но переделывать Java-код для пересборки не нужно. Все различия в системных API учтены внутри Java-библиотеки.
Как, учтено даже различие консольной и системной кодировок?!
Дык, давнно же уже есть Excelsior JET (http://www.excelsior-usa.com/jet.html). Единственное, поддержки Мака нет, а так вон для некоммерческого использования бесплатно можно взять. Но конкуренция — это всегда хорошо, надеюсь в JET поскорее поддержка MacOS X появится.
там какое то ограничение 30 дней. а платить за это 2500$ только чтобы не
качать jre весит 50 mb и устанавливается в пару кликов, стоит того?
Что-то я не вижу никаких ограничений по времени для некоммерческих проектов (http://www.excelsior-usa.com/jetfree.html). А если уж речь идет о коммерческих проектах, Standard версия и Basic суппорт вполне достаточны, по крайней мере для меня, а это в два с небольшим раза дешевле. На наших десктопных SWING приложениях результирующий размер макс. 20MB. И дело не только в том, чтобы не качать JRE. Ну и JET — это сертифицированная Oracle реализация, так что можно не опасаться всяких подводных камней.
Внимание! Статья поправлена и доработана. Многие комментарии стали неактуальны, так как изложенные в них мысли я внедрил. Так что чем неактуальнее комментарий, тем сильнее я благодарен за него автору ;)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.