«Մասնակից: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 в значительно более высокой степени, чем С++, отвечает фундаментальному принципу ООП «''всё — объект''» (но не в абсолютной — методы классов самостоятельными объектами не являются, в отличие от [[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 также отсутствует. Однако, большинство конструкций являются типичными для всех потомков [[Алгол]]а: императивный порядок вычислений, присваивания, ветвления, циклы, инфиксные арифметические операции, аргументы в объявлениях и вызовах функций, и пр. В целом спецификация 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֊ի հիմնական կառույցների և կոդի բլոկերի բնութագրիչ ձևավորումը ժառանգված են 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 всегда освобождает явно. |
||
; Միջավայրը : 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.2 Design Goals of the Java™ Programming Language». Oracle. 1999-01-01. Վերցված է 2013-01-14-ին.
{{cite web}}
:|chapter=
ignored (օգնություն) - ↑ Class Arrays, JavaTM 2 Platform Std. Ed. v1.4.2
- ↑ The Java Tutorials. A Closer Look at the «Hello World!» Application
- ↑ The Java Tutorials: The switch Statement