Разработка компилятора. Общие теоретические основы


Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Notice: Функция get_currentuserinfo с версии 4.5.0 считается устаревшей! Используйте wp_get_current_user(). in /hlds/web/u138079p19/code4life.ru/htdocs/wp-includes/functions.php on line 3840

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

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

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

Определение высокоуровневого языка исчерпывающе дано на википедии:

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

Хост-программа — программа запускающая на исполнение код скрипта.

То есть есть программа которая загружает на исполнение скрипты (хост-программа), и исполняет их, причем их исполнение влияет на работу программы.

Основная суть скриптового языка это возможность его встраивания в основную программу для редактирования ее логики без перекомпиляции. Ярким примером может служить логика игр, к примеру игры серии S.T.A.L.K.E.R, где логика вынесена на сторону lua скриптов, что позволяет отделить основное управление от программируемой логики на скриптах, что является важным в модификации. Именно поэтому моддинг этой игры до сих пор жив.

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

Компиляция бывает двух видов: в байт-код и jit-компиляция

Байт-код — инструкции машины переведенные из исходного кода, обычно для какой-то определенной виртуальной машины. Код скриптового языка преобразуется в байт-код для дальнейшего его исполнения на виртуальной машине для этого языка. То есть в этом случае скриптовый язык — интерпретируемый. Про различия компилируемых и интерпретируемых языков читать здесь.

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

jit-компиляция — компиляция байт кода в машинный код (на лету) для более быстрого исполнения кода скрипта. Такой вид компиляции обычно применяется к байт-коду.

Типизация бывает двух видов статическая и динамическая

Статическая типизация — вид типизации при котором переменная связывается с типом в момент объявления. То есть необходимо указывать тип переменной.

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

Преимущества и недостатки обоих очевидны:

  • статическая — сложнее описывать но труднее допустить ошибку
  • динамическая — легче описывать но проще сделать ошибку

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

Также в скриптовых языках есть утиная типизация, подробнее читайте здесь.

Состав и исполнение

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

  • лексический анализатор
  • синтаксический анализатор (парсер)
  • оптимизатор (опционально)
  • компилятор
  • виртуальная машина
  • сборщик мусора

Как происходит процесс загрузки и исполнения скрипта? Очень просто:

  • весь код скрипта разбивается на лексемы лексическим анализатором,
  • парсер берет эти лексемы и выстраивает из них абстрактное синтаксическое дерево (АСТ),
  • если есть оптимизатор то он оптимизирует это АСТ,
  • по АСТ проходится компилятор и выдает на основе АСТ байт-код,
  • после чего этот байт-код можно выполнять на виртуальной машине скриптового языка.

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

Скриптовый язык при логическом обосновании и практичным использованием является достаточно мощным и гибким средством.

Поделиться:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*