2009-10-20 79 views
3

出於好奇,有沒有很多編譯器目標.pyc文件?編譯器是否針對.pyc文件?

有點谷歌搜索後,只有兩個我能看到的是:

  • unholy:why_的Ruby到PYC編譯
  • Python:該PSF的Python來PYC編譯

所以...還有嗎?

(作爲一個方面說明,我得到了考慮這一點,因爲我想要寫一個計劃到PYC編譯)

(作爲第二方面說明,我不抱任何幻想,一個方案 - 下to-pyc編譯器將是有用,但它會給我一個令人難以置信的藉口來學習Scheme和Python的一些內部)

+2

我很確定'不聖潔的'只存在,因爲_why是瘋了。 (精確的瘋狂) – 2009-10-20 03:57:11

+1

如果您想生成在Python運行時執行的代碼,那麼更好的方法是生成Python代碼並編譯它,而不是直接生成Python字節代碼。 – 2009-10-20 04:19:59

+0

@Glenn同意 - 一個Scheme-to-Python編譯器會更合理......但我不想在這裏理智,我想了解Python的內部(以及實現Scheme的過程) – 2009-10-20 05:09:36

回答

3

我幾年前編寫了一個編譯器,它接受了一個名爲「Noodle」的lisp-like語言並生成了Python字節碼。雖然它從來沒有變得特別有用,但它對於更好地理解Common Lisp(我複製了它的幾個特性)和更好地理解Python是一個非常好的學習體驗。

我能想到的兩種特殊情況下,當它可能不是產Python和它傳遞給一個Python編譯器直接針對Python的字節碼有用:3.0之前在Python(前:

  1. 全面關閉關鍵字nonlocal),您不能修改封閉式變量的值而不訴諸字節碼hackery。你可以改變值,所以通常的做法是讓一個閉包引用一個列表,例如,並將其中的第一個元素從內部作用域中改變。這可能會變得非常煩人。限制是語法的一部分,但不是Python VM。我的語言有明確的變量聲明,所以它成功地提供了具有可修改的閉合值的「正常」閉包。
  2. 在不引用任何內建函數的情況下獲取跟蹤對象。真正的利基案例,當然,但我用它來打破「安全」監獄的早期版本。關於它,請參閱my posting

所以是的,這可能是更多的工作比它的價值,但我很喜歡它,你也可能。

+0

感謝評論,保羅!我很高興知道我不是瘋了:)另外,歡迎來到Stack Overflow。 – 2009-10-21 13:02:45

4

「我想寫一個Scheme-pyc編譯器」。

我的大腦很痛!你爲什麼想這麼做? Python字節碼是一種專爲滿足Python語言需求而設計的中間語言,旨在在Python虛擬機上運行,​​並且已經針對Python的需求量身定製。 Python開發的一些最重要的領域是將Python移植到其他「虛擬機」,如Jython(JVM),IronPython(.NET),PyPyUnladen Swallow項目(將CPython移動到基於LLVM的表示)。試圖將另一種非常不同的語言(Scheme)的語法和語義壓縮到另一種高級語言的中間表示中似乎是在錯誤的層面上攻擊問題(不管問題是什麼)。所以,一般來說,似乎並不存在許多.pyc編譯器,並且有一個很好的理由。

+0

爲什麼我要要做到這一點? *不喜歡它的是什麼?我開始學習Scheme和Python的內部(儘管在不同的層次上......但仍然)! – 2009-10-20 05:02:03

+0

但是,更嚴重的是,你有一個很好的觀點,我沒有考慮:與一般的字節碼(.swf或.class?)不同,pyc只是爲了適合Python而設計的......所以它沒有什麼意義瞄準它。 – 2009-10-20 05:05:36

+0

至少,如果你的目標是產生一些有用的東西沒有意義:P – 2009-10-20 05:06:15

2

我建議你專注於CPython。

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

,而不是一個計劃,以.pyc文件翻譯,我建議你寫一個計劃,以Python的翻譯,然後讓CPython的處理轉換到.pyc文件。 (有這樣做的先例;第一個C++編譯器是Cfront,它將C++編譯爲C,然後讓系統C編譯器完成剩下的工作。)

從我所瞭解的Scheme中,它不會是很難將Scheme翻譯成Python。

一個警告:Python虛擬機可能不像計劃本身那樣快。例如,Python不會自動將尾遞歸轉換爲迭代;而且Python有一個相對較淺的堆棧,因此實際上需要將尾遞歸轉換爲翻譯器的迭代。作爲獎勵,一旦Unladen Swallow加速Python,您的Scheme-to-Python翻譯將會受益,並且在那一刻甚至會變得實用!

如果這看起來像一個有趣的項目給你,我說去吧。並非每個項目都必須立即實用。

P.S.如果你想要一個更實用的項目,你可能想寫一個AWK到Python翻譯器。這樣,具有傳統AWK腳本的人可以輕鬆地向Python發展!

+0

恩,他已經在他的列表中有CPython:這是PSF的Python到pyc編譯器。 – 2009-10-20 05:00:38

+2

Hhhmm ... Awk to Python ...這更加令人厭惡......但* *有*可能有用的缺點... – 2009-10-20 05:11:53

+0

我建議它的主要原因是,我回答了有關從AWK文件創建獨立二進制文件的問題。 Python有幾種方法來創建獨立的二進制文件(例如,Windows,Py2Exe:http://www.py2exe.org/)。如果你可以將AWK翻譯成Python,那麼你可以創建一個獨立的二進制文件! – steveha 2009-10-20 07:03:57

2

爲了您的興趣,我編寫了一個從簡單的LISP到Python的玩具編譯器。實際上,這是pyc編譯器的LISP。

看一看:sinC - The tiniest LISP compiler

+0

酷 - 看起來很整齊。謝謝。 – 2009-11-30 00:11:12

1

可能有點晚了在黨,但如果你還有興趣Clojure的-PY項目(https://github.com/halgari/clojure-py)現在能夠編譯clojure的一個重要的子集到python字節碼 - 但總是歡迎一些幫助。除了一件事:它在平臺上不穩定(例如MAKE_FUNCTION在Python 3中彈出兩個堆棧元素,但在Python 2中只有一個),並且這些差異並不清楚記錄在一個地方(afaict) - 所以你可能需要一些抽象層。

相關問題