Вступительная сказка.

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

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

Это источник для переводчика исходного текста.

Компилятор берет некоторый исходный код и компилирует его на более низкий язык. Этот более низкий язык может быть исходным кодом или может быть чем-то меньшим, чем исходный код. Например, C ++ компилируется до байт-кода. Некоторые программисты могут возиться с байт-кодом. Большинство не может или не хочет. TypeScript компилируется в Javascript, поскольку Typescript - это надмножество Javascript.

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

Эти вещи легко перепутать, и в некоторых случаях судьба между ними может быть сильно размыта. Иногда потребности программы настолько сложны, что возникают споры о том, является ли программа транспилятором или компилятором.

Существуют инструменты сборки, которые переносят код, а также компилируют код. Это грязно.

Для простоты Просто подумайте о транспиляторе как о переводчике исходного кода в исходный код.

Зачем нам может понадобиться транспайлер?

Представьте, что вы работаете в каком-то проекте, где вам нужно преобразовать все ваши файлы JS в файлы ruby ​​или вам нужно преобразовать файлы ruby ​​в файлы GO или файлы HTML в файлы erb. На то есть множество причин, но чаще всего это полезно для доставки обновлений для более старого проекта, который требует небольшого обновления или, возможно, даже полного рефакторинга или миграции.

Потребность в транспайлере в реальной работе встречается крайне часто.

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

Как мы можем сделать это?

Каждый файл исходного кода - это текстовый файл. Много лет назад ваш исходный код мог буквально представлять собой такой текстовый файл.

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

Компилятор прочитает ваш файл как массив или некую гигантскую строку и попытается его скомпилировать. Так работает большинство компиляторов и транспиляторов.

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

Давайте воспользуемся Ruby, чтобы преобразовать Ruby в javascript-транспилятор.

Вот простая программа на Javascript, которая складывает два числа.

Поместите этот файл и файл ruby ​​в один и тот же репозиторий и используйте встроенные методы ruby, чтобы открыть и прочитать файл Javascript.

Это поместит содержимое файла javascript в терминал.

Это хорошее начало, но метод put автоматически скрывает символы, существующие в нашем JS-файле. За кулисами наш файл ruby ​​читает ВСЕ содержимое, и мы тоже хотим это увидеть.

Мы можем сказать Ruby, чтобы он прекратил скрывать от нас детали, используя вместо этого команду p.

Итак, мы идем. Содержимое нашего js файла представлено в виде большой старой строки. Мы можем очистить наши данные и сделать их еще более управляемыми с помощью некоторых манипуляций со строками.

Теперь мы разделили наш JS-файл по строкам и удалили пустые строки.

К счастью для нас, Ruby - очень синтаксически вежливый язык, поэтому этот конкретный транспилятор не сложен. Все, что нам нужно сделать, это удалить ненужные ключевые слова javascript и добавить некоторые ключевые слова ruby.

Нам не нужно ключевое слово let, фигурные скобки и даже ключевое слово return. Мы собираемся перебрать наши данные и заменить весь синтаксис javascript допустимым синтаксисом ruby.

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

Если вы не знакомы с gsub! метод просто знайте "!" сообщает Ruby изменить строку на месте, а метод gsub выполняет итерацию по строке и заменяет первый аргумент вторым аргументом.

Теперь я собираюсь вставить символы новой строки для каждой строки и снова объединить массив в одну строку.

И вот он, действительный файл ruby ​​в строковой форме, автоматически перенесенный из нашего файла javascript.

Последний шаг, запишите это в рубиновый файл.

Поскольку мы уже выполнили всю работу, написать наш файл несложно.

Эта строка сообщает Ruby открыть новый файл с именем «output.rb», а затем записать в него данные.

Вот наш результат. Рабочий рубиновый файл.

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

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

Вот полная суть.

До нового времени.

Оставайтесь сильными, мои товарищи-программисты.