Нет таблицы символов в ходе?
-
19-09-2019 - |
Вопрос
Новый язык Google "Go" говорит на своем веб -сайте:
Язык был разработан, чтобы быть простым в анализе и может быть проанализирован без таблицы символов.
Я, конечно, не эксперт по этим вопросам, но я думал, что таблица символов была основной конструкцией, общей для всех компиляторов для языков, которые используют переменные, и Go ясно использует переменные. Что я не понимаю?
Решение
Расположение означает просто выяснение структуры программы: разделение модуля на операторы/объявления, разбивание выражений до подэкспрессии и т. Д. Вы в конечном итоге сталкиваетесь со структурой дерева, известной как «дерево Аст).
По -видимому, C ++ требует таблицы символов для проведения анализа.
На этой странице обсуждаются некоторые причины Почему C ++ требует таблицы символов для анализа.
Конечно, анализ является лишь частью компиляции, и вам понадобится таблица символов, чтобы сделать полную компиляцию.
Тем не менее, сам анализ может быть полезен в инструментах анализа письма (например, какой модуль импортирует модули). Таким образом, упрощение процесса анализа означает, что легче написать инструменты анализа кода.
Другие советы
Интерпретация и компиляция абсолютно требуют таблиц символов или аналогичных. Это верно почти для всех языков.
В C и C ++, даже диапазон Язык требует таблицы символов.
@Justice прав. Чтобы немного расширить это, в C единственная настоящая сложная часть - это говорит типы, кроме переменных. В частности, когда вы видите это:
T t;
Вы должны знать это T
это тип для этого, чтобы быть юридическим анализом. Это то, что вы должны посмотреть в таблице символов. Это относительно просто для выяснения, пока типы добавляются в таблицу символов, как продолжается анализ. Вам не нужно делать много дополнительной работы в компиляторе: тоже T
присутствует в таблице или нет.
В C ++ вещи много, много более сложный. Существует огромное количество неоднозначных или потенциально неоднозначных конструкций. Наиболее очевидным является этот:
B::C (c);
Помимо того, что неясно, если B
это class
, а typedef
, или namespace
, также неясно, если C
тип и c
объект такого типа, или если C
Функция (или конструктор) принимает c
как аргумент (или даже если C является объектом с operator()
перегружен). Вам нужна таблица символов, чтобы продолжить анализ, хотя все еще можно продолжить достаточно быстро, так как тип символа находится в таблице символов.
Все становится намного, намного, намного хуже, когда шаблоны входят в микс. Если C (c)
находится в шаблоне, вы можете не знать в фактическом определении шаблона, если C является типом или функцией/объектом. Это потому, что шаблон может объявить C
быть либо тип, либо переменная. Анкет Это означает, что вам нужна таблица символов, но вы не имеют один - и ты не мочь Имейте один, пока шаблон фактически не будет объявлен. Хуже того, недостаточно иметь только тип символа: вы можете придумать ситуации, которые требуют полной информации о типе, который представляет символ, включая размер, выравнивание и другую машинную информацию.
Все это имеет несколько практических эффектов. Я бы сказал, что два наиболее важных, это:
- Компиляция намного быстрее. Я предполагаю, что GO быстрее для компиляции, чем C, и C ++ имеет классно медленное время компиляции для ситуаций с участием множества шаблонов.
- Вы можете написать анализаторы, которые не зависят от получения полного компилятора. Это очень полезно для анализа кода и для рефакторинга.
Для анализа большинства языков вам нужно знать, когда имена являются переменными, типами или функциями, чтобы устроить исключение определенных конструкций. У Go нет таких неоднозначных конструкций.
Например:
int x = foo (bar);
Foo может быть типом или функцией, и они представлены различными типами AST. По сути, анализатор никогда не должен делать поиск символов, чтобы узнать, как построить AST. Грамматика и AST просто проще, чем большинство языков. Действительно довольно круто.
Символьные таблицы медленные и вообще не нужны. Так что иди выбрать, чтобы уйти с этим. Другие функциональные языки также не нуждаются. Быстрый поиск требует хэша, но для поддержки вложенных областей, которые вам необходимы для толчки/поп -имен в стек. Простые симпаты реализуются как линейный поисковый стек, лучшие символы как хэш со стеком на символ. Но все же, поиск должен быть выполнен во время выполнения.
Интерпретация и компиляция для лексически ометных языков не требуют абсолютно никаких таблиц символов или аналогичных. Только динамически охватываемые символы нуждаются в таблицах символов, а некоторым компиляторам со строго напечатанными языками нужны какая -то внутренняя таблица символов, чтобы удерживать аннотации типа.
В C и C ++ даже анализ языка требует таблицы символов, потому что вам необходимо хранить типы и объявления глобалов и функций.
Символы с лексически омешались не в Symtab's, а в виде индексированного списка имен в блочных рамках, как на функциональных языках. Эти индексы вычисляются во время компиляции. Так что доступ к времени выполнения является немедленным. Отказ от прицела делает эти VARS недоступны автоматически, поэтому вам не нужно толкать/pop -имена из пространств имен/символов.
Не так функциональные языки без первоклассных функций часто должны хранить имена своих функций в таблицах символов. Как языковой дизайнер, вы пытаетесь связывать функции с лексиками, чтобы избавиться от динамического поиска имен в симпатах.