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
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.
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.
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.