Компилятор против интерпретатора против транспилятора

Во время сеанса responseJS, на котором я присутствовал, докладчик использовал термин transpiler для обозначения некоторого преобразования / переноса кода. Я всегда использовал и слышал термины «компилятор» и «интерпретатор», когда дело доходит до преобразования языкового кода в работоспособную форму в компьютерной системе / машине. Транспилер для меня в новинку. Чем транспилятор отличается от компилятора или интерпретатора и зачем он вообще нужен?


comment
Вы правы - транспиллер - это избыточный термин, и его никогда не следует использовать. Любой компилятор - это транспилятор.   -  person SK-logic    schedule 31.08.2016
comment
Уважаемый, отрицательный! Если вы можете оставить соответствующий отзыв / комментарий, я смогу предпринять соответствующие действия для улучшения сообщения.   -  person RBT    schedule 23.04.2018


Ответы (7)


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

Конвертер VB6 в VB.NET можно рассматривать как транспилятор. Я мог бы думать об инструменте COBOL to C # / C ++ / Java как о транспиляторе.

person Ajay    schedule 31.08.2016
comment
Xtend (eclipse.org/xtend) и NetRexx (netrexx.org) - это 2 языка, которые переведены на Java. - person Bruce Martin; 01.09.2016
comment
Другой пример - язык TypeScript, который переводит (транслирует) в JavaScript. - person Somnath Musib; 28.04.2018

Компилятор - компилирует код в код более низкого уровня.

Пример:

  • "Developer code" -> "Machine code"
  • PHP -> C
  • Java -> bytecode

Transpiler - компилирует код на тот же уровень кода / абстракции.

Пример:

  • "Developer code" -> "Another developer code or version"
  • JavaScript ES2015+ -> JavaScript ES5

Интерпретатор - интерпретирует код, на самом деле, не в одном классе / лиге / контексте с двумя вышеупомянутыми.

Пример: php.exe

  • "Ваш PHP-код / ​​скрипты внутри index.php" -> "Результаты до html или просто как index.html"
person Jim M    schedule 17.11.2017
comment
Быстрый вопрос: если я создам язык с использованием C ++ и превращу исходный код этого языка в C ++ как часть моего компилятора, будет ли это действительно просто транспиляцией? - person Dynamic Squid; 31.08.2020

Это часто называют «транспилированием», когда вы переводите код с помощью JS-препроцессоров, таких как CoffeeScript, TypeScript (вы называете это), в простой JavaScript. Но на самом деле это не эксклюзивная вещь для JS. Это применимо ко всем языкам программирования. В основном это просто называется компиляцией.

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

Согласно https://www.stevefenton.co.uk/2012/11/compiling-vs-transpiling/

Итак, в вашем случае:

  • 'compile' JSX => JavaScript (и HTML), что, как мне кажется, соответствует приведенному выше определению.
  • Поэтому его можно назвать «транспилингом». Хотя называть это «компиляцией» тоже можно.

Другой пример:

  • CoffeeScript / TypeScript / ... whatEverScript .. => JavaScript и наоборот.
person fuma    schedule 07.09.2016
comment
А как насчет кода SQL в Java? это компилятор или транспилятор? из приведенного выше определения мне кажется, что это компилятор. не так ли? - person user1870400; 27.08.2019
comment
@ user1870400 Мое мнение здесь для SQL - использовать термин "генерация кода" или "миграция". Это то, что вы здесь, вероятно, сделаете в случае SQL и тому подобного. Но зависит от того, что именно вы хотите сделать. Я бы сказал, что SQL - это не язык программирования, а язык запросов (надеюсь, что меня никто не застанет за это утверждение). Также, когда вы думаете об OpenAPI / swagger, вы можете сгенерировать код из формата определения. Вероятно, это не то, что следует называть скомпилированным, а сгенерированным. - person fuma; 02.09.2019

Я создаю такие инструменты с 1980-х годов.

Мы назвали их «системами преобразования программ».

Этот срок прослужил нормально, AFAICT, около 45 лет. Идея возникла намного раньше; см. работу компилятора-компилятора Meta II Вэла Шорре для версии этой идеи 1963 года.

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

person Ira Baxter    schedule 01.09.2016
comment
Согласованный. Я построил его в 1979 году. По сути, это просто компилятор с другим типом целевого языка. - person user207421; 01.09.2016
comment
А компьютер раньше называли двигателем разницы. Мышь раньше называлось индикатором положения X-Y для системы отображения. Предшественником автомобилей называлась пожарная машина для перевозки повозок и особенно артиллерии. В природе языка есть сокращение: см. Закон Ципфа и лингвистическая экономика. Раньше для нас это было достаточно хорошо, эти молодые люди ... чушь. Он называется транспилятором, потому что компилятор преобразования исходного кода в исходный слишком длинный для повседневного использования, теперь, когда транспилеры стали повседневным использованием (наиболее яркими примерами являются TypeScript / CoffeeScript / ES6 и SCSS). - person Amadan; 01.09.2016
comment
Ваши примеры - все это неуклюжая фраза, которую мы использовали, когда у нас было всего несколько; это было незадолго до того, как была установлена ​​стандартная терминология, и люди так и не изобрели термины, заменяющие мышь. Я хочу сказать, что эта технология существует уже более 50 лет. Система трансформации - это способ сокращения более длинной фразы, если вы хотите лингвистической экономии. И они находились в повседневном использовании во многих областях вычислений; возможно, просто вы их не заметили. Появление TypeScript не меняет внезапно концепцию и не вызывает необходимости в новом термине. Для меня ты похож на одного из тех священников. - person Ira Baxter; 01.09.2016
comment
@ Амадан Вы даже не точны. Устройство Бэббиджа называлось аналитической машиной. Его предшественник назывался разностным двигателем, но это не был компьютер. Это был 1837 год. Термин «компьютер» в современном понимании используется уже семьдесят лет. - person user207421; 02.09.2016
comment
Верны ли мои точные примеры или нет, не имеет значения. Я просто хотел указать, что это не заговор, это просто язык как язык - спросите любого лингвиста. Язык меняется, новые слова появляются постоянно и выживают, если им удается быть полезными для достаточно значительной части населения. Священники? Дай мне перерыв. Проблема с TypeScript не в том, что это новая концепция; но то, что концепция вырвалась из микропопуляции, в которой она была раньше, и распространилась в массы: вот что движет лингвистическими изменениями. - person Amadan; 02.09.2016
comment
@Amadan Я не думаю, что какие-либо из ваших примеров на самом деле точны, и, поскольку ваш аргумент в основном анекдотичен, он стоит или падает на ваших примерах. Не подлежит сомнению, что язык динамичен. Вопрос в том, нужен ли нам новый термин для существующей концепции. Негативная реакция на изменение языка является такой же законной силой при оценке языка, как и нововведение: этот момент лингвисты неизменно упускают из виду. - person user207421; 07.09.2016
comment
Они игнорируют это, потому что естественный язык изменяется ЕСТЕСТВЕННО. Все дело в том, что решают массы, а не меньшинство программистов из 1979 года. Поверьте мне, лучше принять это и быть довольным, чем тратить свое время и усилия на споры о несерьезном. - person Phil; 20.06.2017
comment
Я тоже получаю свой голос по поводу развития языка, но он не учитывается, если я не жалуюсь. - person Ira Baxter; 20.06.2017
comment
На самом деле ни один из примеров @Amadan не является правильным. Болел за него, даже мышь так не называли, так описывали. en.wikipedia.org/wiki/Douglas_Engelbart И Ира Бакстер, проверила ваш профиль linkedin. Ты мудрец. С большим уважением. - person Cozzbie; 04.10.2017
comment
@Cozzbie: Вы цитируете Википедию. Я цитирую настоящий патент, который подал Энгельбарт. Но опять же, и я поддерживаю это: верны ли мои конкретные примеры или нет, не имеет значения. Я только отреагировал, чтобы отметить, как я буду уважать этот ответ и огромный опыт, стоящий за ним, тем более, если бы он сопротивлялся желанию унижать людей без какой-либо причины, кроме как использовать язык иначе, чем он. Последний абзац ответа уродлив и ниже его; это не объективно и не заслуживает ответа на StackOverflow. - person Amadan; 05.10.2017

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

Источник: Википедия.

  • Компилятор - переводит исходный код с языка более высокого уровня на язык более низкого уровня.
    Пример: компиляторы C (C в машинный код), javac-инструмент JDK (java в байтовый код)
  • Transpiler - тип компилятора, который выполняет перевод между исходными кодами на одном уровне абстракции.
    Пример: Babel (ES6 + to ES5) - который можно использовать для написания Код ES6, по-прежнему поддерживая старые браузеры, такие как IE 11 и ниже.
person shaahiin    schedule 27.11.2017

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

Типы компилятора

  • Компилятор собственного кода: компилятор, используемый для компиляции исходного кода только для платформы того же типа. Вывод, сгенерированный этим типом компилятора, может быть запущен только на том же типе компьютерной системы и операционной системы (ОС), на которой работает сам компилятор.
  • Кросс-компилятор: компилятор, используемый для компиляции исходного кода для различных платформ. Используется при создании программного обеспечения для встраиваемых систем, которое можно использовать на нескольких платформах.
  • Компилятор исходного кода: преобразует HLL (язык высокого уровня) или исходный язык в LLL (язык низкого уровня) или машинный язык.
  • Транспилер: преобразует HLL (язык высокого уровня) в другой HLL.
person Jeyanth    schedule 22.01.2019

По определению транспилятор - это особая форма переводчика.

Компилятор преобразует исходный код высокого уровня в код более низкого уровня абстракции. Обычно, но не обязательно, целью компиляции является машинный код. То есть код, который может выполняться непосредственно ЦП. Компилятор также может создавать байт-код, который является имитацией машинного кода, но позже интерпретируется так называемой виртуальной машиной (т. Е. Байт-кодом Java для Java VM). Тем не менее, термин компилятор может применяться к инструменту, который преобразует код на другой язык программирования, который не является машинно-исполняемым кодом. Отличительное отличие компилятора в том, что он снижает уровень абстракции.

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

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

person Valera Grishin    schedule 18.11.2018
comment
Этот ответ будет полезен при цитировании источников использованных утверждений. Я не говорю, что это неправильно, просто предоставление источников может отличить это от других ответов. - person Trilarion; 29.07.2020