Жаба
Материал из Lurkmore
Эта статья сделана из уныния и отчаяния. Сделайте с ней что-нибудь. Пожалуйста. |
В эту статью нужно добавить как можно больше лулзов. Также сюда можно добавить интересные факты, картинки и прочие кошерные вещи. |
« |
Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders | » |
— Программисты .NET |
« |
Посадить двуногого автомата, можно нескольких, выполнять задачу. И никакой жабы не надо. | » |
— Программисты 1С |
Жа́ба (жарг.) — искажённое название языка программирования Java, из которого выпилили почти все беззнаковые типы данных и указатели. Определённой эмоциональной окраски не несёт, но, ввиду плохого отношения к Java значительной части населения ЛОРа, чаще употребляется в уничижительных выражениях (жабокодер, жабобыдлокодер и т. д.). Это значение популяризовано Луговским. Алсо, жабонебыдлокодеры имеют зарплату, на которую можно купить не только хлеб, воду и сало, как похапекодерам. А некоторым хватает еще и на черную икру, феррари и 25-летний виски [1].
Наиболее характерной (и уже много лет как не слишком актуальной) претензией является низкая скорость работы, связанная, в основном, с особенностями национального программирования.
Содержание |
[править] История
Есть версия, что миф о «тормознутости» Java еще связан с тем, что в доисторические времена в браузерах были апплеты, которые адски тормозили. Виртуальная машина тогда была очень паршивая. Соответственно, открытие странички с Java-апплетом вызывало «подвисание» браузера на минуту-другую, часто с надписями типа «Приложеньице загружается…». Что не могло не радовать пользователей. Особенно цинично это выглядело, когда причиной тормозов был апплет с анимированной кнопкой «e-mail» размером 100 на 50 пикселей. Были даже спецпрограммы, чтобы генерировать такие апплеты для говносайтов.
Алсо, в доисторические времена не было JIT-компиляции, машина занималась лишь интерпретацией. JIT сильно ускорил процесс. При обращении к какому-либо участку кода, который исполняется уже с десяток тысяч раз (как известно, 80% всего рантайма исполняется 20% кода), он компилируется виртуальной машиной в реальный машинный код, что, естественно, прибавляет скорости. Особенно хорошо это работает на новых процессорах, под которые JVM создаёт максимально оптимизированый код(обычные компиляторы — как правило создают один код, который совместим с большиноством существующих процессоров).
Также Java облегчает труд девелопера с помощью использования сборщика мусора (garbage collector, GC). В связи с этим программы на Java плохо переносят использование свопа, так как при удалении объектов из памяти GC проходится по множеству объектов. С другой стороны программы, полностью написанные на Java гораздо лучше застрахованы от утечек памяти благодаря тому, что об этом уже по большей части не приходится заботиться разработчикам.
[править] Достоинства
- долгий цикл поддержки
- отличная обратная совместимость: все новые версии обратно совместимы вплоть до java 1.0.2 (да, это камень в сторону .NET)
- полная кроссплатформенность: Windows, Linux, BSD, Solaris, AIX, канувшем в Лету Irix, HP-UX, QNX, а также совсем безумные реализации типа en.w:NanoVM для микроконтроллеров — подо все есть совместимая реализация JDK, причем правильно написанная программа будет под всем этим работать одинаково успешно[1].
- безопасность: такие вещи, как SQL Injection (разумеется, если не использовать raw sql), уязвимости при неправильной работе с памятью и ряд других не существуют в джаве. Что не может не радовать.
Если же немного отойти от технической стороны и обратиться к технологической, то Java максимально заточена на написание и поддержку кроссплатформенных сетевых приложений и программных продуктов (которые по технической сложности могут превосходить самотрансформирующуюся шатл-субмарину) с минимальными затратами человеко-часов за счёт таких особенностей как:
- Принудительное ООП. Напомню, что в правильных (то есть выпрямленных суровой необходимостью) руках управляемых средней тупости головой (этими качествами обладают большинство прогеров на западе) ООП приводит к более интуитивной модульности кода с меньшим числом концептуально лишних зависимостей.
- Программы пишутся не под и исполняются не на физической машине, а виртуальной, которая без лишних выебонов заточена на поддержку именно таких программ, которые на жабе и пишутся, что разом устраняет тонны (но не надо думать, что их остается так уж мало) матана, брэйнфака и задротства из проектной документации и списков требований к работникам. Это всё равно, что дорогого анонимуса вместо реального мира с его трудностями самоопределения в бурном потоке перемен, проблемой обретения финансовой независимости или даже состоятельности в условиях крысиса и сложностями репродукции поместить в Эдем с блэкджеком и шлюхами. Каково? Ништяк ведь?
- Совместимость языка и платформы с точки зрения Солнцевских ребят — это не только когда вы можете перекомпилить старый код под новую версию платформы новой версией компилера, и всё будет работать так же, а когда вы можете даже не перекомпиливать старый код. en.w:Write once, run everywhere.
- Отсутствие указателей и адресной арифметики, что исключает как класс примерно 93,7438935621% всех ошибок и уж точно ВСЕ самые сложные и дорогостоящие из них (ошибки общего дизайна продукта здесь не к месту, так как такими вещами рядовые кодеры не занимаются). ЧСХ, на практике оказывается, что никакой нужды в адресной арифметике нет.
- Тысячи их!
Этим всем жаба бессовестно и нагло лишила программинг романтики и обеспечила возможность добиваться сносного результата в приемлемые сроки даже с кудрявыми руками и не очень мощным мозгом. Чем, конечно же, вызвала неприятие Ъ гиков.
Это язык для реализации серьезных бизнес-приложений. Никто не пишет на Java тру-GUI-приложений на стандартных библиотеках AWT/SWING и нет в этом особой необходимости. Однако, еще как пишут распределенные вычисилительные системы, разворачивают большие интренет-магазины, порталы и прочие вещи, на которых зарабатыют деньги. А все потому, что это надежно, быстро, просто и безопасно.
[править] НЕНАВИСТЬ!!!!!
Основными обоснованными претензиями в сторону жабы являются:
- Не слишком вменяемые стандартные библиотеки, тянущиеся ещё с 1й версии. Часто приходится писать свою имплементацию стандартного механизма. Ситуация серьезно улучшена в версии 1.6, но нет предела совершенству.
- Необходимость тонкой оптимизации (как кода, так и настроек JVM) для получения приличной скорости работы (да, она возможна, но часто нетривиальна).
- До сих пор не слишком вменяемые средства для работы с GUI (что, в прочем, решается сторонними разработками — Qt под Java, SWT и др. плюс нормальный редактор GUI в NetBeans), однако считать это за минус — чистой воды идиотизм, ибо Жаба задумывалась не для ГУЙовых приложений, а консольных
- Отсутствие нормального метапрограммирования. В версии 1.5 запилили генерики и аннотации, но они не решают всех проблем. Любители C++ досадуют на стирание типов, то есть невозможность получения информации о параметризованном типе в рантайме.
Еще есть не слишком обоснованные претензии:
- Жаба тормозит (но надо учесть, что для основного целевого применения покупка сервера за 9000+ денег проблемой не является).
- Жаба хавает 9000+ МБайт памяти (волшебная JIT компиляция и утечки. Хотя решается это просто — одна программа на Жабе — один сервер, то есть пресловутая «Серверная Java»).
- Жаба кривая (уж не потому ли, что держат её кривые руки?).
- Жаба убогая (да, в ней действительно нет прямой работы с памятью, что можно обойти через sun.misc.Unsafe, и перегрузки операторов, что нафиг не нужно, ибо не соответствует идеологии языка).
- Жаба ооочень медленно развивается, в то время как C# обрастает новыми фичами чуть ли не каждый день[2] (что, само собою разумеется, убивает обратную совместимость под корню).
О недостатках есть длинная бумага, которую никто не будет читать. А по мнению Никлауса Вирта, Java и JVM были слизаны с его языка Oberon чуть менее чем полностью и испорчены сишным синтаксисом. Честно говоря, у Вирта есть на то основания, но разве это кого волнует?
[править] Google Android
Не так давно (2007 год) Google для реализации плана захвата мира сделал мобильную ОС для КПК, коммуникаторов, роботов… с именем Android. Ну так вот, для исполнения приложений в ОС в Гугл написали свою виртуальную машину по имени Dalvik, оптимизировав ее для низкого потребления памяти. Отличается она от солнечной тем, что основана на регистрах, а не на стеке. Стандартный солнечный байт-код не используется, так что солнечные приложения не запустишь (но в Android SDK есть утилита dx, которая преобразует .class файлы в формат .dex, пригодный для интерпретации в Dalvik). JIT-компиляции в Dalvik’e появилась совсем недавно, в Android 2.2 (Froyo). Скорость увеличена, но требует дополнительной памяти для хранения скомпиленного кода, так что владельцы старых смартфонов всё равно в пролёте. Примечательно, что запилили все это только когда стало понятно, что просирать интерпретацией большую часть мощности и без того хилого «карманного» железа как минимум не всегда разумно.
12 августа 2010 года корпорация Зла, пользуясь недавно приобретенными сантехниками, подала в суд на корпорацию Добра копирастический иск. В иске говорится, что Google «осознанно, прямо и постоянно нарушала законы, связанные с интеллектуальной собственностью на технологии Java» при создании операционной среды Android. Истец требует возмещения ущерба. Это вызвало значительный всплеск в мировых болотах. Жабофаги производили стройматериалы не хуже сочинских джамшутов.
А ведь пророк еще 4 года назад предупреждал:
Разработчикам систем на GNU/Linux не следует использовать такие технологии как Java и Macromedia Flash, поскольку они не являются свободными |
ЛОР также не остался в стороне:
Ужасно. Оракл изящным и быстрым ударом убил джаву. Теперь с неё повалят все. Legioner
Сволочной Oracle! Чтоб они сдохли! Ненависти моей нет конца. zloy_buratino
Корпорация Майкрософт также не отказалась вбросить пару тонн удобрений в вентиляцию. Она гордо заявила, что не собирается препятствовать развитию технологий .net на ведроиде, согласно своему публичному обещанию. Тот факт, что пока окромя зачаточного монодроида ничего и нету, многим параллелен. Однако незадолго до этого m$ отымели HTC (первого, но теперь уже одного из многочисленных прозиводителей телефонов с android), заявив, что все подсистемы ведроида нарушают их патенты, причём не говорит, какие именно.[2] Возможно даже, что никаких нарушений нету.
[править] Связанные мемы
В основном мемы связаны со скоростью работы программ на Java, а также с тем, что это индустриальный язык программирования, точнее, с тем, что на нём пишет большое количество быдлокодеров-индусов. Типичные примеры:
- «Жаба не тормозит», «просто gc невовремя запустился», «просто всё остальное слишком быстро работает» и тому подобное по вкусу.
- «Томми», «убей себя как Томми». Применяется в основном к быдложабокодерам. Мем, связанный с тем, что на одной из гонок машин-роботов имени DARPA одна из машин по имени Томми, софт для которой был написан на Java, сошла с дистанции в связи со сбоем чипа, приведшей к убиению оного об стену. Что интересно, неполадка была чисто аппаратной, но всем похуй.
- «Серверная Java». Используется при обсуждении любых проблем с производительностью жабоприложений. Заявляется, что проблема в десктопной жабе, а с серверными настройками все нормально.
[править] Не тормозит
Java is high performance. By high performance we mean adequate. By adequate we mean slow. |
В холиварах жабакодеры любят приводить в качестве главного аргумента того, что жаба не тормозит, линки на бенчмарки, в которых сравнивается скорость нативного кода и жабо-байткода. Обычно заголовки таких тестов выглядят в духе «Жаба обгоняет по производительности С++» и приводится код, где Java быстрее C/C++ (нужное подчеркнуть). Это происходит по нескольким причинам:
- Такие бенчмарки примитивны: они работают только со скалярными типами (с такими, как int, double), память под которые выделяется на стеке, используются простые операции и, наконец, весь код находится только в одном классе.
- Обычно такие тесты содержат много циклов, а замеры проводятся не во время первого запуска, а когда JIT-компилятор уже отработал. Значит, меряется скорость хорошо оптимизированного динамически скомпилированного кода. Да и garbage collector не успевает в таких программах отработать.
- Авторы бенчмарков зачастую поверхностно знают C/C++ и используют его в «жабьем» стиле, например используя кучу там, где она не нужна (и ноют про необходимость free и delete).
В реальных же приложениях ситуация с быстродействием несколько иная. Причина тому:
- Все объекты ссылочные и хранятся в куче, а значит самые элементарные составные типы такие, как Point, будут каждый раз создаваться в ней.[3] А таких объектов тысячи. Даже при хорошей оптимизации кучи, она медленнее стека.
- Большое потребление памяти: один только хелловорлд при запуске отъедает 10 МБ. Также с каждой инстанцией класса связаны метаданные и монитор (по предыдущей причине), в результате какой-нибудь массив значений RGB будет занимать в 4-5 раз больше памяти, чем в даже хотя бы в C#[4]. На венде, которая свопит всё подряд, это приводит к известным результатам[5].
- Динамическая природа языка: динамическое связывание кода подразумевает постоянные проверки при кастинге типов, например при работе с коллекциями. Генерики здесь не дают ничего, так как они были введены в язык позже и, для сохранения обратной совместимости, действуют только на уровне исходного кода, в конечном байткоде их нет. Возможность подгрузки классов и рефлексия во время выполнения также связывают руки компилятору.
- Бросание исключений на каждый мелкий чих, чего язык не требует, но требует идеология и сторонние либы, а выполняются исключения медленно. Оборотной стороной повышенной надежности является то, что многие программы в процессе работы генерируют over 9000 исключений[6], а исправлять их разработчики не спешат.
- Другая семантика языка: во избежание воспаления мозга от i++ + i++ были введены четкие правила, устраняющие неоднозначности, что мешает компилятору заниматься оптимизацией. Так, например, на Java оператор вида x+=foo(); в отличие от Си требует запоминания предыдущего значения x перед вызовом foo(). См. также http://avva.livejournal.com/2334773.html
- Garbage collector: хотя он проходится по памяти нечасто, на GUI приложениях это ощутимо.
- Всякие там веб-приложения активно используют базу данных, так что большую часть времени займет обработка запросов на стороне этой базы (в основном I/O диска), так что хоть на чем пиши — разница в скорости будет небольшая. Более того, сервлет на Java может запросто обогнать какой-нибудь кривой cgi-скрипт на Си, потому что сервлету надо инициализироваться один раз, а cgi-скрипту может понадобится стучаться на базу при ответе на каждый запрос для получения каких-нибудь там настроек.
- На embedded системах зачастую недостаточно ресурсов для работы JIT’а, в результате приходится выполнять байт-код. Даже если это происходит на JVM-процессоре, то оно все равно работает не слишком быстро, так как вся оптимизация происходит не в javac, а в JIT, которого нет. К слову, Hotspot JIT написан на C++ и асме, а javac на Java. На маломощных системах неплохие результаты дает AOT компиляция (типа Excelsior JET), однако это не труъ и стоит бабок.
- Неотключаемая (если не заниматься извращениями вроде GCJ) проверка индексов при обращении к массиву.
Алсо, в последние годы стало популярно портировать на жабу проекты, для которых она, мягко говоря, является не лучшим средством реализации. Например, на Java был полностью портирован исходный код Quake II.
Но всё же большинство причин тормозов жабы идут от работы с либами, ибо солнцевские пытаются обеспечить безопасную среду исполнения. Но, с другой стороны, вам никто не запрещает реализовать, скажем, собственный быстрый сетевой интерфейс (или что угодно) с использованием вызовов в С системные библиотеки. Правда, в таком случае, все джавовские прелести (вроде полной кроссплатформенности, упрощённости обслуживания готового кода, безопасности среды исполнения — ибо ошибка при выполнении native call с успехом может завесить и JVM и всю систему в целом — и практически всего прочего, включённого в рекламный видеоклип от Солнышка) полностью утрачиваются. И порой вообще перестаёт быть понятным, зачем, собственно, Жаба участвует в данном програмном продукте. Кроме того, для многих стандартных механизмов существует несколько реализаций, которые, в зависимости от способа использования, могут отличаться по скорости на порядки. Но быдлокодеры берут первый попавшийся, со всеми вытекающими.
Алсо, в соревнованиях по программированию алгоритмического толка ACM, авторы задач просто вынуждены удваивать/утраивать ограничение по времени или вовсе устанавливать специальные ограничения для жабы, чтобы каждый жабакодер мог сдать задачу. Для одинаковых лимитов времени часто бывало, что кривой алгоритм на жабе, не укладывающийся в рамки времени и/или памяти, будучи переписанным один-в-один на си, проходил. Обратные случаи неизвестны. Также, в ACM’е каждый жабокодер вынужден писать свой класс для чтения чисел из файла, так как поставляемый со стандартной библиотекой работает слишком медленно. Тем не менее, за последние 3 года дважды финал выигрывали команды, пишущие на жабе.
Но тем не менее, есть вполне наглядный пример реализации на языке системы реального времени.
[править] Простота кода Java
Когда язык разрабатывался, простота кода была одним из самых важных его параметров и это легко увидеть. Например, так Ъ жабакодеры пишут факториал.
Ещё более Ъ вариант:
Хотя можно и так.
Код на Java интуитивно понятен:[7]:
[править] Фетишизм
Первоначально язык назывался Oak, что как бы намекает на дровосексуальность разработчиков. Потом у языка появился маскот в виде клизмы с глазом. Также, усилия были приложены, чтобы Math.sin(Math.PI) возвращала не 1.2246063538223773e-16, а 1.2246467991473532E-16, что доставляет тем, кто хоть что-то понимает в машинной арифметике или метрологии. Похуй, что нет неполностью поддерживается стандарт IEEE 754, похуй, что нельзя иметь плавучку точнее, чем 53 бита, зато можно воспроизвести погрешности, свойственные технике, которая была на момент разработки языка.
[править] J2ME
Сия отрасль является, пожалуй, самой популярной версией жабы среди быдла, но не в плане программинга, а в плане юзинга, ибо круто вечером в подъезде показать пацанам, что у тебя на мобиле есть ещё игры, вроде «Трахни шлюху», которую ты бесплатно скачал, отправив смс на номер (а потом куда-то всё бабло ушло в минус, но это другая история).
Итак, мобильная жаба весьма доставляет тем, у кого не хватает денег или мозгов на смартфон, а хочется игр или софта. Отличается она всё той же мультиплатформенностью, хотя реализация ява-машины у разных контор разная, и несчастным разработчикам, разрабатывая очередной хит на кроссплатформенном языке нужно выкладывать десяток версий для нокий новых, нокий старых, нокий смартфонов, эриксонов, сименсов, моторов и прочей хуиты. Именно из-за мультиплатформенности на яве игр не просто больше 9000, а больше 9000 в квадрате, а то и в кубе.
Стоит так же отметить систему безопасности явы на мобилках. Как правило, наиболее опасные функции (отправка смс, выход в инет и т. д.) требуют подтверждения пользователем каждый раз, что, по сути, сделало написание вирусов под эту платформу бессмысленным. Но нашлось куча долбоёбов, которые-таки пишут своих «троянов» и выкладывают их по инету. Самое интересное, что находится ещё больше долбоёбов, которые, запустив какую-нибудь игру или «антивирус касперского», получая запрос на отправку смс тут же её подтверждают, после чего теряют всё своё бабло.
Эпичнейшим проектом на яве по праву можно назвать браузер Opera Mini. Им, как ни странно, очень многие пользуются даже на смартфонах, где своих браузеров со свистелками и перделками жопой ешь. А разгадка проста — неебическая экономия трафика + сотни модов, позволяющих творить чудеса. Кстати, в 2010 году Opera Mini вышла в native-виде под платформы Windows Mobile, Symbian и Android и теперь не требует наличия богомерзкого эмулятора J2ME для работы.
Что касается скорости сей жабы — здесь важную роль чаще всего играет производитель аппарата, а номер модели — во вторую очередь.
[править] JavaCard
Java работает также и на смарт-картах. Большинство SIM-карт поддерживает установку специальных апплетов, написанных на Java. Правда язык для этого пришлось обрезать по функциональности в связи с ограниченностью мощностей смарт-карт.
[править] Алсо
- Также «Ява» — винрарная марка чешских байков. А еще — марка еще более винрарных сигарет. А еще — остров на юг от Сингапура, на котором расположена столица Индонезии Джакарта.
- Яванский человек — ископамый человек вида хомо эректус.
- Говорят, что язык программирования был назван в честь сорта кофе.
- Джавы — в звездных войнах — раса дикарей на планете Татуин.
- Жаба — жаргонное название Fender Jazz Bass.
- Жаба — хорошо известное каждому лично животное, приходящее к нему всякий раз, когда сосед покупает новую мебель/машину/квартиру.
- Кстати, при общении с разносчиками Жаббера следует уточнять, какую жабу вы имеете в виду; иначе случаются когнитивные диссонансы с обеих сторон
[править] Информация к размышлению
- Квака на жабе (к вопросу о тормозах в разделе выше)
- Моно опережает Java на Linux Desktop
- b_mahno/1727 Java, какой я ее увидел десять лет назад.
- Жалобы на исключение GMP из Kaffee JVM
- Опасности обучения на Java
- Quirks of Java language
- Чак Норрис тоже знает Жабу
[править] Галерея
[править] См. также
[править] Примечания
- ↑ Следует отметить, что Microsoft в свое время получил от солнцевских повестку в суд и была вынуждена выпилить свою реализацию JVM. Правда, они после этого сделали C#.
- ↑ Стараниями Oracle, версия 1.7 уже здесь!
- ↑ Пофикшено, начиная с 1.6 update 14: луркайте Escape analysis
- ↑ Стоит отметить, что кодер на жабе без энтерпрайза головного мозга в данном случае будет хранить данные, упакованные в виде одного (для всех RGB переменных) массива скаляров, правда, ценой приближения читаемости такого кода к индусскому (при отсутствии вменяемых комментариев). Костыль, но такова, как говорится, селяви
- ↑ Потребление памяти программами на разных языках в shootout
- ↑ например на жабе можно легально суммировать массив так: try { for(int i=0;;i++) sum+=a[i]; } catch(Exception e) {}
- ↑ Здесь дело в автобоксинге — криво добавленном в версии 1.5 автоматическом преобразовании примитивных типов в обёртки. В версии 1.4 и ранее пришлось бы явно писать
Integer.valueOf(42)
. А объекты оператор == сравнивает по ссылке, а не по значению, в то время как >= автоматически распаковывает эти объектыInteger
обратно вint
неявным вызовомintValue()
(Алсо, для Integers от −127 до 127 созданы статические объекты (для экономии памяти), поэтому a==b возвращает true). И так у них всё — в смысле всё тяжёлое историческое наследие. В этом вашем .NET подобных проблем не возникает (даже строки сравниваются по значению вместо явного вызоваEquals()
), хотя там есть свои тонкости с различиями между структурными и ссылочными объектами.
[ + ] Любой программист без словаря поймёт, что такое Жаба
|
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|