Сравнение языков программирования. Реферат сравнение языков программирования


Реферат Сравнение языков программирования

скачать

Реферат на тему:

План:

Введение

 Условные обозначения 
+ Указанная возможность присутствует
- Указанная возможность отсутствует
+/- Возможность поддерживается не полностью
-/+ Возможность поддерживается очень ограниченно
 ? Нет данных
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 Императивный Объектно-ориентированный Функциональный Рефлексивный Обобщенное программирование Логический Декларативный Распределенный 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] -[2] + + + +[3] -[4] + + + + + + + + + + + + -/+
- - +/- +/- +/- +/- + + + + - +/- + + + + +/- +/- + + + + +/- -/+ + +/-
- - - [5] -/+ -  ? + + -/+ -/+ -/+ + - + -/+ +/- + + + -/+ + + -/+ -/+ -  ?
+ - + + + +/- + + + + + + + + + + + + + + + - + + + -/+
- - - - - - - + - - - - +/-[6] +/-[7] +/- - - - -  ? +/- - - - -  ?
- - - -/+ [8] -/+  ? + + + + - +/- + + [9] + -/+[10] + + + + +/- - +/- - + +/-
+[11] +/-[12] +/-[12] -/+[13] - + + + - -/+ + - +[14] +/- - - - -/+ -/+  ? +/-  ? - - - -

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

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

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 Создание объектов на стеке Неуправляемые указатели Ручное управление памятью Сборка мусора
+ + + + + -/+[57]  ?  ? - - - +/-[58] +/-[59] + - - - -  ?  ? - - -/+[60]  ? +
+ + + + + - - - - - [61] - - [61] - [61] - - - -[62] - - +[63] - - + - +
+ + + +[64] + - - - - - [61] - - [61] - [61] - - - - [61] - - +[65] - - + - +
-/+[66] -[67] -/+[68] + + + + + + + + + + + + + + + + + + + -[69] + -

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

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

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

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

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 98 ANSI - - - - - - ANSI - - - -

11. Примечания

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

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. Контрактное программирование

Возможность задавать пред- и пост-условия для методов и инварианты для классов. Подробнее см. Design by contract (англ.).

www.wreferat.baza-referat.ru

Реферат Сравнение языков программирования

скачать

Реферат на тему:

План:

Введение

 Условные обозначения 
+ Указанная возможность присутствует
- Указанная возможность отсутствует
+/- Возможность поддерживается не полностью
-/+ Возможность поддерживается очень ограниченно
 ? Нет данных
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 Императивный Объектно-ориентированный Функциональный Рефлексивный Обобщенное программирование Логический Декларативный Распределенный 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] -[2] + + + +[3] -[4] + + + + + + + + + + + + -/+
- - +/- +/- +/- +/- + + + + - +/- + + + + +/- +/- + + + + +/- -/+ + +/-
- - - [5] -/+ -  ? + + -/+ -/+ -/+ + - + -/+ +/- + + + -/+ + + -/+ -/+ -  ?
+ - + + + +/- + + + + + + + + + + + + + + + - + + + -/+
- - - - - - - + - - - - +/-[6] +/-[7] +/- - - - -  ? +/- - - - -  ?
- - - -/+ [8] -/+  ? + + + + - +/- + + [9] + -/+[10] + + + + +/- - +/- - + +/-
+[11] +/-[12] +/-[12] -/+[13] - + + + - -/+ + - +[14] +/- - - - -/+ -/+  ? +/-  ? - - - -

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

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

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 Создание объектов на стеке Неуправляемые указатели Ручное управление памятью Сборка мусора
+ + + + + -/+[57]  ?  ? - - - +/-[58] +/-[59] + - - - -  ?  ? - - -/+[60]  ? +
+ + + + + - - - - - [61] - - [61] - [61] - - - -[62] - - +[63] - - + - +
+ + + +[64] + - - - - - [61] - - [61] - [61] - - - - [61] - - +[65] - - + - +
-/+[66] -[67] -/+[68] + + + + + + + + + + + + + + + + + + + -[69] + -

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

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

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

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

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 98 ANSI - - - - - - ANSI - - - -

11. Примечания

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

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. Контрактное программирование

Возможность задавать пред- и пост-условия для методов и инварианты для классов. Подробнее см. Design by contract (англ.).

wreferat.baza-referat.ru

Реферат - Сравнительный анализ языков программирования JavaScript и VBScript

Омский Государственный Педагогический Университет

Кафедра информатики

Сравнительный анализ языков программирования JavaScript и VBScript

Проверил: Кирьякова И.В.

Выполнил: Поросков Д.В.

Группа: 34

Омск 2002

Содержание

Введение ….3

Общий обзор языка …4

Типы данных …5

Переменные …8

Операторы …10

Операторы управления …13

Процедуры …19

Объекты …21

Список литературы …24

Введение

Объектные модели языков сценариев тесно связаны с тэгами HTML. При загрузке страницы HTML в браузер интерпретатор языка создает объекты со свойствами, определенными значениями тэгов страницы. Говорят, что браузер отражает HTML-страницу в свойствах объектов, и иногда этот процесс называют отражением (reflection). Созданные объекты существуют в виде иерархической структуры, отражающей структуру самой HTML-страницы. На верхнем уровне расположен объект window, представляющий собой активное окно браузера. Далее вниз по иерархической лестнице следуют объекты frame, document, location и history, представляющие соответственно фрейм, непосредственно сам документ, адрес загружаемого документа и список ранее загружавшихся документов, и т.д. Значения свойств объектов отражают значения соответствующих параметров тэгов страницы или установленных системных параметров.

Для правильного использования объектных моделей следует четко понимать, как браузер компонует страницы и, тем самым, создает иерархия объектов. При загрузке страницы просматриваются сверху вниз, тем самым последовательно происходит компоновка страницы и ее отображение в окне браузера. А это означает, что и объектная модель страницы также формируется последовательно, по мере ее обработки. Поэтому невозможно обратится из сценария, расположенного ранее какой-либо формы на странице, к элементам этой формы. Всегда следует помнить о том, что браузер последовательно сверху вниз интерпретирует содержимое HTML-страницы.

Еще один аспект работы с объектами языков сценариев заключается в том, что нельзя изменить свойства объектов. Браузер обрабатывает страницу только один раз, компонуя и отображая ее. Поэтому попытка в сценарии изменить свойство отображенного элемента страницы, обречена на провал. Только повторная загрузка страницы приведет к желаемому результату.

Общий обзор языка

JavaScript

Язык программирования JavaScript разработан фирмой Netscape для создания интерактивных HTML-документов. Это объектно-ориентированный язык разработки встраиваемых приложений, выполняющих как на стороне клиента, так и на стороне сервера. Синтаксис языка очень похож на синтаксис языка Java – поэтому его часто называют Java-подобным. Клиентские приложения выполняются браузером просмотра Web-документов на машине пользователя, серверные приложения выполняются на сервере.

При разработке обоих типов приложений используется общий компонент языка, называемый ядром и включающий определения стандартных объектов и конструкций (переменные, функции, основные объекты и средство LiveConnect взаимодействия с Java-апплетами), и соответствующие компоненты дополнений языка, содержащие специфические для каждого типа приложений определения объектов.

Клиентские приложения непосредственно встраиваются в HTML-страницы и интерпретируются браузером по мере отображения частей документа в его окне. Серверные приложения для увеличения производительности предварительно компилируются в промежуточный байт-код.

Основные области использования языка JavaScript при создании интерактивных HTML-страниц:

· Динамическое создание документа с помощью сценария

· Оперативная проверка достоверности заполняемых пользователем полей форм HTML до передачи их на сервер

· Создание динамических HTML-страниц совместно с каскадными таблицами стилей и объектной моделью документа

· Взаимодействие с пользователем при решении “локальных” задач, решаемых приложением JavaScript, встроенном в HTML-страницу

VBScript

Язык создания сценариев VBScript разработан фирмой Microsoft и является подмножеством достаточно распространенного в среде программистов языка Visual Basic разработки прикладных Windows-приложений. Как и его родитель, язык VBScript достаточно прост и легок в изучении.

Преимуществом его применения для создания сценариев является возможность использования, с небольшими корректировками, ранее написанных процедур на языках Visual Basic и Visual Basic for Application.

Функциональные возможности сценариев, написанных на VBScript, ничем не отличаются от возможностей сценариев JavaScript: динамическое создание документа или его частей, перехват и обработка событий и т.д.

VBScript используется для написания сценариев клиента (в этом случае браузер должен иметь встроенный интерпретатор этого языка), а также для написания сценариев на сервере (в этом случае сервер должен поддерживать язык VBScript). Для создания сценариев клиента используется набор объектов, аналогичный набору объектов JavaScript. Объекты клиента и сервера отличаются друг от друга, но существует общая часть (ядро) объектов, используемых при разработке как сценариев клиента, так и сценариев сервера.

Типы данных

JavaScript

Как и любой другой язык программирования, JavaScript использует переменные для хранения данных определенного типа. Реализация JavaScript является примером языка свободного использования типов. В нем не обязательно задавать тип переменной. Ее тип зависит от типа хранимых в ней данных, причем при изменении типа данных меняется и тип переменной.

JavaScript поддерживает четыре простых типа данных:

· Целый

· Вещественный

· Строковый

· Булевый, или логический

Для присваивания переменным значений основных типов применяются литералы – буквенные значения данных соответствующих типов.

Целые литералы являются последовательностью цифр и представляют обычные целые числа со знаком или без знака:

123 // целое положительное число

-123 // целое отрицательное число

+123 // целое положительное число

Для задания вещественных литералов используется синтаксис чисел с десятичной точкой, отделяющей дробную часть числа от целой, или запись вещественных чисел в научной нотации с указанием после символа “e” или “E” порядка числа. Пример правильных вещественных чисел:

1.25 0.125e01 12.5E-1 0.0125E+2

Строковый литерал – последовательность алфавитно-цифровых символов, заключенная в одинарные (‘) или двойные кавычки (“), например: “Ира”, ‘ИРА’. При задании строковых переменных нельзя смешивать одинарные и двойные кавычки. Недопустимо задавать строку, например, в виде “Ира’. Двойные кавычки – это один самостоятельный символ, а не последовательность двух символов одинарных кавычек. Если в строке нужно использовать символ кавычек, то строковый литерал необходимо заключать в кавычки противоположного вида:

“It’s a string” // Значение строки равно It’s a string

Булевы литералы имеют два значения: true и false, и используются для обработки ситуаций да/нет в операторах сравнения.

VBScript

В VBScript определен только один тип данных – Variant. Это универсальный тип, в котором можно хранить информацию, предоставленную другими типами данных, применяемыми в программировании, начиная от простейшего целого и заканчивая объектами.

В своем простейшем использовании тип Variant содержит либо числовые данные, либо символьные строки – типы данных, наиболее часто встречаемые при написании сценария. Реально содержащиеся в вариантом типе данные могут быть одного из типов, называемых подтипами типа Variant, представленных в табл.1.

Таблица 1. Подтипы данных, хранящихся в типе Variant

Подтип

Описание

Функция преобразования

Empty

Переменная не инициализирована

Null

Переменная не содержит никаких допустимых данных

Error

Содержит номер ошибки

Boolean

Содержит значения либо True, либо False

CBool

Byte

Содержит целые числа в диапазоне от 0 до 255

CByte

Integer

Содержит целые числа в диапазоне от -32 768 до 32 767

CInt

Currency

Значения в диапазоне от -922 337 203 685 477.5808 до 922 337 203 685 477.5807

CCur

Long

Содержит целые числа в диапазоне

от -2 147 483 648 до 2 147 483 647

CLng

Single

Содержит вещественные числа с плавающей точкой одинарной точности в диапазоне

от -3.402823E38 до -1.401298E-45

для отрицательных значений

и от 1.401298E-45 до 3.402823E38

для положительных значений

CSng

Double

Содержит вещественные числа с плавающей точкой удвоенной точности в диапазоне

от -1.79769313486232E308 до -4.94065645841247E-324

для отрицательных значений

и от 4.94065645841247E-324 до 1.79769313486232E308

для положительных значений

CDbl

Date(Time)

Содержит число, которое представляет дату в диапазоне от 1 января 100 года до 31 декабря 9999 года

CDate

String

Содержит строку переменной длины (до 2 миллионов символов)

CStr

Object

Содержит ссылку на объект

Первые три подтипа, собственно говоря, не являются подтипами, а представляют значения, которые может принимать вариантный тип.

Значение Empty имеет переменная, которая была объявлена в операторе Dim (см. ниже), но ей еще не присваивали никакого значения. Это значение считается равным 0 в математических операциях и равным пустой строке (“”) в операциях со строковыми значениями.

Значение Null означает, что переменная не содержит данных. Его не следует путать со значением Empty. Вариантная переменная может получить значение Null в результате выполнения некоторых операций над ней. Это значение можно присвоить переменной, тогда как значение Empty – нельзя.

Значение Error – это специальное значение, которое используется для указания возникновения ошибки в процедуре.

Каждый подтип данных задается с помощью литералов. Числовые литералы представляют собой целые числа, действительные числа с плавающей или фиксированной точкой. Примеры числовых литералов приведены ниже:

23 ‘Целое число

-23.78 ‘Действительное число с фиксированной точкой

-237.8E-1 ‘Действительное число с плавающей точкой

Строковые литералы задаются в виде последовательности символов, заключенных в двойные кавычки (“):

“Это строковый литерал”.

Литералы даты и времени заключаются между символами числовых знаков (#). VBScript поддерживает большое число форматов даты и времени. Следующие примеры показывают правильные литералы даты и времени, соответствующие дате 10 июня 1999 года:

#10-6-99 22:20#

#10/6/99#

#10/6/99 10:20pm#

Внутренне литералы даты и времени представляются в виде действительных чисел удвоенной точности. Целая часть представляет количество дней, прошедших от даты 30 декабря 1899 года, а дробная часть – время суток.

Булевы литералы True и False являются константами целого типа, принимающими соответственно значения 1 и 0. Любое числовое значение, не равное нулю, преобразуется функцией CBool в True, а нулевое значение (целое или действительное) – в False.

Вариантный тип данных при использовании в выражениях в качестве операндов разнообразных операторов языка обрабатывается в зависимости от подтипа содержащихся в нем данных. Например, при использовании переменных этого типа данных в операторе сложения (+) результат зависит от того, какие подтипы данных в них содержатся. Если хотя бы один из операндов содержит число, то результат будет сумма значений двух переменных (содержимое второго операнда преобразуется к числовому подтипу), если оба операнда содержат строковые данные, тот результатом будет конкатенация строк.

Вариативный тип данных предоставляет программисту более эффективный способ обработки и хранения данных, не заботясь о типе хранимых данных. Если, например, при вычислениях первоначально в переменной вариантного типа хранилось значение типа Byte (число в диапазоне от 0 до 255), и в результате выполнения некоторых действий это значение стало отрицательным, то просто изменится представление этого числа в переменной (оно станет Integer) и не возникает никакой ошибки. Правда, за это удобство приходится платить используемой памятью: для вариантного типа данных вне зависимости от хранимого подтипа нужно 16 байт памяти.

Иногда в некоторых вычислениях необходимо явно преобразовать содержащийся в переменной подтип в другой. Для этого в VBScript имеется ряд функций преобразования в соответствующие типы. В табл. 1 последний столбец содержит имена функций преобразования в соответствующий подтип. Эти функции в качестве параметра принимают литералы, переменные и выражения.

Переменные

JavaScript

Каждая переменная имеет имя, которое должно начинаться с буквы латинского алфавита, либо символа подчеркивания “_”, за которым следует любая комбинация алфавитно-цифровых символов или символов подчеркивания. Следующие имена являются допустимыми именами переменных

Temp1

MyFunction

_my_Method

Язык JavaScript чувствителен к регистру. Это означает, что строчные и прописные буквы алфавита считаются разными символами.

Определить переменную можно двумя способами:

· Оператором var

· Оператором присваивания (=)

Оператор var используется как для задания, так и для инициализации переменной и имеет синтаксис:

var имя_переменной [= начальное_значение];

Необязательный оператор присваивания задает данные, которые содержит переменная. Их тип определяет и тип переменной. Например, следующий оператор

var weekDay = “Пятница”;

задает переменную weekDay, присваивает ей строковое значение “Пятница”, и тем самым определяет ее тип как строковый.

Если при определении переменной ей не присвоено никакого значения, то ее тип не определен. Ее тип будет определен только после того, как ей будет присвоено некоторое значение оператором присваивания =.

VBScript

Переменные используются для хранения данных приложения. Прежде чем переменную можно будет использовать, ее необходимо объявить. Это можно осуществить явным способом с помощью оператора Dim, или неявным – просто использовать имя переменной в операторе присваивания. Синтаксис оператора явного объявления переменной следующий:

Dim имя_переменной

Параметр имя_переменной – имя объявляемой переменной. Оно должно начинаться с буквы, не содержать пробелов, точку (.), восклицательный знак (!), а также символов (@), (&), ($), (#) и не превышать длину в 255 символов.

Язык VBScript не чувствителен к регистру. Это означает, что в нем не различаются строчные и прописные буквы. Поэтому, например, и m, и M будут ссылаться на одну и ту же переменную, если используются в качестве идентификатора переменной.

Иногда в программе необходимо задавать переменные, значения которых нельзя изменять. Такие переменные называются именованными константами. В VBScript для задания констант существует оператор Const, имеющий следующий синтаксис:

Const conName = “Дмитрий” ‘Строковая константа

Const conPi = 3.1416 ‘Числовая константа

Const conBirthDay = #1-8-53# ‘Константа даты

Операторы

JavaScript

Оператор присваивания рассматривается как выражение присваивания, которое вычисляется равным выражению правой части, и в то же время он присваивает вычисленное значение выражения переменной, заданное в левой части оператора.

Арифметические выражения создаются арифметическими операторами (табл. 2).

Таблица 2. Арифметические операторы

Оператор

Название

+

Сложение

-

Вычитание

*

Умножение

/

Деление

%

Остаток от деления целых чисел

++

Увеличение значения переменной на единицу

--

Уменьшение значения переменной на единицу

Кроме простого оператора присваивания (=) существуют сокращенные формы операторов присваивания, совмещенных с арифметическими операторами, в которых производятся арифметические действия над левыми и правыми операндами и результат присваивается переменной, заданной левым операндом. Все они перечислены в табл. 3.

Таблица 3. Сокращенные операторы присваивания

Оператор

Значение

X * = Y

X = X * Y

X / = Y

X = X / Y

X + = Y

X = X + Y

X — = Y

X = X – Y

X % = Y

X = X % Y

Для создания логических выражений используются операторы сравнения и логические операторы, применяемые к переменным любого типа.

Операторы сравнения аналогичны таковым в других языках программирования. Их список представлен в табл. 4.

Таблица 4. Операторы сравнения

Оператор

Название

==

Равно

!=

Не равно

>=

Больше или равно

<=

Меньше или равно

>

Строго больше

<

Строго меньше

При использовании этих операторов в выражении оно вычисляется равным true, если соответствующее сравнение верно, в противном случае значение выражения равно false.

Логические операторы представлены в табл. 5. В примерах предполагается, что переменная var1 = ‘Кит’, var2 = ‘Кот’, var3 = false.

Таблица 5. Логические операторы

Оператор

Синтаксис

Описание

Пример

&& (логическое И)

выраж1 && выраж2

Возвращает выраж1, если оно преобразуется или равно false, иначе выраж2

var1 && var2

(равно ‘Кот’)

var2 && var3

(равно false)

|| (логическое ИЛИ)

выраж1 || выраж2

Возвращает выраж1, если оно преобразуется или равно true, иначе выраж2

var1 || var2

(равно ‘Кит’)

var3 || var1

(равно ‘Кит’)

var3 || false

(равно false)

! (логическое НЕ)

! выраж

Если выраж равно true, возвращает false; если выраж равно false, возвращает true

!var1

(равно false)

!var3

(равно true)

Логические операторы и операторы сравнения используются в операторах цикла и условия для проверки завершения цикла или выполнения определенной группы операторов.

Строковые операторы используются для создания строковых выражений. В JavaScript, собственно говоря, существует только один строковый оператор – оператор конкатенации (соединения) строк (+), если не считать сокращенной формы оператора присваивания со сложением (+=). Этот оператор присоединяет к строковому значению первого операнда строковое значение второго, получая результат, равный соединению строк:

string = “Моя”+”строка”; // Значение переменной string равно “Моястрока”

Условный оператор является единственным оператором, использующим три операнда. Его значением является один из двух операндов, определяемый из условия истинности третьего. Его синтаксис таков:

(условие)? знач1: знач2;

Если операнд условие имеет значение true, то результатом вычисления условного оператора будет знач1, в противном случае – знач2. Например, оператор

range = (mark <= 2)? “Пересдача”: “Зачтено”;

присваивает переменной range значение “Пересдача”, если переменная mark меньше либо равно 2, в противном случае ей присваивается значение “Зачтено”.

Кроме перечисленных выше операторов в JavaScript существует большая группа операторов для поразрядных действий с данными. В них содержимое каждого оператора рассматривается как последовательность битов, а не как данные строкового, числового или булевого типов.

VBScript

При вычислении выражений необходимо производить разнообразные действия с переменными и литералами. Для этих целей в VBScript предусмотрен ряд встроенных операторов, выполняющих арифметические операции, операции сравнения, конкатенацию (соединение) строк и логические операции над данными, хранящимися в переменных, или представленными литералами.

В VBScript каждый оператор размещается на отдельной строке и не завершается никаким разделителем. Однако, если возникает необходимость задания нескольких операторов в одной строке, то они разделяются двоеточием (:).

Если оператор достаточно длинный, или из соображений удобства чтения исходного текста необходимо расположить его в нескольких строках, то следует использовать символы продолжения – пробел со знаком подчеркивания (_).

Комментарии в языке VBScript вводятся в текст программы одинарной кавычкой (‘). Любой текст, расположенный в строке за одинарной кавычкой, трактуется интерпретатором как комментарий, и, естественно, не обрабатывается им.

Большую группу представляют арифметические операторы, выполняющие основные арифметические действия над числовыми данными: возведение в степень (^), умножение (*), деление (/), целочисленное деление (\), сложение (+) и вычитание (-). Они подчиняются принятым в математике правилам старшинства операций: сначала выполняется возведение в степень, затем умножение или деление, далее сложение или вычитание. Скобки изменяют последовательность вычисления операций.

Для сравнения данных используются операторы сравнения: равенство (=), неравенство (<>), меньше (<), больше (>), меньше или равно (<=), больше или равно (>=). Объекты сравниваются с помощью специального оператора Is.

В VBScript нет специального знака для операции присваивания. Один и тот же знака равенства используется как для операции присваивания значения переменной (см. выше), так и для операции сравнения на равенство. Смысл операции, представляемой этим символом, зависит от контекста, в котором она применена.

Существует ряд операторов, выполняющих действия над логическими (булевыми) данными: отрицание (Not), конъюнкция (And), дизъюнкция (Or), исключающее ИЛИ (Xor), эквивалентность (Eqv) и импликация (Imp).

Оператор (&) производит конкатенацию (соединение) двух строк. При его выполнении данные, содержащиеся в операндах, преобразуются при необходимости к строковому подтипу, и осуществляется сцепление двух строк.

Операторы управления

JavaScript

Весь набор управления языка можно разбить на три группы:

· Операторы выбора, или условные

· Операторы цикла

· Операторы манипулирования с объектами

Операторы выбора

К этой группе операторов относятся операторы, которые выполняют определенные блоки операторов в зависимости от истинности некоторого булевского выражения. Этот оператор условия if…else и переключатель switch.

Оператор условия if применяется, если необходимо вычислить некоторый блок операторов в зависимости от истинности заданного условия, и имеет следующий синтаксис:

if (условие) {

операторы1

}

[else {

операторы2

}]

Первая группа операторов операторы1 выполняется при условии истинности выражения условие. Необязательный блок else задает группу операторов операторы2, которая будет выполнена в случае ложности условия, заданного в блоке if.

Внутри группы выполняемых операторов могут использоваться любые операторы JavaScript, в том числе и операторы условия. Таким образом, можно создавать группу вложенных операторов условия и реализовывать сложные алгоритмы проверки.

В операторе switch вычисляется одно выражение и сравнивается со значениями, заданными в блоках case. В случае совпадения выполняются операторы соответствующего блока case. Синтаксис этого оператора следующий:

switch (выражение) {

case значение1 :

[операторы1]

break;

case значение2 :

[операторы2]

break;

default :

[операторы]

}

Если значение выражения в блоке switch равно значение1, то выполняется группа операторов операторы1, если равно значение2, то выполняется группа операторов оператары2 и т.д. Если значение выражения не равняется ни одному из значений, заданных в блоках case, то вычисляется группа операторов блока default, если этот блок задан, иначе происходит выход из оператора switch.

Необязательный оператор break, задаваемый в каждом из блоков case, выполняет безусловный выход из оператора switch. Если он не задан, то продолжается выполнение операторов в следующих блоках case до первого оператора break или до конца тела оператора switch.

Операторы цикла

Оператор цикла повторно выполняет последовательность операторов JavaScript, определенных в его теле, пока не выполнится некоторое заданное условие. В языке существует два оператора цикла: for и while. Они отличаются механизмом организации цикла.

Оператор цикла for позволяет организовать выполнение блока операторов заданное число раз. Он определяет переменную, называемую переменной цикла, которая изменяет свое значение во время выполнения цикла. Условие завершения цикла зависит от значения этой переменной. Оператор имеет следующий синтаксис:

for ([инициал_выражение];[условие];[изменяющее_выражение]) {

[операторы]

}

Параметром инициал_выражение задается и инициализируется переменная цикла. Это выражение вычисляется один раз в начале выполнения цикла. После этого проверяется истинность выражения условие. Если оно истинно, то выполняется блок операторов тела цикла, ограниченного фигурными скобками; вычисляется изменяющее_выражение, содержащее переменную цикла, и снова проверяется истинность выражения условие. Если оно истинно, то повторяется цикл вычислений, если нет, то оператор цикла завершает свое выполнение.

Цикл while выполняется пока истинно выражение, задающее условие выполнения цикла. Его синтаксис следующий:

while (условие) {

[операторы]

}

Сначала проверяется истинность условия, заданного в заголовке цикла, а затем выполняются (или не выполняются) операторы тела цикла. Проверка истинности условия осуществляется на каждом шаге цикла. Использование этого цикла предполагает, что условное выражение окончания цикла меняется в зависимости от вычисленных значений переменных и выражений в теле цикла.

Иногда необходимо завершить цикл не по условию, задаваемому в заголовке цикла, а в результате вычисления некоторого условия в теле цикла. Для этой цели в JavaScript существуют операторы break и continue.

Оператор break завершает выполнение цикла и передает управление оператору, непосредственно следующим за оператором цикла. Оператор continue прекращает выполнение текущей итерации и начинает выполнение следующей, т.е. в цикле while он передает управление на проверку выражения условие цикла, а в цикле for – на вычисление выражения изменяющее_выражение.

Манипулирование объектами

Четыре оператора JavaScript предназначены для работы с объектами. Это оператор new, создающий новый объект, операторы for…in и with и ключевое слово this.

Оператор for…in позволяет организовать цикл по свойствам объекта JavaScript. Синтаксис его следующий:

for (переменная_цикла in объект) {

[операторы]

}

Этот цикл производит перебор свойств объекта. В переменной цикла на каждой итерации сохраняется значение свойства объекта. Количество итераций равно количеству свойств, существующих у заданного в заголовке цикла объекта.

Оператор with задает объект по умолчанию для блока операторов, определенных в его теле. Это означает, что все встречаемые в операторах этого блока свойства и методы, являются свойствами и методами указанного объекта. Применение данного оператора избавляет от необходимости указывать иерархию принадлежности объекта и сокращает исходный текст программы.

VBScript

Операторы сценария выполняются последовательно в том порядке, как они записаны. Изменить порядок выполнения операторов в VBScript можно операторами условия и цикла.

Операторы условия

Операторы принятия решения (условные операторы) выполняют определенные блоки операторов в зависимости от результатов проверки некоторого выражения или выражений. VBScript поддерживает следующие конструкции операторов принятия решения:

· if…then

· if…then…else

· select case

Конструкция if…then применяется, когда необходимо выполнить группу операторов или один оператор в зависимости от значения выражения, задаваемого в качестве параметра условия конструкции.

Ее первая форма

if условие then оператор

позволяет вычислить указанный оператор, если истинно заданное условие.

Вторая форма этой конструкции позволяет вычислить группу операторов, заданных в нескольких строках кода, и имеет следующий синтаксис:

if условие then

операторы

end if

Наиболее общий синтаксис конструкции if…then…else следующий:

if условие1 then

[группа-операторов-1]

[elseIf условие2 then

[группа-операторов-2]…

[else

[группа-операторов-n]]

end if

Сначала проверяется условие1. Если оно ложно, то проверяется условие2. Если и оно ложно, то проверяется следующее условие из группы elseIf до тех пор, пока не будет найдено истинное условие, операторы которого и выполняются. После чего управление передается оператору, непосредственно следующему за оператором end if.

Если не найдено ни одно истинное условие, то выполняется группа операторов из блока else, если он присутствует в конструкции. В противном случае управление передается оператору, следующему за оператором end if.

Блоков elseIf в конструкции if…then…else может быть сколько угодно, тогда как блок else всегда один, если он задан.

Если в предыдущей конструкции принятия решения проверяется равенство одного выражения разным условиям, она становится не достаточно эффективной как с точки зрения ее выполнения, так и сточки зрения легкости восприятия текста. В этом случае следует использовать конструкцию select case:

select case тестируемое_выражение

[case список_значений1

[группа-операторов-1]]

[case список_значений2

[группа-операторов-2]]

.

.

.

[case else

[группа-операторов-n]]

end select

Вычисляется единственное выражение тестируемое_выражение и последовательно сравнивается со значениями из списка значений блоков case. Если значение выражения совпадает со значением, заданным в списке какого-либо блока case, то выполняется группа операторов данного блока, и после этого управление передается оператору, непосредственно следующему за оператором end select.

Если не найдено ни одного соответствия значения тестируемого выражения со значениями из списков значений, то выполняется группа операторов блока case else (в случае его наличия).

Список значений блока case может состоять из одного или нескольких значений. В случае нескольких значений они разделяются запятыми.

Операторы цикла

Для повторного выполнения несколько раз группы операторов VBScript, как и любой другой язык программирования, предоставляет разнообразные типы операторов цикла:

· do…loop

· for…next

· for each…next

Конструкция do…loop применяется для выполнения группы операторов, пока некоторое выражение ложно или истинно. Она имеет несколько разновидностей, отличающихся моментом проверки условия завершения цикла (до начала выполнения группы операторов или после) и тем, истинно или ложно это условие.

Цикл do while выполняется до тех пор, пока истинно условие окончания цикла:

do while условие_окончания

группа-операторов

loop

Перед выполнением операторов цикла проверяется, истинно ли выражение условие_окончания. Если оно истинно, то выполняется группа-операторов (в ней изменяются значения переменных, входящих в выражение условие_окончания). После этого снова проверяется условие окончания цикла и, в случае его истинности, выполняется группа операторов тела цикла. Процедура выполняется до тех пор, пока выражение условие_окончания не станет ложным.

Цикл do while не будет выполнен ни разу, если при первой проверке условие_окончания ложно.

Другая разновидность цикла do while сначала выполняет группу операторов, а потом проверяет условие окончания цикла:

do

группа-операторов

loop while условие_окончания

Этот цикл обязательно выполнит один раз группу операторов, определенных в теле цикла.

Цикл do until аналогичен первой разновидности цикла do while, за исключением того, что он выполняется, пока значение выражения условие_окончания ложно:

do until условие_окончания

группа-операторов

loop

Этот цикл также может не выполниться ни одного раза, если при первой же проверке условия завершения цикла, оно оказывается истинным.

Во второй разновидности цикла do until условие окончания завершения цикла проверяется после выполнения группы операторов, и, таким образом, он обязательно выполнится хотя бы один раз:

do

группа-операторов

loop until условие_окончания

В циклах do…loop заранее не известно количество итераций повторения группы операторов, но иногда требуется выполнить точно заданное число повторений цикла. Такую возможность предоставляет цикл for…next.

В этом цикле задается переменная, называемая счетчиком цикла, которая увеличивается (или уменьшается) на заданную величину после выполнения группы операторов. Цикл завершает свои итерации, когда значение счетчика превысит (или станет меньше) заданной величины. Синтаксис такой конструкции цикла следующий:

for счетчик = нач_значение to кон_значение [step приращение]

операторы

next

В начале выполнения этого цикла переменной счетчик присваивается значение, заданное параметром нач_значение. Выполняются операторы цикла, и значение переменной цикла увеличивается или уменьшается (в зависимости от знака) на величину приращение. Осуществляется проверка, не превысило ли (или не стало меньше) новое значение счетчика значение параметра кон_значение. Если нет, то итерации повторяются, если да, то цикл завершает свое выполнение.

Параметр приращение цикла for…next является необязательным. Если он не задан, то по умолчанию переменная цикла увеличивается на 1.

Конструкция for each…next позволяет организовать цикл по элементам массива или по объектам некоторого набора (семейства) объектов, не зная заранее число элементов в массиве или число объектов в наборе. Синтаксис этой конструкции следующий:

for each элемент in группа

операторы

next

Параметр группа задает имя массива или имя набора объектов. Переменная элемент на каждом шаге цикла будет содержать ссылку на элемент массива или объект набора. Цикл завершает свое выполнение, как только завершится последовательный перебор всех элементов массива или объектов набора.

Процедуры

JavaScript

Процедура, или функция, – это именованная последовательность операторов, которая инициализируется и выполняется простой ссылкой на имя функции.

Процедура задается оператором function, имеющим следующий синтаксис:

function имя_функции ([параметры] {

[операторы]

}

где имя_функции – любое правильное имя языка JavaScript, параметры – список передаваемых в процедуру параметров, элементы которого отделяются запятыми.

Оператор function только определяет процедуру, но не выполняет ее. Для вызова процедуры достаточно указать ее имя с заданными в скобках параметрами.

Если в процедуре параметры отсутствуют, наличие скобок без параметров в операторе вызова процедуры обязательно.

Процедура может возвращать некоторое вычисляемое в ней значение. В этом случае обычно она называется функцией, и в операторах, определяющих последовательность выполняемых ею действий, обязательно должен присутствовать оператор return, задающий возвращаемое функцией значение. Вызов функции осуществляется аналогично вызову процедуры, но ее можно использовать в выражениях JavaScript.

Обычно все определения процедур и функции задаются в разделе <HEAD> документа. Это обеспечивает интерпретацию и сохранение в памяти всех процедур при загрузке документа в браузер.

VBScript

VBScript предусматривает создание двух типов процедур:

· Процедура sub

· Процедура function (или функция)

Процедура sub выполняет последовательность действий, но не возвращает никакого, значения, ассоциированного с ее именем. Она имеет следующий синтаксис:

sub имя_процедуры ([список-параметров])

операторы

end sub

Через необязательный параметр можно передать в процедуру внешние данные или, наоборот, получить некоторые вычисленные ею значения.

Вызов процедуры sub осуществляется оператором call, после которого указывается имя процедуры и в круглых скобках параметры. Процедуру можно вызвать и простым указанием ее имени, но в этом случае передаваемые ей параметры задаются без скобок. Следующие два способа вызова процедуры эквивалентны:

call MyProc(firstarg, secondarg)

MyProc firstarg, secondarg

Функция также выполняет определенную последовательность операторов и ей можно передать внешние данные через параметры процедуры, но, в отличие от процедуры sub, она возвращает значение, присваиваемое ее имени, и может быть использована в выражениях VBScript. Она имеет следующий синтаксис:

function имя_процедуры ([список-параметров])

операторы

имя_процедуры = значение

end function

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

VBScript предоставляет два способа передачи параметров в процедуру:

· По ссылке

· По значению

Способ передачи параметров по ссылке, применяемый по умолчанию, передает фактический адрес переменной, используемой в качестве параметра. Это позволяет изменить содержимое соответствующего адреса памяти, а тем самым, и значение переменной.

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

Объекты

JavaScript

На самом верхнем уровне иерархии находится объект window, представляющий окно браузера и являющийся “родителем” всех остальных объектов. Расположенные ниже в иерархии объекты могут иметь свои подчиненные объекты. На рис. 1 показана структура объектов клиента (браузера).

Рис. 1. Иерархия объектов JavaScript на стороне клиента

Особняком стоит объект navigator с двумя дочерними (подчиненными) объектами. Он относится к самому браузеру, и его свойства позволяют определить характеристики программы просмотра.

Каждая страница в добавление к объекту navigator обязательно имеет еще четыре объекта:

· window – объект верхнего уровня, свойства которого применяются ко всему окну, в котором отображается документ.

· document – свойства которого определяются содержимым самого документа: связи, цвет фона, формы и т.д.

· location – свойства которого связаны с URL-адресом отображаемого документа.

· history – представляет адреса ранее загружавшихся HTML-страниц.

Кроме указанных объектов страница может иметь дополнительные объекты, зависящие от ее содержимого, которые являются дочерними объектами объекта document. Если на страницы расположена форма, то все ее элементы являются дочерними объектами этой формы. Для задания точного имени объекта используется точечная нотация с полным указанием всей цепочки наследования объекта. Это возможно, так как объект верхнего уровня имеет свойство, значением которого является объект нижнего уровня. Ссылка на объект осуществляется по имени, заданному параметром NAME тэга HTML.

<FORM NAME=”form1”>

Фамилия: <INPUT TYPE = “text” name = “studentName” size = 20>

Курс: <INPUT TYPE = “text” name = “course” size = 2>

</FORM>

Для получения фамилии студента, введенного в первом поле ввода, в программе JavaScript следует использовать ссылку document.form1.studentName.value, а чтобы определить курс, на котором обучается студент, необходимо использовать ссылку document.form1.course.value.

VBScript

Во главе иерархии, как и в случае с Netscape Navigator, стоит объект window, представляющий окно браузера и порождающий все остальные объекты модели. При ссылке в программе на любой объект из иерархии можно не указывать “родительский” объект window.

Модель охватывает практически все элементы HTML-страницы. На рис. 2 показана иерархическая структура объектной модели, которая отражает подчиненность элементов страницы.

Рис . 2. Объектная модель MS Internet Explorer

Для каждого типа элементов в модели предусмотрены соответствующие наборы. Например, для объектов image, определяемых тэгами <IMG>, существует набор images. Ссылку на соответствующий объект можно определить с использованием имени объекта, задаваемого значением параметра NAME, или с помощью набора объектов, в данном случае images. В наборе объекты расположены в последовательности, в которой они задаются на HTML-странице.

Список литературы

1. Матросов А.В., Сергеев А.О, Чаунин М.П. HTML 4.0. – СПб.: БХВ-Петербург, 2000.

2. Кенин А.М., Печенкина Н.С. Новый уровень создания HTML-документов. – Екатеринбург: Деловая книга, 1996.

3. Дэвис С. Языки JavaScript и VBScript. – К.: Диалектика, 1996.

4. Микляев А. Основы HTML. – М.: Солон, 1998.

5. Зубкова С.В. Интерактивные Web-документы. – М.: ДМК Пресс, 2000.

6. Ратбон Э. JavaScript для чайников. – К.: Диалектика, 1995.

7. Ставровский А.Б. Учебник по VBScript. – K.: BHV, 2000.

www.ronl.ru


Смотрите также