Почему так много структур данных отсутствует в языках высокого уровня? - PullRequest
5 голосов
/ 27 ноября 2010

Почему языки более высокого уровня (Javascript, PHP и т. Д.) Не предлагают структуры данных, такие как связанные списки, очереди, двоичные деревья и т. Д., Как часть своей стандартной библиотеки?Это из-за исторических / практических / культурных причин или я упускаю что-то более фундаментальное.

Ответы [ 3 ]

8 голосов
/ 27 ноября 2010

связанные списки

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

Очередь

Легко реализуется с помощью динамического массива.

бинарные деревья

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

Определенно важно знать эти основополагающие структуры данных, и если вы пишете низкоуровневый код, вы обнаружите, что используете их. На уровне приложений, где используется большинство динамических языков, хеш-таблицы и динамические массивы действительно покрывают 95% ваших потребностей в структуре данных.

3 голосов
/ 21 декабря 2010

Существует много определений «высокого уровня», когда речь идет о языках, но я буду использовать этот термин для обозначения языков, специально созданных для определенного домена ( 4GL кто-нибудь?) , Такие «конкретные домены», как правило, ограничены в области действия, например: создание веб-страницы, написание отчета, запросы к базе данных и т. Д. В этом ограниченном объеме часто не требуется ничего, кроме самых основных структур данных.

Есть ли необходимость?

Давайте рассмотрим случай Javascript. Область применения этого языка изначально была очень ограниченной, поскольку являлась языком сценариев, а не ограничивалась веб-браузером. В первую очередь это касалось обеспечения небольшого количества динамического поведения на статических веб-страницах. Кроме того, ограничения технологии сделали непрактичным написание больших компонентов в этой среде (особенно производительность и модель песочницы).

Поскольку Javascript ограничивался решением «небольших проблем», не было особой необходимости в большом наборе структур данных. Что касается структур данных, карта Javascript очень гибкая. Вы должны помнить, что Basic и FORTRAN прошли долгий путь, предоставляя только массивы - карты значительно более гибкие, чем это. Javascript, похоже, претерпевает трансформацию, избегая песочницы. Некоторые очень амбициозные системы создаются в Javascript как внутри, так и за пределами браузера. И технология развивается, чтобы идти в ногу с ней (посмотрите на новые движки Javascript, модели персистентности и так далее). Я ожидаю, что спрос на более интересные структуры данных увеличится, и что спрос будет удовлетворен.

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

Новая возникающая необходимость?

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

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

История ... Но не будущее

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

0 голосов
/ 27 ноября 2010

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

...