Редактирование: Сравнение Языков Программирования

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.

ПРЕДУПРЕЖДЕНИЕ: Длина этой страницы составляет 166 килобайт. Страницы, размер которых приближается к 32 КБ или превышает это значение, могут неверно отображаться в некоторых браузерах. Пожалуйста, рассмотрите вариант разбиения страницы на меньшие части.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.

Текущая версия Ваш текст
Строка 7: Строка 7:
* [http://progopedia.ru/ Энциклопедия языков программирования]
* [http://progopedia.ru/ Энциклопедия языков программирования]
* [http://citforum.ru/programming/cpp/aglav.shtml Книжка Страуструпа]
* [http://citforum.ru/programming/cpp/aglav.shtml Книжка Страуструпа]
-
* [https://habrahabr.ru/post/161205/ Ликбез по типизации в языках программирования / Хабрахабр]
 
План (краткий, взят из методички Головина, подробный см. в самой [[Media:pl.exam.variants.pdf|методичке]]):
План (краткий, взят из методички Головина, подробный см. в самой [[Media:pl.exam.variants.pdf|методичке]]):
Строка 58: Строка 57:
Mother: Person_Access := '''new''' Person'(Mothers_First_Name, Mothers_Last_Name); ''-- инициализованно''
Mother: Person_Access := '''new''' Person'(Mothers_First_Name, Mothers_Last_Name); ''-- инициализованно''
-
Тип Access - это высокоуровневый указатель, представленный записью с полями. Например, разыменовать указатель можно следующим образом:
+
Тип Access - это высокоуровневый указатель, представленный записью с полями. Например, разименовать указатель можно следующим образом:
Mother.'''all'''.Last_Name = Father.'''all'''.Last_Name ''-- здесь, Mother.'''all''' имеет тип Person;
Mother.'''all'''.Last_Name = Father.'''all'''.Last_Name ''-- здесь, Mother.'''all''' имеет тип Person;
Строка 139: Строка 138:
Также существует специальный тип null.
Также существует специальный тип null.
-
Объектом в Java считается экземпляр класса или массив. Значением ссылочного типа является ссылка на объект (или специальное значение null). Значение переменной ссылочного типа можно изменить, в отличии от C++.
+
Объектом в Java считается экземпляр класса или массив. Значением ссылочного типа является ссылка на объект (или специальное значение null). Все объекты (включая массивы) обладают методами класса Object (java.lang.Object) (иначе говоря, с т.з. Java-программиста все объекты *наследуют* методы класса Object). Строковые литералы (например, "Hello world!") являются объектами типа String (== экземплярами класса String).
-
 
+
-
Все объекты (включая массивы) обладают методами класса Object (java.lang.Object) (иначе говоря, с т. з. Java-программиста все объекты *наследуют* методы класса Object). Строковые литералы (например, "Hello world!") являются объектами типа String (иначе говоря, экземплярами класса String).
+
Операции над простыми типами почти идентичны C/C++, однако могут выбрасывать исключения. Конкатенация строк: "Hello " + "world!" (может принимать в качестве одного из аргументов не только строку, но и любой из целых типов).
Операции над простыми типами почти идентичны C/C++, однако могут выбрасывать исключения. Конкатенация строк: "Hello " + "world!" (может принимать в качестве одного из аргументов не только строку, но и любой из целых типов).
Строка 148: Строка 145:
=== C++ ===
=== C++ ===
- 
; Целые типы:
; Целые типы:
: char - размер как для хранения символа, определяется машиной (обычно байт)
: char - размер как для хранения символа, определяется машиной (обычно байт)
Строка 399: Строка 395:
: ''Упаковкой (boxing)'' называется процесс преобразования значения простого типа значения в экземпляр соответствующего класса-оболочки.
: ''Упаковкой (boxing)'' называется процесс преобразования значения простого типа значения в экземпляр соответствующего класса-оболочки.
: ''Распаковкой (unboxing)'' называется, очевидно, процесс преобразования экземпляра класса-оболочки в значение соответствующего простого типа.
: ''Распаковкой (unboxing)'' называется, очевидно, процесс преобразования экземпляра класса-оболочки в значение соответствующего простого типа.
- 
==== C# ====
==== C# ====
В '''C#''' упаковка и распаковка выполняются автоматически.
В '''C#''' упаковка и распаковка выполняются автоматически.
Строка 712: Строка 707:
== Процедурные абстракции ==
== Процедурные абстракции ==
-
=== Передача параметров в подпрограммы ===
+
=== Передача параметров в подпрограммах ===
-
 
+
Для каждой подпрограммы указывается набор формальных параметров. Можно рассматривать формальные параметры как локальные
-
Для каждой подпрограммы указывается набор формальных параметров. Можно рассматривать формальные параметры как локальные переменные тела подпрограммы. При вызове подпрограммы указывается список фактических параметров. Соответствие между фактическими и формальными параметрами выполняется по позиции в списке: первый фактический параметр соответствует первому формальному параметру и т. д. Такой способ называется ''позиционным''. Язык С#, начиная с версии 4, предусматривает альтернативный — ''ключевой'' способ отождествления, в котором используются имена формальных параметров, но мы не будем его рассматривать. Существует три вида формальных параметров:
+
переменные тела подпрограммы. При вызове подпрограммы указывается список фактических параметров. Соответствие между фактическими и формальными параметрами
-
* входные параметры (параметры, от которых требуется только значение). Мы используем только значения фактических параметров, которые не меняются при выходе из тела функции;
+
выполняется по позиции в списке: первый фактический параметр соответствует первому формальному параметру и т.д. Такой
-
* выходные параметры (эти параметры не обязаны иметь начальное значение, но могут быть изменены в теле функции);
+
способ называется ''позиционным.'' Язык С#, начиная с версии 4, предусматривает альтернативный — ''ключевой'' способ отождествления, в котором используются имена формальных параметров, но мы не будем его рассматривать.Существует три вида формальных параметров:
-
* изменяемые параметры (требуется и исходное значение, и возможность его изменения).
+
: • входные параметры (параметры, от которых требуется только значение). Мы используем только значения фактических параметров, которые не меняются при : : выходе из тела функции;
-
 
+
: • выходные параметры (эти параметры не обязаны иметь начальное значение, но могут быть изменены в теле функции);
-
С входным параметром может связываться произвольное выражение, а выходным или изменяемым — только объекты, которые могут стоять в левой части оператора присваивания. В большинстве языков программирования вместо указания вида параметра указывается способ (механизм) связывания параметра, называемый способом передачи параметра.
+
: • изменяемые параметры (требуется и исходное значение, и возможность его изменения).
-
 
+
С входным параметром может связываться произвольное выражение, а выходным или изменяемым — только объекты, которые могут стоять в левой части оператора присваивания. В большинстве языков программирования вместо указания вида параметра указывается способ (механизм) связывания параметра,
-
Существует два основных способа передачи параметров: ''по значению'' и ''по ссылке''.
+
называемый способом передачи параметра.
-
 
+
Существует два основных способа передачи параметров: ''по значению'' и ''по ссылке.''
==== Передача параметров по значению ====
==== Передача параметров по значению ====
-
 
+
Формальный параметр есть некоторая локальная переменная. Место для локальных переменных отводится в стеке. При вызове подпрограммы значение
-
Формальный параметр есть некоторая локальная переменная. Место для локальных переменных отводится в стеке. При вызове подпрограммы значение фактического параметра копируется в соответствующий формальный параметр. Все изменения формального параметра связаны с изменением локальной переменной и не сказываются на фактическом параметре. Перед копированием может потребоваться приведение типа, если типы фактического и формального параметров не совпадают.
+
фактического параметра копируется в соответствующий формальный параметр. Все изменения формального параметра связаны с изменением локальной переменной и не сказываются на фактическом параметре. Перед копированием может потребоваться приведение типа, если типы фактического и формального
-
 
+
параметров не совпадают.
==== Передача параметров по ссылке ====
==== Передача параметров по ссылке ====
-
 
+
Фактически этот способ есть передача ссылки по значению. Формальный параметр — это ссылка на объект. В момент вызова происходит инициализация ссылки
-
Фактически этот способ есть передача ссылки по значению. Формальный параметр — это ссылка на объект. (Существует мнение, что данное «определение» не только не отражает сути явления, но и неверно в корне. В дискуссии вокруг передачи аргументов в Java Dale King [http://www.yoda.arachsys.com/java/passing.html дал] следующее определение. ''Передача по ссылке — это когда lvalue формального параметра устанавливается в lvalue фактического параметра.'') В момент вызова происходит инициализация ссылки фактическим параметром. Преобразования типов в этот момент не происходит: типы формального и фактического параметров должны совпадать. Поскольку ссылка после инициализации отождествляется с объектом, то любые изменения формального параметра подразумевают изменения фактического параметра. Очевидно, что способ передачи по значению соответствует семантике входных формальных параметров. По ссылке можно передавать выходные и изменяемые параметры.
+
фактическим параметром. Преобразования типов в этот момент не происходит: типы формального и фактического параметров должны совпадать. Поскольку ссылка после инициализации отождествляется с объектом, то любые изменения формального параметра подразумевают изменения фактического параметра.
-
 
+
Очевидно, что способ передачи по значению соответствует семантике
-
==== Аргументы в C/C++ всегда передаются по значению ====
+
входных формальных параметров.
-
 
+
По ссылке можно передавать выходные и изменяемые параметры.
-
В C++ есть ссылочный тип. Переменная ссылочного типа может ссылаться на значение любого типа, должна быть инициализирована и не может менять значения. С помощью передачи переменной ссылочного типа можно имитировать все возможности контрукции var из '''Pascal'''. Но можно действовать в стиле C — передавать указатель. В свою очередь, чтобы менять указатель, можно передавать в функцию/метод указатель или ссылку на него.
+
-
 
+
-
==== Аргументы в Java всегда передаются по значению ====
+
-
 
+
-
Существует распространённое '''заблуждение''' о том, что «объекты передаются по ссылке, а примитивные типы — по значению».
+
-
'''На самом деле''' ситуация иная:
+
-
# Аргументы любого типа передаются по значению. Объекты, однако, не передаются вообще.
+
-
# Значения переменных всегда примитивы или ссылки (или null), но никак не объекты.
+
-
Подробнее см. http://www.yoda.arachsys.com/java/passing.html .
+
-
 
+
-
В соответствии с изложенным выше, метод может изменить объект через аргумент-ссылку. С примитивным типом это не пройдёт, так как в Java нет ссылок на значения примитивных типов. Чтобы иметь возможность изменить из метода значение некоторой внешней переменной примитивного типа, нужно чтобы эта переменная была полем некоторого объекта.
+
-
 
+
-
В связи с этим для примитивных типов были введены классы-обёртки. Объект такого класса содержит в себе значение примитивного типа, которое можно как прочитать, так и поменять. См. также [[Сравнение_Языков_Программирования#.D0.A3.D0.BF.D0.B0.D0.BA.D0.BE.D0.B2.D0.BA.D0.B0_.D0.B8_.D1.80.D0.B0.D1.81.D0.BF.D0.B0.D0.BA.D0.BE.D0.B2.D0.BA.D0.B0|Упаковка и распаковка]]
+
-
 
+
=== Перегрузка операций ===
=== Перегрузка операций ===
Ада 83, Ада 95, Си++, Java, Delphi, C#
Ада 83, Ада 95, Си++, Java, Delphi, C#
Строка 2768: Строка 2749:
|есть
|есть
|есть<ref>cм. [http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx#vclrfpassingmethodparameters_valuetypes MSDN].</ref>
|есть<ref>cм. [http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx#vclrfpassingmethodparameters_valuetypes MSDN].</ref>
-
|есть
+
|есть<ref>Только для простых типов (см. примечание для ячейки ниже).</ref>
|есть
|есть
|есть
|есть
Строка 2779: Строка 2760:
!Передача параметров по ссылке
!Передача параметров по ссылке
|и<ref>Моделируется с помощью указателей.</ref>
|и<ref>Моделируется с помощью указателей.</ref>
-
+
<ref>Специальной конструкции для передачи значения по ссылке нет. Однако, есть ссылочный тип. Переменная ссылочного типа может ссылаться на значение любого типа, должна быть инициализирована и не может менять значения. С помощью передачи переменной ссылочного типа можно имитировать все возможности контрукции var из '''Pascal'''. Но можно действовать в стиле C — передавать указатель (при этом его даже можно поменять, передав в функцию/метод «по указателю» или «по ссылке»).</ref>
|есть<ref>Модификаторы '''ref''' и '''out''', также см. [http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx#vclrfpassingmethodparameters_referencetypes MSDN].</ref>
|есть<ref>Модификаторы '''ref''' и '''out''', также см. [http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx#vclrfpassingmethodparameters_referencetypes MSDN].</ref>
-
+
<ref>Специальной конструкции для передачи значения по ссылке нет. Однако, есть ссылочный тип. Переменная ссылочного типа может ссылаться только на объекты (экземпляры классов и массивы), может иметь специальное значение null и изменяема. Простые типы можно передавать «по ссылке» с помощью соответствующих классов-обёрток.</ref>
|есть<ref name="keyword_var">Ключевое слово var.</ref>
|есть<ref name="keyword_var">Ключевое слово var.</ref>
|есть<ref name="keyword_var" />
|есть<ref name="keyword_var" />

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. eSyr's_wiki:Авторское право).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Шаблоны, использованные на этой странице:

Личные инструменты
Разделы