Java

Жа́ба "(жарг.)" — искажённое название языка программирования Java, наследника C++ (на самом деле нет, он развился из Oak), откуда выпилили почти все беззнаковые типы данных и указатели. Определённой эмоциональной окраски не несёт, но, ввиду плохого отношения к Java значительной части населения ЛОРа, чаще употребляется в уничижительных выражениях: жабокодер, жабобыдлокодер и т. д. — это значение было популяризовано Луговским. Алсо, жабонебыдлокодеры имеют зарплату, на которую можно купить не только хлеб, воду и сало, как похапекодерам. А некоторым хватает ещё и на чёрную икру, Феррари и 25-летний виски.
Наиболее заметная особенность языка — крайне низкая скорость работы, связанная, в основном, с некоторыми особенностями национального программирования.

Есть версия, что миф о «тормознутости» Java еще связан с тем, что в доисторические времена в браузерах были апплеты, которые адски тормозили. Открытие странички с Java-апплетом вызывало подвисание браузера на минуту-другую, а в строке состояния появлялась надпися: «Приложеньице загружается…» — что не могло не радовать пользователей. Особенно цинично это выглядело, когда причиной тормозов был апплет с анимированной кнопкой «e-mail» размером 100 на 50 пикселей. Были даже спецпрограммы, чтобы генерировать такие апплеты для говносайтов.
Реклама тех лет преподносила жаббу как волшебную таблетку, как серебряную пулю, как избавление от страданий: «Life is too short to spend rewriting code ». Обещалось также, что исходные коды станут собственностью разработчиков, они смогут продавать их, получая отчисления, да такие, шо . Корпоративный коммунизм не наступил, а исходные коды апплетов просуществовали ровно два года, с 1997 по 1999, после чего жабба уползла в мир Энтерпрайзных Серверов, а те немногие, кто по молодости верил в рекламные бредни, херачили интернет-магазины на решётках да на Пыхе по 8 часов в день 40 часов в неделю: в нирвану их так и не взяли.
В мире тяжёлых серверов жаба мутировала настолько, что изменились даже классы для работы с датой и временем, а некоторые методы в них исчезли. Кроме того, в доисторические времена у жаба-машин не было -компиляции, и они выполняли байт-коды последовательно, команда за командой. Но теперь, при обращении к участку кода, который был вызван уже с десяток тысяч раз (как известно, 99% всего времени выполняется 0,1% кода), его стали компилировать в реальный машинный код. В итоге, жабба теперь ещё сильней тормозит при запуске… но зато потом уже работает очень быстро. В том числе и на новых процессорах, под которые JIT создаёт максимально оптимизированный код (обычные компиляторы — как правило создают один код, который совместим с большинством существующих процессоров).
Попадание в энтерпрайз имело и хорошие стороны. Прежде всего:
Жабба версий 1.2 и далее заточена на написание и поддержку сетевых приложений, которые по технической сложности могут превосходить самотрансформирующуюся шатл-субмарину с минимальными затратами на отладку и каждодневное латание дыр. Достигнуто это за счёт таких её особенностей, как:
Этим всем жабба бессовестно и нагло лишила программинг романтики и обеспечила возможность добиваться сносного результата в приемлемые сроки даже с кудрявыми руками и не очень мощным мозгом. Чем, конечно же, вызвала неприятие Ъ гиков.
Жабба — язык для создания серверных приложений. Никто не пишет на ней тру-GUI-приложений на стандартных библиотеках AWT/SWING и нет в этом особой необходимости. Зато ещё как пишут распределённые вычислительные системы, разворачивают большие интернет-магазины, порталы и прочие вещи, на которых зарабатывают деньги. А всё потому, что это надёжно, просто и безопасно.
А главное, и, пожалуй, единственное реальное достоинство — востребованность на рынке труда, и, как следствие, оплачиваемость этого самого труда, особенно в международных корпорациях: при весьма низком пороге вхождения за 2-3 года опыта вполне можно получить зарплату на 50% выше средней в IT-индустрии, причём востребованность работодателем не падает уже которые годы (говоря проще, берут любой неадекват, часто с минимальным опытом, лишь бы умел набивать хоть как-то работающие строки кода). Как нетрудно догадаться — это достоинство запросто перекрывает и тормоза, и отсутствие метапрограммирования и этих ваших беззнаковых целых.
Основными претензиями в сторону чудо-языка были, есть и будут:
Ещё не слишком обоснованные претензии:
Алсо, Oracle, нынешний владелец торговой марки, делает только то, что Он хочет. Было бы странно верить в то, что Он любит всех нас и всех нас спасёт.
О недостатках есть длинная бумага, которую никто не будет читать. А по мнению Никлауса Вирта, Java и JVM были слизаны с его языка Oberon чуть менее чем полностью и испорчены сишным синтаксисом. Честно говоря, у Вирта есть на то , но разве это кого-то волнует?…
В основном мемы связаны со скоростью работы программ на Java, а также с тем, что это индустриальный язык программирования, точнее, с тем, что на нём пишет большое количество быдлокодеров-индусов. Типичные примеры:
В холиварах жабакодеры любят приводить в качестве главного аргумента того, что жаба не тормозит, линки на бенчмарки, в которых сравнивается скорость нативного кода и байт-кода. Обычно заголовки таких тестов выглядят в духе «Жаба обгоняет по производительности С++» и приводится код, где Java быстрее C/C++ (нужное подчеркнуть). Это происходит по нескольким причинам:
Такие бенчмарки примитивны: они работают только со скалярными типами (с такими, как int, long, double), память под которые выделяется на стеке, используются простые операции и, наконец, весь код находится только в одном классе.
Обычно такие тесты содержат много циклов, а замеры проводятся не во время первого запуска, а когда JIT-компилятор уже подставил на место байт-кода команды процессора. Значит, меряется скорость хорошо оптимизированного динамически скомпилированного кода. Да и garbage collector не успевает запуститься в таких программах.
Авторы бенчмарков зачастую поверхностно знают С/C++ и используют его в «жабьем» стиле, например используя кучу там, где она не нужна и ноют про необходимость free и delete.
В реальных же приложениях ситуация с быстродействием несколько иная:
Все объекты ссылочные и хранятся в куче, а значит, самые элементарные составные типы, такие, как Point, будут каждый раз создаваться в ней. А таких объектов сотни тысяч. Даже при хорошей оптимизации кучи, она медленнее стека, а стоимость алгоритма сборки мусора в общем случае — O(n²), то есть с ростом числа объектов в памяти затраты на сбор мусора растут нелинейно.
Большое потребление памяти: один только хелловорлд при запуске отъедает 10 МБайт (они забираются виртуальной машиной на внутренние нужды), а так как с каждым объектом связаны метаданные (хотя бы ссылка на таблицу методов класса), то какой-нибудь массив объектов класса RGBColor будет занимать в 4-5 раз больше памяти, чем даже хотя бы в C#. На венде, которая свопит всё подряд, это приводит к известным результатам.
Динамическая природа языка: динамическое связывание кода подразумевает постоянные проверки во время каждого приведения типов (например, при работе с коллекциями). Обобщения здесь не дают ничего, так как они были введены в язык позже, и, для сохранения обратной совместимости, действуют только на уровне исходного кода, в байт-коде их нет.
Бросание исключений на каждый мелкий чих, чего язык не требует, но требует идеология и сторонние библиотеки, а выполняются исключения исключительно медленно. Оборотной стороной повышенной надежности является то, что многие программы в процессе работы генерируют over 9000 исключений, а исправлять подобный код разработчики не спешат.
Другая семантика языка: во избежание воспаления мозга от i++ + i++ были введены правила, устраняющие неоднозначности, что мешает компилятору заниматься оптимизацией. Так, например, на Java оператор вида x+=foo(); в отличие от Си требует запоминания предыдущего значения x перед вызовом foo().
Garbage collector: хотя он проходится по памяти нечасто, на GUI приложениях это ощутимо. Алсо, для серверных приложений с огромным хипом (овер 100G) настройка GC при помощи свичей превращается в ад. И всё равно он тупит.
Неотключаемая, если не заниматься извращениями вроде GCJ, проверка индексов при обращении к массивам.
С другой стороны, многие серверные приложения активно используют базы данных, так что большую часть времени занимает обработка запросов на стороне этой базы, так что хоть на чём пиши — разница в скорости будет небольшая. Более того, сервлет на Java может запросто обогнать какой-нибудь кривой cgi-скрипт на Си, потому что сервлету надо инициализироваться один раз, а cgi-скрипту может понадобится стучаться на базу при ответе на каждый запрос для получения каких-нибудь там настроек. Но к энтерпрайзу это как раз и не относится: потянуть тысячи объектов из базы через ORM, чтобы посчитать что-нибудь в цикле — это для них обычное дело.
Не стоит также забывать, что различных реализаций JVM много. Некоторые из них имеют узкую специализацию и умеют очень многое. Например, широко известный в узких кругах Zing от Azul позволяет в 1000+ раз уменьшить время (как единовременное, так и суммарное) блокировок мира на gc, ценой всего-навсего утроенного расхода памяти (минимум для работы 32 Гб), минимум 6 процессоров с поддержкой Intel-VT или AMD-V (только современные серверные модели) и примерно 14000 долларов за годовую лицензию на 1 сервер. Работает только под Linux и требует установки собственного модуля для ядра.
Многие причины тормозов жабы идут от работы с либами, ибо солнцевские пытаются обеспечить универсальность и безопасную среду выполнения. Ситуация усугубляется тем, что в стандартном наборе обычно имеется минимум две, а всяческих коллекций и вовсе зоопарк, библиотеки с одинаковой функциональностью, но различными механизмами. И если взять не ту, возможен былинный отказ. А выбирают их, как правило, «по указаниям технического директора», то есть — наугад.
Алсо, в соревнованиях по программированию алгоритмического толка ACM, авторы задач просто вынуждены удваивать/утраивать ограничение по времени или вовсе устанавливать специальные ограничения для жабы, чтобы каждый жабакодер мог сдать задачу. Для одинаковых лимитов времени часто бывало, что кривой алгоритм на жабе, не укладывающийся в рамки времени и/или памяти, будучи переписанным один-в-один на си, проходил. Обратные случаи неизвестны. Также, в ACM’е каждый жабокодер вынужден писать свой класс для чтения чисел из файла, так как поставляемый со стандартной библиотекой работает слишком медленно. Тем не менее, за последние 3 года дважды финал выигрывали команды, пишущие на жабе.

Когда язык разрабатывался, простота кода была одним из самых важных его параметров и это легко увидеть! Например, так Ъ жабакодеры пишут факториал:

Ещё более Ъ вариант:
Хотя можно и так:
Код на Java интуитивно понятен:

Или:
Первоначально язык назывался Oak, что как бы намекает на дровосексуальность разработчиков. Потом у языка появился маскот в виде клизмы с глазом. Ничего напоминающего SICP или «Алгоритмы и структуры данных» Никлауса Вирта так и не было написано. И сам язык, и технология (со всеми библиотеками) были с самого начала рассчитаны на корпоративный рынок, где читателям этих книг, мягко говоря, не место.
Также, были приложены усилия, чтобы Math.sin(Math.PI) возвращала не 1.2246063538223773e-16, а 1.2246467991473532E-16, что доставляет тем, кто хоть что-то понимает в машинной арифметике или метрологии. Похуй, что не полностью поддерживается стандарт IEEE 754, похуй, что нельзя иметь плавучку точнее, чем 53 бита, зато можно воспроизвести погрешности, свойственные технике, которая была на момент разработки языка.
Не так давно (2007 год) Google для реализации плана захвата мира сделал мобильную ОС для КПК и коммуникаторов, назвав её Android. Для исполнения приложений в ОС в Гугл написали свою виртуальную машину по имени Dalvik (начиная с версии 5.0 замененили на ART), оптимизировав её для низкого потребления памяти. Отличается она от солнечной тем, что основана на регистрах, а не на стеке. Причем изначально никакого JIT-компилятора в ней не было и хиленькие процессоры тогдашних смартфонов весело интерпретировали байт-код в реальном времени. Запилили JIT только в версии 2.2, в результате чего скорость выполнения «чистого» кода была увеличена в некоторых случаях до 100 раз, но счастье было омрачено тем, что для хранения скомпилированного исполняемого кода требуется дополнительная память, так что владельцы старых смартфонов как всегда пролетели как фанера над Парижем. Но даже наличие JIT-компилятора не спасало ведроид от адских тормозов в «числодробильных» алгоритмах, так что гугол, скрипя зубами, выпустил таки NDK, позволяющий писать адроидный софт не на жабе, а на кошерном C. В последних версиях ведроида можно вообще отказаться от JIT и скомпилировать все программы раз и навсегда в native-код, что в целом показывает ущербность джавовского подхода к выполнению программ (особенно на «слабом» железе).
12 августа 2010 года корпорация Зла, пользуясь недавно приобретёнными сантехниками, подала в суд на корпорацию Добра: в иске говорится, что Google «осознанно, прямо и постоянно нарушала законы, связанные с интеллектуальной собственностью на технологии Java» при создании ведроида. Истец требует возмещения ущерба в размере 12 гигадолларов. Это вызвало значительный всплеск в мировых болотах. Жабофаги производили стройматериалы не хуже сочинских джамшутов.
А ведь пророк ещё 4 года назад предупреждал:
Ричард Столлман
ЛОР не остался в стороне:
Ужасно. Оракл изящным и быстрым ударом убил джаву. Теперь с неё повалят все. Legioner
Сволочной Oracle! Чтоб они сдохли! Ненависти моей нет конца. zloy_buratino
А разгадка одна — джависты часто любили пугать дотнетчиков, дескать МС подсадит вас на иглу, а там закрутит гайки и начнет доить, а получилось наоборот. Тем временем, альтернативная реализация дотнета — монодроид вполне позволяла писать под Андроид (и, кстати, под iOS, но небесплатно), так что Жабу могут выбросить и оттуда. Майкрософт на радостях гордо заявила, что препятствовать развитию технологий .NET на ведроиде не будет. Правда, монодроид издох, но плагин Mono for Android под Monodevelop позволяет делать то же самое.
Многочисленные суды разных инстанций таки, похоже, закончились 2016-05-26 победой Корпорации Бобра над Корпорацией Зла: суд признал, что API таки не подлежат копирайту. Опенсурсы радуются, редакция следит за развитием событий.
Жабу заталкивали куда только можно. И сия отрасль является, пожалуй, самой популярной версией жабы среди быдла, но не в плане программинга, а в плане юзинга, ибо круто вечером в подъезде показать пацанам, что у тебя на мобиле есть ещё игры, вроде «Трахни шлюху», которую ты бесплатно скачал, отправив смс на номер (а потом куда-то всё бабло ушло в минус, но это другая история).
Итак, мобильная жаба весьма доставляет тем, у кого не хватает денег или мозгов на смартфон, а хочется игр или софта. Отличается она всё той же мультиплатформенностью, хотя реализация ява-машины у разных контор разная, и несчастным разработчикам, создавая очередной хит на кроссплатформенном языке нужно выкладывать десяток версий для нокий новых, нокий старых, а также эриксонов, сименсов, моторолов и прочей хуиты. Именно из-за мультиплатформенности на яве игр не просто больше 9000, а больше 9000 в квадрате, а то и в кубе.
Стоит так же отметить систему безопасности явы на мобилках. Как правило, наиболее опасные функции (отправка смс, выход в инет и т. д.) требуют подтверждения пользователем каждый раз, что, по сути, сделало написание вирусов под эту платформу бессмысленным. Но нашлось куча долбоёбов, которые-таки пишут своих «троянов» и раскидывают их по инету. Самое интересное, что находится ещё больше долбоёбов, которые, запустив какую-нибудь игру или «антивирус касперского», получая запрос на отправку смс, тут же её подтверждают.
Эпичнейшим проектом на яве по праву можно назвать браузер Opera Mini. Им, как ни странно, очень многие пользуются даже на смартфонах, где своих браузеров со свистелками и перделками жопой ешь. А разгадка проста — неебическая экономия трафика + сотни модов, позволяющих творить чудеса.
Что касается скорости сей жабы: разработчики микропроцессора ARM добавили к нему сопроцессор, выполняющий байт-код.