Bagaimana cara kerja Python Runtime sebenarnya?

26

Saya memiliki beberapa masalah dalam memahami konsep runtime library, terutama yang Python. Jadi saya telah menulis beberapa program python hello world dan bermaksud untuk mengeksekusinya, jadi saya menulis python ./hello_world.py.

Apa langkah-langkah yang terjadi antara saya menekan tombol Enter dan kode mesin yang dihasilkan dari kode python saya dieksekusi pada CPU saya? Dan bagaimana hubungannya dengan sistem runtime Python dan / atau library?

hgiesel
sumber
Kedua utas ini memberikan wawasan hebat tentang runtime Python - Apakah Python ditafsirkan, atau dikompilasi, atau keduanya? & Apakah Python ditafsirkan (seperti Javascript atau PHP)? . Pustaka Runtime dan runtime tidak sama. Memetakannya ke dunia .NET yang saya tahu - Common Language Runtime (CLR) dan Framework / Base Class Library (FCL / BCL) tidak sama.
RBT

Jawaban:

33

Karena beragamnya, ada beberapa konsep umum yang dimiliki oleh semua bahasa pemrograman modern yang serius. Dua di antaranya adalah inti dari jawaban untuk pertanyaan Anda di atas.

Langkah apa yang terjadi antara saya menekan tombol Enter dan kode mesin yang dihasilkan dari kode python saya yang dieksekusi pada CPU saya?

Kode diuraikan, dianalisis, dan dimasukkan ke dalam juru bahasa. Ini semua tentang bidang yang sangat penting dari ilmu komputer yang dikenal sebagai teori kompiler . Compiler adalah program yang menerjemahkan kode dari satu bahasa (kode sumber Anda) ke bahasa lain (biasanya kode mesin, meskipun "transpiler" yang menerjemahkan dari satu bahasa tingkat tinggi ke bahasa lain memang ada). Ini adalah topik yang sangat besar yang dapat Anda habiskan bertahun-tahun untuk meneliti, tetapi inilah versi dasarnya:

Kompiler dimulai dengan parser , sebuah rutin yang membaca kode sumber Anda dan menerapkan aturan sintaksis bahasa untuk mengetahui apakah masuk akal sebagai kode Python (dalam kasus Anda) yang valid. Jika tidak, parser akan melempar kesalahan dan kompiler menebus, tetapi jika ya, parser mengeluarkan apa yang dikenal sebagai Pohon Sintaks Abstrak, atau AST. AST adalah struktur data pohon yang masing-masing node mengandung elemen sintaks. Misalnya, jika Anda mengatakan x = 5, Anda bisa berakhir dengan BinaryExpressionsimpul dengan operatornilai =, Leftnilai ReferenceExpression(x)dan Rightnilai IntegerLiteralExpression(5). Seluruh program Anda dapat diwakili oleh pohon besar seperti ini.

Setelah parser menghasilkan AST, fase kedua adalah analisis semantik . Dalam bahasa Inggris biasa, ini berarti "mencari tahu apa arti AST ini." Itu memeriksa AST untuk menentukan apakah Anda melakukan sesuatu yang ilegal meskipun itu parse yang valid, (misalnya, mencoba memanggil fungsi 1-argumen dengan 3 argumen,) dan memunculkan kesalahan jika Anda melakukannya. Kalau tidak, ia menganalisis AST dan melakukan pengeditan untuk membuatnya lebih mudah untuk dipahami mesin.

Fase ketiga adalah pembuatan kode. Setelah AST dianalisis, disederhanakan, dan valid sepenuhnya, Anda memasukkannya ke dalam generator, yang berjalan di AST dan menghasilkan kode dalam bahasa output. Ini adalah produk jadi Anda.

Dengan Python, ia menggunakan interpreter daripada compiler. Seorang juru bahasa bekerja dengan cara yang persis sama dengan kompiler, dengan satu perbedaan: alih-alih pembuatan kode, ia memuat output dalam memori dan mengeksekusi langsung pada sistem Anda. (Perincian yang tepat tentang bagaimana hal ini terjadi dapat sangat bervariasi antara berbagai bahasa dan penerjemah yang berbeda.)

Dan bagaimana hubungannya dengan sistem runtime Python dan / atau library?

Semua kecuali bahasa yang paling sederhana hadir dengan serangkaian fungsi yang telah ditentukan sebelumnya yang penting bagi sebagian besar pengguna dan akan sulit bagi pengguna untuk mengimplementasikannya sendiri karena satu dan lain alasan. Kode mereka dapat memanggil ke fungsi-fungsi ini tanpa memerlukan pustaka pihak ketiga. (Misalnya, dalam Python yang Anda miliki print, yang mengirimkan output ke stdout. Semoga berhasil menerapkannya sendiri!) Serangkaian fungsi ini umumnya dikumpulkan di perpustakaan bersama yang dapat dipanggil oleh kode saat run-time, itulah sebabnya mengapa dikenal sebagai pustaka runtime bahasa, atau cukup "runtime" singkatnya.

Mason Wheeler
sumber
Jadi kode saya dimasukkan ke program lain (sistem runtime Python) yang melakukan semua itu dan selesai ketika kode saya berakhir (dan setelah pembersihan, tentu saja)?
hgiesel
@ hgiesel Saya percaya bahwa dalam kasus Python, penerjemah adalah bagian dari runtime. Ini tidak berlaku untuk setiap bahasa. tentu saja, tapi itu cukup umum di antara bahasa yang ditafsirkan.
Mason Wheeler
5

Implementasi standar Python adalah mesin virtual kode byte. Ini berarti bahwa kode mesin (opcodes dari set opcode prosesor Anda) tidak dihasilkan dari program Anda. Opcode hanya dipilih dari opcode yang sudah dikompilasi ke dalam mesin virtual sementara VM mengartikan kode byte.

Bagaimana program Anda diubah menjadi kode byte di tempat pertama adalah pertanyaan yang sedikit berbeda, tetapi jawaban singkatnya adalah "melalui kompilasi, sama seperti terjemahan bahasa ke bawah lainnya".

Kilian Foth
sumber