Условные обозначения | |
---|---|
+ | Указанная возможность присутствует |
- | Указанная возможность отсутствует |
+/- | Возможность поддерживается не полностью |
-/+ | Возможность поддерживается очень ограниченно |
? | Нет данных |
x | Постановка вопроса не применима к языку |
В приведенной ниже таблице отмечено наличие или отсутствие тех или иных возможностей в некоторых популярных сегодня языках программирования. Столбцы упорядочены по алфавиту. Если возможность в языке недоступна напрямую, но может быть эмулирована с помощью других средств, то в таблице отмечено, что её нет.
При заполнении таблицы учтены только фактические данные, при том, что наличие возможности не обязательно является преимуществом языка, а отсутствие — недостатком.
Возможность | Язык | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ada | C | C++ | C# | D | Eiffel | Erlang | Prolog | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | Tcl | VB.NET | Delphi | OCaml | PureBasic | |
Императивная | + | + | + | + | + | + | - | - | + | + | + | + | + [1] |
+ | + | + | + | + | + | + | + | + | + | + | + | + |
Объектно-ориентированная | + | -/+[2] | + | + | + | + | - [3] |
- [3] |
+ | + | + | + [4] |
- [5] |
+ | + | + | + | + | + | + | + | + | + | + | + | -/+ |
Функциональная | - | - | +/- | +/- | +/- | +/- | + | + | + | + | -/+ | +/- | + | + | + | + | +/- | + | + | + | + | + | +/- | -/+ | + | +/- |
Рефлексивная | - | - | - [6] | -/+ | - | ? | + | + | -/+ | -/+ | -/+ | + | - | + | -/+ | +/- | + | + | + | -/+ | + | + | -/+ | -/+ | - | ? |
Обобщенное программирование | + | - | + | + | + | +/- | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | - | + | + | + | -/+ |
Логическая | - | - | - | - | - | - | - | + | - | - | - | - | +/- [7] |
+/- [8] |
+/- | - | - | - | - | ? | +/- | - | - | - | - | ? |
Декларативная | - | - | - | -/+[9] | -/+ | ? | + | + | + | + | - | +/- | + | +[10] | + | -/+ [11] |
+ | + | + | + | +/- | - | +/- | - | + | +/- |
Распределенная | + [12] |
+/- [13] |
+/- [13] |
-/+ [14] |
- | + | + | + | - | -/+ | + | - | + [15] |
+/- | - | - | - | -/+ | -/+ | ? | +/- | ? | - | - | - | - |
Ada | C | C++ | C# | D | Eiffel | Erlang | Prolog | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | Tcl | VB.NET | Delphi | OCaml | PureBasic |
Возможность | Язык | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | Tcl | VB.NET | Delphi | OCaml | PureBasic | |
Статическая типизация | + | + | + | + | + | + | - | + | + | + | - | + | +/-[16] | + | +/- [17] |
- | - | - | + | +/- [18] |
- | + | + | + | + |
Динамическая типизация | - | - | - | -/+ [19] |
- | - | + | -/+[20] | + | - | + | -/+ [21] |
+ | - | + | + | + | + | - | + | + | + [22] |
-/+ [23] |
- | - |
Явная типизация | + | + | + | + | + | + | -/+ [24] |
+ | + | + | - | + | +/-[16] | + | -/+ [25] |
+/- | +/- [26] |
- | + | +/- [27] |
- | + | + | + | + |
Неявная типизация | - | - | -/+ | -/+[28] | + | - | + | + | + | - | + | + | + | + | + | + | + | + | + | + | + | + | - | + | + |
Неявное приведение типов без потери данных | -/+ [29] |
+ | + | + | + | + | - | - | + | - | + | - | + | + | + | + | + | + | ? | + | + | + | + | - | + |
Неявное приведение типов с потерей данных | - | + | + | - | + | - | - | - | - | - | ? | - | - | ? | + [30] |
+ | - | - | ? | + | + | + | + | - | -/+ |
Неявное приведение типов в неоднозначных ситуациях | - | + | + | + | + | - | - | - | - | - | + | - | - | + | + [31] |
+ | - | - | ? | - | + | + | - | - | -/+ |
Алиасы типов | + | + | + | + | + | - | x | + | - | - | x | + | +[32] | + | x | x | x | x | ? | ? | x | - | + | + | -/+ |
Вывод типов переменных из инициализатора | - | - | +/- [33] |
+ | + | - | x | + | - | - | x | + | +/- [34] |
+ | x | x | x | x | + | ? | x | + | - | + | + |
Вывод типов переменных из использования | - | - | +/- [33] |
- | - | - | x | + | - | - | x | + | +/- [34] |
+ | x | x | x | x | ? | ? | x | ? | - | + | +/- |
Вывод типов-аргументов при вызове метода | - | - | + | + | + | + | x | + | + | + | x | + | +/- [34] |
+ | x | x | x | x | + | ? | x | + | - | + | ? |
Вывод сигнатуры для локальных функций | - | - | - | - | ? | - | x | + | - | - | x | + | +/-[34] | + | x | ? | x | x | - | ? | x | ? | - | + | ? |
Параметрический полиморфизм | - | x | - | + | + | + | x | + | + | + | - | + | + | + | x | + | x | x | + | ? | x | + | - | + | ? |
Параметрический полиморфизм с ковариантностью | - | x | - | +/- [35] |
? | + | x | + | - | - | - | x | + | +/- | ? | ? | x | x | + | ? | x | - | - | ? | ? |
Параметрический полиморфизм высших порядков | - | x | - | - | - | ? | x | - | - | - | - | + | + | - | x | ? | x | x | + | ? | x | - | - | ? | ? |
Информация о типах в runtime | -/+ [36] |
- | -/+ [37] |
+ | + | + | + | + | + | + | -/+ | - | + | + | + | + | + | + | + | + | + | + | + | - | - |
Информация о типах-параметрах в runtime | - | - | -/+ | + | ? | ? | - | + | - | - | -/+ | - | + | + | + [38] |
+ | + | ? | - | ? | - | + | + | - | - |
Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | Tcl | VB.NET | Delphi | OCaml | PureBasic |
Возможность | Язык | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | Tcl | VB.NET | Delphi | Ocaml | PureBasic | |
Open-source компилятор (интерпретатор) | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + [39] |
+ | + | + [40] |
+ | - |
Возможность компиляции | + | + | + | + | + | + | -/+ [41] |
+ | + | + | + | + | + | + | + | + [42] |
+ | + | + | + [43] |
- | + | + | + | + |
Bootstrapping | + | + | + | + | - | ? | + | + | + | + [44] |
+ [45] |
+ | +[46] | + | ? | x | + [47] |
+ | + | + [48] |
x | ? | + | + | + |
Многопоточная компиляция | + | + | + | - | + | ? | + | + | + | + | ? | + | + | - | ? | ? | x | x | - | - | x | + | ? | + | + |
Интерпретатор командной строки | +/- [49] |
-/+ [50] |
+/- [50] |
- [51] |
- | ? | + | + | + | - | + [52] |
+ | + | + | + | + | + | + | + | + [53] |
+ | + | - | + | - |
Условная компиляция | +/- [54] |
+ | + | + | + | ? | + | + | ? | -/+ [55] |
-/+ [56] |
+ | +[57] | + | + | + | x | x | ? | + | x | + | + | x | + |
Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | Tcl | VB.NET | Delphi | OCaml | PureBasic |
Возможность | Язык | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | Tcl | VB.NET | Delphi | OCaml | PureBasic | |
Создание объектов на стеке | + | + | + | + | + | -/+ [58] |
? | ? | - | - | - | +/- [59] |
+/- [60] |
+ | - | - | - | - | ? | ? | - | - | -/+ [61] |
? | + |
Неуправляемые указатели | + | + | + | + | + | - | - | - | - | -[62] | - | -[62] | -[62] | - | - | - | - [63] |
- | - | + [64] |
- | - | + | - | + |
Ручное управление памятью | + | + | + | +[65] | + | - | - | - | - | -[62] | - | -[62] | -[62] | - | - | - | -[62] | - | - | + [66] |
- | - | + | - | + |
Сборка мусора | -/+ [67] |
- [68] |
-/+ [69] |
+ | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | - [70] |
+ | - |
Возможность | Язык | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | Tcl | VB.NET | Delphi | OCaml | PureBasic | |
Инструкция goto | + | + | + | + | + | - | - | x | - | - [71] |
- | x | +[72] | - | + | +/- [73] |
- | -/+ [74] |
- | -/+ [75] |
- | + | + | - | + |
Инструкции break без метки | + | + | + | + | + | - | - | x | + | + | + | x | +[76] | + | + | + | + | + | - | ? | + | + | + | +/- [77] |
+ |
Инструкция break с меткой | + | - | - | - | + | - | - | x | + | + | + | x | +[78] | + | + | +/- [79] |
- | + | - | ? | - | + | - | x | +/-[80] |
Поддержка try/catch | + | - | + | + | + | + [81] |
+ | + | + | + | + | + | + [82] |
+ | + [83] |
+ | + | + | + | + | + | + | + | + | +[84] |
Блок finally | -/+ [85] |
- | - | + | + | - | - | + | + | + | + [86] |
+ | + [87] |
+ | - | - | + | + | + | + | + | + | + | - [88] |
+[84] |
Блок else (исключения) | - | - | - | + | - | - | + | - | + | + [89] |
? | + | + [90] |
- | + [91] |
- | + | + | - | ? | + | + | + | + | +[84] |
Перезапуски | ? | - | ? | - | ? | ? |
- | - | ? | ? | ? | ? | + |
- | - [92] |
? | ? | + [93] |
? | ? | - | - | ? | ? | ? |
Ленивые вычисления | ? | - | -/+ | -/+ [94] |
+ | - |
- | +/-[95] | - | - | - | + | - [96] |
- [97] |
- |
- | + | -/+ [98] |
? | - | - | -/+ [99] |
- | +[100] | + |
Continuations | ? | -/+[101] | ? | - | ? | ? |
- | - | ? | ? | ? | + | -[102] |
- | ? |
? | - | + | ? | + | - | - | ? | +/- [103] |
? |
Легковесные процессы (Сoroutines) | - | - | - | - | - | + | + | - | ? | +/- [104] |
- | + | +/-[105] | - | + [106] |
? | +/- [107] |
? | ? | + | + | - | - | +/-[108] | - |
Возможность | Язык | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | VB.NET | Delphi | OCaml | PureBasic | ||
Кортежи | - | - | +/- [109] |
+/- [110] |
+/- | + | + | + | + | - | - | + | + | + | + | - | + | + | + | + | +/- [110] |
- | + | - | |
Алгебраические типы данных | -/+ [111] |
- | - | - | ? | ? | x [112] |
+ | ? | - | x [112] |
+ | x [112] |
+ | x [112] |
x [112] |
x [112] |
x [112] |
? | x [112] |
- | -/+ [111] |
+ | - | |
Многомерные массивы | ? | + | + | + | + | ? | - | + | + | +/- | +/- | + [113] |
+ | + | +/- | +/- | +/- | +/- | +/- | ? | + | + | + | + | |
Динамические массивы | ? | -[114] | + | +/- | + | ? | - | +/- | ? | +/-[115] | +/- | +[116] | + | ? | +/- | +/- | +/- | +/- | + | ? | + | + | ? | + | |
Ассоциативные массивы | ? | - | + [117] |
+ | + | ? | - | + | + | +/-[118] | + | +[119] | + | + | + | + | + | + | + | ? | + | +/- | + | + | |
Контроль границ массивов | ? | - | +/- [120] |
+ | + | + | x | + | ? | + | x [121] |
+ [113] |
+ | + | x [121] |
x [121] |
+ | ? | ? | ? | + | + | + [122] |
- | |
Цикл foreach | +/- [123] |
- | + [124] |
+ | + | - | +/- [125] |
+ | + | + | + [126] |
+ | + [127] |
+ | + | + | + | + | + | + | + | + | + | + | |
List comprehensions | - | - | - | -/+ [128] |
- | - | + | + | - | - | - | + | +[129] | + | ? | - | + | ? | + | + | + | - | +/- | - | |
Целые числа произвольной длины | - | - | - | + [130] |
+ | ? | + | + | + | + [131] |
- | + | + | + [130] |
+ | +/- [132] |
+ | + | + [133] |
+ | + [130] |
- | + [134] |
- | |
Целые числа с контролем границ | + | - | - | - | - | ? | - | - | - | - | - | - | +[135] | - | - [136] |
- | - | ? | - | ? | - | + | - | - |
Возможность | Язык | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | VB.NET | Delphi | OCaml | PureBasic | ||
Интерфейсы | ? | - | + [137] | + | + | ? | x | + | ? | + | ? | x | x[138] | + | +/-[139] | + | + | ? | ? | ? | + | + | + | x | |
Мультиметоды | - | - | -/+[140] | -/+[141] | - | - | x | - | ? | - [142] |
- | x |
+ | - | - [142][143] |
- | - [142] |
- [142] |
- | - | - | - | - | x | |
Mixins | ? | - | -/+[144] | - | + | ? | x | ? | ? | + |
? | x |
+ | ? | ? |
? | + [145] |
+ |
+ | + | ? | -/+[146] | ? | x | |
Переименование членов при наследовании | ? | x | -/+[147] | - | ? | + | x | - | - | - | ? | x | - | - | -/+ | - | - | ? | ? | - | - | - | ? | x | |
Множественное наследование | ? | x | + | - | - | + | x | - | - | - | ? | x | + | - | + | - | + | - | ? | - | - | - | + | x | |
Решение конфликта имен при множественном наследовании | ? | x | -/+ [148] |
x | x | + [149] |
x | x | ? | x | ? | x | +[150] | x | + | x | + | x | ? | x | x | x | ? | x |
Возможность | Язык | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | VB.NET | Delphi | OCaml | PureBasic | ||
Декларации чистоты функций | - | - | - | - | +[151] | - | - | - | - | - | - | + | - | - | - | - | - | - | - | - | - | - | - | - | |
First class functions | ? | -/+[152] | +[153] | + | + | ? | + | + | + | - | + |
+ | + | + |
+ | - |
+ |
+ | + | + | ? | +/- [154] |
+ | ? | |
Анонимные функции | ? | - | +[155] | +[156] | + | ? | + | + | + | - | + |
+ | +[157] | + |
+ | + |
+/-[158] |
+ | + | + | + | +/- [154] |
+ | + | |
Лексические замыкания | - | - | + [159] | + | + | + | + | + | + | +[160] | + | + | + | + | + | +[161] | + | + | + | + | + | +/- [162] |
+ | - | |
Частичное применение | ? | - | +/- [163] |
? | - | ? | ? | + | ? | - | - | + | - | + | - [164] |
- | + [165] |
+ | + | ? | ? | ? | + | ? | |
Каррирование | - | - | +/- [166] | + | - | - | - | + | - | - | + |
+ | - | - |
+ | - |
+ |
+[167] | + | - | - | - | + | - |
Возможность | Язык | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | VB.NET | Delphi | Ocaml | PureBasic | ||
Макросы | -/+ | + [168] |
+ [168] |
- | - | - | -/+ | - | - | - | - | +/- [169] |
+ | + |
+[170] | - | - | +/- | - | - | + [171] |
- | -/+ [172] |
+ | |
Шаблоны/Generics | + | - | + | + | + | + | x [173] |
+ | + | + | x [173] |
- [174] |
x [173] |
+ | x [173] |
x [173] | x [173] |
x [173] |
+ | x [173] |
+ | + [175] |
+/- | ? | |
Поддержка Unicode в идентификаторах | + | + [176] |
+ [177] |
+ | + | ? | - | + | + | + | + | + | +[178] | + | +/- | -/+ | + [179] |
+ [180] |
+ | + | + | + | + | + | |
Перегрузка функций | + | - | + | + | + | - | + | + | + | + | -/+ [181] |
+ | +[182] | + | - [183] |
- | - [184] |
- | + | ? | + | + | + | - | |
Динамические переменные | ? | - | - | ? | ? | ? |
- | ? | ? | ? | ? | +/-[185] |
+[186] |
? | + |
- | - | ? | ? | ? | + | ? | ? | - | |
Именованные параметры | + | - | - | + [187] |
- | - | - | +/- | + | - | -/+ [188] |
- | +[189] | + | + | - | + | + | + | -/+ [190] |
+ | -/+ [191] |
+ | - | |
Значения параметров по умолчанию | + | - | + | + [187] |
+ | - | +/- [192] |
- | + | - | - | - | +[193] | + | +/- [194] |
+ | + | + | + | +/- | + | + | + | + | |
Локальные функции | + | -/+ [195] |
+ [196] |
+/- | + | - | + | + | - | +/- [197] |
+ | + | +[198] | + | +/- | + | + | + | + | - | +/- | + | + | ? | |
Сопоставление с образцом | - | - | - | +/- | - | - | + | + | - | - | - | + | +/-[199] | + | + | - | - [184] |
- | + | ? | - | - | + | ? | |
Контрактное программирование | - | - | - | + [200] |
+ | + | ? | +/- [200] |
+/- | +/- [201] |
? | + [202] |
+ | + | ? | - | +/- | +/- | ? | ? | + [200] |
- | - | ? | |
Наличие библиотек для работы с графикой и мультимедия (OpenGL/WebGL/OpenML/OpenAL или DirectX) | ? | + | + | +[203] | ? | ? | ? | +[204] | ? | + | + | + | ? | ? | ? | -/+[205] | + | ? | + | ? | + | + | ? | ? |
Язык | Ada | C | C++ | C# | D | Eiffel | Erlang | F# | Groovy | Java | JavaScript | Haskell | Common Lisp | Nemerle | Perl | PHP | Python | Ruby | Scala | Smalltalk | VB.NET | Delphi | OCaml | PureBasic |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Стандарты | ISO ANSI ГОСТ | ISO ANSI | ISO | ISO ECMA | - | ISO ECMA | - | - | - | - | ECMA | Haskell 2010 | ANSI | - | - | - | - | - | - | ANSI | - | - | - | - |
dynamic
с версии 4.0.xml?name
в вызов xml.op_Dynamic("name")
, на базе чего может быть реализована имитация динамической типизации.Data.Dynamic
.$a = '5aa'; print $a + 0;
Напечатает: 51 + "2" # 3
и 1 . "2" # "12"
for(auto x : some_array){}
— не может изменять элементы, for(auto& x : some_array){}
— может изменять элементы.foreach/3
из модуля lists
.System.Numerics.BigInteger
, включенного в FCL версии 4.0.BigInteger
и BigDecimal
.BigInteger
и BigDecimal
.Num
и Big_int
.Tie::Scalar
.f ({param1: "value1", param2: "value2"})
.сделатьЧтоНибудьС:используя:и:
— в таком случае двоеточия обозначают места, куда будут подставляться параметры при вызове метода, например сделатьЧтоНибудьС: парам1 используя: парам2 и: парам3
. Названия подбирают таким образом, чтобы при вызове было понятно, для чего будут использоваться параметры.Word.Openfile(filename='1.doc')
Противоположность декларативному. Императивный язык должен описывать не столько саму задачу (описание, «ЧТО» нужно получить), сколько её решение («КАК» получить). Некоторыми авторами считается, что данное определение скорее относится к «процедурной» парадигме, которая, помимо императивного, включает в себя функциональное программирование.
Основана на представлении всего в виде объектов, являющихся экземплярами того или иного класса и воплощает применение концепции абстрагирования. Объект при этом соединяет внутри себя как данные, так и методы, их обрабатывающие. Как правило, поддерживаются характерные возможности:наследование, инкапсуляцию и полиморфизм. Некоторыми авторами языки без наследования относят к просто «объектным».
Наличие в языке мощных механизмов интроспекции, функции eval. Возможность программы на данном языке оперировать собственным кодом как данными.
Позволяет записывать программу как композицию функций. В чистом функциональном языке нет переменных. Так как функции не имеют побочных эффектов, они могут выполняться в любом порядке.
Обобщенное программирование позволяет записывать алгоритмы, принимающие данные любого типа.
Программа представляет собой описание фактов и правил вывода в некотором логическом исчислении. Желаемый результат, который часто записывается как вопрос, получается системой в результате попытки применения описанных правил — путем логического вывода. Интересными особенностями являются отсутствие детерминированности в общем случае, внутренняя склонность к распараллеливанию.
Направлен на разработку алгоритмов и программ с доказательствами их правильности с использованием спецификаций программ.
Противоположность императивному. Декларативный язык описывает не столько решение задачи, сколько саму задачу («ЧТО» нужно получить), а каким образом получить решение, уже должен определять компьютер.
Язык, содержащий специальные конструкции для поддержки распараллеливания программы на несколько компьютеров.
(См. статическая типизация). Переменные и параметры методов/функций связываются с типами в момент объявления и не могут быть изменены позже.
(См. динамическая типизация). Переменные и параметры методов/функций связываются с типами в момент присваивания значения (или передачи параметра в метод/функцию), а не в момент объявления переменной или параметра. Одна и та же переменная в разные моменты может хранить значения разных типов.
Типы переменных и параметров указываются явно.
Типы переменных и параметров не указываются явно. Неявная типизация может быть и статической, в таком случае типы переменных и параметров вычисляются компилятором.
Для использования переменной какого-то типа там, где предполагается использование переменной другого типа, нужно (возможно) явно выполнить преобразование типа.
Неявное приведение типов в таких ситуациях, где не происходит потери данных — например, использование целого числа там, где предполагалось использование числа с плавающей точкой.
Неявное приведение типов в таких ситуациях, где может произойти потеря данных — например, использование числа с плавающей точкой там, где предполагалось использование целого числа.
Например, использование строки там, где предполагалось число или наоборот. Классический пример: сложить число 1 со строкой «2» — результат может быть как число 3, так и строка «12». Другой пример — использование целого числа там, где ожидается логическое значение (boolean).
Возможность определить видимый глобально (за пределами единицы компиляции) алиас типа, полностью эквивалентный исходному типу. Например, typedef в Си. Директива using в C# не подходит под этот критерий из-за локальной области действия.
Возможность не указывать явно тип переменной, если для неё задан инициализатор. Если возможность действует для локальных переменных, но не действует для полей класса, все равно ставьте +. Характеристика не применима к языкам с динамической типизацией..
Возможность не указывать явно тип переменной, если её тип может быть выведен из дальнейшего использования. Если возможность действует для локальных переменных, но не действует для полей класса, все равно ставьте +. Характеристика не применима к языкам с динамической типизацией.
Возможность не указывать явно типы-аргументы при вызове generic-метода, если они могут быть выведены из типов обычных аргументов.
Может ли сигнатура локальной функции быть выведена из использования. Неприменимо для языков с динамической типизацией. Ставьте -, если язык не поддерживает локальных функций.
Наличие типобезопасного параметрического полиморфизма (aka generic types). Подразумевает возможность указывать constraints или type classes для типов-параметров.
Наличие ко- и контравариантных type parameters. В некоторых языках может быть лишь частичная поддержка (например, только в интерфейсах и делегатах). В таком случае, отмечайте +/-.
Возможность создавать type constructors высших порядков (как в Scala). См. Towards Equal Rights for Higher-kinded Types
Возможность узнать точный тип объекта в runtime.
Возможность узнать в runtime информацию о типе, с которым инстанциирован generic-тип. Если язык не поддерживает generic-типы, то ставьте -. Если информация о типах стирается в runtime (используется erasure), то ставьте -.
Наличие полноценного open-source компилятора (для интерпретируемых языков — интерпретатора). Если существует open-source компилятор, но он поддерживает не все возможности языка, то ставьте +/- или -/+.
Возможность компиляции в нативный код или в byte-код с возможностью JIT-компиляции. Если язык компилируется в код на другом языке (например, C), который потом компилируется в нативный код, то тоже ставьте +.
Наличие полноценного bootstrapping-компилятора (то есть компилятора, написанного на том же языке, который он компилирует, и успешно компилирующего самого себя). Если существует bootstrapping-компилятор, но он поддерживает не все возможности языка, то ставьте +/- или -/+.
Возможность компилятора на многопроцессорных системах использовать несколько потоков для ускорения компиляции. Если язык не поддерживает компиляцию, то ставьте x (неприменимо).
Возможность вводить инструкции языка строка за строкой с их немедленным выполнением. Может использоваться в качестве калькулятора.
Возможность включать/выключать части кода в зависимости от значения символов условной компиляции (например, с помощью #if … #endif в C++)
Возможность создавать экземпляры объектов не в куче, а на стеке.
Наличие неуправляемых указателей, адресная арифметика, прямой доступ к памяти.
Возможность явного выделения и освобождения памяти в куче (например, с помощью операторов new и delete в C++).
Возможность использовать автоматический процесс сборки мусора (освобождения памяти в куче, занятой неиспользуемыми объектами).
Поддержка инструкции goto (безусловный переход на метку).
Поддержка инструкции break без метки (безусловный выход из ближайшего цикла), и соответствующей инструкции continue. Наличие в языке инструкции break, относящегося к switch или другой конструкции, не влияет на это поле.
Поддержка инструкции break с меткой (безусловный выход из цикла, помеченного меткой), и соответствующей инструкции continue. Наличие в языке инструкции break, относящегося к switch или другой конструкции, не влияет на это поле.
Поддержка обработки исключений с помощью try/catch или эквивалентной конструкции.
Поддержка блока finally при обработке исключений или эквивалентной конструкции.
Поддержка блока else при обработке исключений (действия, выполняющиеся при завершении блока try без исключения).
Исключения, не раскручивающие стек вызовов. Возможность из места перехвата исключения вернуться в место установки перезапуска.
Эмуляция многопоточности рантаймом самого языка. В пределах одного (или нескольких) потока ОС выполняется множество потоков исходного кода
Наличие встроенных в язык многомерных массивов. Если язык поддерживает только массивы массивов, ставьте +/-
Наличие встроенных в язык динамических массивов (способных изменять свой размер во время выполнения программы). Если динамические массивы представлены только векторами (то есть только одномерными массивами) или векторами векторов, ставьте +/-
Наличие встроенных в язык ассоциативных массивов или хэш-таблиц.
Наличие возможности перебрать все элементы коллекции с помощью цикла foreach. Если в языке есть эквивалентная или более сильная возможность (наподобие list comprehensions), ставьте +.
Наличие List comprehensions (или аналога).
Возможность вернуть из функции/метода кортеж (tuple) — неименованный тип данных, содержащий несколько безымянных полей произвольного типа.
Поддержка целых чисел неограниченной разрядности. Должна быть возможность записать сколь угодно большое целое число с помощью литерала.
Возможность определить тип, значениями которого могут быть целые числа только определенного интервала, например [-5..27], при этом присвоение переменной такого типа значения, выходящего за указанные рамки, должно вызывать ошибку.
Семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом. См. Интерфейс в ООП.
Возможность наследовать класс сразу от нескольких классов (не интерфейсов).
Динамическая (run time) диспетчеризация функции в зависимости от типов нескольких аргументов.
В языках с «message passing» ООП похожая функциональность реализуется паттерном «Visitor».
Возможность в наследнике изменить имя поля/метода предка.
При множественном наследовании — решение для случая ромбовидного наследования (B потомок A, C потомок A, D потомок B и C). Решение может приниматься как для всего класса, так и для каждого поля/метода в отдельности.
Функции в данном языке являются объектами первого класса.
Возможность использовать локальную или лямбда-функцию (анонимный делегат) за пределами функции-контейнера с автоматическим сохранением контекста (локальных переменных) функции-контейнера
Возможность фиксировать часть аргументов функции, то есть имея функцию , создать функцию , где . Не следует путать с каррированием (оператор каррирования — один из вариантов реализации частичного применения).
Наличие в языке макро-системы, обрабатывающей код программы до времени её компиляции и/или выполнения. Например, макросы Лиспа, препроцессор Си или шаблоны С++.
Наличие в данном статически типизированном языке инструмента для обобщенного программирования, наподобие templates в C++ или generics в C#.
Возможность включения Unicode-символов (например, букв национальных алфавитов) в идентификаторы.
(См. перегрузка функций). Возможность перегрузки функций/методов по количеству и типам параметров.
Возможность создавать переменные, имеющие динамическую область видимости (англ.).
Возможность при вызове функции/метода указывать имена параметров и менять их местами.
Возможность при вызове функции/метода опускать некоторые параметры, чтобы при этом подставлялось значение по умолчанию, указанное при определении функции.
Возможность определять локальную функцию внутри другой функции/метода. Подразумевается возможность использовать внутри локальной функции локальные переменные из внешнего блока.
Наличие сопоставления с образцом.
Возможность задавать пред- и пост-условия для методов и инварианты для классов. Подробнее см. Контрактное программирование.
Сравнение языков программирования 9 класс презентация, сравнение языков программирования с оружием, сравнение языков программирования таблица.
Himring) — след на северо-востоке Белерианда, на котором стояла сеть Маэдроса, сильного из друзей Феанора.
Teiglin, в некоторых шахтах «Сильмариллиона» — Тенглин, в украинских делах Толкина — Таэглин (синд. Glirhuin) пел, что Камень Несчастных «никогда не будет осквернён Морготом или низвергнут с отрыва».
Оболенский, сравнение языков программирования с оружием, Иван Михайлович (защитник) (1612—1910) — херсонский и харьковский защитник, среднестатистический генерал-защитник. Была названа в честь Нимродэли, возлюбленной короля Амрота, жившей у этой реки. Она расположена на телевидении 19,3 грузинских лет от Земли. 1995—1995 архитектор Михайлов В А , ксантене, генерал-кандидат, десантник Астраханской обл. Располагает четвёртой по флоту строгостью в Лок сабхе. Оно было построено в действительный период гондорской истории, возможно, даже ещё во Вторую Эпоху, днищами. Перевалов через пропускную точность не было. Испокон матчей Рун был документацией истерлингов, Людей Тьмы, которые, за виновным участием, с ордой следовали и за первым, и за вторым Тёмными Владыками и сражались в этапах с современниками и дунэдайн на стороне Тьмы.
Эта глубокая сеть также являлась одним из немногих в Валиноре военных утесов.
Исилдур попытался бежать вплавь, бросившись в Андуин и используя перспективность, которую он приобрёл, надев Кольцо Всевластья.
1 2 Lunar Impact Crater Database (2011) Losiak et al, LPI Lunar Exploration Intern Program (2009). Nimrodel) — река в Лотлориэне. Эред Луин (Синие Горы) — в первую мгу — педагогический миф, отделяющий Белерианд от Эриадора; в третью мгу — северо-шведский ленинский технический миф Средиземья. Саммякусанбодай, полностью просветлённый) из Сутры Сердца передаются без учёта значения пят. В версии для PlayStation Vita был задействован зональный астероид.