Как перевести программу с одного языка программирования на другой

Обновлено: 07.07.2024

Переводчик или язык программирования процессора является общий термин , который может относиться к чему - либо , что преобразует код с одного компьютера на другой язык. Программа, написанная на языке высокого уровня, называется исходной программой. К ним относятся переводы между высокоуровневыми и удобочитаемыми компьютерными языками, такими как C ++ и Java , языками промежуточного уровня, такими как байт-код Java , низкоуровневыми языками, такими как язык ассемблера и машинный код , а также между аналогичными уровнями языка на разных вычислениях. платформы , а также с любой из вышеперечисленных на другую.

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

СОДЕРЖАНИЕ

Переводчики разных типов

Существует 3 различных типа переводчиков:

Компилятор

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

Устный переводчик

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

Ассемблер

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

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

  • Двоичный транслятор (двоичный в двоичный, обычно код)
  • Переводчик языка ассемблера (низкоуровневый исходный код, код)
  • Преобразователь исходного текста в исходный (высокоуровневый исходный код, код)
  • Rewriter (от источника к источнику, обычно код)
  • Конвертер файлов (двоичный в двоичный, обычно данные)
  • Транскодер (двоичный в двоичный, данные)

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

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

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

Компилятор (англ. compiler — составитель, собиратель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется.

1) GCC
2) Free Pascal Compiler
3) Компиляторы C , C ++ и Fortran от Sun Microsystems Inc .
4) Watcom Fortran/C++ Compiler
5) Intel C++/Fortran compiler
6) ICC AVR.

Компилятор обеспечивает преобразование программы с одного языка на другой. Команды исходного языка сильно отличаются по организации и мощности, нежели команды машинного языка. Бывают такие, в которых одна команда исходного языка транслируется в 7-10 машинных команд. Существуют даже такие, в которых в каждой команде может соответствовать более 100 машинных команд (например язык программирования Пролог). В исходных языках довольно часто используется строгая типизация данных, которая осуществляется через их предварительное описание. Программирование на таких языках может опираться не только на кодирование алгоритма, но и на тщательное обдумывание структур данных или классов. Весь процесс трансляции с таких языков программирования обычно называется компиляцией, а исходные языки обычно относятся к языкам высокого уровня.

Интерпретатор (англ. interpreter — истолкователь, устный переводчик) переводит и выполняет программу строка за строкой.В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее. Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы. Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким. Кроме того, отсутствие выходного машинного кода позволяет не «захламлять» внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50-100 раз медленнее программ, написанных в машинных кодах.

Интерпретаторы и компиляторы отвечают за преобразование языка программирования или сценариев (язык высокого уровня) в машинный код. Но если обе программы делают одно и то же, чем они различаются? Давайте разберемся.

Компилятор

Что такое компилятор ?

Компилятор — это компьютерная программа, которая переводит компьютерный код с одного языка программирования на другой. Компилятор берет программу целиком и преобразует ее в исполняемый компьютерный код. Для этого требуется целая программа, так как компьютер понимает только то, что написано двоичным кодом. Задача компилятора — преобразовать исполняемую программу в машинный код, который и распознается компьютером. Примерами скомпилированных языков программирования являются C и C++.

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

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

Интерпретатор

Что такое интерпретатор ?

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

Интерпретатор представляет собой машинную программу, которая непосредственно выполняет набор инструкций без их компиляции. Примерами интерпретируемых языков являются Perl, Python и Matlab.

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

Как это работает?

Интерпретатор создает программу. Он не связывает файлы и не генерирует машинный код. Происходит построчное выполнение исходных операторов во время исполнения программы.

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

Можно ли, по крайней мере, теоретически, написать 100% правильный переводчик между всеми языками? Какие проблемы на практике? Существуют ли уже работающие переводчики?

Помните, что «все языки» включают даже такие глупые, как Oook! (Полнота Тьюринга - не вся история; на практике вам также нужны системные вызовы.) Есть некоторые. Переводчики с C на Pascal и с Pascal на C были довольно распространены в одном месте. Как показывают ответы ниже, выходные данные обычно не были так удобочитаемы, по крайней мере, без некоторой ручной уборки. И это относительно простые языки с относительно простыми библиотеками - хорошо выполнить работу, например, с C ++ для Haskell или наоборот, было бы невозможно. Все компиляторы переводят один PL в другой, они не гарантируют, что код в целевом PL легко читается, хотя Убедившись в точности перевода Google, я убежден, что в своей жизни увижу универсального переводчика. Да, это будет сложная задача и может потребовать огромных усилий, как в случае анализа большой базы кода, такой как github или stackoverflow, но это произойдет, и спрос на такой инструмент также возрастет в ближайшие годы, особенно сейчас что есть много программистов для изучения ИИ и ОД. Там не может быть один человек, который разрабатывает такой инструмент сам по себе. Однако можно разработать бота для разработки ботов для решения этой проблемы.

Самой большой проблемой является не фактический перевод программного кода, а портирование API платформы.

Рассмотрим переводчик PHP на Java. Единственный реальный способ сделать это без встраивания части двоичного кода PHP - это переопределить все модули PHP и API в Java. Это включает в себя реализацию более 10.000 функций. По сравнению с этим работа по переводу синтаксиса очень проста. И даже после всей этой работы у вас не будет Java-кода, у вас будет какое-то чудовище, которое работает на платформе Java, но структурировано как PHP внутри.

Вот почему единственные такие инструменты, которые приходят на ум, - это перевод кода для его развертывания, а не для его последующего сопровождения. Google GWT «компилирует» Java в JavaScript. Хип-хоп Facebook компилирует PHP в C.

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

Ну знаешь что? Такой формат уже существует: сборка. Компилятор уже выполняет преобразование «Язык X в сборку», а дизассемблеры - в преобразование «Сборка в язык Y».

Конечно, вы обнаружите две большие проблемы:

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

Можно ли, по крайней мере, теоретически, написать 100% правильный переводчик между всеми языками? Какие проблемы на практике?

  • Перевод с более структурированного языка на менее структурированный язык, который все еще завершен по Тьюрингу, всегда возможен.
    • Это утверждение следует рассматривать в строго техническом смысле: это означает, что переведенная программа будет давать точно такой же результат при выполнении.
    • Ничто не подразумевает читабельность переведенного кода или сохранение исходных структур программы.
    В точку. Попробуйте прочитать код, который выходит из бэкэнда C LLVM. Это технически допустимый C-код, но это не очень красиво (TM). @dsimcha: кроме читабельности, бэкэнд C делает вывод намного проще для чтения, чем отладка или разборка. Я так рад, что они вернули этот бэкэнд обратно, после того как он вышел из строя на некоторое время.

    Почему вы хотите конвертировать программу?

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

    Языки для людей. Итак, неявное требование вашего вопроса: «почему нет переводчика, который генерирует читаемый код» , и ответ будет (imho): потому что, если есть два языка, которые достаточно отличаются, пишется способ «читаемый код» отличается тем, что не только потребует перевода алгоритмов, но и других алгоритмов.

    Например, сравните типичную итерацию в C и одну в lisp. Или питоны «одним из лучших способов» с идиоматическим рубином.

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

    И «смысл» - не простая концепция для работы.

    *) хорошо, есть coffeescript .

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

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

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

    Кстати, есть переводчик с Java на D. Он называется TioPort и использовался в довольно серьезной попытке перенести SWT на D. Основная проблема, с которой он столкнулся, заключалась в том, что было бы необходимо портировать огромные части стандартной библиотеки Java. ,

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

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

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

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

    Там являются некоторыми автоматическими переводчиками. Если ваша цель - создавать скомпилированный код, а не читаемый код, это вполне возможно и иногда полезно, но не очень часто. Известно, что первый компилятор C ++ на самом деле не был компилятором, но преобразовал C ++ в (действительно сложный) источник C, который затем был скомпилирован компилятором C. Многие компиляторы могут генерировать ассемблерный код по запросу - но вместо того, чтобы выплевывать ассемблерный текст и затем переводить его в машинный код, они обычно могут генерировать машинный код напрямую.

    Учитывая полную спецификацию языка A, в принципе не так сложно написать программу, которая выражает свои директивы на каком-то языке B. Но обычно любой, кто сталкивается с трудностями, выбирает что-то действительно низкое для «языка B»: Машинный код или в наши дни байт-код: Jython - это реализация python, которая генерирует Java-байт-код, который интерпретируется Java VM. Нет необходимости писать и компилировать иерархии классов Java!

    Это делается все время.

    Каждый компилятор переводит «основной язык», такой как C ++, на родной язык ассемблера машины или независимый от архитектуры байт-код в случае интерпретируемых языков.

    Я полагаю, что это не то, о чем вы говорите. Возможно, вам нужен переводчик, который преобразует C ++ во что-то вроде Java или Python. Но какой в ​​этом смысл? В лучшем случае конечный результат будет иметь ту же эффективность, что и исходный источник. (Практически, это будет намного хуже.)

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

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

    1. Если программа тривиальна, вы можете получить достойный результат. Но тогда, если это так просто, какой смысл запускать его через переводчик?
    2. Если программа нетривиальна, код будет низкого качества.

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

    Короче говоря, это просто не стоит.

    Ваша аналогия также применима к обычной компиляции, а мы знаем эмпирически, что это не так! Компьютеры «генерируют» (не пишут) код хорошего качества. То, что они часто делают плохо, это удобочитаемость / ремонтопригодность. Если кому-то действительно нужен такой процесс, который, как мне кажется, время от времени делают люди, ни одна из проблем не является пробкой. Если они, ну тогда, очевидно, перевод никогда не был важен изначально.

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

    Первая проблема заключается только в приемлемой практике языка. Преобразование между двумя объектно-ориентированными языками, такими как Java и C ++, невероятно сложно, и оба они основаны на C. Программа переводчика должна была бы в совершенстве владеть стандартными библиотеками для обоих языков и уметь различать поведение. Вам придется создать огромный словарь, и даже тогда различия в стилях программирования от программиста до программиста означают, что ему придется угадывать, как выполнить некоторые изменения.

    Это не полный список проблем, но их всего две, и они большие. Один из моих профессоров упомянул, что кто-то убедил его работодателя, что в 80-х годах он может сделать его из машинного кода в C, но тогда он не работал. Я сомневаюсь, что когда-нибудь будет тот, который работает полностью.

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

    Можно ли, по крайней мере, теоретически, написать 100% правильный переводчик между всеми языками? Какие проблемы на практике? Существуют ли уже работающие переводчики?

    Помните, что «все языки» включают даже такие глупые, как Oook! (Полнота Тьюринга - не вся история; на практике вам также нужны системные вызовы.) Есть некоторые. Переводчики с C на Pascal и с Pascal на C были довольно распространены в одном месте. Как показывают ответы ниже, выходные данные обычно не были так удобочитаемы, по крайней мере, без некоторой ручной уборки. И это относительно простые языки с относительно простыми библиотеками - хорошо выполнить работу, например, с C ++ для Haskell или наоборот, было бы невозможно. Все компиляторы переводят один PL в другой, они не гарантируют, что код в целевом PL легко читается, хотя Убедившись в точности перевода Google, я убежден, что в своей жизни увижу универсального переводчика. Да, это будет сложная задача и может потребовать огромных усилий, как в случае анализа большой базы кода, такой как github или stackoverflow, но это произойдет, и спрос на такой инструмент также возрастет в ближайшие годы, особенно сейчас что есть много программистов для изучения ИИ и ОД. Там не может быть один человек, который разрабатывает такой инструмент сам по себе. Однако можно разработать бота для разработки ботов для решения этой проблемы.

    Самой большой проблемой является не фактический перевод программного кода, а портирование API платформы.

    Рассмотрим переводчик PHP на Java. Единственный реальный способ сделать это без встраивания части двоичного кода PHP - это переопределить все модули PHP и API в Java. Это включает в себя реализацию более 10.000 функций. По сравнению с этим работа по переводу синтаксиса очень проста. И даже после всей этой работы у вас не будет Java-кода, у вас будет какое-то чудовище, которое работает на платформе Java, но структурировано как PHP внутри.

    Вот почему единственные такие инструменты, которые приходят на ум, - это перевод кода для его развертывания, а не для его последующего сопровождения. Google GWT «компилирует» Java в JavaScript. Хип-хоп Facebook компилирует PHP в C.

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

    Ну знаешь что? Такой формат уже существует: сборка. Компилятор уже выполняет преобразование «Язык X в сборку», а дизассемблеры - в преобразование «Сборка в язык Y».

    Конечно, вы обнаружите две большие проблемы:

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

    Можно ли, по крайней мере, теоретически, написать 100% правильный переводчик между всеми языками? Какие проблемы на практике?

    • Перевод с более структурированного языка на менее структурированный язык, который все еще завершен по Тьюрингу, всегда возможен.
      • Это утверждение следует рассматривать в строго техническом смысле: это означает, что переведенная программа будет давать точно такой же результат при выполнении.
      • Ничто не подразумевает читабельность переведенного кода или сохранение исходных структур программы.
      В точку. Попробуйте прочитать код, который выходит из бэкэнда C LLVM. Это технически допустимый C-код, но это не очень красиво (TM). @dsimcha: кроме читабельности, бэкэнд C делает вывод намного проще для чтения, чем отладка или разборка. Я так рад, что они вернули этот бэкэнд обратно, после того как он вышел из строя на некоторое время.

      Почему вы хотите конвертировать программу?

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

      Языки для людей. Итак, неявное требование вашего вопроса: «почему нет переводчика, который генерирует читаемый код» , и ответ будет (imho): потому что, если есть два языка, которые достаточно отличаются, пишется способ «читаемый код» отличается тем, что не только потребует перевода алгоритмов, но и других алгоритмов.

      Например, сравните типичную итерацию в C и одну в lisp. Или питоны «одним из лучших способов» с идиоматическим рубином.

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

      И «смысл» - не простая концепция для работы.

      *) хорошо, есть coffeescript .

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

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

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

      Кстати, есть переводчик с Java на D. Он называется TioPort и использовался в довольно серьезной попытке перенести SWT на D. Основная проблема, с которой он столкнулся, заключалась в том, что было бы необходимо портировать огромные части стандартной библиотеки Java. ,

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

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

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

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

      Там являются некоторыми автоматическими переводчиками. Если ваша цель - создавать скомпилированный код, а не читаемый код, это вполне возможно и иногда полезно, но не очень часто. Известно, что первый компилятор C ++ на самом деле не был компилятором, но преобразовал C ++ в (действительно сложный) источник C, который затем был скомпилирован компилятором C. Многие компиляторы могут генерировать ассемблерный код по запросу - но вместо того, чтобы выплевывать ассемблерный текст и затем переводить его в машинный код, они обычно могут генерировать машинный код напрямую.

      Учитывая полную спецификацию языка A, в принципе не так сложно написать программу, которая выражает свои директивы на каком-то языке B. Но обычно любой, кто сталкивается с трудностями, выбирает что-то действительно низкое для «языка B»: Машинный код или в наши дни байт-код: Jython - это реализация python, которая генерирует Java-байт-код, который интерпретируется Java VM. Нет необходимости писать и компилировать иерархии классов Java!

      Это делается все время.

      Каждый компилятор переводит «основной язык», такой как C ++, на родной язык ассемблера машины или независимый от архитектуры байт-код в случае интерпретируемых языков.

      Я полагаю, что это не то, о чем вы говорите. Возможно, вам нужен переводчик, который преобразует C ++ во что-то вроде Java или Python. Но какой в ​​этом смысл? В лучшем случае конечный результат будет иметь ту же эффективность, что и исходный источник. (Практически, это будет намного хуже.)

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

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

      1. Если программа тривиальна, вы можете получить достойный результат. Но тогда, если это так просто, какой смысл запускать его через переводчик?
      2. Если программа нетривиальна, код будет низкого качества.

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

      Короче говоря, это просто не стоит.

      Ваша аналогия также применима к обычной компиляции, а мы знаем эмпирически, что это не так! Компьютеры «генерируют» (не пишут) код хорошего качества. То, что они часто делают плохо, это удобочитаемость / ремонтопригодность. Если кому-то действительно нужен такой процесс, который, как мне кажется, время от времени делают люди, ни одна из проблем не является пробкой. Если они, ну тогда, очевидно, перевод никогда не был важен изначально.

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

      Первая проблема заключается только в приемлемой практике языка. Преобразование между двумя объектно-ориентированными языками, такими как Java и C ++, невероятно сложно, и оба они основаны на C. Программа переводчика должна была бы в совершенстве владеть стандартными библиотеками для обоих языков и уметь различать поведение. Вам придется создать огромный словарь, и даже тогда различия в стилях программирования от программиста до программиста означают, что ему придется угадывать, как выполнить некоторые изменения.

      Это не полный список проблем, но их всего две, и они большие. Один из моих профессоров упомянул, что кто-то убедил его работодателя, что в 80-х годах он может сделать его из машинного кода в C, но тогда он не работал. Я сомневаюсь, что когда-нибудь будет тот, который работает полностью.

      Читайте также: