Программирование компилятора: Каковы самые фундаментальные компоненты?

mysqlx::Client предназначен для подключения к новому протоколу Mysql X. Он прослушивает другой порт (по умолчанию 33060 вместо 3306), что является причиной сообщения «Отказано в соединении».

Вам необходимо установить и включить плагин Mysql protocol X. См. https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-install.html для получения инструкций.

6
задан dmckee 24 February 2009 в 14:33
поделиться

8 ответов

Во-первых, необходимо решить, собираетесь ли Вы сделать компилятор или интерпретатор. Компилятор переводит Ваш код во что-то, что может быть выполнено или непосредственно на аппаратных средствах в интерпретаторе, или компилироваться на другой язык, который затем интерпретируется в некотором роде. Обоими типами языков является Тьюринг, завершенный, таким образом, у них есть те же выразительные возможности. Я предложил бы, чтобы Вы создали компилятор, который компилирует Ваш код или в .NET или в байт-код Java, поскольку он дает Вам очень оптимизированный интерпретатор для работы, а также много стандартных библиотек.

После того как Вы приняли свое решение существуют некоторые общие шаги для следования

  1. Определение языка Во-первых, необходимо определить, как язык должен посмотреть синтаксически.

  2. Лексический анализатор второй шаг должен создать ключевые слова Вашего кода, известного как маркеры. Здесь, мы говорим об очень простых элементах, таких как числа, дополнительный знак и строки.

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

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

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

Относительно реального материала чтения я предложил бы "Процессоры языка программирования в JAVA" David A Watt & Deryck F Brown. Я использовал ту книгу в своем курсе компиляторов, и изучение примером является большим в этом поле.

5
ответ дан 8 December 2019 в 05:58
поделиться

Со все, что Вы надеетесь выполнить, самое сложное требование, могло бы быть "очень маленьким (максимум 1-2 KLOC)". Я думаю, что одно только Ваше первое требование (генерация вывода ELF) могло бы взять хорошо более чем тысячу строк кода отдельно.

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

На вашем месте я мог бы запустить с ассемблера и создать части сверху его. Самый простой "компилятор" мог бы взять язык со всего несколькими очень простыми возможными операторами:

print "hello"
a = 5
print a

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

Удачи!

7
ответ дан 8 December 2019 в 05:58
поделиться

Я не знаю то, что Вы надеетесь выйти из этого, но если это учится и смотрит на существующие работы кода для Вас, всегда существует tcc.

2
ответ дан 8 December 2019 в 05:58
поделиться

Это абсолютно необходимые части:

  • Сканер: Это повреждает входной файл в маркеры
  • Синтаксический анализатор: Это создает абстрактное синтаксическое дерево (AST) из маркеров, определенных сканером.
  • Генерация кода: Это производит вывод из AST.

Вы также, вероятно, захотите:

  • Обработка ошибок: Это говорит синтаксический анализатор, что сделать, если он встречается с неожиданным маркером
  • Оптимизация: Это позволит компилятору произвести более эффективный машинный код

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

4
ответ дан 8 December 2019 в 05:58
поделиться

Примеры, все в Perl, но Исследующий Архитектуру Языка программирования в Perl являются хорошей книгой (и свободный).

1
ответ дан 8 December 2019 в 05:58
поделиться

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

0
ответ дан 8 December 2019 в 05:58
поделиться

Действительно хороший набор бесплатных ссылок, по моему скромному мнению:

Полное учебное руководство по компилятору: Позвольте нам Сборка Компилятор Jack Crenshaw (http://compilers.iecc.com/crenshaw/), Это многословно, но мне нравится он.

Ассемблер: NASM (nasm.us) хороший для Linux и Windows/DOS и самое главное большого количества doco и примеров/учебных руководств. (FASM также хорош, но меньше документации/учебных руководств там),

Другие источники книга блока ПК (http://www.drpaulcarter.com/pcasm/index.php)

Я пытаюсь записать LISP, таким образом, я использую Руководство Lisp 1.5. Можно хотеть получить спецификацию языка для любого языка, который Вы пишете.

До 1-2KLOC, принимая Вы используете высокоуровневый язык (как Py или Rb), необходимо быть близкими, если Вы не слишком амбициозны.

1
ответ дан 8 December 2019 в 05:58
поделиться

Важный номер один является книгой по записи компилятора. Много людей скажет Вам читать "Книгу Дракона" Aho и др., но лучшей книгой, которую я прочитал на компиляторах, является "Brinch Hansen на Компиляторах Паскаля". Я подозреваю, что это распродано (Amazon является Вашим другом), но это берет Вас через все шаги разработки и записи компилятора с помощью рекурсивного спуска, который является самым легким методом для новичков компилятора для понимания.

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

2
ответ дан 8 December 2019 в 05:58
поделиться