Компилятор исходного кода - Source-to-source compiler

Источник-источник переводчик , источник-источник компилятор ( S2S компилятор ), transcompiler или transpiler представляет собой тип переводчика , который принимает исходный код программы , написанной на языке программирования в качестве входных данных и производит эквивалентный исходный код на том же или другом языке программирования. Транслятор исходного кода выполняет преобразование между языками программирования, которые работают примерно на одном уровне абстракции , в то время как традиционный компилятор выполняет перевод с языка программирования более высокого уровня на язык программирования более низкого уровня . Например, переводчик исходного кода может выполнять перевод программы с Python на JavaScript , в то время как традиционный компилятор переводит с такого языка, как C, на ассемблер или Java в байт-код . Автоматическое распараллеливание компилятор часто принимает в программе на языке высокого уровня в качестве входных данных , а затем преобразовать код и аннотировать его с параллельным кодом аннотацией (например, OpenMP ) или языковыми конструкциями (например , Fortran «s forallзаявления).

Другая цель компиляции исходного кода в исходный - перевод устаревшего кода для использования следующей версии базового языка программирования или API, нарушающего обратную совместимость. Он будет выполнять автоматический рефакторинг кода, который полезен, когда программы для рефакторинга находятся вне контроля исходного разработчика (например, преобразование программ из Python 2 в Python 3 или преобразование программ из старого API в новый API) или когда размер программы делает ее ручной рефакторинг непрактичной или трудоемкой.

Транскомпиляторы могут либо сохранить структуру транслированного кода как можно ближе к исходному коду, чтобы упростить разработку и отладку исходного исходного кода, либо могут изменить структуру исходного кода настолько, что переведенный код не будет похож на исходный код. Существуют также утилиты отладки, которые отображают преобразованный исходный код обратно в исходный код; например, стандарт JavaScript Source Map позволяет отображать код JavaScript, выполняемый веб-браузером, обратно в исходный источник, когда код JavaScript был, например, уменьшен или создан с помощью языка, преобразованного в JavaScript.

Примеры включают Closure Compiler , CoffeeScript , Dart , Haxe , TypeScript и Emscripten .

Переводчики языка ассемблера

Intel CONV86

Intel продавала свой 16-битный процессор 8086 как источник, совместимый с 8-битным процессором 8080 . Для поддержки этого у Intel был основанный на ISIS-II преобразователь исходного кода 8080 в 8086 с именем CONV86 (также называемый CONV-86 и CONVERT 86), доступный OEM- клиентам с 1978 года, возможно, самая ранняя программа такого рода. Он поддерживал несколько уровней перевода и работал на частоте 2 МГц в системе разработки микропроцессоров Intel MDS-800 с 8-дюймовыми дисководами для гибких дисков . По отзывам пользователей, работало не очень надежно.

SCP TRANS86

Компания Seattle Computer Products (SCP) предложила TRANS86.COM, написанный Тимом Патерсоном в 1980 году при разработке 86-DOS . Утилита может переводить исходный код ассемблера Intel 8080 и Zilog Z80мнемоникой Zilog / Mostek ) в исходный код .ASM для Intel 8086 (в формате, совместимом только с кросс-ассемблером SCP ASM86 для CP / M-80 ), но поддерживается только подмножество кодов операций , регистров и режимов, и часто все еще требовало значительной ручной корректировки и последующей доработки. Кроме того, выполняя только простую транслитерацию , однопроходный транслятор грубой силы не выполнял никаких оптимизаций регистров и переходов. Потребовалось около 24 КБ ОЗУ. SCP версии 1 TRANS86.COM работал на системах на базе Z80. После запуска 86-DOS Патерсон использовал TRANS86, чтобы преобразовать себя в программу, работающую под 86-DOS. Номер версии 2, вместо этого он был назван TRANS.COM. Позже, в 1982 году, переводчик, по-видимому, также был доступен в Microsoft .

Сорцим TRANS86

Также под названием TRANS86, Sorcim также предлагал транслятор с 8080 на 8086 с декабря 1980 года. Как и программа SCP, он был разработан для переноса кода приложения CP / M-80 (в формате ассемблера ASM, MAC, RMAC или ACT80) в MS-DOS (в формат, совместимый с ACT86). В формате ACT80 он также поддерживает несколько мнемоник Z80. Перевод происходил по инструкции с некоторой оптимизацией условных переходов. Программа работала под CP / M-80, MP / M-80 и Cromemco DOS с минимум 24 КБ ОЗУ и не имела ограничений на размер исходного файла.

Цифровые исследования XLT86

Намного более сложным и первым, кто ввел оптимизирующие компиляторные технологии в процесс трансляции исходного кода, был XLT86 1.0 от Digital Research в сентябре 1981 года. XLT86 1.1 был доступен к апрелю 1982 года. Программа была написана Гэри Килдаллом и переведена на исходный код .ASM для платформы. Процессор Intel 8080 (в формате, совместимом с ассемблерами ASM, MAC или RMAC) в исходный код .A86 для 8086 (совместимый с ASM86). Используя глобальный анализ потока данных при использовании регистра 8080, пятифазный многопроходный транслятор также оптимизирует вывод для размера кода и позаботится о соглашениях о вызовах (вызовы CP / M-80 BDOS были отображены в вызовы BDOS для CP / M- 86 ), чтобы программы CP / M-80 и MP / M-80 могли автоматически переноситься на платформы CP / M-86 и MP / M-86 . Сам XLT86.COM был написан на PL / I-80 для платформ CP / M-80. Программа занимала для себя 30 КБ ОЗУ плюс дополнительную память для графа программы . В системе с памятью 64 КБ максимальный поддерживаемый размер исходного файла составлял около 6 КБ, поэтому перед переводом приходилось разбивать файлы большего размера. В качестве альтернативы XLT86 также был доступен для DEC VAX / VMS (для VAX 11/750 или 11/780 ). Хотя ввод и вывод XLT86 работали на уровне исходного кода, представление программы транслятором в памяти и применяемые технологии оптимизации кода закладывают основу для двоичной перекомпиляции .

Другие

Компания 2500 AD Software предложила транслятор исходного кода с 8080 на 8086 как часть своего пакета XASM для машин CP / M-80 с Z80, а также для систем Zilog ZEUS и Olivetti PCOS .

С 1979 года Zilog предлагал переводчик Z80 на Z8000 как часть своей системы разработки PDS 8000. Advanced Micro Computers (AMC) и 2500 AD Software также предлагали переводчики с Z80 на Z8000. Последний назывался TRANS и был доступен для Z80 CP / M, CP / M-86, MS-DOS и PCOS.

Реализации языков программирования

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

Список транскомпиляторов
Имя Исходный язык Язык перевода
Cfront C ++ C
HipHop для PHP (HPHPc) PHP C ++
Вавилон ES6 + ( JS ) ES5
ClojureScript Clojure JavaScript
JSweet Джава Машинопись
Swiftify Цель-C Быстрый
J2ObjC Джава Цель-C
Haxe Haxe ActionScript 3 , JavaScript , Java , C ++ , C # , PHP , Python , Lua
Майя Майя Verilog
Цербер X Цербер JavaScript , Java , C ++ , C #

Перенос кодовой базы

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

Транскомпиляторные конвейеры

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

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

Рекурсивная транскомпиляция

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

Повторяя этот процесс, можно превратить A → B → C → D → E → F, а затем обратно в A (v2). Некоторая информация будет сохранена через этот конвейер, от A → A (v2), и эта информация (на абстрактном уровне) демонстрирует, с чем согласен каждый из компонентов A – F.

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

Эта информация, которая сохраняется при преобразовании в каждом формате, от A – F – A (v2), является (по определению) производным содержанием или производным кодом .

Рекурсивная транспиляция использует тот факт, что транспиляторы могут либо сохранять переведенный код как можно ближе к исходному коду, чтобы упростить разработку и отладку исходного исходного кода, либо они могут настолько сильно изменить структуру исходного кода, что переведенный код не похож на исходный код. Существуют также утилиты отладки, которые отображают перенесенный исходный код обратно в исходный код; например, исходные карты JavaScript позволяют отображать код JavaScript, выполняемый веб-браузером, обратно в исходный источник на языке, преобразованном в JavaScript.

Смотрите также

Примечания

использованная литература

дальнейшее чтение

внешние ссылки