Компиляторы, нацеленные на файлы.pyc?

Из любопытства, есть ли много компиляторов, которые нацелены .pyc файлы?

После небольшого поиска в Google, я могу найти только два:

Итак... Есть еще?

(в качестве примечания я подумал об этом, потому что хочу написать компилятор Scheme-to-pyc)

(как примечание второй стороны, у меня нет никаких иллюзий, что компилятор Scheme-to-pyc будет полезен, но это даст мне невероятное оправдание для изучения некоторых внутренних элементов как Scheme, так и Python)

5 ответов

Решение

Несколько лет назад я написал компилятор, который принимал язык, похожий на lisp, называемый Noodle, и создавал байт-код Python. Хотя он никогда не становился особенно полезным, это был чрезвычайно хороший опыт обучения как для лучшего понимания Common Lisp (я скопировал несколько его функций), так и для лучшего понимания Python.

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

  1. Полное закрытие: в Python до 3.0 (до nonlocal Ключевое слово), вы не можете изменить значение закрытой переменной, не прибегая к взлому байт-кода. Вместо этого вы можете изменять значения, поэтому обычной практикой является закрытие, например, ссылающееся на список и изменяющее первый элемент в нем из внутренней области видимости. Это может стать очень раздражающим. Ограничение является частью синтаксиса, но не Python VM. В моем языке было явное объявление переменных, поэтому он успешно предоставлял "нормальные" замыкания с изменяемыми закрытыми значениями.
  2. Получение объекта трассировки без ссылки на какие-либо встроенные функции. Конечно, это был настоящий нишевый случай, но я использовал его, чтобы сломать раннюю версию "сафелитовой" тюрьмы. Смотрите мою публикацию об этом.

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

Msgstr "Я хочу написать компилятор Scheme-to-pyc".

Мой мозг болит! Почему вы хотите это сделать? Байт-код Python - это промежуточный язык, специально разработанный для удовлетворения потребностей языка Python и предназначенный для работы на виртуальных машинах Python, которые, опять же, были адаптированы к потребностям Python. Некоторые из наиболее важных областей разработки Python в наши дни - это перемещение Python на другие "виртуальные машины", такие как Jython (JVM), IronPython (.NET), PyPy и проект Unladen Swallow (перевод CPython в представление на основе LLVM)., Попытка втиснуть синтаксис и семантику другого, совершенно другого языка (Схемы) в промежуточное представление другого языка высокого уровня, похоже, атакует проблему (какой бы она ни была) на неправильном уровне. Так что, в общем, не похоже, чтобы было много компиляторов.pyc, и для этого есть веская причина.

Просто для вашего интереса, я написал компилятор игрушек из простого LISP для Python. Практически это компилятор LISP to pyc.

Посмотрите: sinC - самый крошечный компилятор LISP

Я предлагаю вам сосредоточиться на CPython.

http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html

Вместо переводчика Scheme в.pyc я предлагаю вам написать переводчик Scheme to Python, а затем позволить CPython обработать преобразование в.pyc. (Есть прецедент для этого: первым компилятором C++ был Cfront, который переводил C++ в C, а затем компилятор системы C делал все остальное.)

Из того, что я знаю о Scheme, было бы не так сложно перевести Scheme на Python.

Одно предупреждение: виртуальная машина Python, вероятно, не так быстра для Схемы, как сама Схема. Например, Python автоматически не превращает хвостовую рекурсию в итерацию; а в Python относительно небольшой стек, поэтому вам действительно нужно превратить хвостовую рекурсию в итерацию для вашего переводчика.

В качестве бонуса, как только Unladen Swallow ускоряет Python, ваш переводчик Scheme-to-Python выиграет, и в этот момент может даже стать практичным!

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

PS Если вам нужен более практичный проект, вы можете написать переводчик с AWK на Python. Таким образом, люди с унаследованными скриптами AWK могут легко сделать шаг вперед к Python!

Возможно, немного поздно на вечеринке, но если вы все еще заинтересованы, проект clojure-py (https://github.com/halgari/clojure-py) теперь может скомпилировать значительное подмножество clojure в байт-код Python - но некоторая помощь всегда приветствуется.

Ориентация на байт-код сама по себе не так сложна, за исключением одной вещи: она нестабильна на разных платформах (например, MAKE_FUNCTION извлекает 2 элемента из стека в Python 3, но только 1 в Python 2), и эти различия четко не задокументированы в одном spot (afaict) - так что вам, вероятно, нужен какой-то слой абстракции.

Другие вопросы по тегам