Почему невозможно создать практический конвертер исходного кода Perl в Python? - PullRequest
4 голосов
/ 03 августа 2010

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

Наиболее очевидное решение - просто вызвать perl через утилиты Python:

#!/usr/bin/python
os.exec("tail -n -2 "+__file__+" | perl -")
...the rest of file is the original perl program...

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

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

Итак, не могли бы вы назвать идиомы и синтаксические возможности Perl, которые не могут быть выражены в Python, такими же краткими, как в исходном коде Perl?

Редактировать : некоторые люди связывали инициаторы Python-to-Perl и на этой основе выводили, что также должно быть легко писать Perl-to-Python. Тем не менее, я уверен, что преобразование в Python требует большего спроса; до сих пор этот конвертер еще не написан - пока обратное уже было! Что только укрепляет мою уверенность в невозможности написания хорошего конвертера для Python.

Ответы [ 11 ]

34 голосов
/ 03 августа 2010

Вашему лучшему конвертеру Perl в Python, вероятно, 23 года, он только что закончил университет и ищет работу.

25 голосов
/ 03 августа 2010

Почему Perl не Python.

  1. В Perl есть операторы, которых Python более или менее полностью отсутствует. Хотя вы, вероятно, можете придумать соответствующие операторы, синтаксис будет настолько непохож на Perl, что затруднит называть его «переводом». Вам действительно нужно было бы приготовить какой-нибудь причудливый материал на Python, чтобы сделать его таким же лаконичным, как и оригинальный Perl.

  2. Perl имеет семантику времени выполнения, которая настолько непохожа на Python, что делает перевод очень сложным. Мы рассмотрим только один пример ниже.

  3. В Perl есть структуры данных, которые достаточно отличаются от Python, что перевод труден.

  4. Потоки Perl по умолчанию не обмениваются данными. Только выбранные элементы данных могут быть общими. Потоки Python имеют более распространенные данные для общего доступа.

Достаточно одного примера # 2.

Perl:

do_something || die()

Где do_something любое заявление любого вида.

Чтобы автоматически перевести это на Python, вам нужно будет обернуть каждую || die() инструкцию в

try:
   python_version_of_do_something
except OrdinaryStatementFailure, e:
   die()
   sys.exit()

Где более распространенная формулировка

Perl

do_something

Стало бы это, используя простой - бездумный - перевод источника

try:
   python_version_of_do_something
except OrdinaryStatementFailure, e:
   pass

И, конечно же,

Perl

do_this || do_that || die()

Еще сложнее перевести на Python.

И

Perl

do_this && do_that || die()

действительно раздвинь конверт. Мой Perl ржавый, поэтому я не могу вспомнить точную семантику такого рода вещей. Но вы должны полностью понимать семантику, чтобы разработать реализацию Pythonic.

Примеры Python не являются хорошими Python. Чтобы написать хорошо Python требует «мышления», чего не может сделать автоматический перевод.

И каждая конструкция Perl должна быть «обернута» таким образом, чтобы преобразовать исходную семантику Perl в форму Pythonic.

Теперь проведите аналогичный анализ для каждой функции Perl.

17 голосов
/ 04 августа 2010

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

  • динамическая область (через ключевое слово local)
  • манипулирование typeglob (несколько переменных с одним и тем же именем)
  • форматов (они имеют собственный синтаксис)
  • замыкания по изменяемым переменным
  • псевдокомментарии
  • Подпрограммы lvalue (mysub() = 5; код типа)
  • исходные фильтры
  • контекст (список против скаляра и способ, которым вызываемый код может проверить это с помощью wantarray)
  • принуждение / динамический набор
  • любая программа, которая использует строку eval

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

Perl не может быть проанализирован статически. Определения в коде Perl (особенно в блоках BEGIN) изменяют способ интерпретации оставшегося кода компилятором. Так что для нетривиальных программ преобразование из Perl => Python страдает от проблемы остановки.

Невозможно точно знать, как будут скомпилированы все программы, пока программа не завершит работу, и теоретически возможно создать программу Perl, которая будет компилироваться по-разному при каждом ее запуске. Это означает, что одна Perl-программа может отображать бесконечное число Python-программ, правильность которых известна только после запуска исходной программы в интерпретаторе Perl.

7 голосов
/ 03 августа 2010

Это не невозможно, просто потребовалось бы много работы.

Кстати, есть Perthon , переводчик Python-to-Perl.Просто кажется, что никто не хочет делать то, что идет другим путем.

РЕДАКТИРОВАТЬ: Я думаю, я мог бы найти причину, почему переводчик Python в Perl намного проще реализоватьЭто потому, что Python позволяет вам использовать AST скрипта.См. модуль синтаксического анализа.

5 голосов
/ 03 августа 2010

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

Значение программы можетбыть точно определенным определением языка, но программисту не обязательно требовать все детали.Тестирование программистом переменного тока, если возвращаемое значение printf() отрицательное, проверяет состояние ошибки и обычно не заботится о точном значении.if (printf("%s","...") < 0) exit(); можно перевести на Perl как print "..." or die();.Эти операторы могут не означать одно и то же, но, как правило, они означают то, что имеет в виду программист, и для создания идиоматического кода C или Perl из идиоматического кода Perl или C переводчик должен учитывать это.

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

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

5 голосов
/ 03 августа 2010

Perl может быть создан экспериментально для сбора дополнительной информации (например, комментариев) во время компиляции кода Perl и даже для выдачи результатов в виде XML. Похоже, что нет никакой документации об этом за пределами источника, за исключением: http://search.cpan.org/perldoc/perl5100delta#MAD

Это должно быть полезно при создании переводчика. Я ожидаю, что вы пройдете 80% пути довольно легко, 95% с большим трудом, и никогда намного лучше, чем это. Слишком много вещей, которые плохо отображаются.

3 голосов
/ 04 августа 2010
  • Область и пространство имен Python отличаются от Perl.

  • В Python все является объектом. В Perl все под капотом выглядит как list / hash / scalar / reference / function. Это вызывает различные подходы к дизайну и идиомы.

  • Perl имеет блоки анонимного кода и может генерировать замыкания на лету с некоторыми ветвями. Я довольно уверен, что это не функция Python.

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

Я гораздо больше сомневаюсь в целесообразности большого и / или грубого перевода Perl. Некоторые из нас время от времени пишут действительно прикольный код ....:)

2 голосов
/ 13 августа 2010

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

1 голос
/ 18 июня 2011

Причина, по которой практически невозможно создать универсальный переводчик с одного языка высокого уровня на другой, заключается в том, что программа описывает только КАК , а не ПОЧЕМУ (это причина комментариев в исходном коде).

Чтобы создать значимую программу на другом языке высокого уровня, вы (или программа-переводчик) должны знать ПОЧЕМУ , чтобы иметь возможность создать наилучшую возможную программу. Если вы не можете этого сделать, все, что вы можете сделать, - это создать интерпретатор Python для скомпилированной версии программы Perl.

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

1 голос
/ 03 августа 2010

Набор модулей B от Малкольма Битти был бы единственной разумной отправной точкой для чего-то подобного, хотя я с другими ответами в том, что это будет трудной проблемой для решения. В целом, для перевода смысла одного языка высокого уровня в другой язык высокого уровня требуется переводчик высокого уровня, и на данный момент это может означать только человека.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...