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















