Редактирование: Сравнение Языков Программирования
Материал из eSyr's wiki.
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
ПРЕДУПРЕЖДЕНИЕ: Длина этой страницы составляет 160 килобайт. Страницы, размер которых приближается к 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). | + | Объектом в Java считается экземпляр класса или массив. Значением ссылочного типа является ссылка на объект (или специальное значение null). Все объекты (включая массивы) обладают методами класса Object (java.lang.Object) (иначе говоря, с т.з. Java-программиста все объекты *наследуют* методы класса Object). Строковые литералы (например, "Hello world!") являются объектами типа String (== экземплярами класса String). |
- | + | ||
- | Все объекты (включая массивы) обладают методами класса Object (java.lang.Object) (иначе говоря, с т. з. Java-программиста все объекты *наследуют* методы класса Object). Строковые литералы (например, "Hello world!") являются объектами типа 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#''' упаковка и распаковка выполняются автоматически. | ||
Строка 423: | Строка 418: | ||
==== Другие языки ==== | ==== Другие языки ==== | ||
- | В некоторых языках упаковка и распаковка отсутствуют. Например, в '''Smalltalk''' любое значение принадлежит некоторому классу (т.е. даже значения простых типов являются экземплярами классов). | + | В некоторых языках упаковка и распаковка отсутствуют. Например, в '''Smalltalk''' любое значение принадлежит некоторому классу (т.е. даже значения простых типов являются экземплярами классов). Немного по другой причине этих операций нет и в '''JavaScript''': в этом языке отсутствует понятие "класс", т.к. он является прототипным. |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
== Операторный базис языков программирования. Управление последовательностью вычислений == | == Операторный базис языков программирования. Управление последовательностью вычислений == | ||
Строка 712: | Строка 698: | ||
== Процедурные абстракции == | == Процедурные абстракции == | ||
- | === Передача параметров в | + | === Передача параметров в подпрограммах === |
- | + | Для каждой подпрограммы указывается набор формальных параметров. Можно рассматривать формальные параметры как локальные | |
- | Для каждой подпрограммы указывается набор формальных параметров. Можно рассматривать формальные параметры как локальные переменные тела подпрограммы. При вызове подпрограммы указывается список фактических параметров. Соответствие между фактическими и формальными параметрами выполняется по позиции в списке: первый фактический параметр соответствует первому формальному параметру и т. д. Такой способ называется ''позиционным'' | + | переменные тела подпрограммы. При вызове подпрограммы указывается список фактических параметров. Соответствие между фактическими и формальными параметрами |
- | + | выполняется по позиции в списке: первый фактический параметр соответствует первому формальному параметру и т.д. Такой | |
- | + | способ называется ''позиционным.'' Язык С#, начиная с версии 4, предусматривает альтернативный — ''ключевой'' способ отождествления, в котором используются имена формальных параметров, но мы не будем его рассматривать.Существует три вида формальных параметров: | |
- | + | : • входные параметры (параметры, от которых требуется только значение). Мы используем только значения фактических параметров, которые не меняются при : : выходе из тела функции; | |
- | + | : • выходные параметры (эти параметры не обязаны иметь начальное значение, но могут быть изменены в теле функции); | |
- | С входным параметром может связываться произвольное выражение, а выходным или изменяемым — только объекты, которые могут стоять в левой части оператора присваивания. В большинстве языков программирования вместо указания вида параметра указывается способ (механизм) связывания параметра, называемый способом передачи параметра. | + | : • изменяемые параметры (требуется и исходное значение, и возможность его изменения). |
- | + | С входным параметром может связываться произвольное выражение, а выходным или изменяемым — только объекты, которые могут стоять в левой части оператора присваивания. В большинстве языков программирования вместо указания вида параметра указывается способ (механизм) связывания параметра, | |
- | Существует два основных способа передачи параметров: ''по значению'' и ''по ссылке'' | + | называемый способом передачи параметра. |
- | + | Существует два основных способа передачи параметров: ''по значению'' и ''по ссылке.'' | |
==== Передача параметров по значению ==== | ==== Передача параметров по значению ==== | ||
- | + | Формальный параметр есть некоторая локальная переменная. Место для локальных переменных отводится в стеке. При вызове подпрограммы значение | |
- | Формальный параметр есть некоторая локальная переменная. Место для локальных переменных отводится в стеке. При вызове подпрограммы значение фактического параметра копируется в соответствующий формальный параметр. Все изменения формального параметра связаны с изменением локальной переменной и не сказываются на фактическом параметре. Перед копированием может потребоваться приведение типа, если типы фактического и формального параметров не совпадают. | + | фактического параметра копируется в соответствующий формальный параметр. Все изменения формального параметра связаны с изменением локальной переменной и не сказываются на фактическом параметре. Перед копированием может потребоваться приведение типа, если типы фактического и формального |
- | + | параметров не совпадают. | |
==== Передача параметров по ссылке ==== | ==== Передача параметров по ссылке ==== | ||
- | + | Фактически этот способ есть передача ссылки по значению. Формальный параметр — это ссылка на объект. В момент вызова происходит инициализация ссылки | |
- | Фактически этот способ есть передача ссылки по значению. Формальный параметр — это ссылка на объект. | + | фактическим параметром. Преобразования типов в этот момент не происходит: типы формального и фактического параметров должны совпадать. Поскольку ссылка после инициализации отождествляется с объектом, то любые изменения формального параметра подразумевают изменения фактического параметра. |
- | + | Очевидно, что способ передачи по значению соответствует семантике | |
- | + | входных формальных параметров. | |
- | + | По ссылке можно передавать выходные и изменяемые параметры. | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
=== Перегрузка операций === | === Перегрузка операций === | ||
Ада 83, Ада 95, Си++, Java, Delphi, C# | Ада 83, Ада 95, Си++, Java, Delphi, C# | ||
Строка 998: | Строка 970: | ||
FMyField := Value; | FMyField := Value; | ||
end; | end; | ||
+ | ==== Статические классы C# ==== | ||
+ | Под ''статическим классом'' понимается разновидность класса, все члены которого объявлены статическими. Как правило, у таких классов не описаны конструктор и деструктор. Использовать статические члены класса можно не создавая самого экземпляра класса. Понятие статического класса чаще всего используется в языках '''C#''' <s>и '''Java.'''</s> В этих языках невозможно создать экземпляр статического класса; также статический класс не может реализовывать интерфейсы. В '''C#''' любой статический класс наследуется от типа object. В '''С++''' понятие статического класса как таковое отсутствует. Имитировать статический класс можно либо создав класс, все члены которого объявлены статическими, и запретив создание его экземпляров с помощью модификатора доступа private перед конструктором; либо используя шаблон проектирования singleton - в таком случае, будет существовать ''ровно один'' экземпляр данного класса, и будет предоставлена глобальная точка доступа к данному экземпляру. | ||
- | + | '''Понятие статического класса в языке C# и понятие статического класса в языке Java - абсолютно разные понятия.''' | |
- | + | ==== Статические классы Java ==== | |
+ | В Java это понятие возникло в связи вложенности классов. Если вложенный класс в Java не является статическим (внутренний), то объект такого класса не может существовать вне контекста вложенного класса. | ||
+ | '''class''' Outer { | ||
+ | '''class''' Inner { | ||
+ | '''...''' //''Здесь видно все что есть в Outer'' | ||
+ | } | ||
+ | } | ||
+ | Объект класса Inner может существовать только если есть объект класса Outer: | ||
+ | Outer outer = new Outer(); | ||
+ | Outer.Inner inner; | ||
+ | //inner = '''new''' Outer.Inner(); //''Ошибка'' | ||
+ | inner = outer.'''new''' Outer.Inner(); //''ОК'' | ||
- | + | Пусть теперь Inner - статический: | |
- | + | '''class''' Outer { | |
- | + | '''static class''' Inner { | |
- | + | '''...''' //''Здесь видно все что есть в Outer'' | |
- | + | } | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | '''class''' | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
} | } | ||
- | + | Теперь мы можем создавать объекты Inner без объекта Outer: | |
- | + | Outer outer = '''new''' Outer(); | |
- | + | Outer.Inner inner; | |
- | + | inner = '''new''' Outer.Inner(); //''ОК'' | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
=== Объединение типов (запись с вариантами) === | === Объединение типов (запись с вариантами) === | ||
Строка 2768: | Строка 2704: | ||
|есть | |есть | ||
|есть<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: | Строка 2715: | ||
!Передача параметров по ссылке | !Передача параметров по ссылке | ||
|и<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" /> |