Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Сравнение языков программирования 2 страница




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

[править] Объектно-ориентированные возможности

Возможность Язык
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  
Интерфейсы ? - + [134] + + ? x + ? + ? x x[135] + +/-[136] + + ? ? ? + + + x  
Мультиметоды - - -/+[137] -/+[138] - - x - ? - [139] - x + - - [139][140] - - [139] - [139] - - - - - x  
Mixins ? - -/+[141] - + ? x ? ? + ? x + ? ? ? + [142] + + + ? -/+[143] ? x  
Переименование членов при наследовании ? x -/+[144] - ? + x - - - ? x - - -/+ - - ? ? - - - ? x  
Множественное наследование ? x + - - + x - - - ? x + - + - + - ? - - - + x  
Решение конфликта имен при множественном наследовании ? x -/+ [145] x x + [146] x x ? x ? x +[147] 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  
Декларации чистоты функций - - - - +[148] - - - - - - + - - - - - - - - - - - -  
First class functions ? -/+[149] +[150] + + ? + + + - + + + + + - + + + + ? +/- [151] + ?  
Анонимные функции ? - +[152] +[153] + ? + + + - + + +[154] + + + + + + + + +/- [151] + +  
Лексические замыкания - - + [155] + + + + + + +[156] + + + + + +[157] + + + + + +/- [158] + -  
Частичное применение ? - +/- [159] ? - ? ? + ? - - + - + - [160] - + [161] + + ? ? ? + ?  
Каррирование - - +/- [162] + - - - + - - + + - - + - + +[163] + - - - + -  

[править] Разное

Возможность Язык
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  
Макросы -/+ -/+ [164] -/+ [164] - - - -/+ - - - - +/- [165] + + +[166] - - +/- - - + [167] - -/+ [168] +  
Шаблоны/Generics + - + + + + x [169] + + + x [169] - [170] x [169] + x [169] x [169] x [169] x [169] + x [169] + + [171] +/- ?  
Поддержка Unicode в идентификаторах + + [172] + [173] + + ? - + + + + + +[174] + +/- -/+ + [175] + [176] + + + + + +  
Перегрузка функций + - + + + - + + + + -/+ [177] + +[178] + - [179] - - [180] - + ? + + + -  
Динамические переменные ? - - ? ? ? - ? ? ? ? +/-[181] +[182] ? + - - ? ? ? ? ? ? -  
Именованные параметры + - - + [183] - - - +/- + - -/+ [184] - +[185] + + - + + + -/+ [186] + -/+ [187] + -  
Значения параметров по умолчанию + - + + [183] + - +/- [188] - + - - - +[189] + +/- [190] + + + + +/- + + + +  
Локальные функции + -/+ [191] + [192] +/- + - + + - +/- [193] + + +[194] + +/- + + + + - +/- + + ?  
Сопоставление с образцом - - - +/- - - + + - - - + +/-[195] + + - - [180] - + ? - - + ?  
Контрактное программирование - - - + [196] + + ? +/- [196] +/- +/- [197] ? + [198] + + ? - +/- +/- ? ? + [196] - - ?  
Наличие библиотек для работы с графикой и мультимедия (OpenGL/WebGL/OpenML/OpenAL или DirectX) ? + + + ? ? ? ? ? + + + ? ? ? -/+[199] + ? ? ? + + ? ?  

[править] Стандартизация

Язык 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 - - - -

[править] Примечания

↑ Показывать компактно

↑ Показывать компактно

  1. Императивный/Haskell. Монады позволяют выполнять императивные действия.
  2. 12 ООП/Erlang. Можно провести параллель между процессами в Эрланге и объектами в определении Алана Кея [1].
  3. ООП/Javascript. Прототипная модель ООП.
  4. ООП/Haskell. Классы типов и семейства типов перекрывают возможности ООП.
  5. рефлексия c++ не входит в стандарт, однако есть реализация с помощью метакомпилятора в Qt
  6. Логический/Haskell. Изначально инструментов для логического программирования не встроено, но есть сторонние библиотеки. Существует академический функционально-логический язык Curry, берущий Haskell за основу.
  7. Логический/Common Lisp. Логическая парадигма изначально в язык не встроена, но реализуется средствами языка.
  8. LINQ
  9. В языке существует множество декларативных конструкций, и, более того, возможность создавать свои, с помощью макросов.
  10. Декларативный/Perl. Только регулярные выражения.
  11. Распределённый/Ada. См. Annex E. Distributed Systems.
  12. 12 Распределённый/C и C++. Многие распространённые компиляторы поддерживают директивы для распараллеливания в рамках технологий MPI и OpenMP.
  13. Распределённый/C#. Существуют проекты распределённых модификаций языка, например Parallel C#.
  14. Распределённый/Haskell. Модель языка подразумевает распределённое использование, при этом не требуя от программиста усилий на реализацию распределённости. Один из поддерживающих эту возможность компиляторов — Glasgow Distributed Haskell.
  15. 12 ANSI стандарт языка предусматривает опциональные декларации типов, которые какие-либо конкретные реализации могут использовать по своему усмотрению. Большинство современных реализаций CL принимают декларации типов в расчет, и используют для статической проверки типов и в целях оптимизации.
  16. Статическая типизация/Perl. С версии 5.6. Только для не встроенных типов.
  17. Статическая типизация/Smalltalk. Возможность статической типизации есть в диалекте Smalltalk — Strongtalk'е.
  18. Динамическая типизация/C#. Посредством специального псевдо-типа dynamic с версии 4.0.
  19. Динамическая типизация/F#. Компилятор поддерживает синтаксический сахар в виде преобразования использования оператора (?) xml?name в вызов xml.op_Dynamic("name"), на базе чего может быть реализована имитация динамической типизации.
  20. Динамическая типизация/Haskell. Обеспечивается модулем Data.Dynamic.
  21. Динамическая типизация/VB.NET. Контролируемо с помощью Option Strict.
  22. Динамическая типизация/Delphi. Посредством специального типа Variant.
  23. Явная типизация/Erlang. Можно использовать т. н. type test BIFs. См. [2]
  24. Явная типизация/Perl. См. Prototypes в man perlsub.
  25. Явная типизация/Python. Частично в Python 3.0.
  26. Явная типизация/Smalltalk. Есть в Strongtalk.
  27. var, dynamic etc.
  28. Неявное приведение типов/Ada. См. 4.6 Type Conversions.
  29. Неявное приведение с потерей данных/Perl. При сложении строки с числом: $a = '5aa'; print $a + 0; Напечатает: 5
  30. Неявное приведение в неоднозначных ситуациях/Perl. Не совсем корректно, так как в Perl эти ситуации однозначны: 1 + "2" # 3 и 1. "2" # "12"
  31. Макрос DEFTYPE
  32. 12 Вывод типов/C++. Поддержка вывода типов имплементируется в C++0x сиспользованием ключевых слов [code]auto[/code] и [code]decltype[/code].
  33. 1234 Вывод типов/Common Lisp. Некоторые компиляторы Common Lisp, такие как SBCL, поддерживают частичный вывод типов.
  34. Параметрический полиморфизм с ковариантностью/C#. Доступно начиная с C# 4.0 для типов интерфейсов и делегатов.
  35. Информация о типах в runtime/Ada. Точный тип узнать можно (Ada.Tags), но полной поддержки отражения в языке нет. Можно узнать имя, предков, интерфейсы, сериализовать объект, но нельзя запросить список методов.
  36. Информация о типах в runtime/С++. Можно сравнить типы на точное совпадение, узнать имя типа (typeid), приводить типы вниз по иерархии наследования.
  37. См. встроенную функцию ref и метод isa
  38. Open-source компилятор (интерпретатор)/Smalltalk. В любом диалекте Smalltalk исходники всего, кроме виртуальной машины, (то есть библиотека классов, компилятор в байткод, среда разработки, сторонние библиотеки и пр.) принципиально открыты — это свойство языка. Из основных диалектов исходники виртуальной машины открыты у GNU Smalltalk, Squeak и Strongtalk.
  39. Open-source компилятор (интерпретатор)/Delphi. FreePascal и Lazarus.
  40. Возможность компиляции/Erlang. HiPE — High Performance Erlang. Доступен только для *nix-систем.
  41. Существуют PHP-компиляторы, вполне корректно комилирующие любые PHP-скрипты. Например, Roadsend PHP Compiler.
  42. Возможность компиляции/Smalltalk. Стандартная реализация в Smalltalk — это прозрачная компиляция в байт-код (в момент сохранения изменённого исходного кода) с последующим исполнением на виртуальной машине, часто с использованием JIT-компилятора. Однако некоторые диалекты поддерживают прямую компиляцию в машинные коды. В частности, к таким диалектам относятся Smalltalk MT и Smalltalk/X.
  43. Bootstrapping-компилятор/Java. Java Compiler API появилось в версии 6.0.
  44. Narcissus.
  45. Например, SBCL
  46. Bootstrapping-компилятор/Python. Проект PyPy.
  47. Bootstrapping-компилятор/Smalltalk. Компилятор в байт-коды изначально написан на самом Smalltalk и исполняется внутри виртуальной машины. Кроме этого также есть примеры виртуальных машин Smalltalk, написанных на самом Smalltalk — к ним, в частности, относится виртуальная машина Squeak, написанная на подмножестве Smalltalk, которое потом транслируется в C и компилируется в машинные коды. При этом собственно разработка и отладка виртуальной машины Squeak осуществляется внутри работающей системы Squeak.
  48. Интерпретатор командной строки/Ada. Business Shell (BUSH).
  49. 12 Интерпретатор командной строки/C++. C++ интерпретатор CINT.
  50. Планируется к версии 5.0 языка.
  51. Rhino Shell.
  52. В диалекте GNU Smalltalk реализована поддержка командной строки.
  53. Условная компиляция/Ada. Поскольку использование препроцессора существенно осложняет работу утилит, отличных от компилятора, работающих с исходными текстами, в стандарт эта возможность не входит. Здесь: Conditional Compilation описывается, как можно организовать условно компилируемый код. В качестве резервного варианта предоставляется препроцессор gnatprep.
  54. Условная компиляция/Java. Утверждения (операторы assert) всегда включаются компилятором в байт-код и могут быть разрешены (по умолчанию запрещены, то есть игнорируются) при запуске виртуальной машины ключом -ea/-enableassertion.
  55. [3].
  56. Макросы лиспа позволяют при компиляции вычислять произвольные выражения, включая, естественно, конструкции ветвлений. Кроме того, имеется также примерный аналог #ifdef из Си.[4][5]
  57. Компилятор должен решать, какие классы будут представлены «простыми» типами и будут, в том числе, размещаться в стеке.
  58. Создание объектов на стеке/Haskell. В GHC при помощи Unboxed Types / Unboxed Arrays.
  59. Стандарт языка предусматривает декларацию DYNAMIC-EXTENT, которая может трактоваться компилятором как указание выделить место под объект на стеке.
  60. Создание объектов на стеке/Delphi. В Delphi имеется 2 объектных модели — старая (унаследована из Turbo Pascal) и новая. Создание объектов на стеке возможно только в старой объектной модели.
  61. 1234567 Через FFI (foreign function interface)
  62. Можно с помощью модуля стандартной библиотеки — ctypes.
  63. Неуправляемые указатели/Smalltalk. В Smalltalk есть возможность низкоуровневой работы с памятью, но только в адресном пространстве, предоставляемом виртуальной машиной.
  64. unsafe + System.Runtime.InteropServices
  65. Ручное управление памятью/Smalltalk. При низкоуровневой работе в пространстве памяти, предоставляемом виртуальной машиной, можно вручную создавать и удалять объекты, записывая данные в соответствующие адреса памяти. Аналогично можно вручную управлять размещением объектов в памяти.
  66. Сборка мусора/Ada. Только на некоторых платформах (.NET и JVM) или при помощи библиотек (AdaCL:GC). Тем не менее, практически все программы на Ada могут работать как с ним, так и без него. В этом смысле к сборке мусора применительно к Аде следует относиться не как к инженерному решению, а как к оптимизации управления памятью.
  67. Сборка мусора/C. В стандарте языка и в стандартных библиотеках нет сборки мусора. Однако существуют сборщики мусора для C и C++ в виде библиотек. Например, BoehmGC (англоязычный раздел).
  68. В новом стандарте C++0x предполагается сборка мусора для интеллектуальных указателей
  69. Сборка мусора/Delphi. Если не считать Delphi.NET.
  70. Инструкция goto/Java. Является зарезервированным словом.
  71. Специальный оператор GO. Все конструкции циклов в CL, фактически, являются макросами-надстройками над этой инструкцией.
  72. Целевая метка должна находиться в том же файле, в том же контексте. Имеется ввиду, что вы не можете ни перейти за границы функции или метода, ни перейти внутрь одной из них [6].
  73. Инструкция goto/Ruby. В языке goto нет, но есть библиотека реализующая его.
  74. Инструкция goto/Smalltalk. В стандарте языка goto нет, но существуют библиотеки, реализующие функциональность goto через управление стеком исполнения. Используются крайне редко, это скорее proof of concept (англ.).
  75. Макрос RETURN. Фактически, является частным случаем RETURN-FROM.
  76. заменяется исключениями, также реализуется с помощью Camlp4 http://code.google.com/p/ocaml-break-continue/
  77. Специальный оператор RETURN-FROM
  78. Принимает необязательный числовой аргумент, который сообщает ему выполнение какого количества вложенных структур необходимо прервать [7].
  79. Есть возможность указать число вложенных циклов, которые нужно прервать
  80. Можно либо повторить выполнение метода, либо пробросить исключение далее
  81. Java-style try-catch блок реализуется макросом handler-case. Кроме того, в возможности системы обработки исключений Common Lisp входит система т. н. перезапусков(restarts), которые позволяют обрабатывать исключения «изнутри» без раскрутки стека вызовов функций
  82. При помощи оператора eval
  83. 123 При использовании библиотеки PBOSL
  84. Блок finally/Ada. В стандарте языка finally нет, но существуют библиотеки, реализующие функциональность finally. Используются крайне редко, это скорее proof of concept (англ.).
  85. MDN — MDC
  86. Специальный оператор UNWIND-PROTECT
  87. реализуется на camlp4 http://bluestorm.info/camlp4/dev/try/pa_tryfinally.ml.html
  88. При помощи нескольких последовательных catch
  89. Java-style try-catch блок реализуется макросом handler-case. Кроме того, в возможности системы обработки исключений Common Lisp входит система т. н. перезапусков(restarts), которые позволяют обрабатывать исключения «сверху» без раскрутки стека вызовов функций
  90. При помощи eval or {…}
  91. Частично реализуются нестандартным модулем Runops::Resume
  92. Конструкции yield return, запросы LINQ, в FCL 4.0 войдёт тип Lazy.
  93. Seq-генераторы, модуль Lazy стандартной библиотеки F#.
  94. Однако, данную возможность можно реализовать на макросах
  95. Данная возможность реализована на макросах
  96. Ленивые вычисления/Ruby. В языке ленивых вычислений нет, но есть библиотека реализующая их.
  97. Конструкции Linq.
  98. модуль Lazy стандартной библиотеки Ocaml.
  99. setcontext et al. (UNIX System V and GNU libc)
  100. Реазилуется сторонними библиотеками, например cl-cont
  101. Только для байт-кода http://okmij.org/ftp/Computation/Continuations.html#caml-shift
  102. Легковесные процессы/Java. Вплоть до Java 1.1.
  103. Только в некоторых реализациях.
  104. Следует заметить что это не стандартные легкие процессы [8]
  105. Легковесные процессы/Python. Используя Stackless Python.
  106. Монадические потоки выполнения, реализованы в библиотеке Lwt
  107. Кортежи/C++. Реализуются в стандартной библиотеке (появились в TR1 (англоязычный раздел), до этого в boost). Кроме того, планируется поддержка кортежей в C++0x
  108. 12 Кортежи/.NET. С помощью типов System.Tuple<T,...> введёных в FCL 4.0.
  109. 12 Алгебраические типы данных/Ada и Delphi. Через механизм вариантных записей.
  110. 12345678 В динамических языках механизм алгебраических типов данных не имеет смысла.
  111. 12 Массивы/Haskell. С помощью Data.Array.
  112. Динамические массивы/C. «Из коробки» данной возможности нет, однако похожий функциональность можно реализовать, используя функцию realloc.
  113. Динамические массивы/Java. С помощью java.util.Vector (в стандартной библиотеке).
  114. map и unordered_map в стандартной библиотеке
  115. Ассоциативные массивы/Java. С помощью java.util.HashMap (в стандартной библиотеке).
  116. Ассоциативные массивы/Haskell. С помощью Data.Map
  117. Контроль границы массивов/С++. Для массивов контроля нет, однако в контейнерах STL, таких как std::vector, std::array есть метод at с контролем границ.
  118. 123 Контроль границ массивов/Perl, PHP и JavaScript. В языке нет массивов со статическими границами, присваивание элементу за текущими границами массива просто расширяет границы массива.
  119. Контроль границ массивов/Ocaml. Можно отключить на этапе компиляции с помощью ключа -unsafe
  120. Цикл foreach/Ada. Методы Iterate и Reverse_Iterate различных контейнеров, входящих в библиотеку Ada.Containers.
  121. Цикл foreach/C++. В C++11 for(auto x: some_array){} — не может изменять элементы, for(auto& x: some_array){} — может изменять элементы.
  122. Цикл foreach/Erlang. В виде функции foreach/3 из модуля lists.
  123. Цикл foreach/JavaScript. С версии 1.6[9].
  124. Цикл foreach/Lisp. Макрос LOOP в составе стандартной библиотеки. Представляет собой «язык в языке» с большим количеством возможностей.
  125. List comprehensions/C#. «Query Comprehension» можно считать за List Comprehension только с большой натяжкой.
  126. LOOP et al.
  127. 123 Целые числа произвольной длины/.NET. Посредством типа System.Numerics.BigInteger, включенного в FCL версии 4.0.
  128. Целые числа произвольной длины/Java. С помощью классов BigInteger и BigDecimal.
  129. Для вычислений с произвольной точностью PHP предоставляет Двоичный калькулятор, который поддерживает числа любого размера и точности, представленные в виде строк [10].
  130. Целые числа произвольной длины/Scala. С помощью классов BigInteger и BigDecimal.
  131. Целые числа произвольной длины/OCaml. В помощью модуля Num и Big_int.
  132. Пример: Тип (INTEGER 0 9) включает в себя все цифры от 0 до 9
  133. Целые числа произвольной длины/Perl. С помощью модуля Tie::Scalar.
  134. Множественное наследование абстрактных классов
  135. Похожая функциональность реализуется макросами и средствами CLOS.
  136. Через множественное наследование от классов с методами-заготовками. См. [11]
  137. Могут быть реализованы с помощью паттерна Visitor(Посетитель)
  138. Эмуляция через dynamic
  139. 1234 Реализуется сторонними библиотеками
  140. появятся(?) в Perl 6
  141. Могут быть реализованы с помощью наследования шаблонов Примесь_(программирование)#.D0.AD.D0.BC.D1.83.D0.BB.D1.8F.D1.86.D0.B8.D1.8F
  142. Через множественное наследование и/или изменение атрибутов произвольного объекта во время выполнения
  143. Подмешивание реализации интерфейсов через ключевое слово implements. См. страницы 10-7 и 10-8 в Object Pascal Guide.
  144. Переименование членов при наследовании не поддерживается c++, однако можно сэмулировать через закрытое наследование, открывая члены, которые не нужно переименовать через директиву using, а если нужно переименовать — просто опредилить метод с новым названием и вызвать в нём метод родителя
  145. Только совместное использование посредством виртуального наследования
  146. Для каждого члена класса — выбор дублирование (через переименование), или слияние (иначе, если не было переопределения)
  147. CLHS: Section 4.3.5
  148. Functions — D Programming Language 2.0 — Digital Mars
  149. в форме указателей на функции
  150. std::function в c++0x
  151. 12 Появились в Delphi2009, как анонимные функции. Ранее — через указатели.
  152. C++0x. Лямбда-выражения в C++0x
  153. Анонимные делегаты присутствуют в языке с версии 2.0. В C# 3.0 появились полноценные анонимные функции.
  154. Макрос LAMBDA
  155. lambda-функции в c++0x поддерживают замыкания как по ссылке, так и по значению
  156. Через анонимные классы
  157. Начиная с версии 5.3
  158. Появились в Delphi2009, как анонимные функции.
  159. boost::bind, std::bind1st, std::bind2nd или сэмулировать с помощью анонимных функций
  160. Реализуется сторонними библиотеками, например Sub::Curry и Sub::Curried
  161. functools.partial в стандартной библиотеке начиная с Python 2.5
  162. с помощью lambda-функций в c++0x
  163. Proc#curry, появился в Ruby 1.9
  164. 12 Макросы/C. Посредством препроцессора C.
  165. Макросы/Haskell. Template Haskell — препроцессор, встроенный в GHC.
  166. Фильтры [12], в том числе, C/C++ препроцессор Filter::cpp
  167. Встроенны в Visual Studio (нет в Express Edition)
  168. Штатный препроцессор camlp4
  169. 12345678 Неприменимо в языках с динамической типизацией.
  170. Generics/Haskell. Прямых аналогов шаблонов в языке нет, однако имеются не менее мощные средства обобщенного программирования.
  171. Generics/Delphi. Доступно начиная с Delphi 2009.
  172. Unicode в идентификаторах/C. Доступно в компиляторах gcc начиная с 4.2
  173. Unicode в идентификаторах/C++. Доступно в компиляторах от MS, начиная с MSVS++ 2005 и в gcc начиная с 4.2
  174. В большинстве современных реализаций
  175. Unicode в идентификаторах/Python. Доступно начиная с Python 3.0.
  176. Unicode в идентификаторах/Ruby. Доступно начиная с Ruby 1.9.
  177. Перегрузка функций/JavaScript. Можно сымитировать, используя проверку передаваемых параметров с помощью рефлексии.
  178. Обобщенные функции можно перегружать по типам или значениям нескольких параметров
  179. Только перегрузка операторов [13].
  180. 12 Перегрузка функций и сопоставление с образцом/Python. Реализовано в сторонней библиотеке PEAK-rules.
  181. implicit-parameters
  182. макросы DEFVAR и DEFPARAMETER, а также декларация SPECIAL, создают динамические биндинги.
  183. 12 Именованные аргументы и параметры по умолчанию/C#. Доступно начиная с C# 4.0.
  184. Именованные параметры/JavaScript. Можно сымитировать, передав в качестве параметра функции объект: f ({param1: "value1", param2: "value2"}).
  185. Спецификатор «&key» в списке аргументов объявляемой функции объявляет именованный параметр.
  186. Именованные параметры/Smalltalk. Можно называть методы в стиле сделатьЧтоНибудьС:используя:и: — в таком случае двоеточия обозначают места, куда будут подставляться параметры при вызове метода, например сделатьЧтоНибудьС: парам1 используя: парам2 и: парам3. Названия подбирают таким образом, чтобы при вызове было понятно, для чего будут использоваться параметры.
  187. Именованные параметры/Delphi: Могут использоваться при вызове OLE: Word.Openfile(filename='1.doc')
  188. Значения параметров по умолчанию/Erlang. Можно сымитировать с помощью арности функции.
  189. «&key» и «&optional» параметры допускают значения по умолчанию
  190. Значения параметров по умолчанию/Perl. Можно элементарно сымитировать, см. [14].
  191. Локальные функции/С. Поддерживаются в компиляторе gcc как нестандартное расширение языка, см. [15].
  192. Локальные функции/С++. с помощью lambda-функций в c++0x
  193. Локальные функции/Java. Внутри метода можно определять безымянные (анонимные) локальные классы, которые фактически позволяют создавать экземпляры объектов, перекрывающие методы своего класса.
  194. Cпециальный оператор LABELS
  195. Макрос DESTRUCTURING-BIND и EQL спецификатор в обобщенных функциях можно рассматривать как аналоги некоторых подмножеств функциональности сопоставления с образцом.
  196. 123 Посредством библиотеки Code Contracts из состава FCL 4.0.
  197. Контрактное программирование/Java. На основе аннотаций Java 5, используя библиотеку OVal и аспектный компилятор AspectJ, а также iContract [16].
  198. Контрактное программирование/Haskell. Посредством библиотеки QuickCheck.
  199. Существует реализация OpenGL библиотеки для php — phpOpenGL project (Зеркало на Github)

[править] Терминология




Поделиться с друзьями:


Дата добавления: 2015-07-13; Просмотров: 1512; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.