Java և С++ լեզուների համեմատությունըԽմբագրել

Java֊ն և C++֊ը հաճախ համեմատում են որպես լեզուներ, որոնք ժառանգել են C լեզվի շարահյուսությունը, չնայած դրանց բավականին մեծ տարբերություններին բոլոր մակարդակներում՝ սկսած իմաստայինից մինչև կիրառման ոլորտները։ Կարելի է ասել, որ С++֊ի համեմատումը Java֊ի հետ իր հաճախակիությամբ երկրորդ տեղում է С++֊ի և C֊ի համեմատումից հետո։

Նպատակային տեղը
Java֊ն կենտրոնացած է արդյունաբերության միայն որոշակի հատվածի վրա․ անվտանգ լեզու, որն ունի օգտագործողի կիրառական հավելվածների մշակման համար մուտքի ցածր շեմ, դյուրատարության բարձր ցուցանիշով[1]։ Եվ նա այդ հանձնարարությունը կարողանում է կատարել։ С++֊ը, իր հերթին, ցանկանում է ունենալ «բազմակողմանի կիրառություն» ծրագրավորողների բոլոր կատեգորիաների բոլոր հանձնարարություններում, սակայն չի լիովին բավարարում հայտարարված կիրառման ոչ մի ոլորտների պահանջներին:
Ծրագրի կատարումը
Java֊ն ունի ֆորմալ շարահյուսություն, որն կողմնորոշված է ինտերպրետացիայի համար, սակայն Java֊ով գրված կոդը կոմպիլյացվում է միջանկյալ կոդի, որն ծրագրի անմիջապես գործարկումից առաջ կոմպիլյացվում է մեքենայականի (հաճախ խոսում են բայթ֊կոդի ինտերպրետացիայի մաիսն, սակայն տվյալ դեպքում դա ճիշտ չէ․ Java֊ի ժամանակակից առավել տարածված կատարման միջավայրերում թարգմանության երկու փուլերն էլ համարվում են ամբողջաթուլային, չսահմանափակվելով AST֊ի շրջանակներում աշխատանքներով, հնարավորությունների համապատասխան սահմանափակմամբ)։ C++֊ն ունի ճշտգրիտ շարահյուսություն, որն կողմնորոշված է կոմպիլյացման համար, այնպես որ արդեն սարքային Java-մեքենայի վրա был бы крайне неэффективен и ограничен по возможностям. Одно это определяет разницу в сферах применения языков: Java нецелесообразно использовать в низкоуровневом программировании; С++ — в разработке интернет-приложений. Механизм исполнения Java делает программы полностью портируемыми, по принципу «написано один раз — запускается везде (write once — run everywhere)», хотя это не было первостепенной целью разработчиков. Стандартное окружение и среда исполнения позволяют выполнять программы на Java на любой аппаратной платформе и в любой ОС без каких-либо изменений, при условии существования на данной ОС и платформе среды исполнения. Усилия по портированию программ минимальны, и могут быть сведены к нулю соблюдением определённых рекомендаций при разработке. Ценой портируемости в данном случае становятся определённые накладные расходы (например, размер среды исполнения Java превышает даже их размеры у всех функциональных языков).
Парадигма программирования
Java в значительно более высокой степени, чем С++, отвечает фундаментальному принципу ООП «всё — объект» (но не в абсолютной — методы классов самостоятельными объектами не являются, в отличие от CLOS или Python). Для объявления глобальных функций или переменных в Java их необходимо оборачивать в фиктивные классы и назначать свойство статичности[2]. Для задания главной функции даже самой простой программы на Java необходимо поместить её в класс[3]. Программировать на Java в функциональном стиле затрудненоԿաղապար:Нет АИ, поскольку на уровне синтаксиса языка нет поддержки основных элементов ФП (таких как функций высшего порядка) и нет средств макрорасширения языка.
Օբյեկտային մոդելը
Как и в С++, объектная модель Java наследуется из Симулы (в Java — через промежуточную ступень — язык Modula-2), то есть фундаментально отличается от оной в потомках языка Smalltalk (Objective-C, Python, Ruby). Но есть серьёзные отличия и от С++. В Java все методы являются виртуальными. Есть синтаксический сахар для определения абстрактных классов: использование ключевого слова interface делает все методы класса чистыми виртуальными — такие классы называются в Java «интерфейсами». Множественное наследование допустимо только для них, но не для обычных классов, что улучшает дисциплину программирования — на этапе реализации нет возможности нарушить структуру проекта, построенную на этапе архитектурного проектирования (в С++ это делается легко).
Օպերատորները
Безусловный переход в Java отсутствует. Тернарная условная операция в Java также отсутствует. Однако, большинство конструкций являются типичными для всех потомков Алгола: императивный порядок вычислений, присваивания, ветвления, циклы, инфиксные арифметические операции, аргументы в объявлениях и вызовах функций, и пр. В целом спецификация Java отвечает принципу наименьшего удивления и позволяет быстрый переход на Java с любого языка семейства Алгола. Однако, есть и исключения — например, Java, как и C++, позволяет пропускать break в ветви оператора switch[4].
Շարահյուսությունը
Java֊ի հիմնական կառույցների և կոդի բլոկերի բնութագրիչ ձևավորումը ժառանգված են C֊ից․ շարահյուսական տարբերությունների մեծամասնությունը պայմանավորված են իմաստաբանական տարբերությամբ։ Спецификаторы видимости компонентов класса в Java указываются на каждый компонент, а не группами, как в С++. В Java нет механизма ввода синтаксического сахара в программу — перегрузки операторов.
Հասցեյի թվաբանություն
C++֊ը պահպանում է ցածր մակարդակի ցուցիչների հետ աշխատանքի հնարավորությունը, ինչը հանգեցնում է դժվար հայտնաբերվող սխալների, սակայն այն անհրաժեշտ է ցածր մակարդակի ծրագրավորման համար։ Java֊ում հասցեի թվաբանությունը բացակայում է։
Кодогенерация
C++ не только сохраняет препроцессор Си, но и дополняет его Тьюринг-полным языком шаблонов, существенно расширяя возможности автоматического построения кода. В Java макроопределения времени компиляции отсутствуют.
Ինքնադիտողությունը
C++ RTTI֊ում սահմանափակված է օբյեկտների տիպերի իրար և տառային արժեքներով տիպերի միջև համեմատության հնարավորությունը։ Java֊ում տիպերի մասին ավելի մանրամասն տեղեկատվություն է հասանելի։
Ռեսուրսների կառավարումը
C++ позволяет использовать принцип «захват ресурсов путём инициализации» (RAII), при котором ресурсы ассоциированы с объектом и автоматически освобождаются при разрушении объекта (например, std::vector и std::ifstream). Также возможен подход, когда программист, выделяя ресурсы (память под объекты, открытые файлы и т. п.), обязан явно позаботиться о своевременном их освобождении. Java работает в среде со сборкой мусора, которая автоматически отслеживает прекращение использования объектов и освобождает занимаемую ими память, если в этом есть необходимость, в некоторый неопределённый момент времени. Ручное управление предпочтительнее в системном программировании, где требуется полный контроль над ресурсами, RAII и сборка мусора удобнее в прикладном программировании, поскольку в значительной степени освобождают программиста от необходимости отслеживать момент прекращения использования ресурсов. Сборщик мусора Java требует системных ресурсов, что снижает эффективность выполнения программ, лишает программы на Java детерминированности выполнения и способен следить только за памятью. Файлы, каналы, сокеты, объекты графического интерфейса программист на Java всегда освобождает явно.
Միջավայրը
Java֊ի կատարման միջավայրի կազմի մեջ արդեն մտնում են գրաֆիկայի, գրաֆիկական միջերեսի, տվյալների բազաների հասանելիության և նմանատիպ խնդիրների գրադարաններ, որոնք որոշում են դրանց օգտագործման դե֊ֆակտո ստանդարտը։ C++֊ի հիմնական գրադարանի կազմում մտնում են ավելի քիչ հնարավորություններ, սակայն մյուս կողմից այն տալիս է ավելի շատ ազատություն այլ գրադարանների ընտրության հարցում։
  1. «1.2 Design Goals of the Java™ Programming Language»։ Oracle։ 1999-01-01։ Վերցված է 2013-01-14 
  2. Class Arrays, JavaTM 2 Platform Std. Ed. v1.4.2
  3. The Java Tutorials. A Closer Look at the «Hello World!» Application
  4. The Java Tutorials: The switch Statement