Seberapa layak mengkompilasi Python (mungkin melalui representasi C menengah) ke dalam kode mesin?
Mungkin perlu menautkan ke pustaka runtime Python, dan setiap bagian dari pustaka standar Python yang merupakan Python sendiri juga perlu dikompilasi (dan ditautkan).
Selain itu, Anda perlu mengelompokkan interpreter Python jika Anda ingin melakukan evaluasi ekspresi yang dinamis, tetapi mungkin sebagian dari Python yang tidak mengizinkan ini masih berguna.
Apakah akan memberikan keuntungan penggunaan kecepatan dan / atau memori? Agaknya waktu startup interpreter Python akan dihilangkan (meskipun perpustakaan bersama masih perlu memuat saat startup).
python
c
linker
compilation
Andy Balaam
sumber
sumber
Jawaban:
Coba kompiler ShedSkin Python-to-C ++, tetapi jauh dari sempurna. Juga ada Psyco - Python JIT jika hanya diperlukan speedup. Tapi IMHO ini tidak sepadan dengan usaha. Untuk bagian kode yang kritis terhadap kecepatan, solusi terbaik adalah menuliskannya sebagai ekstensi C / C ++.
sumber
Seperti yang dikatakan @Greg Hewgill, ada alasan bagus mengapa ini tidak selalu mungkin. Namun, beberapa jenis kode (seperti kode yang sangat algoritmik) dapat diubah menjadi kode mesin "nyata".
Ada beberapa opsi:
Setelah itu, Anda dapat menggunakan salah satu paket yang ada (membekukan, Py2exe, PyInstaller) untuk meletakkan semuanya menjadi satu biner.
Semua dalam semua: tidak ada jawaban umum untuk pertanyaan Anda. Jika Anda memiliki kode Python yang sangat kritis terhadap kinerja, coba gunakan sebanyak mungkin fungsi builtin (atau tanyakan pertanyaan "Bagaimana cara membuat kode Python saya lebih cepat"). Jika itu tidak membantu, cobalah untuk mengidentifikasi kode dan port ke C (atau Cython) dan gunakan ekstensi.
sumber
py2c ( https://github.com/pradyun/Py2C ) dapat mengkonversi kode python ke c / c ++ Saya adalah pengembang solo py2c.
sumber
PyPy adalah proyek untuk mengimplementasikan kembali Python di Python, menggunakan kompilasi ke kode asli sebagai salah satu strategi implementasi (yang lain menjadi VM dengan JIT, menggunakan JVM, dll.). Versi C yang dikompilasi berjalan rata-rata lebih lambat daripada CPython tetapi jauh lebih cepat untuk beberapa program.
Shedskin adalah kompiler Python-to-C ++ eksperimental.
Pyrex adalah bahasa yang dirancang khusus untuk menulis modul ekstensi Python. Ini dirancang untuk menjembatani kesenjangan antara dunia Python yang bagus, tingkat tinggi, mudah digunakan dan dunia C. tingkat rendah yang berantakan.
sumber
Nuitka adalah kompiler Python ke C ++ yang terhubung dengan libpython. Tampaknya menjadi proyek yang relatif baru. Penulis mengklaim peningkatan kecepatan dibandingkan CPython pada benchmark pystone.
sumber
Ini mungkin tampak masuk akal pada pandangan pertama, namun ada banyak hal biasa di Python yang tidak langsung bisa dipetakan ke representasi C tanpa membawa lebih banyak dukungan runtime Python. Misalnya, mengetik bebek muncul di pikiran. Banyak fungsi dalam Python yang membaca input dapat mengambil file atau seperti file objek , asalkan mendukung operasi tertentu, misalnya. baca () atau readline (). Jika Anda berpikir tentang apa yang diperlukan untuk memetakan jenis dukungan ini ke C, Anda mulai membayangkan dengan tepat hal-hal yang sudah dilakukan sistem runtime Python.
Ada beberapa utilitas seperti py2exe yang akan membundel program Python dan runtime menjadi satu yang dapat dieksekusi (sejauh mungkin).
sumber
foo.x
ungkapan tidak akan berfungsi karenafoo
tidak akan memilikix
pada saat dipanggil. Apakah ada checker kode statis untuk Python? Python dapat dikompilasi ke perakitan .Net ...Pyrex adalah bagian dari bahasa Python yang mengkompilasi ke C, dilakukan oleh orang yang pertama kali membangun daftar pemahaman untuk Python. Ini terutama dikembangkan untuk membangun pembungkus tetapi dapat digunakan dalam konteks yang lebih umum. Cython adalah garpu pyrex yang dipelihara lebih aktif.
sumber
Beberapa referensi tambahan:
https://github.com/dropbox/pyston adalah kompiler JIT untuk Python yang dikembangkan oleh Dropbox
http://pythran.readthedocs.io/ adalah kompilasi waktu python ke C ++ penerjemah untuk komputasi ilmiah
https://github.com/cosmo-ethz/hope adalah penerjemah python JIT ke C ++ untuk komputasi ilmiah
sumber
Jython memiliki kompiler yang menargetkan bytecode JVM. Bytecode sepenuhnya dinamis, seperti bahasa Python itu sendiri! Sangat keren. (Ya, seperti disinggung oleh jawaban Greg Hewgill, bytecode menggunakan runtime Jython, dan karenanya file jar Jython harus didistribusikan dengan aplikasi Anda.)
sumber
Psyco adalah sejenis kompiler just-in-time (JIT): kompiler dinamis untuk Python, menjalankan kode 2-100 kali lebih cepat, tetapi membutuhkan banyak memori.
Singkatnya: ini menjalankan perangkat lunak Python Anda yang ada jauh lebih cepat, tanpa perubahan sumber Anda tetapi tidak mengkompilasi ke kode objek dengan cara yang sama seperti kompiler C.
sumber
Jawabannya adalah "Ya, itu mungkin". Anda bisa mengambil kode Python dan mencoba mengkompilasinya menjadi kode C yang setara menggunakan API CPython. Bahkan, dulu ada proyek Python2C yang melakukan hal itu, tapi saya belum pernah mendengarnya selama bertahun-tahun (kembali dalam Python 1,5 hari adalah ketika saya terakhir melihatnya.)
Anda dapat mencoba menerjemahkan kode Python ke dalam bahasa C sebanyak mungkin, dan kembali ke API CPython saat Anda membutuhkan fitur Python yang sebenarnya. Saya telah mempermainkan ide itu sendiri satu atau dua bulan terakhir. Namun, ini merupakan pekerjaan yang sangat buruk, dan sejumlah besar fitur Python sangat sulit untuk diterjemahkan ke dalam C: fungsi bersarang, generator, apa pun kecuali kelas sederhana dengan metode sederhana, apa pun yang melibatkan memodifikasi modul global dari luar modul, dll. , dll.
sumber
Ini tidak mengkompilasi Python ke kode mesin. Tetapi memungkinkan untuk membuat perpustakaan bersama untuk memanggil kode Python.
Jika apa yang Anda cari adalah cara mudah untuk menjalankan kode Python dari C tanpa mengandalkan hal-hal execp. Anda bisa menghasilkan pustaka bersama dari kode python yang dibungkus dengan beberapa panggilan ke API penyematan Python . Yah aplikasinya adalah shared library, sebuah .so yang dapat Anda gunakan di banyak perpustakaan / aplikasi lain.
Berikut adalah contoh sederhana yang membuat perpustakaan bersama, yang dapat Anda tautkan dengan program C. Pustaka bersama mengeksekusi kode Python.
File python yang akan dieksekusi adalah
pythoncalledfromc.py
:Anda dapat mencobanya dengan
python2 -c "import pythoncalledfromc; pythoncalledfromc.main('HELLO')
. Ini akan menampilkan:Pustaka bersama akan ditentukan oleh yang berikut dengan
callpython.h
:Yang terkait
callpython.c
adalah:Anda dapat mengompilasinya dengan perintah berikut:
Buat file dengan nama
callpythonfromc.c
yang berisi yang berikut ini:Kompilasi dan jalankan:
Ini adalah contoh yang sangat mendasar. Ini dapat bekerja, tetapi tergantung pada pustaka, mungkin masih sulit untuk membuat serialisasi struktur data C menjadi Python dan dari Python ke C. Hal-hal dapat diotomatisasi ...
Nuitka mungkin bisa membantu.
Juga ada numba tetapi mereka berdua tidak bertujuan untuk melakukan apa yang Anda inginkan. Menghasilkan header C dari kode Python dimungkinkan, tetapi hanya jika Anda menentukan cara mengkonversi tipe Python ke tipe C atau dapat menyimpulkan informasi itu. Lihat python astroid untuk penganalisis Python ast.
sumber