the-super-tiny-compiler / супер крошечный компилятор
эта частьthe-super-tiny-compiler / супер крошечный компиляторКонтент, все взято изthe-super-tiny-compiler-CN, прочитай сначалаthe-super-tiny-compiler-CNИмеет смысл только смотреть на продолжение.
резюме
Большую часть работы компилятора можно разбить на три основных этапа: синтаксический анализ, преобразование и генерация кода.
- РазобратьПреобразование исходного кода в более абстрактную форму.
- конвертироватьВозьмите абстрактные формы, созданные синтаксическим анализом, и манипулируйте этими абстрактными формами, чтобы делать то, что от них хочет компилятор.
- генерация кодаОбъектный код генерируется на основе преобразованного представления кода.
Разобрать
- лексический анализ-- tokenizer Исходный код разбивается на морфемы с помощью инструмента под названием tokenizer (генератор морфем, также называемый лексером). (Лексема — это объект, описывающий синтаксис языка программирования. Он может описывать числа, идентификаторы, пунктуацию, операторы и многое другое.)
- Разбор- Анализатор берет морфемы и объединяет их в промежуточное представление, описывающее отношения между частями исходного кода: абстрактное синтаксическое дерево. (Абстрактное синтаксическое дерево — это глубоко вложенный объект, представляющий код в форме, которой легко манипулировать и которая предоставляет много информации об исходном коде.)
конвертировать
Следующим этапом компилятора является фаза преобразования. Обзор снова, этот процесс получает абстрактное синтаксическое дерево, которое генерируется и изменяет его. Фаза преобразования может изменить абстрактный синтаксис на один и тот же язык (например, Babel, Babel также является кодом JS, сгенерированным кодом JS) или компилируйте на другой язык.
traverser, эта функция получает абстрактное синтаксическое дерево и объект посетителя
transformer
-> traverser(ast, visitor)
Получает созданное абстрактное синтаксическое дерево и передает его и объект посетителя вtraverser
функция. затем создайте новое абстрактное синтаксическое дерево
генерация кода
codeGenerator
сгенерировать новый код
Как работает вавилон?
- Аналитический@babel/parser(включая вышеуказанныеtokenizer,parser), генерировать AST в соответствии со стандартами es2015, es2016...
- Конвертировать -@babel/traverse+ плагины (посетитель)
- генерация кода -@babel/generator
Определения ТЧА
Инструмент генерации AST (парсер)
- esprima- старомодный парсер
- acorn—— Руль после эсприма, который на данный момент самый б/у. webpack также использует этот инструмент
- astexplorer—— Инструмент онлайн-генерации
- espree-- родом из вилки esprima, от eslint, для eslint
- babel-parser-- Оригиналbabylon, изначально изacornраскошелиться
- UglifyJS2——Встроенный парсер
- shift-parser-js- Определен набор спецификаций ASTshift-spec
Другие инструменты преобразования AST (преобразователь)
- estraverse
- ...
Инструмент генерации кода (codeGenerator)
- escodegen
- ...
Другие инструменты компиляции
- traceur-compiler
- ...
Инструменты на основе AST
Как описано выше:
- eslint
- webpack
- Сжатие кода UglifyJS
- prettier-- использовать@babel/parser,angular-estree-parser... etc.
- Tymdercript - поставляется с парсером, трансформатором, кодегенератором
- Рефакторинг
- Другие, такие как: подсказки об ошибках IDE, форматирование, выделение, автозаполнение и т. д.
- ...
Ссылаться на
- the-super-tiny-compiler-CN
- Раскрыт принцип JS AST
- Основы JavaScript. Что вы делали с компиляторами JS?
- Преобразование посредственных производителей кода переднего плана — AST
- Тяжелая структура кода - JCodeshift
- Перенос кода проекта с помощью AST
- Руководство по началу работы с jscodeshift
- ACORN.JS: принципы и приложения
- Разбираем JavaScript с помощью Acorn
- Speed Comparison
- es6-tools