Эта статья в значительной степени или полностью основана на одном источнике . ( июнь 2013 г. ) |
В этой статье используется разметка HTML . ( Февраль 2019 г. ) |
Сравнение языков программирования |
---|
|
|
|
Сравнение отдельных языков
|
Это сравнение языков программирования (массив) сравнивает особенности структур данных массива или матричной обработки для более чем 48 различных языков программирования .
Синтаксис [ править ]
Размеры массива [ править ]
Следующий список содержит примеры синтаксиса того, как определять размеры (индекс первого элемента, последнего элемента или размер в элементах).
Обратите особое внимание на то, что некоторые языки индексируют с нуля, а другие - с единицы. По крайней мере, со времени знаменитого эссе Дейкстры [1] индексирование с нуля считается лучшим, и новые языки, как правило, используют его.
Языки | Размер | Первый | Последний |
---|---|---|---|
Ада | имя 'Длина | имя 'Первый | имя 'Фамилия |
АЛГОЛ 68 | УПБ имя - LWB имя +1 2 УПБ имя - 2 LWB имя +1 и т.д. | Имя LWB 2 Имя LWB и т. Д. | Имя UPB 2 Название UPB |
APL | ⍴ имя (⍴ имя ) [ индекс ] | ⎕IO | (⍴ имя ) - ~ ⎕IO (⍴ имя ) [ индекс ] - ~ ⎕IO |
AWK | длина | 1 | Asorti |
C # , Visual Basic .NET , Windows PowerShell , F # | name .Length | имя .GetLowerBound ( измерение ) | имя .GetUpperBound ( измерение ) |
CFML | arrayLen ( имя ) имя .len () | 1 | имя .len () |
Ch | макс (форма ( имя )) | 0 | макс (форма ( имя )) - 1 |
Common Lisp | ( название длины ) | 0 | (1- (длина имени )) |
D | имя. длина | 0 | имя .length-1 $ -1 |
Фортран | РАЗМЕР ( имя ) | LBOUND ( имя ) | UBOUND ( имя ) |
Идти | len ( имя ) | 0 | len ( имя ) - 1 |
Haskell | rangeSize ( имя границы ) | fst ( название границы ) | snd ( название границы ) |
ISLISP | ( название длины ) | 0 | (1- (длина имени )) |
Кобра , D , Haxe , Java , JavaScript , Scala | имя. длина | 0 | имя. длина - 1 |
J | # имя | 0 | <: @ # имя |
Юлия | длина ( имя ) размер ( имя ) | 1 перв. (Топоры ( имя )) | конец последний. (оси ( имя )) |
Lingo | count ( имя ) | 1 | getLast ( имя ) |
LiveCode | длина ( имя ) | 1 первый | -1 последняя |
Lua | # имя | 1 условно; любое целое число [2] | # имя |
Mathematica | Длина [ имя ] | 1 Имя [ имя ] | -1 Фамилия [ имя ] |
MATLAB , GNU Octave | длина ( имя ) | 1 | конец |
Ним | имя .len | имя .low [3] | имя. высокий |
Оберон | LEN ( имя ) | 0 | LEN ( имя ) - 1 |
Object Pascal | Длина ( имя ) | 0 низкий ( имя ) | Длина ( имя ) -1 высокая ( имя ) |
Objective-C ( NSArray * только) | [ количество имен ] | 0 | [ количество имен ] - 1 |
OCaml | Имя массива. Длина | 0 | Имя массива. Длина - 1 |
Perl | скаляр (@ имя ) | $ [ | $ # имя |
PHP | count ( имя ) | 0 | count ( имя ) - 1 |
Python | len ( имя ) | 0 | -1 лен ( имя ) - 1 |
р | длина ( имя ) | 1 | длина ( имя ) |
Раку | @ имя .elems | 0 | @ имя. конец |
красный | длина? имя | Название / 1 первое имя | в прошлом имя |
Рубин | имя. размер | 0 имя .первый | -1 имя. Размер - 1 имя. Последнее |
Ржавчина | имя .len () | 0 | имя .len () - 1 |
Сленг | длина ( имя ) | 0 | -1 длина ( имя ) -1 |
Схема | (вектор длины вектора ) | 0 | (- (вектор длины вектора ) 1) |
Болтовня | размер имени | 1 имя сначала | Имя Размер Название последней |
Быстрый | имя. считать | 0 | имя. количество - 1 |
Visual Basic | UBound ( имя ) -LBound ( имя ) +1 | LBound ( имя ) | UBound ( имя ) |
Язык Wolfram Language | Длина [ имя ] | 1 Имя [ имя ] | -1 Фамилия [ имя ] |
Xojo | UBound ( имя ) | 0 | UBound ( имя ) |
XPath / XQuery | количество ($ имя ) | 1 | count ($ name ) last () массив: size ( name ) [4] |
Индексирование [ править ]
В следующем списке приведены примеры синтаксиса того, как получить доступ к отдельному элементу массива.
Формат | Языки |
---|---|
имя [ индекс ] или имя [ индекс 1 , индекс 2 ] и т. д. | АЛГОЛ 58 , АЛГОЛ 60 , АЛГОЛ 68 , AWK , Modula , Pascal , Object Pascal , C # , S-Lang [5] |
имя [ индекс ] или имя [ индекс 1 ; индекс 2 ] и т. д. или индекс ⌷ имя или индекс 1 индекс 2 ⌷ имя и т. д. | APL |
имя [ индекс ] | ActionScript , C , CFML , Ch , Cobra , C ++ , D , Go , Haxe , Java , JavaScript , Julia , Lingo , Lua , Nim , Objective-C ( NSArray * ), Perl , [5] PHP , Python , [5] R , Руби , [5] Ржавчина , Свифт |
$ имя [ индекс ] | Perl , [5] Windows PowerShell , [5] XPath / XQuery [4] |
@ имя [ индекс ] | Раку |
имя ( индекс ) или имя ( индекс 1 , индекс 2 ) и т. д. | Ада , АЛГОЛ W , BASIC , COBOL , Fortran , RPG , GNU Octave , MATLAB , PL / I , Scala , Visual Basic , Visual Basic .NET , Xojo |
$ имя ( индекс ) | XPath / XQuery [4] |
имя . ( индекс ) | OCaml |
имя . [ индекс ] | F # |
имя / индекс | красный |
имя ! показатель | Haskell |
$ name ? показатель | XPath / XQuery [4] |
( указатель имен векторных ссылок ) | Схема |
( индекс имени арефа ) | Common Lisp |
( указатель названия elt ) | ISLISP |
имя [[ индекс ]] | Mathematica , [5] Wolfram Language. |
имя в: index | Болтовня |
[ имя objectAtIndex: index ] | Objective-C ( NSArray * только) |
index { имя | J |
name.item (index) или name @ index [6] | Эйфелева |
Нарезка [ править ]
Следующий список содержит примеры синтаксиса того, как можно получить доступ к диапазону элементов массива.
В следующей таблице:
- first - индекс первого элемента в срезе
- last - индекс последнего элемента в срезе
- end - на единицу больше, чем индекс последнего элемента в срезе
- len - длина среза (= конец - первый)
- step - количество элементов массива в каждом (по умолчанию 1)
Формат | Языки |
---|---|
имя [ первое : последнее ] | АЛГОЛ 68 , [7] Юлия |
имя [ первый + (⍳ len ) -⎕IO] | APL |
имя [ первый : конец : шаг ] | Python [8] [9] |
имя [ первый : конец ] | Идти |
имя [ первый .. последний ] | Паскаль , Object Pascal , Delphi , Nim |
$ name [ первый .. последний ] | Windows PowerShell |
@ имя [ первый .. последний ] | Perl [10] |
имя [ первый .. последнее ] название [ первый ... конец ] имя [ первый , Len ] | Рубин [9] |
копия / часть пропустить имя first len | красный |
имя ( первый .. последний ) | Ада [7] |
Имя ( первый : последний ) | Фортран , [7] [8] GNU Octave , MATLAB [7] [10] |
имя [[ первый ;; последний ;; step ]] | Mathematica , [7] [8] [9] Wolfram Language |
имя [[ первый : последний ]] | С-Лэнг [7] [8] [10] |
имя . [ первый .. последний ] | F # |
имя .slice ( первый , конец ) | Haxe , JavaScript , Scala |
имя .slice (во- первых , len ) | CFML |
array_slice ( имя , первое , len ) | PHP [9] |
(субкв. название первый конец ) | Common Lisp |
(субкв. название первый конец ) | ISLISP |
Array.sub name first len | OCaml |
[ имя subarrayWithRange: NSMakeRange ( first , len )] | Objective-C ( NSArray * только) |
( первый ([+ i. @ (- ~) end ) { имя | J |
имя [ первый .. < конец ] имя [ первый ... последний ] | Быстрый |
имя copyFrom: first to: last name copyFrom: first count: len | Болтовня |
имя [ первый .. конец ] | D , C # [11] [12] |
имя [ первый .. конец ] имя [ первый .. = последний ] | Ржавчина |
имя [ первый : конец ] | Кобра |
Список перекрестных ссылок системы массивов [ править ]
Язык программирования | Базовый индекс по умолчанию | Указываемый тип индекса [13] | Уточняемый базовый индекс | Связанный чек | Многомерный | Динамического размера | Векторизованные операции |
---|---|---|---|---|---|---|---|
Ада | тип индекса [14] | да | да | проверил | да | init [15] | некоторые, другие определяемые [16] |
АЛГОЛ 68 | 1 | нет [17] | да | варьируется | да | да | определяемый пользователем |
APL | 1 | ? | 0 или 1 [18] | проверил | да | да | да |
AWK | 1 | да, неявно | нет | не отмечен | да, как строка с разделителями | да, перефразировал | нет |
БАЗОВЫЙ | 0 | ? | нет | проверил | нет | init [15] | ? |
C | 0 | нет | нет [19] | не отмечен | частично | init, [15] [20] куча [21] | нет |
Ch | 0 | нет | нет | проверил | да, также массив array [22] | init, [15] [20] куча [21] | да |
C ++ [16] | 0 | нет | нет [19] | не отмечен | да, также массив array [22] | куча [21] | нет |
C # | 0 | нет | частичный [23] | проверил | да | куча [21] [24] | да ( выбор LINQ ) |
CFML | 1 | нет | нет | проверил | да, также массив array [22] | да | нет |
КОБОЛ | 1 | нет [25] | нет | проверил | массив array [22] [26] | нет [27] | некоторые внутренние |
Кобра | 0 | нет | нет | проверил | массив массива [22] | куча | ? |
Common Lisp | 0 | ? | нет | проверено [28] | да | да | да (карта или карта-в) |
D | 0 | да [29] | нет | варьируется [30] | да | да | ? |
F # | 0 | нет | частичный [23] | проверил | да | куча [21] [24] | да (карта) |
FreeBASIC | 0 | нет | да | проверил | да | init, [15] init [31] | ? |
Фортран | 1 | да | да | варьируется [32] | да | да | да |
FoxPro | 1 | ? | нет | проверил | да | да | ? |
Идти | 0 | нет | нет | проверил | массив массива [22] | нет [33] | нет |
Взломать | 0 | да | да | проверил | да | да | да |
Haskell | 0 | да [34] | да | проверил | да, также массив array [22] | init [15] | ? |
IDL | 0 | ? | нет | проверил | да | да | да |
ISLISP | 0 | ? | нет | проверил | да | init [15] | да (карта или карта-в) |
J | 0 | ? | нет | проверил | да | да | да |
Java [16] | 0 | нет | нет | проверил | массив массива [22] | init [15] | ? |
JavaScript | 0 | нет | нет | проверено [35] | массив массива [22] | да | да |
Юлия | 1 | да | да | проверил | да | да | да |
Lingo | 1 | ? | ? | не отмечен | да | да | да |
Lua | 1 | ? | частичный [36] | проверил | массив массива [22] | да | ? |
Mathematica | 1 | нет | нет | проверил | да | да | да |
MATLAB | 1 | ? | нет | проверил | да [37] | да | да |
Ним | 0 | да [38] | да | необязательный [39] | массив массива [22] | да | да [40] |
Оберон | 0 | ? | нет | проверил | да | нет | ? |
Оберон-2 | 0 | ? | нет | проверил | да | да | ? |
Objective-C [16] | 0 | нет | нет | проверил | массив массива [22] | да | нет |
OCaml | 0 | нет | нет | проверено по умолчанию | массив массива [22] | init [15] | ? |
Паскаль , Object Pascal | тип индекса [14] | да | да | варьируется [41] | да | варьируется [42] | немного |
Perl | 0 | нет | да ( $[ ) | проверено [35] | массив массива [22] | да | нет [43] |
Раку | 0 | нет | нет | проверено [35] | да | да | да |
PHP | 0 | да [44] | да [44] | проверил [44] | да | да | да |
PL / I | 1 | ? | да | проверил | да | нет | ? |
Python | 0 | нет | нет | проверил | массив массива [22] | да | нет [45] |
РПГ | 1 | нет | нет | ? | нет | нет | ? |
р | 1 | ? | ? | ? | ? | ? | ? |
Звенеть | 1 | ? | частичный [36] | проверил | массив массива [22] | да | ? |
Рубин | 0 | нет | нет | проверено [35] | массив массива [22] | да | ? |
Ржавчина | 0 | нет | нет | проверил | да | ? | ? |
Sass | 1 | нет | нет | проверил | массив массива [22] | init [30] | ? |
Сленг | 0 | ? | нет | проверил | да | да | да |
Scala | 0 | нет | нет | проверил | массив массива [22] | init [15] | да (карта) |
Схема | 0 | ? | нет | проверил | массив массива [22] | init [15] | да (карта) |
Smalltalk [16] | 1 | ? | нет | проверил | массив массива [22] | да [46] | ? |
Быстрый | 0 | нет | нет | проверил | массив массива [22] | да | ? |
Visual Basic | 0 | нет | да | проверил | да | да | ? |
Visual Basic .NET | 0 | нет | частичный [23] | проверил | да | да | да ( выбор LINQ ) |
Язык Wolfram Language | 1 | нет | нет | проверил | да | да | да |
Windows PowerShell | 0 | нет | нет | проверил | да | куча | ? |
Xojo | 0 | нет | нет | проверил | да | да | нет |
XPath / XQuery | 1 | нет | нет | проверил | массив из array [4] [22] | да | да |
Язык программирования | Базовый индекс по умолчанию | Указываемый тип индекса [13] | Уточняемый базовый индекс | Связанный чек | Многомерный | Динамического размера | Векторизованные операции |
Операции с векторизованными массивами [ править ]
Некоторые компилируемые языки, такие как Ada и Fortran , и некоторые языки сценариев, такие как IDL , MATLAB и S-Lang , имеют встроенную поддержку векторизованных операций с массивами. Например, чтобы выполнить поэлементную сумму двух массивов, a и b, чтобы получить третий c , необходимо только написать
с = а + Ь
Помимо поддержки векторизованных арифметических и реляционных операций, эти языки также векторизуют общие математические функции, такие как синус. Например, если x - массив, то
у = грех (х)
приведет к массиву y , элементы которого являются синусами соответствующих элементов массива x .
Также поддерживаются операции с векторизованным индексом. Например,
четное = х ( 2 :: 2 ); нечетное = х ( :: 2 );
это то, как можно было бы использовать Fortran для создания массивов из четных и нечетных записей массива. Еще одно распространенное использование векторизованных индексов - это операция фильтрации. Рассмотрим операцию ограничения синусоидальной волны, когда амплитуды больше 0,5 должны быть установлены на 0,5. Используя S-Lang , это можно сделать с помощью
у = грех (х); y [где (abs (y)> 0,5)] = 0,5;
Математические матричные операции [ править ]
Язык / Библиотека | Создавать | Детерминант | Транспонировать | Элемент | Столбец | Строка | Собственные значения |
---|---|---|---|---|---|---|---|
APL | м ← размеры⍴x11 x12 ... | -. × м | ⍉m | m [i; j] или ij⌷m | m [; j] или j⌷ [2] m или j⌷⍉m | m [i;] или i⌷m | ⌹⍠1⊢м |
Фортран | m = ИЗМЕНИТЬ ([x11, x12, ...], ФОРМА (м)) | ТРАНСПОРТ | м (я, j) | м (:, j) | м (я, :) | ||
Ch [47] | m = {... } | определитель | транспонировать | м [i-1] [j-1] | форма | форма | собственный |
Mathematica | m = {{x11, x12, ...}, ... } | Дет [м] | Транспонировать | м [[i, j]] | м [[;;, j]] | м [[i]] | Собственные значения |
MATLAB / GNU Octave | m = [...] | det (м) | м. ' | м (я, j) | м (:, j) | м (я, :) | eig (м) |
NumPy | м = мат (...) | linalg.det (м) | mT | м [i-1, j-1] | м [:, j-1] | м [i-1 ,:] | linalg.eigval (м) |
Сленг | m = изменить форму | m = транспонировать | m [i, j] | м [*, j] | м [j, *] | ||
SymPy | m = Матрица (...) | mT | м [i-1, j-1] | ||||
Язык Wolfram Language | m = {{x11, x12, ...}, ... } | Дет [м] | Транспонировать | м [[i, j]] | м [[;;, j]] | м [[i]] | Собственные значения |
Ссылки [ править ]
- ^ https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
- ^ https://www.lua.org/pil/11.1.html
- ^ https://nim-lang.org/docs/tut1.html#advanced-types-arrays
- ^ a b c d e XPath / XQuery имеет два типа массивов. Последовательности (1,2,3), которые не могут быть вложены, и в массивы массивов версии XPath / XQuery 3.1 {1,2,3 } или [1,2,3], которые могут.
- ^ a b c d e f g Индекс может быть отрицательным числом, указывающим соответствующее количество разрядов перед концом массива.
- ^ http://smarteiffel.loria.fr/libraries/api/lib.d/storage.d/loadpath.se.d/collection.d/ARRAY/ANY.html
- ^ a b c d e f Срезы для многомерных массивов также поддерживаются и определяются аналогично.
- ^ a b c d Также поддерживаются срезы этого типа .
first:last:step
- ^ a b c d last или end может быть отрицательным числом, указывающим на остановку на соответствующем количестве мест перед концом массива.
- ^ a b c В более общем смысле, для одномерных массивов Perl и S-Lang допускают срезы формы , где может быть диапазон, указанный в сноске 2, или явный список индексов, например, ' ', или сочетание того и другого. , например, .
array[indices]
indices
[0,9,3,4]
A[[[0:3]],7,9,[11:2:-3]]]
- ^ Предлагаемая функция C # 8.0 (по состоянию на 29 августа 2019 г.[Обновить])
- ^ «Диапазоны - языковые предложения C # 8.0» . Документы Microsoft . Microsoft . Проверено 29 августа 2019 .
- ^ a b Тип индекса может быть произвольно выбранным целочисленным типом , нумерованным типом или символьным типом . Для массивов с некомпактными типами индекса см .: Ассоциативный массив
- ^ a b Базовый индекс по умолчанию - это наименьшее значение используемого типа индекса.
- ^ a b c d e f g h i j k Размер может быть выбран только при инициализации, после которой он фиксируется
- ^ a b c d e В этом списке строго сравниваются языковые особенности. На любом языке (даже на ассемблере) можно улучшить обработку массивов с помощью дополнительных библиотек. В этом языке улучшена обработка массивов как часть стандартной библиотеки.
- ^ Массивы ALGOL 68 должны быть разделены индексами (и нарезаны) по типу INT . Однако хеш-функция может использоваться для преобразования других типов в INT . например, имя [ хеш ("строка") ]
- ^ База индексации может быть 0 или 1 в соответствии с системной переменной ⎕IO . Это значение может применяться ко всей «рабочей области» или быть локализовано для пользовательской функции или отдельной примитивной функции с помощью оператора Variant ( ⍠ ).
- ^ a b Поскольку C не выполняет привязку индексов, может быть определен указатель на внутреннюю часть любого массива, который будет символически действовать как псевдо-массив, вмещающий отрицательные индексы или любое целочисленное начало индекса.
- ^ a b C99 позволяет использовать массивы переменного размера; однако компилятора для поддержки этой новой функции почти нет.
- ^ a b c d e Размер может быть выбран только при инициализации, когда память выделяется в куче, в отличие от того, когда она выделяется в стеке. Это примечание не нужно делать для языка, который всегда выделяет массивы в куче.
- ^ a b c d e f g h i j k l m n o p q r s t u v w Позволяет использовать массивы массивов, которые можно использовать для эмуляции большинства, но не всех аспектов многомерных массивов
- ^ a b c Базу можно изменить при инициализации с помощью System.Array.CreateInstance (которая возвращает System.Array ), но не при использовании синтаксиса языка. Массивы с ненулевыми базовыми индексами не относятся к тому же типу, что и массивы с нулевыми базовыми индексами, и ими нельзя управлять с помощью синтаксиса языка ( вместо этого должны использоваться методы GetValue и SetValue ) или приведением к определенному типу ( T [] в C # или T () в VB.NET), предотвращая поломку кода, предполагающего нулевые базовые индексы.
- ^ a b Позволяет создавать массивы фиксированного размера в «небезопасном» коде, обеспечивая улучшенную совместимость с другими языками.
- ^ Массивы COBOL могут быть проиндексированы типами "INDEX", отличными от целочисленных типов.
- ^ В то время как COBOL имеет только массивы-массивы, к элементам массива можно получить доступ с помощью синтаксиса, подобного многомерному массиву, где язык автоматически сопоставляет индексы с массивами, содержащими элемент, на который ссылается
- ^ COBOL предоставляет способ указать, что используемый размер массива является переменным, но он никогда не может быть больше объявленного максимального размера, который также является выделенным размером
- ^ Большинство распространенных реализаций Lisp позволяют выборочно отключать проверку
- ^ Ассоциативные массивы - язык программирования D
- ^ a b Поведение можно настроить с помощью переключателей компилятора. Как и в DMD 1.0, границы проверяются в режиме отладки и не проверяются в режиме выпуска для эффективности.
- ^ FreeBASIC поддерживает как массивы переменной длины, так и массивы фиксированной длины. Массивы, объявленные без диапазона индексов, создаются как массивы переменной длины, в то время как массивы с объявленным диапазоном создаются как массивы фиксированной длины.
- ^ Почти все реализации Fortran предлагают опции проверки границ с помощью переключателей компилятора. Однако по умолчанию проверка границ обычно отключена для повышения эффективности.
- ^ Хотя тип Golang Array не имеет динамического размера, тип данных Slice имеет динамический размер и используется гораздо чаще, чем массивы.
- ^ Массивы Haskell (Data.Array) позволяют использовать в качестве типа индекса любой тип, являющийся экземпляром Ix. Таким образом, пользовательский тип может быть определен и использован в качестве типа индекса, если он содержит Ix. Кроме того, кортежи типов Ix также являются типами Ix; это обычно используется для реализации многомерных массивов
- ^ a b c d В этих языках можно получить доступ или записать индекс массива, больший или равный длине массива, и массив будет неявно увеличиваться до этого размера. Сначала может показаться, что границы не проверяются; однако границы проверяются, чтобы принять решение о росте массива, и у вас нет небезопасного доступа к памяти, как в C
- ^ a b Указав базовый индекс, можно создавать массивы с произвольной базой. Однако по умолчанию оператор длины Lua не учитывает базовый индекс массива при вычислении длины. Это поведение можно изменить с помощью метаметодов.
- ^ Минимум 2 измерения (скалярные числа - это массивы 1 × 1, векторы - это массивы 1 × n или n × 1)
- ^ https://nim-lang.org/docs/tut1.html#advanced-types-arrays
- ^ https://nim-lang.org/docs/nimc.html
- ^ https://stackoverflow.com/questions/53084192/r-style-logical-vector-operation-in-nim
- ^ Многие реализации (Turbo Pascal, Object Pascal (Delphi), FreePascal) позволяют изменять поведение с помощью переключателей компилятора и встроенных директив
- ^ Зависит от реализации. Новые реализации (FreePascal, Object Pascal (Delphi)) позволяют использовать динамические массивы на основе кучи.
- ^ Стандартныетипы данных массивов Perl не поддерживают векторизованные операции, как определено здесь. Однакорасширение Perl Data Language добавляет объекты массивов с этой возможностью.
- ^ a b c "Массивы" PHP - это ассоциативные массивы. В качестве ключей (индексов) можно использовать целые числа и строки; В качестве ключа также можно использовать числа с плавающей запятой, но они усекаются до целых чисел. На самом деле нет никакого "базового индекса" или "границ"
- ^ Стандартныйтип массива Python ,,
list
не поддерживает векторизованные операции, как определено здесь. Однакорасширение numpy добавляет объекты массива с этой возможностью - ^ Класс Array имеет фиксированный размер, но OrderedCollection является динамическим.
- ^ Ch числовые особенности