Сравнение языков программирования (массив) - Comparison of programming languages (array)

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

Синтаксис

Размеры массива

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

Обратите особое внимание на то, что некоторые языки индексируют с нуля, а другие - с единицы. По крайней мере, после знаменитого эссе Дейкстры,[1] Индексирование с нулевым отсчетом считается лучшим, и новые языки склонны его использовать.

ЯзыкиРазмерПервыйПоследний
Адаимя'Длинаимя'Первыйимя'Последний
АЛГОЛ 68UPB имя - LWB имя+1
2 UPB имя - 2 LWB имя+1
и Т. Д.
LWB имя
2 LWB имя
и Т. Д.
UPB имя

2 UPB имя
и Т. Д.

APLимя
(⍴ имя)[индекс]
⎕IO(⍴ имя) - ~ ⎕IO
(⍴ имя)[индекс] - ~ ⎕IO
AWKдлина1Asorti
C #, Visual Basic .NET, Windows PowerShell, F #имя.Длинаимя.GetLowerBound (измерение)имя.GetUpperBound (измерение)
CFMLarrayLen (имя)
имя.len ()
1имя.len ()
Chмакс (форма (имя))0макс (форма (имя))-1
Common Lisp(длина имя)0(1- (длина имя))
Dимя.длина0имя.length-1
$-1
ФортранРАЗМЕР(имя)LBOUND (имя)UBOUND (имя)
Идтиlen (имя)0len (имя) - 1
HaskellrangeSize (границы имя)fst (границы имя)snd (границы имя)
ISLISP(длина имя)0(1- (длина имя))
Кобра, D, Haxe, Ява, JavaScript, Scalaимя.длина0имя.length - 1
J#имя0<:@#имя
Юлядлина(имя)
размер(имя)
1
первый. (топоры (имя))
конец
последний. (топоры (имя))
Lingoсчитать(имя)1getLast (имя)
LiveCodeдлина(имя)1
первый
-1
последний
Lua#имя1 условно; любое целое число[2]#имя
MathematicaДлина[имя]1
Первый[имя]
-1
Последний[имя]
MATLAB, GNU Octaveдлина(имя)1конец
Нимимя.lenимя.низкий[3]имя.высоко
ОберонLEN (имя)0LEN (имя) - 1
Object PascalДлина(имя)0
низкий(имя)
Длина(имя)-1
высоко(имя)
Цель-C (NSArray * Только)[имя считать]0[имя count] - 1
OCamlArray.length имя0Array.length имя - 1
Perlскаляр (@имя)$[$#имя
PHPсчитать($имя)0считать($имя) - 1
Pythonlen (имя)0-1
len (имя) - 1
рдлина(имя)1длина(имя)
Раку@имя.elems0@имя.конец
красныйдлина? имяимя/1
первый имя
последний имя
Рубинимя.размер0
имя.первый
-1
имя. размер - 1
имя.последний
Ржавчинаимя.len ()0имя.len () - 1
Сленгдлина(имя)0-1
длина(имя)-1
Схема(длина вектора вектор)0(- (длина вектора вектор) 1)
Болтовняимя размер1
имя первый
имя размер
имя последний
Быстрыйимя.считать0имя.количество - 1
Visual BasicUBound (имя) -LBound (имя)+1LBound (имя)UBound (имя)
Язык Wolfram LanguageДлина[имя]1
Первый[имя]
-1
Последний[имя]
XojoUBound (имя)0UBound (имя)
XPath /XQuerycount ($имя)1count ($имя)
последний()
массив: размер (имя)[4]

Индексирование

В следующем списке приведены примеры синтаксиса того, как получить доступ к одному элементу массива.

ФорматЯзыки
имя[индекс] или имя[индекс1, индекс2] и Т. Д.АЛГОЛ 58, АЛГОЛ 60, АЛГОЛ 68, AWK, Modula, Паскаль, Object Pascal, C #, Сленг[5]
имя[индекс] или имя[индекс1; индекс2] и Т. Д.
или индексимя или индекс1 индекс2имя и т. д.
APL
имя[индекс]ActionScript, C, CFML, Ch, Кобра, C ++, D, Идти, Haxe, Ява, JavaScript, Юля, Lingo, Lua, Ним, Цель-C (NSArray *), Perl,[5] Python,[5] р, Рубин,[5] Ржавчина, Быстрый
$имя[индекс]Perl,[5] PHP, Windows PowerShell,[5] XPath /XQuery[4]
@имя[индекс]Раку
имя(индекс) или имя(индекс1, индекс2) и Т. Д.Ада, АЛГОЛ W, БАЗОВЫЙ, КОБОЛ, Фортран, РПГ, GNU Octave, MATLAB, PL / I, Scala, Visual Basic, Visual Basic .NET, Xojo
$имя(индекс)XPath /XQuery[4]
имя.(индекс)OCaml
имя.[индекс]F #
имя / индекскрасный
имя ! индексHaskell
$имя ? индексXPath /XQuery[4]
(вектор-ссылка указатель имени)Схема
(ареф указатель имени)Common Lisp
(elt указатель имени)ISLISP
имя[[индекс]]Mathematica,[5] Язык Wolfram Language
имя в:индексБолтовня
[имя objectAtIndex:индекс]Цель-C (NSArray * Только)
индекс{имяJ
name.item (index) или name @ index[6]Эйфель

Нарезка

В следующем списке приведены примеры синтаксиса того, как можно получить доступ к диапазону элементов массива.

В следующей таблице:

  • первый - индекс первого элемента в срезе
  • последний - индекс последнего элемента в срезе
  • конец - на единицу больше, чем индекс последнего элемента в срезе
  • len - длина ломтика (= конец - первый)
  • шаг - количество элементов массива в каждом (по умолчанию 1)
ФорматЯзыки
имя[первый:последний]АЛГОЛ 68,[7] Юля
имя[первый+(⍳len) -⎕IO]APL
имя[первый:конец:шаг]Python[8][9]
имя[первый:конец]Идти
имя[первый..последний]Паскаль, Object Pascal, Delphi, Ним
$имя[первый..последний]Windows PowerShell
@имя[первый..последний]Perl[10]
имя[первый..последний]
имя[первый...конец]
имя[первый, len]
Рубин[9]
копия / часть пропустить имя first lenкрасный
имя(первый..последний)Ада[7]
имя(первый:последний)Фортран,[7][8] GNU Octave, MATLAB[7][10]
имя[[первый;;последний;;шаг]]Mathematica,[7][8][9] Язык Wolfram Language
имя[[первый:последний]]Сленг[7][8][10]
имя.[первый..последний]F #
имя.ломтик(первый, конец)Haxe, JavaScript, Scala
имя.ломтик(первый, len)CFML
array_slice (имя, первый, len)PHP[9]
(далее имя первый конец)Common Lisp
(далее имя первый конец)ISLISP
Array.sub имя первое ленOCaml
[имя subarrayWithRange: NSMakeRange (первый, len)]   Цель-C (NSArray * Только)
(первый([+ i. @ (- ~)конец){имяJ
имя[первый..<конец]
имя[первый...последний]
Быстрый
имя copyFrom: первый к:последний
имя copyFrom: первый считать:len
Болтовня
имя[первый..конец]D, C #[11][12]
имя[первый..конец]
имя[первый..=последний]
Ржавчина
имя[первый:конец]Кобра

Список перекрестных ссылок системы массивов

Язык программированияБазовый индекс по умолчаниюУказанный тип индекса[13]Указанный базовый индексСвязанный чекМногомерныйДинамического размераВекторизованные операции
Адатип индекса[14]дадапроверилдав этом[15]некоторые, другие определяемые[16]
АЛГОЛ 681нет[17]даварьируетсядадаопределяемый пользователем
APL1?0 или 1[18]проверилдадада
AWK1да, неявнонетне отмеченда, как строка с разделителямида, перефразировалнет
БАЗОВЫЙ0?нетпроверилнетв этом[15]?
C0нетнет[19]не отмеченчастичнов этом,[15][20] куча[21]нет
Ch0нетнетпроверилда, также массив массива[22]в этом,[15][20] куча[21]да
C ++[16]0нетнет[19]не отмеченда, также массив массива[22]куча[21]нет
C #0нетчастичный[23]проверилдакуча[21][24]да (LINQ Выбрать)
CFML1нетнетпроверилда, также массив массива[22]данет
КОБОЛ1нет[25]нетпроверилмассив массива[22][26]нет[27]некоторые внутренние
Кобра0нетнетпроверилмассив массива[22]куча?
Common Lisp0?нетпроверил[28]дадада (карта или карта-в)
D0да[29]нетварьируется[30]дада?
F #0нетчастичный[23]проверилдакуча[21][24]да (карта)
FreeBASIC0нетдапроверилдав этом,[15] в этом[31]?
Фортран1дадаварьируется[32]дадада
FoxPro1?нетпроверилдада?
Идти0нетнетпроверилмассив массива[22]нет[33]нет
Взломать0дадапроверилдадада
Haskell0да[34]дапроверилда, также массив массива[22]в этом[15]?
IDL0?нетпроверилдадада
ISLISP0?нетпроверилдав этом[15]да (карта или карта-в)
J0?нетпроверилдадада
Ява[16]0нетнетпроверилмассив массива[22]в этом[15]?
JavaScript0нетнетпроверил[35]массив массива[22]дада
Юля1дадапроверилдадада
Lingo1??не отмечендадада
Lua1?частичный[36]проверилмассив массива[22]да?
Mathematica1нетнетпроверилдадада
MATLAB1?нетпроверилда[37]дада
Ним0да[38]данеобязательный[39]массив массива[22]дада[40]
Оберон0?нетпроверилданет?
Оберон-20?нетпроверилдада?
Цель-C[16]0нетнетпроверилмассив массива[22]данет
OCaml0нетнетпроверено по умолчаниюмассив массива[22]в этом[15]?
Паскаль, Object Pascalтип индекса[14]дадаварьируется[41]даварьируется[42]немного
Perl0нетда ($[)проверил[35]массив массива[22]данет[43]
Раку0нетнетпроверил[35]дадада
PHP0да[44]да[44]проверил[44]дадада
PL / I1?дапроверилданет?
Python0нетнетпроверилмассив массива[22]данет[45]
РПГ1нетнет?нетнет?
р1??????
Звенеть1?частичный[36]проверилмассив массива[22]да?
Рубин0нетнетпроверил[35]массив массива[22]да?
Ржавчина0нетнетпроверилда??
Sass1нетнетпроверилмассив массива[22]в этом[30]?
Сленг0?нетпроверилдадада
Scala0нетнетпроверилмассив массива[22]в этом[15]да (карта)
Схема0?нетпроверилмассив массива[22]в этом[15]да (карта)
Болтовня[16]1?нетпроверилмассив массива[22]да[46]?
Быстрый0нетнетпроверилмассив массива[22]да?
Visual Basic0нетдапроверилдада?
Visual Basic .NET0нетчастичный[23]проверилдадада (LINQ Выбрать)
Язык Wolfram Language1нетнетпроверилдадада
Windows PowerShell0нетнетпроверилдакуча?
Xojo0нетнетпроверилдаданет
XPath /XQuery1нетнетпроверилмассив массива[4][22]дада
Язык программированияБазовый индекс по умолчаниюУказанный тип индекса[13]Указанный базовый индексСвязанный чекМногомерныйДинамического размераВекторизованные операции

Операции с векторизованными массивами

Некоторые компилируемые языки, такие как Ада и Фортран, и некоторые языки сценариев, такие как IDL, MATLAB, и Сленг, имеют встроенную поддержку векторизованных операций с массивами. Например, чтобы выполнить поэлементную сумму двух массивов, а и б произвести третий c, нужно только написать

 с = а + Ь

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

 у = грех (х)

приведет к массиву у элементы которого являются синусами соответствующих элементов массива Икс.

Также поддерживаются операции векторизованного индекса. В качестве примера,

 четное = Икс(2::2); странный = Икс(::2);

как можно было бы использовать Фортран для создания массивов из четных и нечетных записей массива. Еще одно распространенное использование векторизованных индексов - это операция фильтрации. Рассмотрим операцию ограничения синусоидальной волны, при которой амплитуды больше 0,5 должны быть установлены на 0,5. С помощью Сленг, это можно сделать

 у = грех (х); y [где (abs (y)> 0,5)] = 0,5;

Математические матричные операции

Язык/
Библиотека
СоздаватьДетерминантТранспонироватьЭлементСтолбецРядСобственные значения
APLм ← размеры⍴x11 x12 ...-. × м⍉mm [i; j] или же я jmм [; j] или же j⌷ [2] м или же j⌷⍉mm [i;] или же я⌹⍠1⊢м
Фортранm = ИЗМЕНИТЬ ([x11, x12, ...], ФОРМА (м))ТРАНСПОРТИРОВКА(м)м (я, j)м (:, j)м (я, :)
Ch [47]m = {...}детерминант(м)транспонировать(м)м [i-1] [j-1]форма(м, 0)форма(м, 1)собственный(выход, м, NULL)
Mathematicam = {{x11, x12, ...}, ...}Дет [м]Транспонировать[м]м [[i, j]]м [[;;, j]]м [[i]]Собственные значения[м]
MATLAB /
GNU Octave
m = [...]det (м)м. 'м (я, j)м (:, j)м (я, :)eig (м)
NumPyм = мат (...)linalg.det (м)m.Tм [i-1, j-1]м [:, j-1]м [i-1 ,:]linalg.eigval (м)
Сленгm = изменить форму([x11, x12, ...], [новые-тусклые])m = транспонировать(м)m [i, j]м [*, j]м [j, *]
SymPym = Матрица (...)m.Tм [i-1, j-1]
Язык Wolfram Languagem = {{x11, x12, ...}, ...}Дет [м]Транспонировать[м]м [[i, j]]м [[;;, j]]м [[i]]Собственные значения[м]

Рекомендации

  1. ^ https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
  2. ^ https://www.lua.org/pil/11.1.html
  3. ^ https://nim-lang.org/docs/tut1.html#advanced-types-arrays
  4. ^ а б c d е XPath / XQuery имеет два типа массивов. Последовательности (1,2,3) который не может быть вложенным и в версии XPath / XQuery 3.1 массивы массив {1,2,3 } или же [1,2,3] которые могут.
  5. ^ а б c d е ж грамм Индекс может быть отрицательным числом, указывающим соответствующее количество разрядов перед концом массива.
  6. ^ http://smarteiffel.loria.fr/libraries/api/lib.d/storage.d/loadpath.se.d/collection.d/ARRAY/ANY.html
  7. ^ а б c d е ж Срезы для многомерных массивов также поддерживаются и определяются аналогично.
  8. ^ а б c d Ломтики типа первый:последний:шаг также поддерживаются.
  9. ^ а б c d последний или же конец может быть отрицательным числом, указывающим на остановку на соответствующем количестве разрядов до конца массива.
  10. ^ а б c В более общем смысле, для одномерных массивов Perl и Сленг разрешить ломтики формымножество[индексы], куда индексы может быть диапазон, упомянутый в сноске 2, или явный список индексов, например, '[0,9,3,4]'или их сочетание, например, А [[[0: 3]], 7,9, [11: 2: -3]]].
  11. ^ Предлагаемая функция C # 8.0 (по состоянию на 29 августа 2019 г.)
  12. ^ «Диапазоны - языковые предложения C # 8.0». Документы Microsoft. Microsoft. Получено 29 августа 2019.
  13. ^ а б Тип индекса может быть произвольно выбран целочисленный тип, перечислимый тип, или же тип персонажа. Для массивов с некомпактными индексными типами см .: Ассоциативный массив
  14. ^ а б Базовый индекс по умолчанию - это наименьшее значение используемого типа индекса.
  15. ^ а б c d е ж грамм час я j k Размер можно выбрать только при инициализации, после чего он будет исправлен.
  16. ^ а б c d е Этот список строго сравнивает языковые особенности. На любом языке (даже на ассемблере) можно улучшить обработку массивов с помощью дополнительных библиотек. В этом языке улучшена обработка массивов как часть стандартной библиотеки.
  17. ^ Массивы ALGOL 68 должны быть разделены индексами (и нарезаны) по типу. INT. Однако хеш-функция может использоваться для преобразования других типов в INT. например имя[хэш ("строка")]
  18. ^ База индексации может быть 0 или 1 в соответствии с системной переменной. ⎕IO. Это значение может применяться ко всей «рабочей области» или быть локализовано для пользовательской функции или отдельной примитивной функции с помощью оператора Variant ()
  19. ^ а б Поскольку C не выполняет привязку индексов, может быть определен указатель на внутреннюю часть любого массива, который будет символически действовать как псевдо-массив, вмещающий отрицательные индексы или любое целочисленное начало индекса.
  20. ^ а б C99 позволяет использовать массивы переменного размера; однако компилятора для поддержки этой новой функции почти нет.
  21. ^ а б c d е Размер может быть выбран только при инициализации, когда память выделяется в куче, в отличие от того, когда она выделяется в стеке. Это замечание не нужно делать для языка, который всегда выделяет массивы в куче.
  22. ^ а б c d е ж грамм час я j k л м п о п q р s т ты v ш Позволяет создавать массивы массивов, которые можно использовать для имитации большинства - но не всех - аспектов многомерных массивов.
  23. ^ а б c Базу можно изменить при инициализации с помощью System.Array.CreateInstance (который возвращает System.Array), но не при использовании синтаксиса языка. Массивы с ненулевыми базовыми индексами не того же типа, что и с нулевыми базовыми индексами, и ими нельзя управлять с помощью синтаксиса языка ( GetValue и SetValue вместо этого должны использоваться методы) или приведение к определенному типу (Т [] в C # или Т () в VB.NET), предотвращая поломку кода, предполагающего нулевые базовые индексы.
  24. ^ а б Позволяет создавать массивы фиксированного размера в «небезопасном» коде, позволяя расширять совместимость с другим языком
  25. ^ Массивы COBOL можно индексировать с помощью типов "INDEX", отличных от целочисленных типов.
  26. ^ В то время как COBOL имеет только массивы-массивы, к элементам массива можно получить доступ с помощью синтаксиса, подобного многомерному массиву, где язык автоматически сопоставляет индексы с массивами, содержащими элемент, на который ссылаются.
  27. ^ COBOL предоставляет способ указать, что используемый размер массива является переменным, но он никогда не может быть больше заявленного максимального размера, который также является выделенным размером.
  28. ^ Большинство реализаций Common Lisp позволяют выборочно отключать проверку
  29. ^ Ассоциативные массивы - язык программирования D
  30. ^ а б Поведение можно настроить с помощью переключателей компилятора. Как и в DMD 1.0, границы проверяются в режиме отладки и не проверяются в режиме выпуска для эффективности.
  31. ^ FreeBASIC поддерживает массивы как переменной длины, так и массивы фиксированной длины. Массивы, объявленные без диапазона индексов, создаются как массивы переменной длины, а массивы с объявленным диапазоном создаются как массивы фиксированной длины.
  32. ^ Почти все реализации Fortran предлагают опции проверки границ через переключатели компилятора. Однако по умолчанию проверка границ обычно отключена для повышения эффективности.
  33. ^ Хотя тип массива Голанга не имеет динамического размера, тип данных Ломтик имеет динамический размер и используется гораздо чаще, чем массивы.
  34. ^ Массивы Haskell (Data.Array) позволяют использовать любой тип, являющийся экземпляром Ix, в качестве типа индекса. Таким образом, пользовательский тип может быть определен и использован в качестве типа индекса, если он содержит экземпляры Ix. Кроме того, кортежи типов Ix также являются типами Ix; это обычно используется для реализации многомерных массивов
  35. ^ а б c d В этих языках можно получить доступ или записать индекс массива, больший или равный длине массива, и массив будет неявно увеличиваться до этого размера. Сначала это может показаться, как будто границы не проверяются; однако границы проверяются, чтобы принять решение о росте массива, и у вас нет небезопасного доступа к памяти, как в C
  36. ^ а б Указав базовый индекс, можно создавать массивы с произвольной базой. Однако по умолчанию оператор длины Lua не учитывает базовый индекс массива при вычислении длины. Это поведение можно изменить с помощью метаметодов.
  37. ^ По крайней мере, 2 измерения (скалярные числа - это массивы 1 × 1, векторы - это массивы 1 × n или n × 1)
  38. ^ https://nim-lang.org/docs/tut1.html#advanced-types-arrays
  39. ^ https://nim-lang.org/docs/nimc.html
  40. ^ https://stackoverflow.com/questions/53084192/r-style-logical-vector-operation-in-nim
  41. ^ Многие реализации (Turbo Pascal, Object Pascal (Delphi), FreePascal) позволяют изменять поведение с помощью переключателей компилятора и встроенных директив.
  42. ^ Зависит от реализации. Новые реализации (FreePascal, Object Pascal (Delphi)) позволяют использовать динамические массивы на основе кучи.
  43. ^ Стандарт Perl Типы данных массива не поддерживают векторизованные операции, как определено здесь. Тем не менее Язык данных Perl расширение добавляет объекты массива с этой возможностью
  44. ^ а б c «Массивы» PHP - это ассоциативные массивы. В качестве ключей (индексов) можно использовать целые числа и строки; В качестве ключа также можно использовать числа с плавающей запятой, но они сокращаются до целых чисел. На самом деле нет никакого "базового индекса" или "границ"
  45. ^ Стандарт Python тип массива, список, не поддерживает векторизованные операции, как определено здесь. Тем не менее тупой расширение добавляет объекты массива с этой возможностью
  46. ^ Класс Array имеет фиксированный размер, но OrderedCollection является динамическим.
  47. ^ Числовые особенности Ch