Почему лексические области видимости предпочитают компиляторы? - PullRequest
2 голосов
/ 09 июня 2009

Как лексическая область видимости помогает компиляторам? Помогает ли это в компиляции или оптимизации?

Ответы [ 5 ]

2 голосов
/ 26 июня 2009

Я думаю, что лексическая область видимости помогает компилятору и оптимизации. Хотя это зависит от того, что вы подразумеваете под помощью.

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

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

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

См. здесь : В динамической области, напротив, сначала вы выполняете поиск в локальной функции, затем - в функции, которая вызвала локальную функцию, затем вы ищете в функции, которая вызвала эту функцию, и так далее, до стека вызовов. «Динамический» относится к изменению в том смысле, что стек вызовов может отличаться каждый раз, когда вызывается данная функция, и поэтому функция может попадать в разные переменные в зависимости от того, откуда она вызывается.

1 голос
/ 19 августа 2009

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

0 голосов
/ 08 июня 2010

Проще говоря, лексическая (или статическая) область помогает, когда язык статически типизирован, динамическая область помогает, когда язык динамически типизирован.

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

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

0 голосов
/ 05 марта 2010

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

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

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

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

0 голосов
/ 09 июня 2009

Лексическая область не помогает компилятору и не оптимизирует код. Это решение для языкового дизайна. См. этот вопрос для более подробного объяснения.

...