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

Վիքիպեդիայից՝ ազատ հանրագիտարանից
Content deleted Content added
No edit summary
No edit summary
Տող 10. Տող 10.
|publisher=Oracle |date=1999-01-01 |accessdate=2013-01-14
|publisher=Oracle |date=1999-01-01 |accessdate=2013-01-14
}}</ref>։ Եվ նա այդ հանձնարարությունը կարողանում է կատարել։ С++֊ը, իր հերթին, ցանկանում է ունենալ «բազմակողմանի կիրառություն» ծրագրավորողների բոլոր կատեգորիաների բոլոր հանձնարարություններում, սակայն չի լիովին բավարարում հայտարարված կիրառման ոչ մի ոլորտների պահանջներին:
}}</ref>։ Եվ նա այդ հանձնարարությունը կարողանում է կատարել։ С++֊ը, իր հերթին, ցանկանում է ունենալ «բազմակողմանի կիրառություն» ծրագրավորողների բոլոր կատեգորիաների բոլոր հանձնարարություններում, սակայն չի լիովին բավարարում հայտարարված կիրառման ոչ մի ոլորտների պահանջներին:
; Исполнение программы : Java имеет формальную семантику, ориентированную на интерпретацию, но код Java компилируется в [[промежуточный код]], который [[JIT|непосредственно перед запуском]] программы компилируется в машинный (иногда говорят об интерпретации байт-кода, но в данном случае это неверно — у современных наиболее распространённых сред исполнения Java оба этапа трансляции являются полностадийными, не ограничиваясь работой в рамках [[AST]], с соответствующим сужением возможностей). C++ имеет естественную семантику, ориентированную на компиляцию, так что уже на аппаратной Java-машине был бы крайне неэффективен и ограничен по возможностям. Одно это определяет разницу в сферах применения языков: Java нецелесообразно использовать в низкоуровневом программировании; С++ — в разработке интернет-приложений. Механизм исполнения Java делает программы полностью портируемыми, по принципу «''написано один раз — запускается везде (write once — run everywhere)''», хотя это не было первостепенной целью разработчиков. Стандартное окружение и среда исполнения позволяют выполнять программы на Java на любой аппаратной платформе и в любой ОС без каких-либо изменений, при условии существования на данной ОС и платформе среды исполнения. Усилия по портированию программ минимальны, и могут быть сведены к нулю соблюдением определённых рекомендаций при разработке. Ценой портируемости в данном случае становятся определённые накладные расходы (например, размер среды исполнения Java превышает даже их размеры у всех функциональных языков).<!-- и не надо тут писать про невозможность использования платформенно-зависимых библиотек - раз портируемость стоит в числе приоритетов, то ни о каких DirectX-ах не может идти и речи по определению! -->
; Ծրագրի կատարումը : 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 в значительно более высокой степени, чем С++, отвечает фундаментальному принципу ООП «''всё — объект''» (но не в абсолютной — методы классов самостоятельными объектами не являются, в отличие от [[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 — через промежуточную ступень — язык 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 также отсутствует. Однако, большинство конструкций являются типичными для всех потомков [[Алгол]]а: императивный порядок вычислений, присваивания, ветвления, циклы, инфиксные арифметические операции, аргументы в объявлениях и вызовах функций, и пр. В целом спецификация 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 указываются на каждый компонент, а не группами, как в С++. В Java нет механизма ввода синтаксического сахара в программу — [[#Перегрузка операторов|перегрузки операторов]].
; Շարահյուսությունը : Java֊ի հիմնական կառույցների և կոդի բլոկերի բնութագրիչ ձևավորումը ժառանգված են C֊ից․ շարահյուսական տարբերությունների մեծամասնությունը պայմանավորված են իմաստաբանական տարբերությամբ։ Спецификаторы видимости компонентов класса в Java указываются на каждый компонент, а не группами, как в С++. В Java нет механизма ввода синтаксического сахара в программу — [[#Перегрузка операторов|перегрузки операторов]].
; Հասցեյի թվաբանություն : C++֊ը պահպանում է ցածր մակարդակի ցուցիչների հետ աշխատանքի հնարավորությունը, ինչը հանգեցնում է դժվար հայտնաբերվող սխալների, սակայն այն անհրաժեշտ է ցածր մակարդակի ծրագրավորման համար։ 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 всегда освобождает явно.
; Ռեսուրսների կառավարումը : C++ позволяет использовать принцип «захват ресурсов путём инициализации» (RAII), при котором ресурсы ассоциированы с объектом и автоматически освобождаются при разрушении объекта (например, <code>std::vector</code> и <code>std::ifstream</code>). Также возможен подход, когда программист, выделяя ресурсы (память под объекты, открытые файлы и т. п.), обязан явно позаботиться о своевременном их освобождении. Java работает в среде со [[сборка мусора|сборкой мусора]], которая автоматически отслеживает прекращение использования объектов и освобождает занимаемую ими память, если в этом есть необходимость, в некоторый неопределённый момент времени. Ручное управление предпочтительнее в системном программировании, где требуется полный контроль над ресурсами, RAII и [[сборка мусора]] удобнее в прикладном программировании, поскольку в значительной степени освобождают программиста от необходимости отслеживать момент прекращения использования ресурсов. Сборщик мусора Java требует системных ресурсов, что снижает эффективность выполнения программ, лишает программы на Java детерминированности выполнения и способен следить только за памятью. Файлы, каналы, сокеты, объекты графического интерфейса программист на Java всегда освобождает явно.
; Միջավայրը : Java֊ի կատարման միջավայրի կազմի մեջ արդեն մտնում են գրաֆիկայի, գրաֆիկական միջերեսի, տվյալների բազաների հասանելիության և նմանատիպ խնդիրների գրադարաններ, որոնք որոշում են դրանց օգտագործման դե֊ֆակտո ստանդարտը։ [[C++֊ի ստանդարտ գրադարան|C++֊ի հիմնական գրադարանի]] կազմում մտնում են ավելի քիչ հնարավորություններ, սակայն մյուս կողմից այն տալիս է ավելի շատ ազատություն այլ գրադարանների ընտրության հարցում։
; Միջավայրը : Java֊ի կատարման միջավայրի կազմի մեջ արդեն մտնում են գրաֆիկայի, գրաֆիկական միջերեսի, տվյալների բազաների հասանելիության և նմանատիպ խնդիրների գրադարաններ, որոնք որոշում են դրանց օգտագործման դե֊ֆակտո ստանդարտը։ [[C++֊ի ստանդարտ գրադարան|C++֊ի հիմնական գրադարանի]] կազմում մտնում են ավելի քիչ հնարավորություններ, սակայն մյուս կողմից այն տալիս է ավելի շատ ազատություն այլ գրադարանների ընտրության հարցում։

20:19, 23 Մայիսի 2014-ի տարբերակ

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-ին. {{cite web}}: |chapter= ignored (օգնություն)
  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