Вопрос

Новый язык 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 -имена из пространств имен/символов.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top