Гибридный массив Lua и хэш-таблица;существует ли она где-нибудь еще?
-
22-09-2019 - |
Вопрос
Реализация таблиц в Lua содержит свои элементы в двух частях:часть массива и часть хэша.
Существует ли такая вещь в каких-либо других языках?
Взгляните на раздел 4 "Таблицы" в Реализация Lua 5.0.
Решение
Эта идея была оригинальной у Роберто Иерусалимского и остальной команды Lua.Я слышал, как Роберто выступал с докладом об этом на семинаре MIT по облегченным языкам в 2003 году, и в этом выступлении он обсуждал предыдущую работу и убедительно доказывал, что идея была новой.Я не знаю, скопировали ли его с тех пор другие языки.
Оригинальный Awk имеет несколько более ограниченную языковую модель, чем Lua;в качестве ключа в массиве можно использовать либо число, либо строку, но сами массивы не являются первоклассными значениями:массив должен иметь имя, и массив не может использоваться в качестве ключа в массиве.
Что касается реализации, я проверил исходные тексты для оригинального Awk, поддерживаемого Брайаном Керниганом, и реализация Awk использует хэш-таблицу, а не гибридную структуру массива / таблицы Lua.Различие важно, потому что в Lua, когда таблица используется с последовательными целочисленными ключами, накладные расходы на пространство такие же, как и для массива C.Это не верно для оригинального Awk.
Я не потрудился исследовать все более поздние реализации awk, например, Gnu Awk, mawk и так далее.
Другие советы
Редактировать: Это не отвечает на вопрос, который касался реализации.
АВК и сделал это.
Интересно, как в одних языках объединяются операции, которые отличаются в других:
- Индексирование списка -
a[10]
- Ассоциативное индексирование -
a['foo']
- Доступ к объектному полю -
a.foo
- Вызовы функций / методов -
a('foo')
/a.foo()
Очень неполные примеры:
Perl - редкий язык, где последовательное / ассоциативное индексирование имеет отдельный синтаксис -
a[10]
/a{'foo'}
.AFAIK, поля объекта сопоставляются с одной из других операций, в зависимости от того, какую хотел использовать разработчик класса.В Python все 4 различны;последовательное / ассоциативное индексирование использует один и тот же синтаксис, но для них оптимизированы отдельные типы данных.
В Ruby поля объектов - это методы без аргументов -
a.foo
.В JavaScript поля объектов
a.foo
являются синтаксическим сахаром для ассоциативной индексацииa['foo']
.В Lua и AWK ассоциативные массивы также используются для последовательного индексирования -
a[10]
.В Дуга, последовательное и ассоциативное индексирование выглядит как вызовы функций -
(a 10)
/(a "foo")
, и я думаю ,a.foo
есть ли синтаксический сахар и для этого (?).
Самое близкое, что я могу придумать, это Javascript - вы создаете массив с помощью new Array()
, а затем переходите к индексации либо по номеру, либо по строковому значению.Вполне возможно, что по соображениям производительности некоторые реализации Javascript предпочитают делать это с использованием двух массивов по причинам, указанным в документации Lua, на которую вы ссылались.
ArrayWithHash Массив с хэшем это быстрая реализация гибрида массива и хэш-таблицы на C ++.
Поскольку C ++ является статически типизированным языком, в ArrayWithHash разрешены только целочисленные ключи (невозможно вставить строку или ключ указателя).Другими словами, это что-то вроде массива с резервной копией хэш-таблицы для больших индексов.Также он использует другую реализацию хэш-таблицы, которая менее эффективна с точки зрения памяти, чем реализация таблицы Lua.