it-swarm-id.com

Apakah Python Diartikan atau Dikompilasi?

Ini hanya ingin tahu yang saya miliki saat membaca tentang bahasa yang ditafsirkan dan disusun.

Ruby tidak diragukan lagi merupakan bahasa yang ditafsirkan karena kode sumber diproses oleh penerjemah pada titik eksekusi.
Sebaliknya [~ # ~] c [~ # ~] adalah bahasa yang dikompilasi, karena kita harus mengkompilasi kode sumber pertama sesuai dengan mesin dan kemudian jalankan. Hasil ini jauh lebih cepat dieksekusi.

Sekarang datang ke Python :

  • A python kode ( somefile.py ) ketika diimpor membuat file ( somefile.pyc ) di direktori yang sama. Misalkan impor dilakukan dalam modul python Shell atau Django modul Setelah impor saya sedikit mengubah kode dan menjalankan fungsi yang diimpor lagi untuk menemukan bahwa itu masih menjalankan kode lama. Ini menunjukkan bahwa file * .pyc dikompilasi python file mirip dengan executable dibuat setelah kompilasi file C, meskipun saya tidak dapat menjalankan file * .pyc secara langsung.
  • Ketika file python (somefile.py) dijalankan langsung (./somefile.py atau python somefile.py) tidak ada file .pyc dibuat dan kode dieksekusi sebagaimana mengindikasikan perilaku yang ditafsirkan.

Ini menunjukkan bahwa kode python dikompilasi setiap kali itu diimpor dalam proses baru untuk membuat .pyc ketika ditafsirkan ketika langsung dieksekusi.

Jadi jenis bahasa apa yang harus saya pertimbangkan? Ditafsirkan atau Dikompilasi? Dan bagaimana efisiensinya dibandingkan dengan bahasa yang ditafsirkan dan dikompilasi?

Menurut halaman wiki Interpreted Languages , ia terdaftar sebagai bahasa yang dikompilasi ke Kode Mesin Virtual, apa yang dimaksud dengan itu?

82
crodjer

Perlu dicatat bahwa bahasa tidak ditafsirkan atau dikompilasi, melainkan bahasa implementasi baik tafsirkan atau kompilasi kode. Anda mencatat bahwa Ruby adalah "bahasa yang diartikan", tetapi Anda dapat mengompilasi Ruby à la MacRuby , jadi bukan always bahasa yang diartikan.

Hampir setiap Python terdiri dari juru bahasa (bukan kompiler). File .pyc Yang Anda lihat adalah kode byte untuk Python mesin virtual (mirip dengan file .class Java). Mereka tidak sama dengan kode mesin yang dihasilkan oleh kompiler C untuk arsitektur mesin asli. Beberapa Python, namun, lakukan terdiri dari just-in-time kompiler yang akan mengkompilasi Python kode byte ke dalam kode mesin asli.

(Saya mengatakan "hampir setiap" karena saya tidak tahu ada kompiler mesin asli untuk Python, tapi saya tidak ingin mengklaim bahwa tidak ada di mana pun.)

83
mipadi

Python akan jatuh di bawah kode byte yang ditafsirkan. .py kode sumber pertama kali dikompilasi ke kode byte sebagai .pyc. Kode byte ini dapat diartikan (CPython resmi), atau JIT dikompilasi (PyPy). Python kode sumber (.py) dapat dikompilasi ke kode byte yang berbeda juga seperti IronPython (.Net) atau Jython (JVM). Ada beberapa implementasi dari Python bahasa. Yang resmi adalah kode byte yang ditafsirkan. Ada juga kode byte yang dikompilasi dengan implementasi JIT.

Untuk perbandingan kecepatan berbagai implementasi bahasa, Anda dapat mencoba di sini .

36
aufather

Dikompilasi vs ditafsirkan dapat membantu dalam beberapa konteks, tetapi ketika diterapkan dalam pengertian teknis, itu adalah dikotomi yang salah.

Kompiler (dalam arti luas) adalah penerjemah . Ini menerjemahkan program A ke program B dan untuk eksekusi di masa depan menggunakan mesin M.

Penerjemah (dalam arti luas) adalah pelaksana . Ini adalah mesin M yang menjalankan program A. Meskipun kami biasanya mengecualikan dari definisi ini mesin fisik (atau mesin non-fisik yang bertindak seperti yang fisik). Tetapi dari perspektif teoretis, perbedaan itu agak sewenang-wenang.


Misalnya, ambil re.compile . Ini "mengkompilasi" suatu regex ke bentuk peralihan, dan bahwa bentuk peralihan ditafsirkan/dievaluasi/dieksekusi.


Pada akhirnya, itu tergantung pada level abstraksi apa yang Anda bicarakan, dan apa yang Anda pedulikan. Orang mengatakan "dikompilasi" atau "ditafsirkan" sebagai deskripsi luas dari bagian yang paling menarik dari proses, tetapi sebenarnya sebagian besar setiap program dikompilasi (diterjemahkan) dan ditafsirkan (dieksekusi) dengan satu atau lain cara.

CPython (implementasi paling populer dari bahasa Python) sebagian besar menarik untuk mengeksekusi kode. Jadi, CPython biasanya digambarkan sebagai ditafsirkan. Meskipun ini adalah label yang longgar.

11
Paul Draper

Kode Mesin Virtual adalah versi yang lebih ringkas dari kode sumber asli (kode byte). Masih perlu ditafsirkan oleh mesin virtual, karena tidak ada kode mesin. Akan lebih mudah dan lebih cepat untuk menguraikan daripada kode asli yang ditulis oleh manusia.

Beberapa mesin virtual menghasilkan kode mesin saat menafsirkan kode mesin virtual untuk pertama kalinya (hanya dalam kompilasi waktu - JIT). Doa berikut akan menggunakan kode mesin ini secara langsung, yang mengarah pada eksekusi yang lebih cepat.

Sejauh yang saya tahu Ruby> = 1.9 menggunakan mesin virtual seperti Python juga.

7

The Python runtime menjalankan kode objek khusus (kode byte) pada mesin virtual.

Proses kompilasi mengubah kode sumber menjadi kode objek.

Untuk mempercepat, kode objek (atau kode byte, jika Anda mau) disimpan pada disk, sehingga dapat digunakan kembali saat berikutnya program dijalankan.

5
ykombinator