Почему отделять синтаксический анализ от исполнения? - PullRequest
4 голосов
/ 06 февраля 2012

В главе 4 SICP метациклический анализатор модифицируется путем отделения синтаксического анализа от выполнения, в результате чего процедура eval выглядит следующим образом:

(define (eval exp env)
    ((analyze exp) env))

, и в книге говорится, что это спасет работуanalyze будет вызываться один раз для выражения, тогда как процедура выполнения может вызываться много раз.

Мой вопрос: как работает эта оптимизация?Это будет работать для рекурсивных вызовов процедур, но как насчет других случаев?Оценщик оценивает выражения одно за другим, eval будет по-прежнему вызываться для каждого выражения, даже если они имеют идентичные формы.

Ответы [ 3 ]

4 голосов
/ 06 февраля 2012

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

Кстати, гораздо лучше название analyze - compile - оно действительно переводит язык ввода (sexprs) в целевой язык (функция, действующая здесь как машинный код).

1 голос
/ 11 сентября 2013

Разница между компилятором и интерпретатором заключается в том, что:

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

Однако интерпретатор анализирует исходный код каждый раз, когда вы выполняете свою программу.

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

Как сказал @Eli Barzilay, «гораздо лучшее имя для analyze - это compile», ваши проанализированные функции похожи на код выполнения.Рекурсивные функции похожи на программы, которые выполняются более одного раза.

0 голосов
/ 10 сентября 2014

analyze просто выполняет синтаксический анализ один раз и сохраняет преобразованную definition и т. Д. В среде, которая может использоваться через lookup-variable-value непосредственно при выполнении связанной процедуры.

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

Эта ссылка может быть полезной: http://www.cs.brandeis.edu/~mairson/Courses/cs21b/Handouts/feeley-notes.pdf

...