Python interpretasiya, yoxsa kompilyasiya olunur ? — 1-ci hissə

Kamran Mammadov
Pragmatech
Published in
3 min readMar 13, 2020

Hər hansı bir proqramlaşdırma dilində yazılan kod blokunun icra (execute) olunması, bir nəticə (output) qaytarması, bir sözlə, komputer tərəfindən anlaşılması üçün bu kodun “komputerin başa düşdüyü dil”ə çevrilməsi lazımdır. Bu çevrilmə prosesinə cavabdeh proqramlar (tərcüməçilər) interpretator və ya kompilyator adlanır. Ümumi olaraq, “compiling” yüksək-səviyyə bir dildə yazılmış kodu binar (yalnız 1 və 0-ların mövcud olduğu) say sisteminə-maşın dilinə çevrilməsi prosesinə verilən addır. “Interpreting” isə oxunan kod sətrini anında icra edir. Onların fərqləri, iş prinsipləri və s. barədə daha detallı məlumat verməyəcəm, çünki mövzumuz məhz, python-un arxa fonunda bu proseslərdən hansının realizə olunduğunu aydınlaşdırmaqdır. (Bax: Difference Between Interpreter and Compiler)

Bir çox mənbələrdə Python (yanlız) interpretasiya olunan proqramlaşdırma dili kimi qələmə verilir. Faktın doğruluq payı 50 faizdir, çünki bu dil həm də kompilyasiya olunur. Necə ? Let’s dive deeper.

Qeyd: İzahı müqayisəli şəkildə ifadə edərək anlaşıqlılığı təmin etmək üçün müqayisə ediləcək dil olaraq C#-ı seçirəm.

Pythonda yazılan kodlar ilk mərhələdə maşın dilindən daha sadə və oxunaqlı olan baytkodlara (bytecode) çevrilir. (kompilyasiya(!) olunur). Eyni bəla C# kodlarının da başına gəlir: C# kompayleri (C# compiler) kodlarımızı MSIL və ya IL (Microsoft Intermediate Lanuage/Intermediate Language) kodlarına çevirir. Burada da kodlar bir azdan bəhs edəcəyim pyc faylında olduğu kimi baytkodlar şəklində saxlanır və buradan birbaşa(!) maşın dilinə çevrilir. Bu çevrilmə JIT (Just In Time) kompayleri tərəfindən reallaşdırılır.

İndi gəlin, python-da “Hello, Pragmatech !” deyə bir string çap edən bəsit bir funksiyanın icra olunana qədərki mərhələsinə-baytkodlara çevrilməsinə baxaq (bunun üçün python-un dis (disassembler) modulundan istifadə edəcəyik):

import disdis.dis(print("Hello, Pragmatech !"))

Nəticə:

1           0 LOAD_NAME                0 (print)
2 LOAD_CONST 0 ('Hello, Pragmatech!')
4 CALL_FUNCTION 1
6 RETURN_VALUE

Yuxarıdaki nəticə baytkodlardır. Çox oxunaqlı və anlaşılandır, hə ? :)

Kompilyasiya olunaraq əldə olunan bu qəşəng baytkodlar növbəti mərhələdə komputer tərəfindən başa düşülməlidir, lakin günümüz mərkəzi prosessorları üçün (CPU) bu imkansızdır. Bu öhdəliyi isə öz üzərinə Python Virtual Maşını (PVM) götürür. PVM iş prinsipinə görə əməliyyat sistemlərini simulyasiya etdiyimiz virtual maşınlara bənzəyir, lakin bütün əməliyyat sistemini deyil, məhz, prosessoru simulyasiya etməsilə onlardan fərqlənir. Beləliklə, ilk öncə kodlarımız kompilyasiya olunub baytkodlara çevrilir, “ikinci” mərhələdə isə PVM interpretatoru tərəfindən icra(execute) olunur. Bu baytkodlar (.pyc uzantılı fayl içərisində yer alır) proqramın ümumi icrası zamanı python tərəfindən avtomatik olaraq silinir. Sübut ? All right. Deyək ki, aşağıdakı kimi bir skriptimiz var:

print('Hello, Pragmatech !')

Bu çox sadə skripti məsələn, pythonblog1.py işçi masasında python qovluğunda yer almaqla kimi yaddaşa yazaq: (/Users/myusername/desktop/python/pythonblog1.py)

Bu skripti terminal üzərindən işə salmaq üçün işçi masasına keçib

python python/pythonblog1.py

əmrini icra etməliyik. İndi baytkodların içərisində yer aldığı pyc faylını əyani sübuta yetirmək üçün aşağıdakı əmri icra edək:

python -m py_compile python/pythonblog1.py

You welcome ! python qovluğunun içərisində yaranan pythonblog1.pyc faylı özündə bloqun əvvəlində gördüyümüz baytkodları saxlayır :)

Tərsinə mühəndislik edib bu pyc faylını işə salaq:

python python/pythonblog1.pyc

Nəticə:

Hello, Pragmatech !

Theorem is proved.

Yuxarıda yazılanları ümumiləşdirərək bir də python kodlarımızın necə icra olunduğundan əmin olaq:

  1. İnterpretator python kodlarını oxuyur. Sintaksis, format probleminin olub-olmamasını yoxlayır, problem və ya çatışmazlıq varsa, proqramçıya error mesajı qaytarır.
  2. Əgər hər şey qaydasındadırsa, kodlarımız interpretator tərəfindən baytkodlara tərcümə olunur.
  3. Baytkodlar PVM-ə göndərilir və PVM vasitəsilə işə salınır.

--

--