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

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

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

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

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

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

Текущая версия Ваш текст
Строка 6: Строка 6:
* [[w:Сравнение языков программирования|Сравнение ЯП в википедии]]
* [[w:Сравнение языков программирования|Сравнение ЯП в википедии]]
* [http://progopedia.ru/ Энциклопедия языков программирования]
* [http://progopedia.ru/ Энциклопедия языков программирования]
 +
* [http://home.perm.ru/strannik/st_txt_prog_02.html/ Немножно рекламное сравнения большинства языков]
* [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|методичке]]):
Строка 18: Строка 18:
; Character: Как я понял, существует несколько разновидностей (зависит от размера) и является особым перечислимым типом (Enumeration)
; Character: Как я понял, существует несколько разновидностей (зависит от размера) и является особым перечислимым типом (Enumeration)
; String: Массив '''Character''' фиксированной длины. Так же есть стандартные пакеты, реализующие строки квазистатической и динамической длины.
; String: Массив '''Character''' фиксированной длины. Так же есть стандартные пакеты, реализующие строки квазистатической и динамической длины.
-
; Floating point: Эти типы обычно определяются вручную в виде конструкции, где Num_Digits указывает максимальную погрешность:
+
; Floating point: Эти типы обычно определяются вручную в виде конструкции, где Num_Digits указывает минимальную (минимально допустимую?) погрешность:
'''digits''' Num_Digits
'''digits''' Num_Digits
Строка 58: Строка 58:
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: Строка 139:
Также существует специальный тип 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: Строка 146:
=== C++ ===
=== C++ ===
- 
; Целые типы:
; Целые типы:
: char - размер как для хранения символа, определяется машиной (обычно байт)
: char - размер как для хранения символа, определяется машиной (обычно байт)
Строка 324: Строка 321:
Преобразование типов называется ''явным,'' если оно указано программистом в исходном коде.
Преобразование типов называется ''явным,'' если оно указано программистом в исходном коде.
=== Неявное преобразование типов ===
=== Неявное преобразование типов ===
 +
Преобразование типов называется ''неявным,'' если оно не указывается программистом, но, тем не менее, выполняется (в языках со статической типизацией — подставляется на этапе компиляции). В языках '''Pascal''', '''Delphi''', '''C#''' и '''Java''' неявными могут быть только расширяющие преобразования; в '''С++''' — любые преобразования.
-
Преобразование типов называется ''неявным'', если оно не указывается программистом, но, тем не менее, выполняется (в языках со статической типизацией — соответствующие конструкции подставляются на этапе компиляции). В языках '''C'''<ref>Если не считать (T *) → (void *).</ref>, '''C#''', '''Java''', '''Pascal''', '''Delphi''', '''Modula-2''', '''Оберон''', '''Оберон-2''' неявными могут быть только расширяющие преобразования (иначе говоря, преобразования, к более общему типу<ref>Следует иметь ввиду, что в случае простых типов не всегда более общий тип может отобразить менее общий. К примеру, вещественный тип single стандарта IEEE 754 не может точно представить число 16777217, в то время как 32-битный целочисленный тип может.</ref>); в '''С++''' — любые преобразования. В языке '''Ада''' неявных преобразований почти<ref>Исключение составляет, например, неявное приведение числового литерала к конкретному типу. Подробнее: [http://www.adaic.org/resources/add_content/standards/05rm/html/RM-4-6.html#I2822].</ref> нет.
+
==== Неявное преобразование для пользовательских классов====
 +
Язык Java запрещает любые неявные преобразования между
 +
объектами классов (исключение составляют только неявные преобразования
 +
к стандартному типу String, разрешенные в некоторых
 +
контекстах).
-
==== Неявное преобразование для пользовательских классов ====
+
Языки C++ и C# разрешают неявные преобразования для классов,
-
 
+
определяемых пользователем.
-
Язык Java запрещает любые неявные преобразования между объектами классов (исключение составляют только неявные преобразования к стандартному типу String, разрешенные в некоторых
+
-
контекстах).
+
-
Языки C++ и C# разрешают неявные преобразования для классов, определяемых пользователем.
+
В '''C++''' преобразования определяются специальными функциями-членами: конструкторами преобразования и функциями преобразования.
 +
Конструктор преобразования имеет прототип вида
-
В '''C++''' преобразования определяются специальными функциями-членами: конструкторами преобразования и функциями преобразования. Конструктор преобразования имеет прототип вида:
 
Х(Т) // или Х(Т&) или X (const Т&)
Х(Т) // или Х(Т&) или X (const Т&)
-
Функция преобразования имеет вид:
+
Функция преобразования имеет вид
class X {
class X {
operator Т();
operator Т();
};
};
-
В языке '''C#''' область применения пользовательских преобразований уже, чем в языке C++. Можно
+
В языке '''C#''' область применения
-
определять свои преобразования только между двумя классами, нельзя определять преобразования в типы значений или из них. Преобразование из класса X в класс Y реализуется с помощью специального метода — функции преобразования:
+
пользовательских преобразований уже, чем в языке C++. Можно
 +
определять свои преобразования только между двумя классами, нельзя
 +
определять преобразования в типы значений или из них.
 +
Преобразование из класса X в класс Y реализуется с помощью
 +
специального метода — функции преобразования:
static operator Y (X х) { ... }
static operator Y (X х) { ... }
-
Функция преобразования может быть только статическим методом либо класса х, либо класса Y. Если такая функция преобразования есть, то она вызывается с использованием обычного синтаксиса преобразований: (Y) х. Компилятор вставляет неявное преобразование из X в Y только, если соответствующая функция преобразования снабжена модификатором implicit:
+
Функция преобразования может быть только статическим методом
 +
либо класса х, либо класса Y.
 +
Если такая функция преобразования есть, то она вызывается с использованием
 +
обычного синтаксиса преобразований: (Y) х.
 +
Компилятор вставляет неявное преобразование из X в Y только,
 +
если соответствующая функция преобразования снабжена модификатором
 +
implicit:
static implicit operator Y (X x) { ... }
static implicit operator Y (X x) { ... }
-
Если же используется модификатор explicit, то функция преобразования может вызываться только явно. По умолчанию принимается модификатор explicit, что снижает вероятность случайной
+
Если же используется модификатор explicit, то функция преобразования
 +
может вызываться только явно. По умолчанию принимается
 +
модификатор explicit, что снижает вероятность случайной
ошибки.
ошибки.
Строка 399: Строка 411:
: ''Упаковкой (boxing)'' называется процесс преобразования значения простого типа значения в экземпляр соответствующего класса-оболочки.
: ''Упаковкой (boxing)'' называется процесс преобразования значения простого типа значения в экземпляр соответствующего класса-оболочки.
: ''Распаковкой (unboxing)'' называется, очевидно, процесс преобразования экземпляра класса-оболочки в значение соответствующего простого типа.
: ''Распаковкой (unboxing)'' называется, очевидно, процесс преобразования экземпляра класса-оболочки в значение соответствующего простого типа.
- 
==== C# ====
==== C# ====
В '''C#''' упаковка и распаковка выполняются автоматически.
В '''C#''' упаковка и распаковка выполняются автоматически.
Строка 423: Строка 434:
==== Другие языки ====
==== Другие языки ====
-
В некоторых языках упаковка и распаковка отсутствуют. Например, в '''Smalltalk''' любое значение принадлежит некоторому классу (т.е. даже значения простых типов являются экземплярами классов).
+
В некоторых языках упаковка и распаковка отсутствуют. Например, в '''Smalltalk''' любое значение принадлежит некоторому классу (т.е. даже значения простых типов являются экземплярами классов). Немного по другой причине этих операций нет и в '''JavaScript''': в этом языке отсутствует понятие "класс", т.к. он является прототипным.
-
 
+
-
В JavaScript ситуация несколько иная. Например, есть примитивный тип ''Number'' для чисел. В отличие от Java и C#, это тип является полноценным (к объектам этого типа можно применить операцию <code>typeof</code>). Однако при вызове методов примитивный тип упаковывается в объект, прототипом которого является <code>Number.prototype</code> (это не тот же самый ''Number''-примитивный тип!), и в котором уже определены нужные методы. Пример кода, который это демонстрирует:
+
-
<pre>
+
-
Number.prototype.test = function() { return this; }
+
-
var x = 5;
+
-
alert(x + " " + typeof x);
+
-
x = x.test();
+
-
alert(x + " " + typeof x);
+
-
</pre>
+
== Операторный базис языков программирования. Управление последовательностью вычислений ==
== Операторный базис языков программирования. Управление последовательностью вычислений ==
Строка 712: Строка 714:
== Процедурные абстракции ==
== Процедурные абстракции ==
-
=== Передача параметров в подпрограммы ===
+
=== Передача параметров в подпрограммах ===
-
 
+
Для каждой подпрограммы указывается набор формальных параметров. Можно рассматривать формальные параметры как локальные
-
Для каждой подпрограммы указывается набор формальных параметров. Можно рассматривать формальные параметры как локальные переменные тела подпрограммы. При вызове подпрограммы указывается список фактических параметров. Соответствие между фактическими и формальными параметрами выполняется по позиции в списке: первый фактический параметр соответствует первому формальному параметру и т. д. Такой способ называется ''позиционным''. Язык С#, начиная с версии 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#
Строка 998: Строка 986:
FMyField := Value;
FMyField := Value;
end;
end;
- 
==== Статические классы ====
==== Статические классы ====
-
 
+
Под ''статическим классом'' понимается разновидность класса, все члены которого объявлены статическими. Как правило, у таких классов не описаны конструктор и деструктор. Использовать статические члены класса можно не создавая самого экземпляра класса. Понятие статического класса чаще всего используется в языках '''C#''' и '''Java.''' В этих языках невозможно создать экземпляр статического класса; также статический класс не может реализовывать интерфейсы. В '''C#''' любой статический класс наследуется от типа object. В '''С++''' понятие статического класса как таковое отсутствует. Имитировать статический класс можно либо создав класс, все члены которого объявлены статическими, и запретив создание его экземпляров с помощью модификатора доступа private перед конструктором; либо используя шаблон проектирования singleton - в таком случае, будет существовать ''ровно один'' экземпляр данного класса, и будет предоставлена глобальная точка доступа к данному экземпляру.
-
''Статический класс'' — это, в общем случае, достаточно неформальное понятие. Обычно так называют класс, все члены которого объявлены статическими. Для работы с таким классом не требуется создавать экземпляр и часто, говоря о статическом классе, подразумевают невозможность создания экземпляра. Такой класс, как правило, не имеет конструкторов и деструкторов, либо они объявлены приватными (в зависимости от языка).<ref>Стоит уточнить, что статический класс в C# может иметь статический конструктор, см. далее раздел про C#.</ref>
+
-
 
+
-
Иногда понятие ''статического класса'' закрепляется на уровне языка программирования. В этом случае язык добавляет некоторые требования, кроме статичности всех членов и невозможности создания экземпляров: например, невозможность наследования от данного класса или невозможность реализации таким классом интерфейса (см. далее про C#).
+
-
 
+
-
Следует понимать, что в контексте разных языков программирования могут подразумеваться разные понятия статического класса, разной степени формальности (вплоть до строго закреплённого языком понятия).
+
-
 
+
-
===== В C++ =====
+
-
 
+
-
В C++ понятие статического класса отсутствует. Для реализации статического класса нужно объявить члены класса статическими (static) и запретить создание его экземпляров, поместив конструктор по умолчанию и конструктор копирования в приватную (private) часть класса (а по-хорошему, ещё и деструктор). Похожих свойств можно добиться, используя шаблон проектирования singleton — для класса-singleton'а будет существовать ''ровно один'' экземпляр данного класса.
+
-
 
+
-
===== В Java =====
+
-
 
+
-
В Java также нет понятия соответствующего статическому классу в данном выше понимании (статические вложенные классы — совершенно другая вещь, о них далее в этом разделе). Ситуация аналогична ситуации в C++. Для реализации статического класса нужно объявить все члены статическими (static) и запретить создание его экземпляров, объявив конструктор приватным (private). Чтобы ближе имитировать статический класс C# можно отказаться от наследования с помощью ключевого слова ''final''. Похожих свойств можно добиться используя шаблон проектирования singleton.
+
-
 
+
-
В Java существует модификатор static для класса, но применяться он может '''только''' ко вложенным (nested) классам. Статический вложенный класс нельзя считать статическим в том смысле, который вкладывается в это понятие в начале данного раздела и далее в разделе про Java этот смысл не подразумевается.
+
-
 
+
-
Вложенные классы делятся на две категории — статические и нестатические. Вложенные классы, объявленные статическими называются статическими вложенными классами (static nested classes). Нестатические вложенные классы называются внутренними (inner classes). Ко вложенному классу могут быть применены любые модификаторы доступа (тогда как к классу верхнего уровня — только ''public'' или ''package private'').
+
-
 
+
-
'''class''' OuterClass {
+
-
...
+
-
'''static''' '''class''' StaticNestedClass {
+
-
...
+
-
}
+
-
'''class''' InnerClass {
+
-
...
+
-
}
+
-
}
+
-
 
+
-
Статический вложенный класс может использоваться без экземпляра объемлющего класса. Он взаимодействует с членами объемлющего класса (и любого другого) точно так же как любой класс верхнего уровня (не вложенный). В сущности, он ведёт себя как класс верхнего уровня, вложенный в другой лишь с точки зрения логической группировки классов.
+
-
 
+
-
// Создание экземпляра статического вложенного класса.
+
-
OuterClass.StaticNestedClass nestedObject =
+
-
'''new''' OuterClass.StaticNestedClass();
+
-
 
+
-
Внутренний класс имеет доступ ко всем членам объемлющего класса, даже если они объявлены с модификатором ''private'' и не может содержать статические члены. Экземпляр внутреннего класса можно получить только от конкретного экземпляра объемлющего класса. Можно сказать, что каждый из экземпляров внутреннего класса ведёт себя как часть соответствующего экземпляра объемлющего класса.
+
-
 
+
-
// Создание экземпляра внутреннего класса.
+
-
OuterClass.InnerClass innerObject =
+
-
outerObject.'''new''' InnerClass();
+
-
 
+
-
Больше информации:
+
-
* http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
+
-
* http://stackoverflow.com/questions/3584113/java-static-class
+
-
 
+
-
===== В C# =====
+
-
 
+
-
В C# существует понятие статического класса. Статический класс создаётся с помощью ключевого слова ''static''. Компилятор предоставляет относительно такого класса некоторые гарантии.
+
-
 
+
-
* Может содержать только статические члены.
+
-
* Нельзя создать экземпляр такого класса.
+
-
* Неявно определяется как ''sealed'', т.е. наследоваться от такого класса нельзя.
+
-
* Не может иметь instance constructors.
+
-
* Может иметь статический конструктор, который выполняется перед первым обращением к данному классу.
+
-
* Не может быть унаследован ни от какого объекта, исключая Object, от которого, как и все классы, наследуется неявно.
+
-
 
+
-
Также можно обратить внимание на тот факт, что к члену интерфейса не может быть применено ключевое слово ''static'', равно как и к соответствующему члену реализующего интерфейс класса. Напрямую к статическим классам это не относится, но означает, что реализовать интерфейс с хотя бы одним членом статический класс не может. Вопрос о том, может ли статический класс быть реализацией интерфейса без членов остаётся в рамках данной статьи открытым, профессионалы могут добавить ответ и ссылку на него.
+
-
 
+
-
Больше информации:
+
-
* [http://msdn.microsoft.com/en-us/library/79b3xss3.aspx Msdn: «Static Classes and Static Class Members (C# Programming Guide)»].
+
-
* [http://msdn.microsoft.com/en-us/library/ms173156.aspx Msdn: «Interfaces (C# Programming Guide)»].
+
-
* http://stackoverflow.com/questions/259026/why-doesnt-c-sharp-allow-static-methods-to-implement-an-interface
+
=== Объединение типов (запись с вариантами) ===
=== Объединение типов (запись с вариантами) ===
Строка 1088: Строка 1014:
* http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone%28%29
* http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone%28%29
* http://docs.oracle.com/javase/7/docs/api/java/lang/CloneNotSupportedException.html
* http://docs.oracle.com/javase/7/docs/api/java/lang/CloneNotSupportedException.html
- 
-
И. Г. Головин выделяет не два (копируется / не копируется) вида копирования в Java, а четыре. ЕМНИП, добавляется вариант с перманентным выбросом исключения CloneNotSupportException для явного запрета копирования. А четвёртый не помню. ''TODO: описать все варианты.''
 
В общем случае всё это говорит о сложности проблемы копирования. Проблемы у программистов на '''C#''' — такие же.
В общем случае всё это говорит о сложности проблемы копирования. Проблемы у программистов на '''C#''' — такие же.
Строка 1349: Строка 1273:
Do_Smth;
Do_Smth;
'''end''';
'''end''';
 +
 +
'''finally-блока в Аде таки нету.''' Однако он [http://stackoverflow.com/questions/4804135/best-practice-for-implementing-in-ada-2005-or-2012-an-equivalent-of-the-java-f имитируется].
Отлов исключения так же может иметь такой вид:
Отлов исключения так же может иметь такой вид:
Строка 1672: Строка 1598:
== Понятие о родовых объектах. Обобщенное программирование ==
== Понятие о родовых объектах. Обобщенное программирование ==
=== ADA ===
=== ADA ===
-
Note to C++ programmers: generic units are similar to C++ templates.
+
Note to C++ programmers: generic units are similar to C++ templates. [http://www.example.com Ada Programming]
Объявляем шаблон:
Объявляем шаблон:
Строка 1765: Строка 1691:
== Параллельное программирование ==
== Параллельное программирование ==
- 
=== ADA ===
=== ADA ===
Ада реализует концепцию так называемых задач ('''task'''), что по сути является синонимом потока. Задача оформляется совершенно аналогично модулю, но может быть объявлена и описана где угодно, даже в теле подпрограммы:
Ада реализует концепцию так называемых задач ('''task'''), что по сути является синонимом потока. Задача оформляется совершенно аналогично модулю, но может быть объявлена и описана где угодно, даже в теле подпрограммы:
Строка 1839: Строка 1764:
=== Modula-2 ===
=== Modula-2 ===
-
 
+
<b>Низкоуровневый механизм <i>сопрограмм</i></b> <br>
-
В языке Modula-2 есть низкоуровневый механизм ''сопрограмм''.
+
-
 
+
Отличия сопрограммы от процесса:
Отличия сопрограммы от процесса:
-
# Известно, что сопрограммы выполняются квазипараллельно. Следовательно, их использование исключает трудную проблему взаимодействия истинно параллельных процессов.
+
<ol>
-
# Переключение процессора от одной сопрограммы к другой осществляется явным ''оператором передачи управления''. Выполнение сопрограммы, которой передаётся управление, возобновляется с той точки, где она была приостановлена последним таким оператором.
+
<li>Известно, что сопрограммы выполняются квазипараллельно. Следовательно, их использование исключает трудную проблему взаимодействия истинно параллельных процессов.</li>
 +
<li>Переключение процессора от одной сопрограммы к другой осществляется явным <i>оператором передачи управления</i>. Выполнение сопрограммы, которой передаётся управление, возобновляется с той точки, где она была приостановлена последним таким оператором.</li>
 +
</ol>
== Примеры кода ==
== Примеры кода ==
Строка 2351: Строка 2276:
}
}
-
Ключевое слово ''event'' в '''C#''' позволяет уменьшить объём кода, необходимого для реализации событийной модели взаимодействия на делегатах. Иначе говоря, это такой синтаксический сахар для упрощения работы с обратными вызовами.
+
Event в C# (грубо говоря, это эмуляция асинхронности):
using System;
using System;
Строка 2358: Строка 2283:
public class Metronome
public class Metronome
{
{
-
public event TickHandler Tick; // объявляем событие Tick
+
public event TickHandler Tick; // !
public EventArgs e = null;
public EventArgs e = null;
public delegate void TickHandler(Metronome m, EventArgs e);
public delegate void TickHandler(Metronome m, EventArgs e);
Строка 2368: Строка 2293:
if (Tick != null)
if (Tick != null)
{
{
-
Tick(this, e); // генерируем событие Tick
+
Tick(this, e);
}
}
}
}
Строка 2377: Строка 2302:
public void Subscribe(Metronome m)
public void Subscribe(Metronome m)
{
{
-
// регистрируем обработчик события Tick
 
m.Tick += new Metronome.TickHandler(HeardIt);
m.Tick += new Metronome.TickHandler(HeardIt);
}
}
Строка 2398: Строка 2322:
}
}
-
; Замечание
+
Если удалить ключевое слово event, то слушающий класс не будет оповещен о событии (предположительно, могу ошибаться).
-
: Делегат — это тип, который определяет сигнатуру метода. При создании экземпляра делегата можно связать этот экземпляр с любым методом с совместимой сигнатурой. Метод можно запустить (или вызвать) с помощью экземпляра делегата. Делегаты похожи на указатели на функции в C++.<ref>Процитировано из [http://msdn.microsoft.com/ru-ru/library/ms173171.aspx msdn].</ref>
+
=== Моделирование приватных типов данных из Ады в C++ ===
=== Моделирование приватных типов данных из Ады в C++ ===
Строка 2503: Строка 2426:
|есть
|есть
|-
|-
-
!Виртуальные методы (a.k.a. динамическое связывание методов)
+
!Виртуальные методы
-
|нет<ref>Обычно реализуется через указатели на функции и указатели на структуры с указателями на функции.</ref>
+
|нет
|есть
|есть
|есть
|есть
Строка 2512: Строка 2435:
|нет
|нет
|есть
|есть
-
|нет<ref>Комитет ISO утвердил т.н. &laquo;объектное расширение&raquo; (OO extension). (См.: стандартизация [http://sc22wg13.twi.tudelft.nl ISO Modula-2].) В получившемся языке каждый метод виртуален (взято [http://computer-programming-forum.com/27-modula2/2a715a4b1cce6ba6.htm отсюда]). Однако в канонической Modula-2 даже наследования-то нет (собственно, это одна из фич Oberon).</ref>
+
|есть<ref>Причём, каждый метод виртуален; взято [http://computer-programming-forum.com/27-modula2/2a715a4b1cce6ba6.htm отсюда].</ref>
|нет
|нет
|есть
|есть
Строка 2554: Строка 2477:
|нет
|нет
|нет
|нет
 +
|-
 +
!Понятие связывания подпрограмм (методов класса) на этапе выполнения (динамическое связывание)
 +
|нет<ref>Обычно реализуется через указатели на функции и указатели на структуры с указателями на функции.</ref>
 +
|есть
 +
|есть
 +
|есть
 +
|нет
 +
|есть
 +
|нет
 +
|есть
 +
|нет
 +
|нет
 +
|есть
|-
|-
!Раздельная независимая трансляция
!Раздельная независимая трансляция
Строка 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" />

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

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

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