почему memoization не является функцией языка?

Я задавался вопросом..., почему memoization не обеспечивается исходно как функция языка никаким языком, о котором я знаю?

Править: разъясниться, что я имею в виду, то, что язык обеспечивает ключевое слово для определения заданной функции как memoizable, не, что каждая функция автоматически мемоизована "по умолчанию", если не определено иначе. Например, Фортран обеспечивает ключевое слово, ЧИСТОЕ для определения определенной функции как таковой. Я предполагаю, что компилятор может использовать в своих интересах эту информацию к memoize вызов, но я игнорирую то, что происходит, если Вы объявляете ЧИСТЫЙ функция с побочными эффектами.

35
задан Stefano Borini 19 December 2009 в 15:35
поделиться

9 ответов

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

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

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

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

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

Запись как оптимизация зависит от того, что поиск запомненного значения будет намного дешевле, чем перевычисление значения. Это, в свою очередь, зависит от упорядоченности входных запросов. Это влияет на базу данных memoization: Использует ли она стек, массив всех возможных входных значений (который может быть очень большим), ковшовый хэш или b-дерево?

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

.
47
ответ дан 27 November 2019 в 06:31
поделиться

Ваш вопрос также оставляет открытым решение вопроса об изучении большего количества языков. Я думаю, что Lisp поддерживает заучивание, и я знаю, что система Mathematica это делает.

.
1
ответ дан 27 November 2019 в 06:31
поделиться

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

.
22
ответ дан 27 November 2019 в 06:31
поделиться

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

.
6
ответ дан 27 November 2019 в 06:31
поделиться

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

Для пары языков запоминание легко реализуется и легко настраивается в соответствии с заданными требованиями.

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

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

...

.
5
ответ дан 27 November 2019 в 06:31
поделиться

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

.
1
ответ дан 27 November 2019 в 06:31
поделиться

Clojure имеет функцию запоминания (http://richhickey.github.com/clojure/clojure.core-api.html#clojure.core/memoize):

memoize
function

Usage: (memoize f)

Returns a memoized version of a referentially transparent function. The
memoized version of the function keeps a cache of the mapping from arguments
to results and, when calls with the same arguments are repeated often, has
higher performance at the expense of higher memory use.
12
ответ дан 27 November 2019 в 06:31
поделиться

В Хаскелле запись происходит автоматически для (чистых) определенных вами функций, которые не принимают аргументов. И пример Фибоначчи в этой Вики - это действительно самый простой демонстрационный пример, который я мог бы придумать.

Хаскелл может сделать это, потому что ваши чистые функции определены для получения одного и того же результата каждое время; конечно же, монадские функции, зависящие от побочных эффектов, не будут запоминаться.

Я не уверен, что это верхние пределы - очевидно, что они не будут запоминать больше, чем доступная память. И я также не уверен, будет ли запоминание происходить во время компиляции (если значения могут быть определены во время компиляции), или же при первом вызове функции всегда .

.
12
ответ дан 27 November 2019 в 06:31
поделиться

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

1
ответ дан 27 November 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: