Порівняння мов програмування

Умовні позначення
+ Зазначена можливість присутня
- Зазначена можливість відсутня
+ / - Можливість підтримується не повністю
- / + Можливість підтримується дуже обмежено
? Немає даних
x Постановка питання не застосовна до мови

У наведеній нижче таблиці зазначено наявність або відсутність тих чи інших можливостей у деяких популярних сьогодні мовах програмування. Стовпці упорядковані за алфавітом. Якщо можливість в мові недоступна безпосередньо, але може бути емулювати за допомогою інших засобів, то в таблиці зазначено, що її немає.

При заповненні таблиці враховані тільки фактичні дані, при тому, що наявність можливості не обов'язково є перевагою мови, а відсутність - недоліком.



1. Парадигми

Можливість Мова
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]
+ / -
[14]
+ / -
[14]
- / +
[15]
- + + + - - / + + - +
[16]
+ / - - - - - / + - / + ? + / - ? - - - -
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

2. Типізація

Можливість Мова
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
Статична типізація + + + + + + - + + + - + + / - [17] + + / -
[18]
- - - + + / -
[19]
- + + + +
Динамічна типізація - - - - / +
[20]
- - + - / + [21] + - + - / +
[22]
+ - + + + + - + + +
[23]
- / +
[24]
- -
Явна типізація + + + + + + - / +
[25]
+ + + - + + / - [17] + - / +
[26]
+ / - + / -
[27]
- + + / -
[28]
- + + + +
Неявна типізація - - - / + - / + [29] + - + + + - + + + + + + + + + + + + - + +
Неявне приведення типів без втрати даних - / +
[30]
+ + + + + - - + - + - + + + + + + ? + + + + - +
Неявне приведення типів з втратою даних - + + - + - - - - - ? - - ? +
[31]
+ - - ? + + + + - - / +
Неявне приведення типів в неоднозначних ситуаціях - + + + + - - - - - + - - + +
[32]
+ - - ? - + + - - - / +
Аліаси типів + + + + + - x + - - x + + [33] + x x x x ? ? x - + + - / +
Висновок типів змінних з Ініціалізатор - - + / -
[34]
+ + - x + - - x + + / -
[35]
+ x x x x + ? x + - + +
Висновок типів змінних з використання - - + / -
[34]
- - - x + - - x + + / -
[35]
+ x x x x ? ? x ? - + + / -
Висновок типів-аргументів при виклику методу - - + + + + x + + + x + + / -
[35]
+ x x x x + ? x + - + ?
Висновок сигнатури для локальних функцій - - - - ? - x + - - x + + / - [35] + x ? x x - ? x ? - + ?
Параметричний поліморфізм - x - + + + x + + + - + + + x + x x + ? x + - + ?
Параметричний поліморфізм з коваріантного - x - + / -
[36]
? + x + - - - x + + / - ? ? x x + ? x - - ? ?
Параметричний поліморфізм вищих порядків - x - - - ? x - - - - + + - x ? x x + ? x - - ? ?
Інформація про типи в runtime - / +
[37]
- - / +
[38]
+ + + + + + + - / + - + + + + + + + + + + + - -
Інформація про типи-параметрах у runtime - - - / + + ? ? - + - - - / + - + + +
[39]
+ + ? - ? - + + - -
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

3. Компілятор / інтерпретатор

Можливість Мова
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 компілятор (інтерпретатор) + + + + + + + + + + + + + + + + + + + +
[40]
+ + +
[41]
+ -
Можливість компіляції + + + + + + - / +
[42]
+ + + + + + + + +
[43]
+ + + +
[44]
- + + + +
Bootstrapping + + + + - ? + + + +
[45]
+
[46]
+ + [47] + ? x +
[48]
+ + +
[49]
x ? + + +
Багатопотокова компіляція + + + - + ? + + + + ? + + - ? ? x x - - x + ? + +
Інтерпретатор командного рядка + / -
[50]
- / +
[51]
+ / -
[51]
-
[52]
- ? + + + - +
[53]
+ + + + + + + + +
[54]
+ + - + -
Умовна компіляція + / -
[55]
+ + + + ? + + ? - / +
[56]
- / +
[57]
+ + [58] + + + 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

4. Управління пам'яттю

Можливість Мова
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
Створення об'єктів на стеку + + + + + - / +
[59]
? ? - - - + / -
[60]
+ / -
[61]
+ - - - - ? ? - - - / +
[62]
? +
Некеровані покажчики + + + + + - - - - - [63] - - [63] - [63] - - - -
[64]
- - +
[65]
- - + - +
Ручне управління пам'яттю + + + + [66] + - - - - - [63] - - [63] - [63] - - - - [63] - - +
[67]
- - + - +
Збірка сміття - / +
[68]
-
[69]
- / +
[70]
+ + + + + + + + + + + + + + + + + + + -
[71]
+ -

5. Управління потоком обчислень

Можливість Мова
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 - -
[72]
- x + [73] - + + / -
[74]
- - / +
[75]
- - / +
[76]
- + + - +
Інструкції break без мітки + + + + + - - x + + + x + [77] + + + + + - ? + + + + / -
[78]
+
Інструкція break з міткою + - - - + - - x + + + x + [79] + + + / -
[80]
- + - ? - + - x + / - [81]
Підтримка try / catch + - + + + +
[82]
+ + + + + + +
[83]
+ +
[84]
+ + + + + + + + + + [85]
Блок finally - / +
[86]
- - + + - - + + + +
[87]
+ +
[88]
+ - - + + + + + + + -
[89]
+ [85]
Блок else (виключення) - - - + - - + - + +
[90]
? + +
[91]
- +
[92]
- + + - ? + + + + + [85]
Перезапуски ? - ? - ? ?
- - ? ? ? ? +
- -
[93]
? ? +
[94]
? ? - - ? ? ?
Ледачі обчислення ? - - / + - / +
[95]
+ -
- + / - [96] - - - + -
[97]
-
[98]
-
- + - / +
[99]
? - - - / +
[100]
- + [101] +
Continuations ? - / + [102] ? - ? ?
- - ? ? ? + - [103]
- ?
? - + ? + - - ? + / -
[104]
?
Легковагі процеси (Сoroutines) - - - - - + + - ? + / -
[105]
- + + / - [106] - +
[107]
? + / -
[108]
? ? + + - - + / - [109] -

6. Типи і структури даних

Можливість Мова
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
Кортежі - - + / -
[110]
+ / -
[111]
+ / - + + + + - - + + + + - + + + + + / -
[111]
- + -
Алгебраїчні типи даних - / +
[112]
- - - ? ? x
[113]
+ ? - x
[113]
+ x
[113]
+ x
[113]
x
[113]
x
[113]
x
[113]
? x
[113]
- - / +
[112]
+ -
Багатовимірні масиви ? + + + + ? - + + + / - + / - +
[114]
+ + + / - + / - + / - + / - + / - ? + + + +
Динамічні масиви ? - [115] + + / - + ? - + / - ? + / - [116] + / - + [117] + ? + / - + / - + / - + / - + ? + + ? +
Асоціативні масиви ? - +
[118]
+ + ? - + + + / - [119] + + [120] + + + + + + + ? + + / - + +
Контроль кордонів масивів ? - + / -
[121]
+ + + x + ? + x
[122]
+
[114]
+ + x
[122]
x
[122]
+ ? ? ? + + +
[123]
-
Цикл foreach + / -
[124]
- +
[125]
+ + - + / -
[126]
+ + + +
[127]
+ +
[128]
+ + + + + + + + + + +
List comprehensions - - - - / +
[129]
- - + + - - - + + [130] + ? - + ? + + + - + / - -
Цілі числа довільної довжини - - - +
[131]
+ ? + + + +
[132]
- + + +
[131]
+ + / -
[133]
+ + +
[134]
+ +
[131]
- +
[135]
-
Цілі числа з контролем кордонів + - - - - ? - - - - - - + [136] - -
[137]
- - ? - ? - + - -

7. Об'єктно-орієнтовані можливості

Можливість Мова
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
Інтерфейси ? + / - [138] + [139] + + ? x + + + ? x x [140] + + / - [141] + + ? ? ? + + + x
Мультіметоди - - - / + [142] - / + [143] - - x - ? -
[144]
- x
+ - -
[144] [145]
- -
[144]
-
[144]
- - - - - x
Mixins ? - - / + [146] - + ? x ? +
[147]
+
? x
+ ? ?
? +
[148]
+
+ + ? - / + [149] ? x
Перейменування членів при спадкуванні ? x - / + [150] - ? + x - - - ? x - - - / + - - ? ? - - - ? x
Множинне спадкоємство ? x + - - + x - - - ? x + - + - + - ? - - - + x
Рішення конфлікту імен при множинному спадкуванні ? x - / +
[151]
x x +
[152]
x x ? x ? x + [153] x + x + x ? x x x ? x

8. Функціональні можливості

Можливість Мова
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
Декларації чистоти функцій - - - - + [154] - - - - - - + - - - - - - - - - - - -
First class functions ? - / + [155] + [156] + + ? + + + - +
+ + +
+ -
+
+ + + ? + / -
[157]
+ ?
Анонімні функції ? - + [158] + [159] + ? + + + - +
+ + [160] +
+ +
+ / - [161]
+ + + + + / -
[157]
+ +
Лексичні замикання - - + [162] + + + + + + + [163] + + + + + + [164] + + + + + + / -
[165]
+ -
Часткове застосування ? - + / -
[166]
? - ? ? + ? - - + - + -
[167]
- +
[168]
+ + ? ? ? + ?
Каррірованіе - - + / - [169] + - - - + - - +
+ - -
+ -
+
+ [170] + - - + / - [171] + -

9. Різне

Можливість Мова
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
Макроси - / + +
[172]
+
[172]
- - - - / + - - - - + / -
[173]
+ +
+ [174] - - + / - - - +
[175]
- - / +
[176]
+
Шаблони / Generics + - + + + + x
[177]
+ + + x
[177]
-
[178]
x
[177]
+ x
[177]
x [177] x
[177]
x
[177]
+ x
[177]
+ +
[179]
+ / - ?
Підтримка Unicode в ідентифікаторах + +
[180]
+
[181]
+ + ? - + + + + + + [182] + + / - - / + +
[183]
+
[184]
+ + + + + +
Перевантаження функцій + - + + + - + + + + - / +
[185]
+ + [186] + -
[187]
- -
[188]
- + ? + + + -
Динамічні змінні ? - - ? ? ?
- ? ? ? ? + / - [189]
+ [190]
? +
- - ? ? ? + ? ? -
Іменовані параметри + - - +
[191]
- - - + / - + - - / +
[192]
- + [193] + + - + + + - / +
[194]
+ - / +
[195]
+ -
Значення параметрів за замовчуванням + - + +
[191]
+ - + / -
[196]
- + - - - + [197] + + / -
[198]
+ + + + + / - + + + +
Локальні функції + - / +
[199]
+
[200]
+ / - + - + + - + / -
[201]
+ + + [202] + + / - + + + + - + / - + + ?
Зіставлення зі зразком - - - + / - - - + + - - - + + / - [203] + + - -
[188]
- + ? - - + ?
Контрактне програмування - - - +
[204]
+ + ? + / -
[204]
+ / - + / -
[205]
? +
[206]
+ + ? - + / - + / - ? ? +
[204]
- - ?
Наявність бібліотек для роботи з графікою і мультимедія ( OpenGL / WebGL / OpenML / OpenAL або DirectX) ? + + + [207] ? ? ? + [208] ? + + + ? ? ? - / + [209] + ? + ? + + ? ?

10. Стандартизація

Мова 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 - - - - ISO - ANSI - - - -

11. Примітки

  1. Імперативний / Haskell. Монади дозволяють виконувати імперативні дії.
  2. Незважаючи на відсутність вбудованих засобів підтримки ООП, реалізація об'єктно-орієнтованого підходу можлива. В якості найбільш яскравих прикладів можна навести бібліотеки OpenGL, OpenCL, OpenMAX AL і т.п., які реалізують саме ООП засобами мови С.
  3. 1 2 ООП / Erlang. Можна провести паралель між процесами в Ерланген і об'єктами у визначенні Алана Кея [1] - userpage.fu-berlin.de / ~ ram/pub/pub_jf47ht25Ht/doc_kay_oop_en.
  4. ООП / Javascript. Прототипна модель ООП.
  5. ООП / Haskell. Класи типів і сімейства типів перекривають можливості ООП.
  6. Простори імен функцій і даних розділені, для роботи з функціями вищих порядків використовується спеціальний синтаксис
  7. рефлексія c + + не входить в стандарт, проте є реалізація за допомогою метакомпілятора в Qt
  8. Логічний / Haskell. Спочатку інструментів для логічного програмування не вбудовано, але є сторонні бібліотеки. Існує академічний функціонально-логічна мова Curry, що бере Haskell за основу.
  9. Логічний / Common Lisp. Логічна парадигма спочатку в мову не вбудована, але реалізується засобами мови.
  10. LINQ
  11. У мові існує безліч декларативних конструкцій, і, більш того, можливість створювати свої, за допомогою макросів.
  12. Декларативний / Perl. Тільки регулярні вирази.
  13. Розподілений / Ada. Див Annex E. Distributed Systems - www.adaic.com/standards/05rm/html/RM-E.html.
  14. 1 2 Розподілений / C і C + +. Багато поширених компілятори підтримують директиви для розпаралелювання в рамках технологій MPI і OpenMP.
  15. Розподілений / C #. Існують проекти розподілених модифікацій мови, наприклад Parallel C # - www.parallelcsharp.com/.
  16. Розподілений / Haskell. Модель мови має на увазі розподілене використання, при цьому не вимагаючи від програміста зусиль на реалізацію розподіленості. Один з підтримуючих цю можливість компіляторів - Glasgow Distributed Haskell.
  17. 1 2 ANSI стандарт мови передбачає опціональні декларації типів, які-небудь конкретні реалізації можуть використовувати за своїм розсудом. Більшість сучасних реалізацій CL приймають декларації типів в розрахунок, і використовують для статичної перевірки типів і в цілях оптимізації.
  18. Статична типізація / Perl. З версії 5.6. Тільки для не вбудованих типів.
  19. Статична типізація / Smalltalk. Можливість статичної типізації є в діалекті Smalltalk - Strongtalk'е.
  20. Динамічна типізація / C #. За допомогою спеціального псевдо-типу dynamic з версії 4.0.
  21. Динамічна типізація / F #. Компілятор підтримує синтаксичний цукор у вигляді перетворення використання оператора (?) xml?name в виклик xml.op_Dynamic("name"), на базі чого може бути реалізована імітація динамічної типізації.
  22. Динамічна типізація / Haskell. Забезпечується модулем Data.Dynamic.
  23. Динамічна типізація / VB.NET. Контрольовано за допомогою Option Strict.
  24. Динамічна типізація / Delphi. За допомогою спеціального типу Variant.
  25. Явна типізація / Erlang. Можна використовувати т. н. type test BIFs. Див [2] - erlang.org / doc / reference_manual / expressions.html # 6.24
  26. Явна типізація / Perl. Див Prototypes в man perlsub.
  27. Явна типізація / Python. Частково в Python 3.0.
  28. Явна типізація / Smalltalk. Є в Strongtalk.
  29. var, dynamic etc.
  30. Неявне приведення типів / Ada. Див 4.6 Type Conversions - www.adaic.com/standards/05rm/html/RM-4-6.html # I2822.
  31. Неявне приведення з втратою даних / Perl. При додаванні рядка з числом: $a = '5aa'; print $a + 0; надрукованих: 5
  32. Неявне приведення в неоднозначних ситуаціях / Perl. Не зовсім коректно, оскільки в Perl ці ситуації однозначні: 1 + "2" # 3 і 1 . "2" # "12" 1 . "2" # "12"
  33. Макрос DEFTYPE - www.lispworks.com / documentation / HyperSpec / Body / m_deftp.htm
  34. 1 2 Висновок типів / C + +. Підтримка виводу типів імплементується в C + +0 x звикористанням ключових слів [code] auto [/ code] і [code] decltype [/ code].
  35. 1 2 3 4 Висновок типів / Common Lisp. Деякі компілятори Common Lisp, такі як SBCL, підтримують часткове виведення типів.
  36. Параметричний поліморфізм з коваріантного / C #. Доступно починаючи з C # 4.0 для типів інтерфейсів і делегатів.
  37. Інформація про типи в runtime / Ada. Точний тип дізнатися можна (Ada.Tags - www.adaic.com/standards/05rm/html/RM-3-9.html # I2032), але повної підтримки відображення в мові немає. Можна дізнатися ім'я, предків, інтерфейси, серіалізовать об'єкт, але не можна запросити список методів.
  38. Інформація про типи в runtime / С + +. Можна порівняти типи на точний збіг, дізнатися ім'я типу (typeid - www.hep.wisc.edu/ ~ pinghc / isocppstd / expr.html # expr.typeid), приводити типи вниз по ієрархії спадкоємства.
  39. Див вбудовану функцію ref і метод isa
  40. Open-source компілятор (інтерпретатор) / Smalltalk. У будь-якому діалекті Smalltalk исходники все, крім віртуальної машини, (тобто бібліотека класів, компілятор в байткод, середа розробки, сторонні бібліотеки і пр.) принципово відкриті - це властивість мови. З основних діалектів исходники віртуальної машини відкриті у GNU Smalltalk, Squeak і Strongtalk.
  41. Open-source компілятор (інтерпретатор) / Delphi. FreePascal і Lazarus.
  42. Можливість компіляції / Erlang. HiPE - High Performance Erlang - www.it.uu.se/research/group/hipe/. Доступний тільки для * nix-систем.
  43. Існують PHP-компілятори, цілком коректно комілірующіе будь PHP-скрипти. Наприклад, Roadsend PHP Compiler - www.roadsend.com / home / index.php.
  44. Можливість компіляції / Smalltalk. Стандартна реалізація в Smalltalk - це прозора компіляція в байт-код (у момент збереження зміненого вихідного коду) з подальшим виконанням на віртуальній машині, часто з використанням JIT-компілятора. Однак деякі діалекти підтримують пряму компіляцію в машинні коди. Зокрема, до таких діалектам відносяться Smalltalk MT і Smalltalk / X.
  45. Bootstrapping-компілятор/Java. Java Compiler API з'явилося у версії 6.0.
  46. Narcissus.
  47. Наприклад, SBCL
  48. Bootstrapping-компілятор/Python. Проект PyPy - codespeak.net / pypy / dist / pypy / doc / news.html.
  49. Bootstrapping-компілятор/Smalltalk. Компілятор в байт-коди спочатку написаний на самому Smalltalk і виповнюється всередині віртуальної машини. Крім цього також є приклади віртуальних машин Smalltalk, написаних на самому Smalltalk - до них, зокрема, відноситься віртуальна машина Squeak, написана на підмножині Smalltalk, яке потім транслюється в C і компілюється в машинні коди. При цьому власне розробка і налагодження віртуальної машини Squeak здійснюється всередині працюючої системи Squeak.
  50. Інтерпретатор командного рядка / Ada. Business Shell (BUSH) - www.pegasoft.ca / bush.html.
  51. 1 2 Інтерпретатор командного рядка / C + +. C + + інтерпретатор CINT - root.cern.ch / twiki / bin / view / ROOT / CINT.
  52. Планується до версії 5.0 мови.
  53. Rhino Shell - developer.mozilla.org / en / docs / Rhino_Shell.
  54. У діалекті GNU Smalltalk реалізована підтримка командного рядка.
  55. Умовна компіляція / Ada. Оскільки використання препроцесора істотно ускладнює роботу утиліт, відмінних від компілятора, що працюють з вихідними текстами, в стандарт ця можливість не входить. Тут: Conditional Compilation - www.adacore.com/wp-content/files/auto_update/gnat-unw-docs/html/gnat_ugn_32.html описується, як можна організувати умовно компільований код. В якості резервного варіанта надається препроцесор gnatprep.
  56. Умовна компіляція / Java. Затвердження (оператори assert) завжди включаються компілятором в байт-код і можуть бути дозволені (за замовчуванням заборонені, тобто ігноруються) при запуску віртуальної машини ключем -ea/-enableassertion.
  57. [3] - wdh.suncloud.ru/js13.htm # ref3134.
  58. Макроси Ліспу дозволяють при компіляції обчислювати довільні вирази, включаючи, природно, конструкції розгалужень. Крім того, є також зразковий аналог # ifdef з Сі. [4] - www.lispworks.com/documentation/HyperSpec/Body/02_dhq.htm [5] - www.lispworks.com/documentation/HyperSpec/Body/02_dhr.htm
  59. Компілятор повинен вирішувати, які класи будуть представлені "простими" типами і будуть, в тому числі, розміщуватися в стеці.
  60. Створення об'єктів на стеку / Haskell. У GHC за допомогою Unboxed Types / Unboxed Arrays.
  61. Стандарт мови передбачає декларацію DYNAMIC-EXTENT - www.lispworks.com / documentation / HyperSpec / Body / d_dynami.htm, яка може трактуватися компілятором як вказівку виділити місце під об'єкт на стеку.
  62. Створення об'єктів на стеку / Delphi. У Delphi є 2 об'єктних моделі - стара (успадкована з Turbo Pascal) та нова. Створення об'єктів на стеку можливо тільки в старій об'єктної моделі.
  63. 1 2 3 4 5 6 7 Через FFI (foreign function interface)
  64. Можна за допомогою модуля стандартної бібліотеки - ctypes.
  65. Некеровані покажчики / Smalltalk. У Smalltalk є можливість низькорівневої роботи з пам'яттю, але тільки в адресному просторі, яке надається віртуальною машиною.
  66. unsafe + System.Runtime.InteropServices
  67. Ручне управління пам'яттю / Smalltalk. При низькорівневої роботі в просторі пам'яті, що надається віртуальною машиною, можна вручну створювати і видаляти об'єкти, записуючи дані у відповідні адреси пам'яті. Аналогічно можна вручну керувати розміщенням об'єктів в пам'яті.
  68. Збірка сміття / Ada. Тільки на деяких платформах (. NET і JVM) або за допомогою бібліотек (AdaCL: GC - adacl.sourceforge.net / pmwiki.php / Main / GarbageCollector). Тим не менше, практично всі програми на Ada можуть працювати як з ним, так і без нього. У цьому сенсі до збірці сміття стосовно до Аде слід ставитися не як до інженерному рішенню, а як до оптимізації управління пам'яттю.
  69. Збірка сміття / C. У стандарті мови і в стандартних бібліотеках немає збірки сміття. Однак існують збирачі сміття для C та C + + у вигляді бібліотек. Наприклад, BoehmGC (англомовний розділ).
  70. У новому стандарті C + +0 x передбачається збірка сміття для інтелектуальних покажчиків
  71. Збірка сміття / Delphi. Якщо не вважати Delphi.NET.
  72. Інструкція goto / Java. Є зарезервованим словом.
  73. Спеціальний оператор GO - www.lispworks.com / documentation / HyperSpec / Body / s_go.htm. Всі конструкції циклів в CL, фактично, є макросами-надбудовами над цією інструкцією.
  74. Цільова мітка повинна знаходитися в тому ж файлі, в тому ж контексті. Мається на увазі, що ви не можете ні перейти за кордону функції або методу, ні перейти всередину однієї з них [6] - php.net / manual / ru / control-structures.goto.php.
  75. Інструкція goto / Ruby. У мові goto немає, але є бібліотека - raa.ruby-lang.org/project/ruby-goto / реалізує його.
  76. Інструкція goto / Smalltalk. У стандарті мови goto немає, але існують бібліотеки, реалізують функціональність goto через управління стеком виконання. Використовуються вкрай рідко, це скоріше proof of concept (Англ.) .
  77. Макрос RETURN - www.lispworks.com / documentation / HyperSpec / Body / m_return.htm. Фактично, є окремим випадком RETURN-FROM - www.lispworks.com / documentation / HyperSpec / Body / s_ret_fr.htm.
  78. замінюється винятками, також реалізується за допомогою Camlp4 http://code.google.com/p/ocaml-break-continue/ - code.google.com / p / ocaml-break-continue /
  79. Спеціальний оператор RETURN-FROM - www.lispworks.com / documentation / HyperSpec / Body / s_ret_fr.htm
  80. Приймає необов'язковий числовий аргумент, який повідомляє йому виконання якої кількості вкладених структур необхідно перервати [7] - php.net / manual / ru / control-structures.break.php.
  81. Є можливість вказати число вкладених циклів, які потрібно перервати
  82. Можна або повторити виконання методу, або прокинути виключення далі
  83. Java-style try-catch блок реалізується макросом handler-case. Крім того, в можливості системи обробки виключень Common Lisp входить система т. н. перезапусків (restarts), які дозволяють обробляти виключення "зсередини" без розкручування стека викликів функцій
  84. За допомогою оператора eval
  85. 1 2 3 При використанні бібліотеки PBOSL - pbosl.purearea.net
  86. Блок finally / Ada. У стандарті мови finally немає, але існують бібліотеки, реалізують функціональність finally - www.ada-ru.org/smpl-final. Використовуються вкрай рідко, це скоріше proof of concept (Англ.) .
  87. MDN - MDC - developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference: Statements: try ... catch
  88. Спеціальний оператор UNWIND-PROTECT - www.lispworks.com / documentation / HyperSpec / Body / s_unwind.htm
  89. реалізується на camlp4 http://bluestorm.info/camlp4/dev/try/pa_tryfinally.ml.html - bluestorm.info/camlp4/dev/try/pa_tryfinally.ml.html
  90. За допомогою декількох послідовних catch
  91. Java-style try-catch блок реалізується макросом handler-case. Крім того, в можливості системи обробки виключень Common Lisp входить система т. н. перезапусків (restarts), які дозволяють обробляти виключення "зверху" без розкручування стека викликів функцій
  92. За допомогою eval or {...}
  93. Частково реалізуються нестандартним модулем Runops :: Resume - use.perl.org / ~ chromatic/journal/27491
  94. Ключове слово retry [8] - www.ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html
  95. Конструкції yield return, запити LINQ, в FCL 4.0 увійде тип Lazy.
  96. Seq-генератори, модуль Lazy стандартної бібліотеки F #.
  97. Однак, дану можливість можна реалізувати на макросах
  98. Дана можливість реалізована на макросах
  99. Ледачі обчислення / Ruby. У мові ледачих обчислень немає, але є бібліотека - moonbase.rydia.net / software / lazy.rb / реалізує їх.
  100. Конструкції Linq.
  101. модуль Lazy стандартної бібліотеки Ocaml.
  102. setcontext ET Al. (UNIX System V and GNU libc)
  103. Реазілуется сторонніми бібліотеками, наприклад cl-cont - common-lisp.net/project/cl-cont /
  104. Тільки для байт-коду http://okmij.org/ftp/Computation/Continuations.html # caml-shift - okmij.org / ftp / Computation / Continuations.html # caml-shift
  105. Легковагі процеси / Java. Аж до Java 1.1.
  106. Тільки в деяких реалізаціях.
  107. Слід зауважити що це не стандартні легкі процеси [9] - perldoc.perl.org / threads.html
  108. Легковагі процеси / Python. Використовуючи Stackless Python - www.stackless.com/.
  109. Монадичної потоки виконання, реалізовані в бібліотеці Lwt
  110. Кортежі / C + +. Реалізуються в стандартній бібліотеці (з'явилися в TR1 (англомовний розділ), до цього в boost). Крім того, планується підтримка кортежів в C + +0 x
  111. 1 2 Кортежі / .NET. За допомогою типів System.Tuple введених в FCL 4.0.
  112. 1 2 Алгебраїчні типи даних / Ada і Delphi. Через механізм варіантних записів.
  113. 1 2 3 4 5 6 7 8 У динамічних мовах механізм алгебраїчних типів даних не має сенсу.
  114. 1 2 Масиви / Haskell. За допомогою Data.Array.
  115. Динамічні масиви / C. "З коробки" даної можливості немає, проте схожий функціональність можна реалізувати, використовуючи функцію realloc.
  116. Динамічні масиви / Java. За допомогою java.util.Vector (в стандартній бібліотеці).
  117. Динамічні масиви / Haskell. Реалізовані у вигляді списків, які відповідають визначенню динамічного масиву.
  118. map і unordered_map в стандартній бібліотеці
  119. Асоціативні масиви / Java. За допомогою java.util.HashMap (в стандартній бібліотеці).
  120. Асоціативні масиви / Haskell. За допомогою Data.Map
  121. Контроль межі масивів / С + +. Для масивів контролю немає, проте в контейнерах STL, таких як std :: vector, std :: array є метод at із контролем кордонів.
  122. 1 2 3 Контроль кордонів масивів / Perl, PHP і JavaScript. У мові немає масивів зі статичними кордонами, присвоювання елементу за поточними кордонами масиву просто розширює межі масиву.
  123. Контроль кордонів масивів / Ocaml. Можна відключити на етапі компіляції за допомогою ключа-unsafe
  124. Цикл foreach / Ada. Методи Iterate і Reverse_Iterate різних контейнерів, що входять в бібліотеку Ada.Containers.
  125. Цикл foreach / C + +. У C + +11 for(auto x : some_array){} - не може змінювати елементи, for(auto& x : some_array){} - може змінювати елементи.
  126. Цикл foreach / Erlang. У вигляді функції foreach/3 з модуля lists.
  127. Цикл foreach / JavaScript. З версії 1.6 [10] - developer.mozilla.org/en/docs/New_in_JavaScript_1.6.
  128. Цикл foreach / Lisp. Макрос LOOP - www.lispworks.com / documentation / HyperSpec / Body / m_loop.htm у складі стандартної бібліотеки. Являє собою "мову в мові" з великою кількістю можливостей.
  129. List comprehensions / C #. "Query Comprehension" можна вважати за List Comprehension тільки з великою натяжкою.
  130. LOOP et al.
  131. 1 2 3 Цілі числа довільної довжини / .NET. Вигляді типу System.Numerics.BigInteger, включеного в FCL версії 4.0.
  132. Цілі числа довільної довжини / Java. За допомогою класів BigInteger і BigDecimal.
  133. Для обчислень з довільною точністю PHP надає Двійковий калькулятор, який підтримує числа будь-якого розміру і точності, представлені у вигляді рядків [11] - php.net / manual / ru / book.bc.php.
  134. Цілі числа довільної довжини / Scala. За допомогою класів BigInteger і BigDecimal.
  135. Цілі числа довільної довжини / OCaml. В допомогою модуля Num і Big_int.
  136. Приклад: Тип (INTEGER 0 9) включає в себе всі цифри від 0 до 9
  137. Цілі числа довільної довжини / Perl. За допомогою модуля Tie::Scalar.
  138. Інтерфейси традиційно реалізуються структурами з покажчиками на функції, що входять в інтерфейс. Приклад реалізації та використання - бібліотеки OpenGL, OpenMAX AL і т.п..
  139. Множинне успадкування абстрактних класів
  140. Схожа функціональність реалізується макросами та засобами CLOS.
  141. Через множинне спадкоємство від класів з методами-заготовками. Див [12] - perldesignpatterns.com /? AbstractClass
  142. Можуть бути реалізовані за допомогою патерну Visitor (Відвідувач)
  143. Емуляція через dynamic
  144. 1 2 3 4 Реалізується сторонніми бібліотеками
  145. з'являться (?) в Perl 6
  146. Можуть бути реалізовані за допомогою спадкування шаблонів Прімесь_ (програмування) #. D0.AD.D0.BC.D1.83.D0.BB.D1.8F.D1.86.D0.B8.D1.8F
  147. Groovy - Category and Mixin transformations - groovy.codehaus.org / Category and Mixin transformations
  148. Через множинне успадкування і / або зміна атрибутів довільного об'єкта під час виконання
  149. Підмішування реалізації інтерфейсів через ключове слово implements. Див сторінки 10-7 та 10-8 в Object Pascal Guide - docs.embarcadero.com/products/rad_studio/cbuilder6/EN/CB6_ObjPascalLangGuide_EN.pdf.
  150. Перейменування членів при спадкуванні не підтримується c + +, проте можна семуліровать через закрите успадкування, відкриваючи члени, які не потрібно перейменувати через директиву using, а якщо потрібно перейменувати - просто опреділіть метод з новою назвою і викликати в ньому метод батька
  151. Тільки спільне використання за допомогою віртуального наслідування
  152. Для кожного члена класу - вибір дублювання (через перейменування), або злиття (інакше, якщо не було перевизначення)
  153. CLHS: Section 4.3.5 - www.lispworks.com/documentation/HyperSpec/Body/04_ce.htm
  154. Functions - D Programming Language 2.0 - Digital Mars - www.digitalmars.com/d/2.0/function.html # pure-functions
  155. у формі покажчиків на функції
  156. std :: function в c + +0 x
  157. 1 2 З'явилися в Delphi2009, як анонімні функції. Раніше - через покажчики.
  158. C + +0 x. Лямбда-вирази в C + +0 x - blog.olendarenko.org.ua/2009/08/c0x.html
  159. Анонімні делегати присутні в мові з версії 2.0. В C # 3.0 з'явилися повноцінні анонімні функції.
  160. Макрос LAMBDA - www.lispworks.com / documentation / HyperSpec / Body / m_lambda.htm
  161. З істотними обмеженнями
  162. lambda-функції в c + +0 x підтримують замикання як по посиланню, так і за значенням
  163. Через анонімні класи
  164. Починаючи з версії 5.3
  165. З'явилися в Delphi2009, як анонімні функції.
  166. boost :: bind, std :: bind1st, std :: bind2nd або семуліровать за допомогою анонімних функцій
  167. Реалізується сторонніми бібліотеками, наприклад Sub :: Curry - search.cpan.org / ~ lodin/Sub-Curry-0.8/lib/Sub/Curry.pm і Sub :: Curried - search.cpan.org / ~ osfameron / Sub-Curried -0.11/lib/Sub/Curried.pm
  168. functools.partial в стандартній бібліотеці починаючи з Python 2.5
  169. за допомогою lambda-функцій в c + +0 x
  170. Proc # curry, з'явився в Ruby 1.9
  171. Починаючи з Delphi 2009
  172. 1 2 Макроси / C. За допомогою препроцесора C.
  173. Макроси / Haskell. Template Haskell - препроцесор, вбудований в GHC.
  174. Фільтри [13] - perldoc.perl.org / perlfilter.html, в тому числі, C / C + + препроцесор Filter :: cpp
  175. Вбудовані в Visual Studio (немає в Express Edition)
  176. Штатний препроцесор camlp4
  177. 1 2 3 4 5 6 7 8 Незастосовне в мовах з динамічною типізацією.
  178. Generics / Haskell. Прямих аналогів шаблонів в мові немає, проте є не менш потужні засоби узагальненого програмування.
  179. Generics / Delphi. Доступно починаючи з Delphi 2009.
  180. Unicode в ідентифікаторах / C. Доступно в компіляторах gcc починаючи з 4.2
  181. Unicode в ідентифікаторах / C + +. Доступно в компіляторах від MS, починаючи з MSVS + + 2005 і в gcc починаючи з 4.2
  182. У більшості сучасних реалізацій
  183. Unicode в ідентифікаторах / Python. Доступно починаючи з Python 3.0.
  184. Unicode в ідентифікаторах / Ruby. Доступно починаючи з Ruby 1.9.
  185. Перевантаження функцій / JavaScript. Можна зімітувати, використовуючи перевірку переданих параметрів за допомогою рефлексії.
  186. Узагальнені функції можна перевантажувати за типами або значенням декількох параметрів
  187. Тільки перевантаження операторів [14] - perldoc.perl.org / overload.html.
  188. 1 2 Перевантаження функцій і зіставлення зі зразком / Python. Реалізовано в сторонньої бібліотеці PEAK-rules - pypi.python.org / pypi / PEAK-Rules.
  189. implicit-parameters - cvs.haskell.org / Hugs / pages / users_guide / implicit-parameters.html
  190. макроси DEFVAR - www.lispworks.com / documentation / HyperSpec / Body / m_defpar.htm і DEFPARAMETER - www.lispworks.com / documentation / HyperSpec / Body / m_defpar.htm, а також декларація SPECIAL - www.lispworks.com/documentation/ HyperSpec / Body / d_specia.htm, створюють динамічні Біндінг.
  191. 1 2 Іменовані аргументи і параметри за замовчуванням / C #. Доступно починаючи з C # 4.0.
  192. Іменовані параметри / JavaScript. Можна зімітувати, передавши в якості параметра функції об'єкт: f ({param1: "value1", param2: "value2"}).
  193. Специфікатор "& key" у списку аргументів оголошуваної функції оголошує іменований параметр.
  194. Іменовані параметри / Smalltalk. Можна називати методи в стилі сделатьЧтоНибудьС:используя:и: - в такому випадку двокрапки позначають місця, куди будуть підставлятися параметри при виклику методу, наприклад сделатьЧтоНибудьС: парам1 используя: парам2 и: парам3. Назви підбирають таким чином, щоб при виклику було зрозуміло, для чого будуть використовуватися параметри.
  195. Іменовані параметри / Delphi: Можуть використовуватися при виклику OLE: Word.Openfile(filename='1.doc')
  196. Значення параметрів за замовчуванням / Erlang. Можна зімітувати за допомогою арності функції.
  197. "& Key" та "& optional" параметри допускають значення за замовчуванням
  198. Значення параметрів за замовчуванням / Perl. Можна елементарно зімітувати, див. [15] - www.devshed.com/c/a/Perl/Perl-Subroutines-Arguments-and-Values/1/.
  199. Локальні функції / С. Підтримуються в компіляторі gcc як нестандартне розширення мови, див [16] - gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Nested-Functions.html.
  200. Локальні функції / С + +. за допомогою lambda-функцій в c + +0 x
  201. Локальні функції / Java. Усередині методу можна визначати безіменні (анонімні) локальні класи, які фактично дозволяють створювати екземпляри об'єктів, що перекривають методи свого класу.
  202. Спеціальний оператор LABELS - www.lispworks.com / documentation / HyperSpec / Body / s_flet_.htm
  203. Макрос DESTRUCTURING-BIND - www.lispworks.com / documentation / HyperSpec / Body / m_destru.htm і EQL специфікатор в узагальнених функціях - www.lispworks.com / documentation / HyperSpec / Body / t_eql.htm можна розглядати як аналоги деяких підмножин функціональності зіставлення із зразком.
  204. 1 2 3 За допомогою бібліотеки Code Contracts - research.microsoft.com / en-us / projects / contracts / зі складу FCL 4.0.
  205. Контрактне програмування / Java. На основі анотацій Java 5, використовуючи бібліотеку OVal - oval.sourceforge.net / і аспектний компілятор AspectJ - www.eclipse.org/aspectj/, а також iContract [17] - www.javaworld.com/javaworld/jw-02-2001 / jw-0216-cooltools.html.
  206. Контрактне програмування / Haskell. За допомогою бібліотеки QuickCheck.
  207. DirectX через Net, OpenGL через сторонню бібліотеку OpenTK
  208. DirectX через Net, OpenGL через сторонню бібліотеку OpenTK
  209. Існує реалізація OpenGL бібліотеки для php - phpOpenGL project - sourceforge.net / projects / phpopengl / (Дзеркало на Github)

12. Термінологія

12.1. Парадигми

12.1.1. Імперативна

Протилежність декларативним. Імперативний мова повинна описувати не стільки саму задачу (опис, "ЩО" потрібно отримати), скільки її рішення ("ЯК" отримати). Деякими авторами вважається, що дане визначення скоріше відноситься до "процедурної" парадигмі, яка, крім імперативного, включає в себе функціональне програмування.

12.1.2. Об'єктно-орієнтована

Заснована на уявленні всього у вигляді об'єктів, що є екземплярами того чи іншого класу і втілює застосування концепції абстрагування. Об'єкт при цьому з'єднує всередині себе як дані, так і методи, їх обробляють. Як правило, підтримуються характерні можливості: спадкування, інкапсуляцію і поліморфізм. Деякими авторами мови без успадкування відносять до просто "об'єктним".


12.1.3. Рефлексивна

Наявність у мові потужних механізмів інтроспекції, функції eval. Можливість програми на даному мовою оперувати власним кодом як даними.

12.1.4. Функціональна

Дозволяє записувати програму як композицію функцій. У чистому функціональному мові немає змінних. Так як функції не мають побічних ефектів, вони можуть виконуватися в будь-якому порядку.

12.1.5. Узагальнене програмування

Узагальнене програмування дозволяє записувати алгоритми, що приймають дані будь-якого типу.

12.1.6. Логічна

Програма являє собою опис фактів і правил виводу в деякому логічному численні. Бажаний результат, який часто записується як питання, виходить системою в результаті спроби застосування описаних правил - шляхом логічного висновку. Цікавими особливостями є відсутність детермінованості в загальному випадку, внутрішня схильність до распараллеливанию.

12.1.7. Доказова

Спрямований на розробку алгоритмів і програм з доказами їх правильності з використанням специфікацій програм.

12.1.8. Декларативна

Протилежність імперативному. Декларативний мову описує не стільки рішення задачі, скільки саму задачу ("ЩО" потрібно отримати), а яким чином отримати рішення, вже повинен визначати комп'ютер.

12.1.9. Розподілена

Мова, що містить спеціальні конструкції для підтримки розпаралелювання програми на кілька комп'ютерів.

12.2. Типізація

12.2.1. Статична типізація

(Див. статична типізація). Змінні і параметри методів / функцій зв'язуються з типами в момент оголошення і не можуть бути змінені пізніше.

12.2.2. Динамічна типізація

(Див. динамічна типізація). Змінні і параметри методів / функцій зв'язуються з типами в момент присвоювання значення (або передачі параметра в метод / функцію), а не в момент оголошення змінної або параметра. Одна і та ж змінна в різні моменти може зберігати значення різних типів.

12.2.3. Явна типізація

Типи змінних і параметрів вказуються явно.

12.2.4. Неявна типізація

Типи змінних і параметрів не вказуються явно. Неявна типізація може бути і статичною, в такому випадку типи змінних і параметрів обчислюються компілятором.

12.2.5. Явне приведення типів

Для використання змінної якогось типу там, де передбачається використання змінної іншого типу, потрібно (можливо) явно виконати перетворення типу.

12.2.6. Неявне приведення типів без втрати даних

Неявне приведення типів в таких ситуаціях, де не відбувається втрати даних - наприклад, використання цілого числа там, де передбачалося використання числа з плаваючою точкою.

12.2.7. Неявне приведення типів з втратою даних

Неявне приведення типів в таких ситуаціях, де може відбутися втрата даних - наприклад, використання числа з плаваючою точкою там, де передбачалося використання цілого числа.

12.2.8. Неявне приведення типів в неоднозначних ситуаціях

Наприклад, використання рядки там, де передбачалося число або навпаки. Класичний приклад: скласти число 1 з рядком "2" - результат може бути як число 3, так і рядок "12". Інший приклад - використання цілого числа там, де очікується логічне значення (boolean).

12.2.9. Аліаси типів

Можливість визначити видимий глобально (за межами одиниці компіляції) аліас типу, повністю еквівалентний вихідному типу. Наприклад, typedef в Сі. Директива using в C # не підходить під цей критерій через локальній області дії.

12.2.10. Висновок типів змінних з Ініціалізатор

Можливість не вказувати явно тип змінної, якщо для неї заданий ініціалізатор. Якщо можливість діє для локальних змінних, але не діє для полів класу, все одно ставте +. Характеристика не застосовна до мов з динамічною типізацією ..

12.2.11. Висновок типів змінних з використання

Можливість не вказувати явно тип змінної, якщо її тип може бути виведений з подальшого використання. Якщо можливість діє для локальних змінних, але не діє для полів класу, все одно ставте +. Характеристика не застосовна до мов з динамічною типізацією.

12.2.12. Висновок типів-аргументів при виклику методу

Можливість не вказувати явно типи-аргументи при виклику generic-методу, якщо вони можуть бути виведені з типів звичайних аргументів.

12.2.13. Висновок сигнатури для локальних функцій

Чи може сигнатура локальної функції бути виведена з використання. Незастосовне для мов з динамічною типізацією. Ставте -, якщо мова не підтримує локальних функцій.

12.2.14. Параметричний поліморфізм

Наявність тіпобезопасного параметричного поліморфізму (aka generic types). Увазі можливість вказувати constraints або type classes для типів-параметрів.

12.2.15. Параметричний поліморфізм з коваріантного

Наявність ко-і контраваріантних type parameters. У деяких мовах може бути лише часткова підтримка (наприклад, тільки в інтерфейсах і делегатах). У такому випадку, відзначайте + / -.

12.2.16. Параметричний поліморфізм вищих порядків

Можливість створювати type constructors вищих порядків (як в Scala). Див Towards Equal Rights for Higher-kinded Types - www.cs.kuleuven.be/ ~ adriaan / files / higher.pdf

12.2.17. Інформація про типи в runtime

Можливість дізнатися точний тип об'єкта в runtime.

12.2.18. Інформація про типи-параметрах у runtime

Можливість дізнатися в runtime інформацію про тип, з яким інстанціірован generic-тип. Якщо мова не підтримує generic-типи, то ставте -. Якщо інформація про типи стирається в runtime (використовується erasure), то ставте -.

12.3. Компілятор / інтерпретатор

12.3.1. Open-source компілятор (інтерпретатор)

Наявність повноцінного open-source компілятора (для різних мов - інтерпретатора). Якщо існує open-source компілятор, але він підтримує не всі можливості мови, то ставте + / - або - / +.

12.3.2. Можливість компіляції

Можливість компіляції в нативний код або в byte-код з можливістю JIT-компіляції. Якщо мова компілюється в код на іншій мові (наприклад, C), який потім компілюється в нативний код, то теж ставте +.

12.3.3. Bootstrapping

Наявність повноцінного bootstrapping-компілятора (тобто компілятора, написаного на тій же мові, який він компілює, і успішно компілюються самого себе). Якщо існує bootstrapping-компілятор, але він підтримує не всі можливості мови, то ставте + / - або - / +.

12.3.4. Багатопотокова компіляція

Можливість компілятора на багатопроцесорних системах використовувати декілька потоків для прискорення компіляції. Якщо мова не підтримує компіляцію, то ставте x (незастосовне).

12.3.5. Інтерпретатор командного рядка

Можливість вводити інструкції мови рядок за рядком з їх негайним виконанням. Може використовуватися в якості калькулятора.

12.3.6. Умовна компіляція

Можливість вмикати / вимикати частини коду в залежності від значення символів умовної компіляції (наприклад, за допомогою # if ... # endif в C + +)

12.4. Управління пам'яттю

12.4.1. Об'єкти на стеку

Можливість створювати екземпляри об'єктів не в купі, а на стеку.

12.4.2. Некеровані покажчики

Наявність некерованих покажчиків, адресна арифметика, прямий доступ до пам'яті.

12.4.3. Ручне управління пам'яттю

Можливість явного виділення і звільнення пам'яті в купі (наприклад, за допомогою операторів new і delete в C + +).

12.4.4. Збірка сміття

Можливість використовувати автоматичний процес збірки сміття (звільнення пам'яті в купі, зайнятої невикористовуваними об'єктами).

12.5. Управління потоком обчислень

12.5.1. Інструкція goto

Підтримка інструкції goto (безумовний перехід на мітку).

12.5.2. Інструкція break без мітки

Підтримка інструкції break без мітки (безумовний вихід з найближчого циклу), і відповідної інструкції continue. Наявність у мові інструкції break, що відноситься до switch або іншої конструкції, не впливає на це поле.

12.5.3. Інструкція break з міткою

Підтримка інструкції break з міткою (безумовний вихід із циклу, поміченого міткою), і відповідної інструкції continue. Наявність у мові інструкції break, що відноситься до switch або іншої конструкції, не впливає на це поле.

12.5.4. Підтримка try / catch

Підтримка обробки виключень за допомогою try / catch або еквівалентної конструкції.

12.5.5. Блок finally

Підтримка блоку finally при обробці виключень або еквівалентної конструкції.

12.5.6. Блок else (виключення)

Підтримка блоку else при обробці виключень (дії, що виконуються при завершенні блоку try без винятку).

12.5.7. Перезапуски

Винятки, не розкручують стек викликів. Можливість з місця перехоплення виключення повернутися в місце установки перезапуску.

12.5.8. Легковагі процеси

Емуляція багатопоточності рантайм самої мови. У межах одного (або декількох) потоку ОС виконується безліч потоків вихідного коду

12.6. Типи і структури даних

12.6.1. Багатовимірні масиви

Наявність вбудованих в мову багатовимірних масивів. Якщо мова підтримує тільки масиви масивів, ставте + / -

12.6.2. Динамічні масиви

Наявність вбудованих в мову динамічних масивів (здатних змінювати свій розмір під час виконання програми). Якщо динамічні масиви представлені тільки векторами (тобто тільки одновимірними масивами) або векторами векторів, ставте + / -

12.6.3. Асоціативні масиви

Наявність вбудованих в мову асоціативних масивів або хеш-таблиць.

12.6.4. Цикл foreach

Наявність можливості перебрати всі елементи колекції за допомогою циклу foreach. Якщо в мові є еквівалентна або більш сильна можливість (на зразок list comprehensions), ставте +.

12.6.5. List comprehensions

Наявність List comprehensions (або аналога).

12.6.6. Кортежі

Можливість повернути з функції / методу кортеж (tuple) - неіменованого тип даних, що містить кілька безіменних полів довільного типу.

12.6.7. Цілі числа довільної довжини

Підтримка цілих чисел необмеженої розрядності. Повинна бути можливість записати як завгодно велике ціле число за допомогою літерала.

12.6.8. Цілі числа з контролем кордонів

Можливість визначити тип, значеннями якого можуть бути цілі числа тільки певного інтервалу, наприклад [-5 .. 27], при цьому привласнення змінної такого типу значення, що виходить за зазначені рамки, повинно викликати помилку.

12.7. Об'єктно-орієнтовані можливості

12.7.1. Інтерфейси

Семантична і синтаксична конструкція в коді програми, використовувана для специфицирования послуг, що надаються класом.

12.7.2. Множинне спадкоємство

Можливість успадковувати клас відразу від декількох класів (не інтерфейсів).

12.7.3. Мультіметоди

Динамічна (run time) диспетчеризація функції в залежності від типів кількох аргументів.
У мовах з "message passing" ООП схожа функціональність реалізується паттерном "Visitor".

12.7.4. Перейменування членів при спадкуванні

Можливість в спадкоємця змінити ім'я поля / методу предка.

12.7.5. Рішення конфлікту імен при множинному спадкуванні

При множині спадкування - рішення для випадку ромбовидного спадкування (B нащадок A, C нащадок A, D нащадок B і C). Рішення може прийматися як для всього класу, так і для кожного поля / методу окремо.

12.8. Функціональні можливості

12.8.1. First class functions

Функції в даній мові є об'єктами першого класу.

12.8.2. Лексичні замикання

Можливість використовувати локальну або лямбда-функцію (анонімний делегат) за межами функції-контейнера з автоматичним збереженням контексту (локальних змінних) функції-контейнера

12.8.3. Часткове застосування

Можливість фіксувати частина аргументів функції, тобто маючи функцію f \ colon (A \ times B) \ to C , Створити функцію P (f, a) \ colon B \ to C , Де (P (f, a)) (b) = f (a, b) . Не слід плутати з каррірованіем (оператор каррірованія - один з варіантів реалізації часткового застосування).

12.9. Різне

12.9.1. Макроси

Наявність у мові макро-системи, що обробляє код програми до часу її компіляції та / або виконання. Наприклад, макроси Ліспу, препроцесор Сі або шаблони С + +.

12.9.2. Шаблони / Generics

Наявність в даному статично типізованих мовах інструменту для узагальненого програмування, на зразок templates в C + + або generics в C #.

12.9.3. Підтримка Unicode в ідентифікаторах

Можливість включення Unicode-символів (наприклад, букв національних алфавітів) у ідентифікатори.

12.9.4. Перевантаження функцій

Можливість перевантаження функцій / методів за кількістю і типами параметрів.

12.9.5. Динамічні змінні

Можливість створювати змінні, що мають динамічну область видимості (Англ.) .

12.9.6. Іменовані параметри

Можливість при виклику функції / методу вказувати імена параметрів і міняти їх місцями.

12.9.7. Значення параметрів за замовчуванням

Можливість при виклику функції / методу опускати деякі параметри, щоб при цьому підставляти значення за замовчуванням, вказане при визначенні функції.

12.9.8. Локальні функції

Можливість визначати локальну функцію всередині іншої функції / методу. Мається на увазі можливість використовувати всередині локальної функції локальні змінні із зовнішнього блоку.

12.9.9. Зіставлення зі зразком

Наявність зіставлення зі зразком.

12.9.10. Контрактне програмування

Можливість задавати перед-і пост-умови для методів і інваріанти для класів.