July 5, 2023

Interpreted va compiled dasturlash tillari yohud nega python sekin ishlaydi.

Har qanday dastur buyruqlar ketma ketligidan iborat bo'ladi. computer tushunadigan til(machine code)ga to'g'ridan to'g'ri tarjima qilinadigan dasturlash tillari compiled tillar deyilsa, interpreted tillarda codeni ishga tushirish uchun interpreterlar kerak bo'ladi.

Tasavvur qiling siznikiga olmoniyalik(germaniya) mehmon keldi lekin siz nemis tilini bilmaysiz va tarjimon yollaysiz. Siz tarjimonga barcha gapingizni aytasiz, u esa oxirida ularni nemis tiliga tarjima qiladi. Buni compiled tillarga qiyoslasak bo'ladi. Agar tarjimon har bitta gapingizni birma bir tarjima qilsa buni interpreted tillarga qiyoslasak bo'ladi.

Compiled tillar interpreted tillarga qaraganda tezroq hisoblanadi. Compiled tillar yana dasturchiga memoryni va cpu ishlashini nazorat qilish imkonini beradi. Compiled tillarga misol qilib C, C++, Haskell, Rust va Go larni aytishimiz mumkin. Compiled tillarda buyruqlarni ishga tushirish uchun avval ularni compile(build) qilib olish kerak ya'ni machine codega o'girib olish. Bu esa har safar biror o'zgartirish kiritganingizda qayta rebuild qilish kerakligini anglatadi.

Quyida C tilidagi code va uning machine code varianti keltirilgan.

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
section .data
    message db 'Hello, World!', 0

section .text
    global _start

_start:
    ; write the message to stdout
    mov eax, 4
    mov ebx, 1
    mov ecx, message
    mov edx, 13
    int 0x80

    ; exit the program
    mov eax, 1
    xor ebx, ebx
    int 0x80
Compiled tillar qanday ishlaydi

Interpreted tillarda esa buyruqlar qatorma qator ishga tushiriladi. Biror bir qatorga o'zgartirish kiritmoqchi bo'lsangiz uni shunchaki modify qilishingiz, keraksiz narsalarni o'chirib, kerakli narsalarni qo'shishingiz kifoya. Har bir qator executable code ya'ni bytecode ga o'tkazib olinadi va ishga tushiriladi. Bytecode machine code dan farq qiladi. Machine code CPU ning native tili. Bytecode CPU tomonidan to'g'ridan to'g'ri ishga tushirilmagani uchun ham sekinroq ishlaydi.

Javascript varianti:

console.log("Hello, World!");

V8 engine tomonidan o'girilgan bytecode:

0000  H8Gd  0 0x00000000
0002  S8Kz  0 "Hello, World!"
0005  C1WC  0 0 1
0008  C8Yp  0 0 1

Interpreted tillar compile tillarga qaraganda sekinroq lekin just-in-time compilation(bu haqida keyinroq yozaman) orqali interpreted tillarni performance ini oshirish mumkin. Ko'p interpreted tillar dynamic typingni qo'llab quvvatlaydi va kamroq source size ga ham ega. Lekin memory usage ga kelganda ular ko'proq joy egallaydi. Sabab ular kodni qatorma qator ishga tushurgani uchun dastur haqida ko'proq ma'lumotni ushlab turishi kerak.

Interpreted tillar qanday ishlaydi.


Ba'zi dasturlash tillari ham compiled ham interpreted bo'lishi mumkin. Bunga misol qilib Python tilini olishimiz mumkin. Python tili interpreted til deb yuritilishiga qaramay, uning compilation stepi ham mavjud. Ya'ni CPythonga o'xshagan implementation lar interpretation va compilationni birgalikda ishlatadi. Source esa birinchi bytecode ga compile bo'lib keyin interpreter tomonidan ishga tushiriladi. Rust compiled til bo'lishiga qaramay, u ham ikkalasini kombinatsiyada ishlata oladi. Rust compilerning kodlarni to'g'ridan to'g'ri ishga tushuruvchi interpreteri mavjud. Bu testing va debugging uchun qulay. Ammo rust interpreter til sifatida shakllanatirilmagan va interpreter unchalik tez emas. Bundan tashqari, interpreter rust tilining hamma xususiyatlarini qo'llab quvvatlamaydi. Shu sabablardan rust kodini interpreter orqali ishga tushirishdan ko'ra machine kodga o'girishni maslahat beraman.

Topshiriq: JavaScript undefined data type ini bytecode ga o'girilgandagi holatini izohlarda qoldiring.