Русская Википедия:Критика Java

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Критика Java — комплекс из большого количества разной степени проработанности критических замечаний, выдвинутых к языку программирования Java, одноимённой программной платформе, проектным решениям, выполненным на основе этого языка и платформы, а также к организации процесса развития языка и базовой платформы.

Общая характеристика

Критика Java, как и других распространённых и популярных ЯВУ, достаточно обширна и разнородна. Можно выделить следующие основные аспекты этой критики.

Базовая идеология Java.
Критикуется сама идея создания системы, базирующейся на языке высокого уровня, компилируемого в байт-код виртуальной машины, и создания для каждой вычислительной платформы интерпретатора байт-кода. Также мишенью для критики может быть встроенная в Java-систему подсистема сборки мусора.
Язык и базовая платформа Java.
Критикуются почти все технологические решения разработчиков Java, в том числе заимствование синтаксиса C/C++, идеология иерархии пакетов и её связь с иерархией файлового дерева исходных текстов проекта, наличие, набор и особенности функционирования базовых скалярных типов данных, арифметика.
Реализация.
Критикуется реализация вычислений с плавающей запятой, обращается внимание на уязвимости во встроенной системе безопасности. Критикуется реализация механизмов обобщённого программирования в Java. Шаблон:Прояснить
Эффективность.
Критические замечания о недостаточной эффективности Java в основном относятся к первым версиям реализации языка и платформы, выпущенным в середине 1990-х годов. Впоследствии лавинообразный рост производительности процессоров и объёмов оперативной памяти сделал критику производительности Java гораздо менее актуальной. Тем не менее, до сих пор можно встретить утверждения, что «генетические особенности» Java-систем приводят к избыточным затратам памяти и процессорного времени, не предоставляя при этом равноценных преимуществ перед более экономичными средствами разработки.
Развитие.
Часть критиков считает, что созданные владельцами авторских прав на язык механизмы развития языка тормозят включение в него различных новшеств. Можно встретить и прямо противоположные мнения, согласно которым изменение Java от версии к версии идёт слишком активно, и разработчики внедряют в язык новые элементы, руководствуясь не столько техническими соображениями, сколько модой, что приводит к неоправданному усложнению языка.

Синтаксис и семантика языка

Обобщения в Java

Шаблон:См. также К моменту добавления средств обобщённого программирования в Java 5.0 платформа Java имела большую, активно используемую иерархию классов, многие из которых были устаревшими. Чтобы обеспечить обратную совместимость и возможность повторного использования существующих классов, обобщения были реализованы с помощью механизма стирания типов (в байт-коде обобщённые типы заменяются на нетипизированные ссылки, что позволяет виртуальной машине исполнять код с обобщениями точно так же, как и обычный), что наложило серьёзные ограничения на их использование. В других языках обобщения дают больше возможностей, поскольку реализованы с помощью других механизмов.[1][2] Так, например, на платформе .NET реализация обобщений была внедрена непосредственно в ядро виртуальной машины, исполняющей байт-код, что позволило ценой некоторого усложнения избежать характерных для Java ограничений и, одновременно, существенно облегчило включение обобщений в любые реализуемые на данной платформе языки.

Поскольку обобщения были реализованы с помощью en (Type erasure), действительный тип параметра шаблона недоступен во время выполнения программы. Поэтому следующие операции невозможны в Java: [3]

public class MyClass<E> {
    public static void myMethod(Object item) {
        if (item instanceof E) { // Compiler error
            ...
        }
        E item2 = new E(); // Compiler error
        E[] iArray = new E[10]; // Compiler error
    }
}

Беззнаковые целочисленные типы данных

В Java не реализованы встроенные беззнаковые целочисленные типы данных.[4] Беззнаковые данные часто генерируются в программах, написанных на Си, и отсутствие этих типов данных в Java препятствует прямому обмену данными между программами, написанными на Си, и программами, написанными на Java. Большие числа без знака также используются во многих задачах числовой обработки, в том числе в криптографии, что может сделать Java менее подходящей для автоматизации этих задач, чем другие языки программирования.[5] Хотя возможно частично обойти эту проблему с помощью преобразования кода и использования других типов данных, это делает работу с Java обременительной при обработке беззнаковых данных. Хотя тип данных для 32-разрядных целых чисел со знаком может быть использован для хранения значения 16-разрядного беззнакового числа без потерь, 32-разрядное беззнаковое число потребует 64-разрядного целого типа со знаком, и, соответственно, 64-разрядное беззнаковое значение не может быть корректно преобразовано ни в один целочисленный тип данных в Java, поскольку в Java не существует типов данных для обработки чисел с разрядностью, большей, чем 64. В любом случае, увеличивается в два раза потребление памяти, и любая логика, которая зависит от правил переполнения дополнительного кода, как правило, должна быть переписана. В качестве альтернативы можно использовать знаковые целочисленные типы данных Java для эмуляции беззнаковых целочисленных типов данных того же размера, однако это требует детального знания работы со сложными битовыми операциями.[6] и снижает читаемость кода.

Операции над числами с плавающей точкой

Хотя операции над числами с плавающей точкой в Java в основном базируются на стандарте двоичной арифметики с плавающей точкой IEEE 754, некоторые функции не поддерживаются даже при использовании модификатора en (strictfp), такие, как Флаги исключений и выпрямленные округления — возможности, предусмотренные в качестве обязательных по стандарту IEEE 754. Кроме того, типы данных повышенной точности с плавающей точкой допускаются стандартом IEEE 754, реализованы во многих процессорах, не реализованы в Java.[7][8][9]

Производительность

Шаблон:См. также В первых версиях Java (до того, как HotSpot был реализован в Java 1.3 в 2000 году) было много критики по поводу низкой производительности. Java продемонстрировала работу на скорости, сравнимой с оптимизированным машинным кодом, а современные реализации виртуальной машины Java в тестах на производительность регулярно показывают одни из лучших результатов среди доступных языковых платформ — обычно в пределах 3 позиций по отношению к Си/C++.[10]

Производительность Java существенно улучшилась в новых версиях по сравнению с ранними.[11] Производительность JIT-компиляторов по сравнению с универсальными компиляторами в некоторых искусственных специально подобранных тестах оказалась сравнимой.[11][12][13]

Байт-код Java может быть либо интерпретирован во время выполнения виртуальной машиной, либо он может быть скомпилирован во время загрузки программы или во время её выполнения в машинный код, который работает непосредственно на компьютере. Интерпретация происходит медленнее, чем выполнение машинного кода, а компиляция во время загрузки программы или во время её выполнения снижает производительность за счёт затрат времени на компиляцию. Современные производительные реализации виртуальной Java-машины используют компиляцию, поэтому (после срабатывания JIT-компиляции) приложение показывает производительность, близкую к платформенно-ориентированному коду.

Безопасность

В 2010 году значительно увеличилось количество эксплойтов для обхода ограничений песочницы JVM в браузерах, в результате чего Java стала более атакуемой, чем Acrobat и Flash.[14]

Критики полагают, что обновлённые версии JVM не используются, поскольку многие пользователи просто не знают о том, что у них на компьютере установлена JVM, и поскольку многие пользователи не знают, как обновить JVM. Что же касается корпоративных компьютеров, то многие компании ограничивают права пользователей на установку программного обеспечения и слишком медленно устанавливают обновления.[14][15]

В последних версиях JVM есть опции доступности Java в браузерах.

См. также

Примечания

Шаблон:Примечания

Ссылки