«Մասնակից:MHamlet/Սևագրություն/5»–ի խմբագրումների տարբերություն

Content deleted Content added
No edit summary
No edit summary
Տող 10.
|publisher=Oracle |date=1999-01-01 |accessdate=2013-01-14
}}</ref>։ Եվ նա այդ հանձնարարությունը կարողանում է կատարել։ С++֊ը, իր հերթին, ցանկանում է ունենալ «բազմակողմանի կիրառություն» ծրագրավորողների բոլոր կատեգորիաների բոլոր հանձնարարություններում, սակայն չի լիովին բավարարում հայտարարված կիրառման ոչ մի ոլորտների պահանջներին:
; ИсполнениеԾրագրի программыկատարումը : Java имеет формальную семантику, ориентированную на интерпретацию, но код Java компилируется в [[промежуточный код]], который [[JIT|непосредственно перед запуском]] программы компилируется в машинный (иногда говорят об интерпретации байт-кода, но в данном случае это неверно — у современных наиболее распространённых сред исполнения Java оба этапа трансляции являются полностадийными, не ограничиваясь работой в рамках [[AST]], с соответствующим сужением возможностей). C++ имеет естественную семантику, ориентированную на компиляцию, так что уже на аппаратной Java-машине был бы крайне неэффективен и ограничен по возможностям. Одно это определяет разницу в сферах применения языков: Java нецелесообразно использовать в низкоуровневом программировании; С++ — в разработке интернет-приложений. Механизм исполнения Java делает программы полностью портируемыми, по принципу «''написано один раз — запускается везде (write once — run everywhere)''», хотя это не было первостепенной целью разработчиков. Стандартное окружение и среда исполнения позволяют выполнять программы на Java на любой аппаратной платформе и в любой ОС без каких-либо изменений, при условии существования на данной ОС и платформе среды исполнения. Усилия по портированию программ минимальны, и могут быть сведены к нулю соблюдением определённых рекомендаций при разработке. Ценой портируемости в данном случае становятся определённые накладные расходы (например, размер среды исполнения Java превышает даже их размеры у всех функциональных языков).<!-- и не надо тут писать про невозможность использования платформенно-зависимых библиотек - раз портируемость стоит в числе приоритетов, то ни о каких DirectX-ах не может идти и речи по определению! -->
; Парадигма программирования : Java в значительно более высокой степени, чем С++, отвечает фундаментальному принципу ООП «''всё — объект''» (но не в абсолютной — методы классов самостоятельными объектами не являются, в отличие от [[CLOS]] или [[Python (язык программирования)|Python]]). Для объявления глобальных функций или переменных в Java их необходимо оборачивать в фиктивные классы и назначать свойство статичности<ref>[http://java.sun.com/j2se/1.4.2/docs/api/java/util/Arrays.html Class Arrays, JavaTM 2 Platform Std. Ed. v1.4.2]</ref>. Для задания главной функции даже самой простой программы на Java необходимо поместить её в класс<ref>[http://java.sun.com/docs/books/tutorial/getStarted/application/index.html The Java Tutorials. A Closer Look at the «Hello World!» Application]</ref>. Программировать на Java в функциональном стиле затруднено{{нет АИ|31|08|2013}}<!-- Вообще-то оно НЕВОЗМОЖНО - утверждающим обратное придётся продемонстрировать функциональное проектирование/декомпозицию (т.е. изоморфизм Карри-Ховарда), лямбда-абстракции, построение ADT, карринг и, конечно же, ИСТИННЫЙ полиморфизм (не путать с ad hoc-полиморфизмом из ООП) -->, поскольку на уровне синтаксиса языка нет поддержки основных элементов ФП (таких как [[Функция высшего порядка|функций высшего порядка]]) и нет средств макрорасширения языка.
; ОбъектнаяՕբյեկտային модельմոդելը : Как и в С++, объектная модель Java наследуется из [[Симула|Симулы]] (в Java — через промежуточную ступень — язык Modula-2), то есть фундаментально отличается от оной в потомках языка [[Smalltalk]] ([[Objective-C]], [[Python (язык программирования)|Python]], [[Ruby]]). Но есть серьёзные отличия и от С++. В Java все методы являются виртуальными. Есть синтаксический сахар для определения абстрактных классов: использование ключевого слова <code>interface</code> делает все методы класса чистыми виртуальными — такие классы называются в Java «интерфейсами». Множественное наследование допустимо только для них, но не для обычных классов, что улучшает дисциплину программирования — на этапе реализации нет возможности нарушить структуру проекта, построенную на этапе архитектурного проектирования (в С++ это делается легко).
; ОператорыՕպերատորները : Безусловный переход в Java отсутствует. [[Тернарная условная операция]] в Java также отсутствует. Однако, большинство конструкций являются типичными для всех потомков [[Алгол]]а: императивный порядок вычислений, присваивания, ветвления, циклы, инфиксные арифметические операции, аргументы в объявлениях и вызовах функций, и пр. В целом спецификация Java отвечает принципу наименьшего удивления и позволяет быстрый переход на Java с любого языка семейства Алгола. Однако, есть и исключения — например, Java, как и C++, позволяет пропускать <code>break</code> в ветви оператора <code>switch</code><ref>[http://java.sun.com/docs/books/tutorial/java/nutsandbolts/switch.html The Java Tutorials: The switch Statement]</ref>.
; СинтаксисՇարահյուսությունը : ОсновныеJava֊ի конструкцииհիմնական Javaկառույցների иև характерноеկոդի оформлениеբլոկերի блоковբնութագրիչ кодаձևավորումը наследованыժառանգված изեն Си;C֊ից․ большинствоշարահյուսական синтаксическихտարբերությունների отличийմեծամասնությունը обусловленыպայմանավորված разницейեն вիմաստաբանական семантике.տարբերությամբ։ Спецификаторы видимости компонентов класса в Java указываются на каждый компонент, а не группами, как в С++. В Java нет механизма ввода синтаксического сахара в программу — [[#Перегрузка операторов|перегрузки операторов]].
; Հասցեյի թվաբանություն : C++֊ը պահպանում է ցածր մակարդակի ցուցիչների հետ աշխատանքի հնարավորությունը, ինչը հանգեցնում է դժվար հայտնաբերվող սխալների, սակայն այն անհրաժեշտ է ցածր մակարդակի ծրագրավորման համար։ Java֊ում հասցեի թվաբանությունը բացակայում է։
; Адресная арифметика : C++ сохраняет возможность работы с низкоуровневыми указателями — это является причиной труднообнаруживаемых ошибок, но необходимо для низкоуровневого программирования. В Java адресной арифметики нет.
; Кодогенерация : C++ не только сохраняет препроцессор Си, но и дополняет его Тьюринг-полным языком шаблонов, существенно расширяя возможности автоматического построения кода. В Java макроопределения времени компиляции отсутствуют.
; Ինքնադիտողությունը : C++ [[RTTI]]֊ում սահմանափակված է օբյեկտների տիպերի իրար և տառային արժեքներով տիպերի միջև համեմատության հնարավորությունը։ Java֊ում տիպերի մասին ավելի մանրամասն տեղեկատվություն է հասանելի։
; Интроспекция : В C++ [[RTTI]] ограничена возможностью сравнивать типы объектов между собой и с буквальными значениями типов. В системе Java доступна более подробная информация о типах.
; УправлениеՌեսուրսների ресурсамиկառավարումը : C++ позволяет использовать принцип «захват ресурсов путём инициализации» (RAII), при котором ресурсы ассоциированы с объектом и автоматически освобождаются при разрушении объекта (например, <code>std::vector</code> и <code>std::ifstream</code>). Также возможен подход, когда программист, выделяя ресурсы (память под объекты, открытые файлы и т. п.), обязан явно позаботиться о своевременном их освобождении. Java работает в среде со [[сборка мусора|сборкой мусора]], которая автоматически отслеживает прекращение использования объектов и освобождает занимаемую ими память, если в этом есть необходимость, в некоторый неопределённый момент времени. Ручное управление предпочтительнее в системном программировании, где требуется полный контроль над ресурсами, RAII и [[сборка мусора]] удобнее в прикладном программировании, поскольку в значительной степени освобождают программиста от необходимости отслеживать момент прекращения использования ресурсов. Сборщик мусора Java требует системных ресурсов, что снижает эффективность выполнения программ, лишает программы на Java детерминированности выполнения и способен следить только за памятью. Файлы, каналы, сокеты, объекты графического интерфейса программист на Java всегда освобождает явно.
; Միջավայրը : Java֊ի կատարման միջավայրի կազմի մեջ արդեն մտնում են գրաֆիկայի, գրաֆիկական միջերեսի, տվյալների բազաների հասանելիության և նմանատիպ խնդիրների գրադարաններ, որոնք որոշում են դրանց օգտագործման դե֊ֆակտո ստանդարտը։ [[C++֊ի ստանդարտ գրադարան|C++֊ի հիմնական գրադարանի]] կազմում մտնում են ավելի քիչ հնարավորություններ, սակայն մյուս կողմից այն տալիս է ավելի շատ ազատություն այլ գրադարանների ընտրության հարցում։