Что такое транспиляция | Hexlet Guides
Понять, что такое транспайлеры и какова их роль в программировании, поможет следующий пример. Представим, что вы разрабатываете софт для TV-приставок и вам нужно добавить калькулятор на все приставки определенной фирмы. Есть одно но — некоторые приставки не обновлялись уже 7 лет и могут работать только со старой версией языка, на котором написан калькулятор. Тут появляется выбор:
- Разрабатывать программу для двух типов приставок: на старой версии языка для тех, которые давно не обновлялись, и на новой — для современных.
- Использовать «переводчик» с версии языка, которую используете вы, на версии, работающие на всех устройствах
Роль такого переводчика выполняют транспайлеры: они преобразуют код, на котором мы пишем, в другой, который может применяться и работать у конечного пользователя на любых устройствах с любыми версиям языка разработки.
Транспиляция — преобразование программы, написанной на одном языке программирования в качестве исходных данных, в эквивалентный код другой версии этого языка или в другой язык программирования того же уровня абстракции.
- Когда нужна транспиляция?
- Как используют транспайлеры?
- Как работают транспайлеры?
- Инструменты (реализации) транспиляции кода
- Итого
- Дополнительные материалы
Когда нужна транспиляция?
Рассмотрим практический пример, в котором пригодится транспайлер. За основу возьмем кейс с обновлением софта в TV-приставках, но дополним его деталями.
Калькулятор запускается на встроенном браузере TV-приставки и написан на JavaScript последней версии. Также учтем, что приставки выпускались каждый год с ограниченным сроком поддержки и сейчас мы имеем множество устройств с разными версиями браузера (а, следовательно, и отличающиеся версии поддерживаемого JS-кода). Кроме того, браузер пользователя давно не обновлялся и код на JS, который может там работать, сильно отличается от текущих версий языка.
В такой ситуации чаще всего может пригодиться транспиляция кода. Транспайлеры помогут преобразовать код, написанный на последней версии JavaScript, в тот, который будет работать у всех пользователей независимо от времени, прошедшего с последнего обновления.
Как используют транспайлеры?
Тринспайлеры широко используются во многих областях программирования. В целом можно выделить две основных области применения:
Транспиляция одной версии языка в другую. Поскольку языки программирования постоянно обновляются, возникают ситуации, когда разработчик уже пишет на новой версии языка, а среда, где используется код, поддерживает и работает только с предыдущими версиями. Например, для переходов между версиями стандарта ECMAScript используется Babel. Транспайлеры позволяют преобразовывать код и в другую сторону: например, помогают перевести проект на более новую версию языка. Делать это вручную долго и больно. Например, если проект написан на Python 2.x, перевести его на Python 3 можно с помощью трансплайнера 2to3
Транспиляция между разными языками. Например преобразование TypeScript в JS. Подробнее об этом расскажем ниже
Как работают транспайлеры?
В качестве примера рассмотрим работу транспайлера над возведением в квадрат кода на JS:
a ** b
Вот как выглядит то же преобразование, проведенное с помощью объекта Math — он и использовался для операций по возведению в квадрат в старых версиях языка:
Math. pow(a, b)
В данном случае у нас есть начальное и желаемое конечное состояния. Мы уже знаем, что для транспайлера не составит труда провести такое преобразование. Однако для нас механизм его работы пока выглядит как черный ящик. Пора в деталях разобраться, как происходит транспиляция.
Преобразование исходного кода в абстрактною форму
На первом этапе транспайлер создает на основе кода абстрактное представление. В общем случае такое преобразование происходить в два этапа — сначала программа проводит лексический, а затем синтаксический анализ.
- Лексический анализ берёт «сырой» код и разбивает его на изолированные части, которые называются токенами. Это могут быть цифры, пунктуация, метки, операторы: всё, что угодно. В нашем случае токенами будут бинарный оператор (применяется к двум операндам, например 2 + 2) и его операнды:
- Синтаксический анализ строит объект, который описывает все токены и их связи между собой. Он называется AST (abstract syntax tree или абстрактное синтаксическое дерево). Оператор возведения в квадрат является бинарным выражением внутри программы (в нашем случае — единственным), а операнды станут идентификаторами в этом выражении:
Трансформация AST
После преобразования в абстрактную модель происходит трансформация, которая производит все необходимые для дальнейшей работы изменения в AST.
На этом этапе дерево из предыдущего шага изменяется: трансформация меняет текущий код на код на предыдущей версии языка. В данном случае оператор умножения заменяется на вызов выражения, при этом его операнды становятся аргументами выражения (Math.pow):
Генерация конечного кода
Когда все изменения внесены, транспайлер берёт трансформированное AST кода и на его основе генерирует новый код.
В итоге код из начального состояния проходит ряд преобразований (анализ -> трансформация -> генерация) до конечного состояния — этот процесс и называется транспиляцией.
Обратная связь
После всех преобразований мы получили конечный код, который работает на нужной нам версии языка. Но представим, что после трансилиляции в нашей программе появились ошибки. Как понять, где именно находится ошибка, если она ссылается какое-то место в трансипилированном коде (который может значительно отличаться от того, что мы писали изначально)?
Использование транспайлеров может затруднить отладку, когда нам нужно найти точное место поломки в исходном коде по транспилированному коду. В таких случаях используются различные утилиты, позволяющие сопоставить результат транспиляции с оригинальным кодом. Например, в JS есть утилита SourceMap, которая в процессе создания конечного кода создает файл-маппер — с его помощью можно связать исходный и конечный код.
Инструменты (реализации) транспиляции кода
Для фронтенд-разработки основной инструмент транспиляции — Babel. Он позволяет не только выполнять транспиляцию между версиями, которую мы рассмотрели выше, но и:
- преобразовывать JSX-код в JavaScript при разработке на React
- трансформировать LESS/SCSS в CSS при использовании CSS препроцессоров
- транспилировать TypeScript в JS, когда нужно использовать типизацию
Среди транспиляторов, которые трансформируют код на бэкэнд языках программирования в код на других языках, популярностью пользуются:
- Haxe предназначен для транспилирования во Flash, JavaScript и Neko. Со временем Haxe разросся до набора инструментов, поддерживающих транспиляцию на разные языки и платформы, включая JavaScript, C++, C#, Java, JVM, Python, Lua, PHP и Flash.
- Lombok — решение для тех, кому хочется расширить возможности Java. Это плагин, добавляющий в Java новые «ключевые слова» и превращающий аннотации в Java-код. Он сокращает время на разработку и обеспечивает дополнительную функциональность.
- Bridge.NET позволяет использовать в JavaScript производительность C#, а также мощные VisualStudio IDE и стандартные инструменты .NET. Grumpy обеспечивает трансляцию кода на языке Python в представление на языке Go и позволяет бесшовно запускать Python-программы в runtime-окружении Go.
Итого
В мире, где есть огромное количество языков программирования, а сами языки имеют множество версий, транспайлеры выполняют крайне важную работу — делают разработку удобнее. Программисты могут писать код на языке или версии языка, которая им удобна или имеет нужные функции, а транспайлеры выполнят работу по доставке этого кода до среды исполнения в нужном виде.
На данный момент реализовано множество различных транспайлеров (Babel, Vala, Typescript transpiler, Bridge и другие), каждый из них решает свою задачу по-своему, но общий принцип работы транспайлеров похож у всех.
Исходный код преобразуется в абстрактное синтаксическое дерево, далее AST трансформируется в структуру, которая соотносится с конечным кодом, и из этой структуры генерируется необходимый нам код.
Дополнительные материалы
- Сайт для построения AST
- Перевод проекта The Super Tiny Compiler! (Супер Маленького Компилятора)
Все страницы — Юнионпедия
Все страницы — ЮнионпедияНовый! Скачать Юнионпедия на вашем Android™ устройстве!
УстановитьБолее быстрый доступ, чем браузер!Все страницы · Предыдущая (Трансантарктическая экспедиция Британского содружества (1955 — 1958)) · Следующий (Транспорт Бутана)
Из:
Транспайлер | Транспанамская тропа | Транспирация |
Транспирационный коэффициент | Транспирационное охлаждение | Трансплантат |
Трансплантация | Трансплантация сердца | Трансплантация фекальной микробиоты |
Трансплантация роговицы | Трансплантация головы | Трансплантация гемопоэтических стволовых клеток |
Трансплантация кроветворных стволовых клеток | Трансплантация костного мозга | Трансплантация лёгких |
Трансплантация лица | Трансплантация легких | Трансплантация матки |
Трансплантация мозга | Трансплантация островковых клеток | Трансплантация органов |
Трансплантация органов в Китае | Трансплантация почки | Трансплантация пениса |
Трансплантология | Транспневматика | Транспорт |
Транспорт (скульптурные композиции, Тольятти) | Транспорт (завод) | Транспорт (значения) |
Транспорт (издательство) | Транспорт / Трансинфо (издательство) | Транспорт Кургана |
Транспорт Крыма | Транспорт Красноярска | Транспорт Красногорска |
Транспорт КНДР | Транспорт Казахстана | Транспорт Казани |
Транспорт Кайзерсверта (Дюссельдорф) | Транспорт Канады | Транспорт Квебека |
Транспорт Кишинэу | Транспорт Кишинёва | Транспорт Кишинева |
Транспорт Китая | Транспорт Китайской Народной Республики | Транспорт Киргизии |
Транспорт Кладово | Транспорт Кладово (1939) | Транспорт Королёва |
Транспорт Пуща-Водицы | Транспорт Пущи-Водицы | Транспорт Праги |
Транспорт Приштины | Транспорт Пакистана | Транспорт Петрозаводска |
Транспорт Орла | Транспорт Афганистана | Транспорт Арубы |
Транспорт Австралии | Транспорт Австрии | Транспорт Азербайджана |
Транспорт Алтайского края | Транспорт Алчевска | Транспорт Албании |
Транспорт Алжира | Транспорт Нагорно-Карабахской Республики | Транспорт Нижнего Новгорода |
Транспорт Ржева | Транспорт России | Транспорт Российской Федерации |
Транспорт Российской Федерации. Журнал о науке, экономике, практике | Транспорт Республики Косово | Транспорт Республики Корея |
Транспорт Сьерра-Леоне | Транспорт США | Транспорт Санкт-Петербурга |
Транспорт Сейшельских Островов | Транспорт Сенегала | Транспорт Туркмении |
Транспорт Таджикистана | Транспорт Тверской области | Транспорт Удмуртии |
Транспорт Узбекистана | Транспорт Украины | Транспорт Фарерских островов |
Транспорт Финляндии | Транспорт Харькова | Транспорт Чада |
Транспорт Чернигова | Транспорт Шумихи | Транспорт Шадринска |
Транспорт Эфиопии | Транспорт Экваториальной Гвинеи | Транспорт Южной Кореи |
Транспорт Юнайтед | Транспорт Якутии | Транспорт Японии |
Транспорт в Кувейте | Транспорт в Крыму | Транспорт в КНР |
Транспорт в КНДР | Транспорт в Катаре | Транспорт в Карелии |
Транспорт в Казахстане | Транспорт в Казани | Транспорт в Калгари |
Транспорт в Камбодже | Транспорт в Канаде | Транспорт в Китайской Народной Республике |
Транспорт в Китайской Республике | Транспорт в Китае | Транспорт в Киргизии |
Транспорт в Киеве | Транспорт в Коломне | Транспорт в Приднестровской Молдавской Республике |
Транспорт в Приднестровье | Транспорт в Парагвае | Транспорт в Париже |
Транспорт в Пакистане | Транспорт в Португалии | Транспорт в Польше |
Транспорт в Орле | Транспорт в Объединённых Арабских Эмиратах | Транспорт в Омской области |
Транспорт в Омане | Транспорт в Астрахани | Транспорт в Афганистане |
Транспорт в Арубе | Транспорт в Аргентине | Транспорт в Армении |
Транспорт в Австралии | Транспорт в Австрии | Транспорт в Азербайджане |
Транспорт в Албании | Транспорт в Алжире | Транспорт в Антигуа и Барбуда |
Транспорт в Андорре | Транспорт в Набережных Челнах | Транспорт в Нагорно-Карабахской Республике |
Транспорт в Нигерии | Транспорт в Нидерландах | Транспорт в Нижегородской области |
Транспорт в Николаеве | Транспорт в Новой Каледонии | Транспорт в Новокузнецке |
Транспорт в Рязанской области | Транспорт в России | Транспорт в Республике Карелия |
Транспорт в Республике Косово | Транспорт в Республике Корея | Транспорт в Республике Сербской |
Транспорт в Республике Македонии | Транспорт в Республике Молдова | Транспорт в Сьерра-Леоне |
Транспорт в Суринаме | Транспорт в США | Транспорт в Саудовской Аравии |
Транспорт в Сахалинской области | Транспорт в Саратовской области | Транспорт в Самарской области |
Транспорт в Сан-Марино | Транспорт в Санкт-Петербурге | Транспорт в Сирии |
Транспорт в Сингапуре | Транспорт в Словакии | Транспорт в Сербии |
Транспорт в Сенегале | Транспорт в Турции | Транспорт в Туркмении |
Транспорт в Тульской области | Транспорт в Тунисе | Транспорт в Тыве |
Транспорт в Таджикистане | Транспорт в Таиланде | Транспорт в Тверской области |
Транспорт в Удмуртии | Транспорт в Узбекистане | Транспорт в Ульяновской области |
Транспорт в Фарерских островах | Транспорт в Финляндии | Транспорт в Химачал-Прадеш |
Транспорт в Хорватии | Транспорт в Херсоне | Транспорт в Чаде |
Транспорт в Чили | Транспорт в Чехии | Транспорт в Швеции |
Транспорт в Швейцарии | Транспорт в Эстонии | Транспорт в Эфиопии |
Транспорт в Экваториальной Гвинее | Транспорт в Южной Корее | Транспорт в Южном Судане |
Транспорт в Якутии | Транспорт в Японии | Транспорт в Мурманской области |
Транспорт в Мариуполе | Транспорт в Марокко | Транспорт в Мавритании |
Транспорт в Малайзии | Транспорт в Минске | Транспорт в Москве |
Транспорт в Московской области | Транспорт в Молдавии | Транспорт в Молдове |
Транспорт в Монголии | Транспорт в Исландии | Транспорт в Испании |
Транспорт в Ишимбае | Транспорт в Италии | Транспорт в Ираке |
Транспорт в Иране | Транспорт в Иркутской области | Транспорт в Ирландии |
Транспорт в Израиле | Транспорт в Индии | Транспорт в Индонезии |
Транспорт в Иордании | Транспорт в Иерусалиме | Транспорт в Западной Сахаре |
Транспорт в Бутане | Транспорт в Бурунди | Транспорт в Буркина Фасо |
Транспорт в Буркина-Фасо | Транспорт в Бразилии | Транспорт в Башкортостане |
Транспорт в Баку | Транспорт в Бангладеш | Транспорт в Боснии и Герцеговине |
Транспорт в Ботсване | Транспорт в Болгарии | Транспорт в Белгородской области |
Транспорт в Белоруссии | Транспорт в Восточном Тиморе | Транспорт в Воронеже |
Транспорт в Волгоградской области | Транспорт в Великобритании | Транспорт в Венгрии |
Транспорт в Венесуэле | Транспорт в Грузии | Транспорт в Грозном |
Транспорт в Греции | Транспорт в Гренландии | Транспорт в Габоне |
Транспорт в Гайане | Транспорт в Гоа | Транспорт в Гондурасе |
Транспорт в Гонконге | Транспорт в Германии | Транспорт в ДРК |
Транспорт в Дании | Транспорт в Джибути | Транспорт в Доминиканской Республике |
Транспорт в Донецке | Транспорт в Демократической Республике Конго | Транспорт в Европе |
Транспорт в Египте | Транспорт в Люксембурге | Транспорт в Латвии |
Транспорт в Лаосе | Транспорт в Литве | Транспорт в Ливане |
Транспорт в Ливии | Транспорт в Ленинградской области | Транспорт в Йемене |
Транспорт во Франции | Транспорт во Вьетнаме | Транспорт во Владимирской области |
Транспорт на сжатом воздухе | Транспорт на Кипре | Транспорт на Сейшельских Островах |
Транспорт на Сейшелах | Транспорт на Украине | Транспорт на Фарерских островах |
Транспорт на Шри-Ланке | Транспорт на Мартинике | Транспорт на Мадейре |
Транспорт на Мальдивах | Транспорт общего пользования | Транспорт правоохранительных служб |
Транспорт Мценска | Транспорт Мытищ | Транспорт Мариуполя |
Транспорт Марокко | Транспорт Мадейры | Транспорт Минска |
Транспорт Москвы | Транспорт Московской области | Транспорт Молдавии |
Транспорт Монголии | Транспорт Исландии | Транспорт Ирака |
Транспорт Ирана | Транспорт Иркутской области | Транспорт Ирландии |
Транспорт Израиля | Транспорт Иерусалима | Транспорт Запорожья |
Transpiler
Предположим, вы написали программу на одном языке, но хотите преобразовать ее в другой язык, тогда вы должны вызвать так называемый транспайлер . Язык программирования на входе транспилятора может быть назван исходным языком, тогда как язык на выходе может быть назван целевым языком. Транспайлер иногда называют компилятором исходного кода .
Например, для преобразования кода C++ в код C потребуется транспилятор. Для преобразования кода Python в код Ruby потребуется транспилятор. Отметим, что в этом примере и исходный, и целевой языки находятся на одном уровне абстракции. Но допустим, мы конвертируем Java-код в байт-код или C-код в ассемблерный код, тогда это не называется транспиляцией. Транспиляторы не изменяют уровень абстракции, такой как перевод с языка высокого уровня на ассемблерный код, байт-код или машинный код.
Обсуждение
- Чем транспилер отличается от компилятора?
Транспиляция — это не то же самое, что компиляция. Источник: Ackerman 2016.
Компилятор преобразует высокоуровневый удобочитаемый код в низкоуровневые инструкции, которые могут выполняться на компьютере. Например, компилятор C преобразует код C в исполняемый код. Компилятор Java преобразует код Java в так называемый байт-код Java, который интерпретируется во время выполнения для выполнения на целевой машине.
С другой стороны, транспилятор обычно работает с абстракцией языков высокого уровня. Выходной код по-прежнему удобочитаем. Он не может быть выполнен напрямую, если не вызван его собственный компилятор или интерпретатор. Например, транспилятор может преобразовывать код Java в код C++. Программисту по-прежнему потребуется вызывать компилятор C++ перед выполнением результирующего машинного кода.
Однако некоторые люди используют эти термины как синонимы. Например, VOC считается транспилером из исходного кода Python в байт-код Java, хотя на самом деле эти два находятся на разных уровнях абстракции. Однако допустимо вызывать переводы на том же уровне абстракции, что и транспиляция, например из ассемблерного кода .ASM в ассемблерный код .A86.
ISO/ IEC / IEEE 24765 определяет пять поколений языков, которые могут быть связаны с абстракциями, описанными выше.
- Зачем мне использовать транспилятор?
Критический код Python перенесен на Фортран для повышения производительности. Источник: Bysiek et al. 2016, рис. 1.
Вот несколько причин для использования транспилятора:
- Миграция : Миграция устаревшего кода на современный язык.
- Совместимость : Создание кода, соответствующего более старой версии, в то время как разработчики получают преимущества от функций более новой версии, например, с браузерами, не обновленными до последних стандартов JavaScript.
- Навыки кодирования : Кодовая база может быть переведена на язык, на котором навыки легко доступны. Или это может быть вопрос предпочтений. Например, те, кто из ООП предпочитаю фон TypeScript. Вместо этого программисты Python предпочитают CoffeeScript. В обоих случаях код переносится в JavaScript.
- Производительность : Исходный код был написан для быстрого прототипирования или проект перемещается на другую платформу, где другой язык более подходит. Возможно, у целевого языка есть лучший компилятор, который может генерировать более оптимизированный код. Например, критические части кодовой базы Python могут быть перенесены в Fortran, а затем вызваны из Python.
- Инструментарий : Исходный язык лучше IDE , средства тестирования и отладки, такие как .NET и Visual Studio.
- Как транспилятор работает внутри?
шагов, которые выполняет транспилятор. Источник: Samuels 2017.
Транспилятор анализирует код и извлекает токены, которые являются основными строительными блоками языка. Ключевые слова языка, переменные, литералы и операторы являются примерами токенов. Этот шаг представляет собой комбинацию лексического анализа и синтаксического анализа. Transpiler знает, как это сделать, потому что он понимает правила синтаксиса входного языка. Учитывая это понимание, транспилятор строит то, что называется Дерево абстрактного синтаксиса ( AST ) .
Следующим шагом является преобразование AST в соответствии с целевым языком. Затем это используется для генерации кода на целевом языке.
AST Explorer — это онлайн-инструмент, который поможет вам просмотреть AST с фрагментом кода на многих популярных языках.
- Не могли бы вы назвать какие-нибудь транспиляторы?
JavaScript — это язык, который развивается в обычном темпе, но в Интернете также есть множество браузеров, использующих более старые версии языка. Поэтому транспиляторы обычно используются в JS world для переноса кода в ES5, версию, поддерживаемую большинством браузеров. Существует множество транспилеров для JS , но самыми популярными являются Babel, TypeScript и CoffeeScript.
ClojureScript транспилируется из Clojure в JS . JSweet транспилирует из Java в TypeScript или JS . GWT Web Toolkit, ранее известный как Google Web Toolkit, позволяет программистам Java использовать интерфейс JS для браузерных приложений. GWT включает транспилятор с Java на JS . Script# преобразуется из C# в JS . C2Rust и Corrode — две альтернативы транспиляции C в Rust.
VOC — это транспилятор с Python на Java, а это значит, что даже приложения для Android можно создавать из кодовой базы Python. Сам Python имеет две несовместимые версии: 2 и 3. Однако доступны инструменты для преобразования из одной версии в другую:
2to3
,модернизация
,futurize
иpasteurize
. Их можно назвать транспиляторами.
Вехи
Входные и выходные файлы CONV86. Источник: Intel 1979, рис. 1-2.
Intel публикует подробную информацию о преобразователе под названием CONV86 . Он может преобразовывать исходный код сборки 8080/8085 в исходный код сборки 8086. Поскольку последний является типизированным языком, конвертер присваивает типы каждому символу. Обратите внимание, что используется термин преобразователь . Срок 9Транспайлер 0081 , возможно, появился позже.
Тим Патерсон пишет ПЕР. COM для перевода ассемблерного кода Z80 в ассемблерный код . ASM для процессора Intel 8086. Процесс не полностью автоматизирован и требует ручной корректировки.
Гэри Килдалл пишет программу под названием XLT86 для преобразования ассемблерного кода .ASM, написанного для процессора Intel 8080, в ассемблерный код .A86 для Intel 8086. Идея состоит в том, чтобы автоматически портировать P/M-80 и MP/M-80. программы до Платформы CP /M-86 и MP/M-86.
Бьерн Страуструп, создатель C++, создает Cfront для преобразования кода C++ в код C, поскольку в то время у C++ не было собственного компилятора. Разработка Cfront прекращена в 1993 году.
Facebook создает HipHop для PHP (HPHPc) для преобразования PHP в C++ для повышения производительности во время выполнения. Это устарело в 2013 году виртуальной машиной HipHop ( HHVM ), которая использует компиляцию точно в срок. HPHPc не полностью поддерживал PHP, его производительность снизилась, а его развертывание на всех серверах Facebook было нетривиальной задачей.
Сен
2014
Себастьян Маккензи создает транспайлер с именем 6to5 , который переводит код ES6 в код ES5. В феврале 2015 года он становится Babel .
Каталожные номера
- Аккерман, Дэвид. 2016. «WebAssembly: наконец-то избавились от JavaScript?» Simple Programmer, 25 мая. По состоянию на 03 июня 2018 г.
- Бисек, Матеуш, Александр Дрозд и Сатоши Мацуока. 2016. «Миграция устаревшего Fortran на Python с сохранением производительности на уровне Fortran за счет транспиляции и подсказок типов». 6-й семинар по Python для высокопроизводительных и научных вычислений (PyHPC) через Semantic Scholar. Доступ 2018-06-03.
- ИСО/МЭК/ИИЭР. 2017. «Системная и программная инженерия — Словарь». ISO/IEC/IEEE 24765:2017, международный стандарт, второе издание, сентябрь. Проверено 24 января 2019 г.
- Интел. 1979. «MCS-86, преобразователь языка ассемблера, инструкции по эксплуатации для пользователей ISIS-II». Доступ 2018-06-05.
- Кейт-Маги, Рассел. 2017. «Как написать транспилятор Python». BeeWare, PyCon US 2017, Портленд, Орегон, 17-25 мая.
- Кайл, Джеймс. 2015. «Не рожден умирать». Блог Babel, 15 февраля. По состоянию на 03 июня 2018 г.
- Манчини, Альберто. 2015. «Набор инструментов GWT: создание мощных интерфейсов JavaScript с использованием Java». Топтал. Доступ 2018-06-03.
- Павляк, Рено. 2016. «Сравнение транспилятора GWT с JSweet». JSweet, 10 февраля. По состоянию на 03 июня 2018 г.
- Сэмюэлс, Чарльз. 2017. «Мир транспиляторов Javascript». Сайт, 31 мая. По состоянию на 03 июня 2018 г.
- Шульц, Мариус. 2015. «Эпоха транспайлеров». Блог, 4 мая. По состоянию на 03 июня 2018 г.
- Сенгстаке, Пелеке. 2016. «Транспилеры JavaScript: что это такое и зачем они нам нужны». Скотч, 25 апреля. По состоянию на 03 июня 2018 г.
- Шарп, Джеймс. 2018. «c2rust против Corrode». Блог non-O(n) musings, 30 июня. По состоянию на 02 июля 2018 г.
- Википедия. 2018а. «Компилятор исходного кода». Википедия, 31 мая. По состоянию на 03 июня 2018 г.
- Википедия. 2018б. «Передний фронт». Википедия, 18 апреля. По состоянию на 03 июня 2018 г.
- Википедия. 2018г. «Хип-хоп для PHP». Википедия, 25 марта. По состоянию на 03 июня 2018 г.
- Зацина, Фэрис. 2015. «Как Babel сравнивается с TypeScript». Блог Министерства программирования, 23 августа. По состоянию на 03 июня 2018 г.
- Чжу, Генри. 2016. «Вавилонское государство». Блог Babel, 7 декабря. По состоянию на 03 июня 2018 г.
- Нихилк GitHub. 2013. «Сценарист». Доступ 2018-06-03.
- гитхаб. 2018. «ЛОС». Доступ 2018-06-03.
Дополнительная литература
- Сэмюэлс, Чарльз. 2017. «Мир транспиляторов Javascript». Сайт, 31 мая. По состоянию на 03 июня 2018 г.
- Эверлёф, Алекс. 2017. «Возможно, вам не нужно транспилировать ваш JavaScript». freeCodeCamp, 19 мая. По состоянию на 03 июня 2018 г.
- Шульц, Мариус. 2015. «Эпоха транспайлеров». Блог, 4 мая. По состоянию на 03 июня 2018 г.
- Кит-Маги, Рассел. 2017. «Как написать транспилятор Python». BeeWare, PyCon US 2017, Портленд, Орегон, 17-25 мая.
Статистика статьи
1070
Слова2
Авторы5
Правки2
Чаты10
Нравится29K
ПросмотровПроцитировать как
Девопедия. 2019. «Транспилятор». Версия 5, 24 января. По состоянию на 02 мая 2023 г. https://devopedia.org/transpiler
Предоставлено2 автора
Последнее обновление
2019-01-24 14:15:00
Интернет языки инструменты обратная совместимость
- Транспиляторы JavaScript
- Абстрактное синтаксическое дерево
- Машинопись
- Вавилон (транспилятор)
- Поколения языков программирования
- Средний язык
qiskit.compiler.
transpile — Документация Qiskit 0.43.2- transpile( схемы , backend=нет , base_gates=нет , inst_map=нет , connection_map=нет , backend_properties=нет , initial_layout = нет , layout_method = нет , routing_method =Нет , translation_method=Нет , scheduling_method=Нет , инструкция_durations=Нет , dt=Нет , аппроксимация_степень=1.0 , Timing_constraints=Нет , 900 81 seed_transpiler=Нет , Optimization_level=Нет , callback=Нет , output_name=Нет , unitary_synchronous_method=’default’ , unitary_synchronous_plugin_config=Нет , target=Нет , hls_config=Нет , init_method =Нет , optim_method=Нет , ignore_backend_supplied_default_methods=False ) [источник]
Транспиляция одной или нескольких цепей в соответствии с желаемыми целями транспиляции.
Устарело, начиная с версии 0.23.0: ранее все аргументы принимали списки той же длины, что и
цепей
, который использовался для специализации аргументов для схем в соответствующем индексы. Поддержка использования таких списков аргументов теперь устарела и будет быть удалены в версии 0.25.0. Если вам нужно использовать несколько значений для аргумент, вы можете использовать несколькоtranspile()
вызовов (и потенциальноparallel_map()
для использования многопроцессорности, если это необходимо).Транспиляция выполняется параллельно с использованием многопроцессорной обработки.
- Параметры
схемы ( _CircuitT ) – Схема(ы) для передачи
бэкенд ( Необязательный [ Бэкэнд ] ) — если установлено, транспилятор скомпилирует входную схему для этой цели устройство. Если какой-либо другой параметр задан явно (например,
connection_map
), это переопределит бэкэнд.base_gates ( Дополнительно [ Список [ стр ] ] ) — Список имен базовых ворот, на которые нужно развернуться. (например:
['u1', 'u2', 'u3', 'cx']
). ЕслиNone
, не разворачивать.inst_map ( Дополнительно [ Список [ InstructionScheduleMap ] ] ) — сопоставление развернутых ворот с расписанием импульсов. Если это не предусмотрено, транспайлер пытается получить от бэкенда. Если какая-либо пользовательская калибровка находится на карте и используется в цепи, транспилятор прикрепляет пользовательское определение ворот для схемы. Это позволяет гибко переопределить реализацию инструкции низкого уровня. Эта функция доступна если серверная часть поддерживает эксперимент с импульсными воротами.
карта_сцепления ( Дополнительно [ Соединение [ CouplingMap , Список [ Список [ ] ] ] ] ) –
Карта направленной связи (возможно, пользовательская) для цели в отображении. Если карта связи симметрична, необходимо указать оба направления.
Поддерживается несколько форматов:
Карта соединения
экземплярСписок должен быть представлен в виде матрицы смежности, где каждая запись определяет все направленные двухкубитные взаимодействия, поддерживаемые серверной частью, например:
[[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3]]
backend_properties ( Необязательный [ BackendProperties ] ) — свойства, возвращаемые бэкендом, включая информацию о шлюзе ошибки, ошибки считывания, время когерентности кубитов и т. д. Найдите бэкенд который предоставляет эту информацию:
бэкенд.свойства()
initial_layout ( Дополнительный [ Union [ Layout , Dict 9008 4 , Список ] ] ) –
Исходное положение виртуальных кубитов на физическом кубиты. Если этот макет делает схему совместимой с Coupling_map ограничения, он будет использоваться. Окончательный макет не обязательно будет таким же, поскольку транспилятор может переставлять кубиты с помощью свопов или других средств. Поддерживается несколько форматов:
Макет
ЭкземплярДиктовка * виртуальный в физический:
{qr[0]: 0, qr[1]: 3, qr[2]: 5}
Список
виртуальный в физический:
[0, 3, 5] # упорядочены виртуальные кубиты (помимо именованных)
физическое в виртуальное:
[qr[0], нет, нет, qr[1], нет, qr[2]]
layout_method ( Дополнительно [ str ] ) – Имя прохода выбора раскладки («тривиальный», «плотный», «шум_адаптивный», «сабля»). Это также может быть имя внешнего плагина для использования на этапе макета
list_stage_plugins()
с"layout"
для аргументаstage_name
.метод_маршрутизации ( Дополнительно [ стр ] ) — Имя прохода маршрутизации («базовый», «упреждающий», «стохастический», «саблезный», «нет»). Примечание Это также может быть имя внешнего плагина для использования на этапе маршрутизации
list_stage_plugins()
с"routing"
для аргументаstage_name
.translation_method ( Необязательный [ str ] ) – Название прохода перевода («unroller», «translator», «synthese») Это также может быть имя внешнего плагина для использования в
перевод
этап. Вы можете увидеть список установленных плагинов, используяlist_stage_plugins()
с"перевод"
для аргументаstage_name
.метод_планирования ( Дополнительный [ стр ] ) – Имя прохода планирования. *
'as_soon_as_possible'
: Расписание инструкций жадно, как можно раньше на кубитовом ресурсе. (псевдоним:'как можно скорее'
) *'как_поздно_как_возможно'
: Инструкции по расписанию с опозданием, т.е. сохранение кубитов в основном состоянии, когда это возможно. (псевдоним:'алап'
) ЕслиNone
, планирование выполняться не будет. Это также может быть имя внешнего плагина. для использования на стадии планированияlist_stage_plugins()
с"планированием"
дляstage_name
аргумент.инструкция_длительность ( Дополнительно [ Союз [ Список [ Кортеж [ стр , 900 84 Дополнительный [ Итеративный [ целое число ] ] , float , Необязательный [ Итерируемый [ float ] ] , стр ] ] , Список [ Кортеж [ стр , Дополнительно [ 90 084 Iterable [ int ] ] , float , Дополнительно [ Итерируемый [ float ] ] ] 9008 1 ] , Список [ Кортеж [ str , Дополнительно [ Итерируемый [ int ] ] , плавающий , стр ] ] , Список [ Кортеж [ str , Дополнительно [ Iter способный [ целое число ] ] , с плавающей запятой ] ] , InstructionDurations ] ] ) – продолжительность инструкций. Применимо, только если указан метод планирования. Длина шлюза, определенная в
backend.properties
, используется по умолчанию. Они перезаписываются, если указано этоинструкция_длительности
. Форматинструкций_длительности
должен быть следующим. инструкций_длительности должны быть указаны в виде списка кортежей. [(имя_инструкции, кубиты, продолжительность, единица измерения), …]. | [(‘cx’, [0, 1], 12.3, ‘ns’), (‘u3’, [0], 4.56, ‘ns’)] | [(‘cx’, [0, 1], 1000), (‘u3’, [0], 300)] Если единица измерения опущена, по умолчанию используется значение «dt», что представляет собой шаг расчета, зависящий от бэкенда. Если единицей времени является «dt», продолжительность должна быть целым числом.dt ( Необязательный [ float ] ) – Время выборки (разрешение) серверной части в секундах. Если
None
(по умолчанию), используетсяbackend.configuration(). dt
.аппроксимация_степень ( float ) — эвристический циферблат, используемый для аппроксимации схемы (1,0=нет приближения, 0,0=максимальное приближение)
timest_constraints ( Дополнительно [ Dict [ стр , инт ] ] ) – 9000 8
Дополнительное аппаратное ограничение на разрешение команд. Серверная часть квантового компьютера может сообщать о наборе ограничений, а именно:
granularity: целочисленное значение, представляющее минимальный импульсный строб разрешение в единицах
dt
. Определяемый пользователем импульсный вентиль должен иметь длительность, кратная этому значению детализации.min_length: целочисленное значение, представляющее минимальный импульсный строб длина в единицах
dt
. Определяемый пользователем импульсный строб должен быть длиннее чем эта длина.pulse_alignment: целочисленное значение, представляющее временное разрешение строба. время начала инструктажа. Инструкция шлюза должна начинаться во время, которое является кратным значению выравнивания.
Acquisition_alignment: Целочисленное значение, представляющее временное разрешение измерения время начала инструктажа. Инструкция по измерению должна начинаться во время, которое является кратным значению выравнивания.
Эта информация будет предоставлена серверной конфигурацией. Если у бэкенда нет ограничений на распределение времени инструкций, тогда
Timing_constraints
имеет значение None, и корректировка выполняться не будет.seed_transpiler ( Необязательный [ int ] ) — Устанавливает случайное начальное число для стохастических частей транспайлера
уровень_оптимизации ( Необязательный [ int ] ) — Сколько оптимизации нужно выполнить в цепях. Более высокие уровни генерируют более оптимизированные схемы, за счет увеличения времени транспиляции. * 0: без оптимизации * 1: оптимизация света * 2: сильная оптимизация * 3: еще более тяжелая оптимизация Если
None
, по умолчанию будет выбран уровень 1.обратный вызов ( Дополнительный [ Вызываемый [ [ BasePass , DAGCircuit , float , PropertySet 90 081 , инт ] , Любой ] ] ) –
Функция обратного вызова, которая будет вызываться после каждого пройти исполнение. Функция будет вызываться с ключевым словом 5 аргументы, |
pass_
: выполняется проход. |dag
: dag вывод прохода. |время
: время выполнения прохода. |property_set
: набор свойств. |count
: индекс выполнения прохода. Точные переданные аргументы раскрывают внутренности менеджера проходов, и могут быть изменены по мере изменения внутреннего устройства диспетчера пропусков. Если вы собираетесь повторно использовать функцию обратного вызова в нескольких выпусках, обязательно проверьте, что передаваемые аргументы одинаковы. Чтобы использовать функцию обратного вызова, определите функцию, которая будет возьмите kwargs dict и получите доступ к переменным. Например:по определению callback_func(**kwargs): pass_ = kwargs['pass_'] даг = kwargs['даг'] время = kwargs['время'] property_set = kwargs['property_set'] количество = kwargs['количество'] ... транспортировать (циркуляр, обратный вызов = callback_func)
output_name ( Дополнительный [ Union [ str , List 9 0081 [ str ] ] ] ) — список со строками для идентификации выходные цепи. Длина список должен быть точно такой же длины, как
цепей
параметр.унитарный_синтез_метод ( стр ) — Название унитарного синтеза метод для использования. По умолчанию
используется «по умолчанию»
. Вы можете увидеть список установленных плагины сunitary_synchronous_plugin_names()
.unitary_synchronous_plugin_config ( Необязательный [ dict ] ) — Дополнительный словарь конфигурации который будет передан непосредственно плагину унитарного синтеза. К по умолчанию этот параметр не будет иметь никакого эффекта, так как по умолчанию унитарный метод синтеза не требует пользовательской конфигурации. Это должно быть необходимым только тогда, когда унитарный плагин синтеза указан с
унитарный_синтез
аргумент. Так как это индивидуально для каждого плагин унитарного синтеза, обратитесь к документации плагина, чтобы узнать, как чтобы использовать эту опцию.target ( Необязательный [ Target ] ) — целевой транспилер. Обычно это указывается как часть аргумент
серверной части
, но если вы вручную создалиЦелевой объект
, здесь вы можете указать его вручную. Это переопределит цель сбэкэнд
.hls_config ( Необязательный [ HLSConfig ] ) — дополнительный класс конфигурации
HLSConfig
, который будет передан напрямую вHighLevelSynthesis
проход преобразования. Этот класс конфигурации позволяет задавать для различных высокоуровневых объектов списки алгоритмы синтеза и их параметры.init_method ( Дополнительно [ str ] ) — имя плагина для использования на этапе
init
. По умолчанию внешний плагин не используется. Вы можете увидеть список установленных плагинов по используяlist_stage_plugins()
с"init"
для этапа аргумент имени.optim_method ( Необязательный [ str ] ) – имя плагина для использования
этап оптимизации
. По умолчанию внешний плагин не используется. Вы можете увидеть список установленных плагинов по используяlist_stage_plugins()
с"оптимизацией"
дляимя_стадии
аргумент.ignore_backend_supplied_default_methods ( bool ) — если установлено значение
True
любые методы по умолчанию, указанные бэкенд будет проигнорирован. Некоторые бэкенды указывают альтернативные методы по умолчанию. для поддержки пользовательских проходов/плагинов, специфичных для цели компиляции, которые поддерживают методы компиляции, специфичные для серверной части. Если вы предпочитаете, чтобы эти значения по умолчанию были не используется. Этот параметр используется для отключения этих специфических для бэкенда значений по умолчанию.