Компиляторы, нацеленные на файлы.pyc?
Из любопытства, есть ли много компиляторов, которые нацелены .pyc
файлы?
После небольшого поиска в Google, я могу найти только два:
- нечестивый: Why_'s Ruby-to-pyc компилятор
- Python: компилятор PSF для Python to pyc
Итак... Есть еще?
(в качестве примечания я подумал об этом, потому что хочу написать компилятор Scheme-to-pyc)
(как примечание второй стороны, у меня нет никаких иллюзий, что компилятор Scheme-to-pyc будет полезен, но это даст мне невероятное оправдание для изучения некоторых внутренних элементов как Scheme, так и Python)
5 ответов
Несколько лет назад я написал компилятор, который принимал язык, похожий на lisp, называемый Noodle, и создавал байт-код Python. Хотя он никогда не становился особенно полезным, это был чрезвычайно хороший опыт обучения как для лучшего понимания Common Lisp (я скопировал несколько его функций), так и для лучшего понимания Python.
Я могу вспомнить два конкретных случая, когда было бы полезно нацеливаться на байт-код Python напрямую, вместо того, чтобы создавать Python и передавать его компилятору Python:
- Полное закрытие: в Python до 3.0 (до
nonlocal
Ключевое слово), вы не можете изменить значение закрытой переменной, не прибегая к взлому байт-кода. Вместо этого вы можете изменять значения, поэтому обычной практикой является закрытие, например, ссылающееся на список и изменяющее первый элемент в нем из внутренней области видимости. Это может стать очень раздражающим. Ограничение является частью синтаксиса, но не Python VM. В моем языке было явное объявление переменных, поэтому он успешно предоставлял "нормальные" замыкания с изменяемыми закрытыми значениями. - Получение объекта трассировки без ссылки на какие-либо встроенные функции. Конечно, это был настоящий нишевый случай, но я использовал его, чтобы сломать раннюю версию "сафелитовой" тюрьмы. Смотрите мою публикацию об этом.
Так что да, это, вероятно, намного больше работы, чем стоит, но мне понравилось, и вы тоже можете.
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) - так что вам, вероятно, нужен какой-то слой абстракции.