Dasturlash tillari tarixi

Dasturchilar qanday qilib kompyuterga 0 va 1 lar orqali buyruq berishdan bugungi qulay dasturlash tillarigacha yetib kelishdi? Hozir boshimizdan kechganlarni qiziqarli hikoya sifatida o'rganamiz.

Hammasi 0 va 1 lardan boshlangan

It's Machine Code

Oldingi dasturlash hozirgilardan tubdan farq qilgan. Tasavvur qiling oldingizda bitta katta kitob turibdi xuddi 70 000 ta so'zdan iborat inglizcha lug'atdek. Ha to'g'ri oldin ham shunday dasturlash qo'llanmalari bor edi. Siz dastur yozish uchun bir butun xonani egallaydigan ulkan kompyuter va o'sha qalin lug'at kitobidan foydalangansiz. Lug'atda esa har bir xotira pointer'lari, har bir vazifa qanday yozilishi va qayerda joylashgani bittalab ko'rsatilgan bo'lardi.

Eng ilk kompyuterlarga buyruqlar faqatgina 0 va 1 lardan iborat mashina tili (Binary code)[https://en.wikipedia.org/wiki/Binary_code] orqali berilardi. Dasturchilar minglab shunday raqamlarni ketma-ket yozishar agar bitta joyda xatoga yo'l qo'ysalar butun tizim ishlamay qolardi. Albatta hamma narsa faqat qog'ozda yozilmagan; dastlabki kompyuterlarda turli usullar switch kalitlar va punch card kabi vositalar ham ishlatilgan.

lekin asosiy muammo o'sha edi inson miyasi uchun bu o'ta og'ir va charchatadigan jarayon edi chunki u vaqtda Python hali tug'ilmagan edi ๐Ÿฅฒ. Bir xil kod qayta-qayta yozilardi dunyo bilan kommunikatsiya yo'q edi. Ehhhh qattiq davrlar edi...

Hech bo'lmasa raqamlarni o'qimaylik!

Bir kuni dasturchilar o'ylab qolishdi: "Kompyuterga baribir shu buyruqlarni beramiz. Nega ularni eslab qolish osonroq bo'lgan qisqa so'zlar bilan yozmasligimiz kerak?"

Shunday qilib raqamlarni o'qishni osonlashtirish uchun Assembly[https://en.wikipedia.org/wiki/Assembly_language] tili yaratildi. U ikkilik sanoq sistemasidagi tushunarsiz kodlarni qisqa va tushunarli mnemonik so'zlarga o'zgartirdi:

MOV AX, 5
ADD AX, 3
SUB AX, 1

Ushbu misol x86 Assembly sintaksisiga tegishli bo'lib MOV qiymatni ko'chirish ADD qo'shish SUB ayirish amallarini bajaradi

Endi kodni ko'rish biroz osonlashdi lekin bitta muammo bor edi protsessor bu so'zlarni to'g'ridan-to'g'ri tushunmaydi. Shu sababli Assembler deb nomlangan maxsus dastur kerak bo'ldi.

  • Assembler - matn ko'rinishidagi Assembly kodini to'g'ridan-to'g'ri mashina tiliga (0 va 1 larga) o'girib beruvchi eng ilk tarjimon dastur edi. (Uni keyingi kompilyatorlar bilan adashtirmang).

Ammo Assembly ham ideal emas edi:

  • Har bir protsessor arxitekturasi uchun alohida kod yozish talab qilinardi.
  • Katta dasturlarni yozish va qo'llab-quvvatlash juda mashaqqatli edi.
  • Xotira, registrlar va protsessor buyruqlari bilan juda yaqin ishlash kerak edi.

Dasturchilar biroz erkin nafas ola boshladi

1960-yillarning oxiri va 1970-yillarning boshlarida Bell Labs laboratoriyasida Ken Thompson, Dennis Ritchie va boshqa tadqiqotchilar UNIX operatsion tizimi ustida ishlayotib tizim dasturlarini yozishni qulayroq qilishni xohlashdi.

Ken Thompson avval B tilini yaratdi keyin esa Dennis Ritchie uni rivojlantirib haqiqiy monster bo'lgan C tilini dunyoga keltirdi.

Mana shu yerda hikoya jiddiy qiziq tus oladi. C tili hardware'ga juda yaqin turib ayni paytda yuqori darajadagi dasturlash imkoniyatlarini berardi.

Endi har bir amaliyot uchun mashina buyruqlarini qo'lda yozish shart emas edi. Compiler C kodini tegishli platforma uchun mashina kodiga aylantirar bu dasturlarning o'ta chaqmoqdek tez ishlashini ta'minlardi. Eng muhimi C tili UNIX operatsion tizimini boshqa turdagi kompyuterlarga o'tkazishni (Porting) juda osonlashtirdi.

Compiler nima? Dastur kodini boshqa ko'rinishga (odatda mashina kodiga yoki oraliq kodga) butunlay tarjima qiluvchi dastur.


Kod kattalashsa uni boshqarish qiyinlashadi

C kuchli til edi lekin dastur hajmi kattalashgani sari yangi muammolar bosh ko'tardi. Minglab funksiyalar, o'zgaruvchilar va ma'lumotlar bilan ishlaydigan kod tartibsiz va chigal (Spaghetti code) bo'lib ketardi. Xotirada funksiyalar ko'payib ketib dasturchilar boshini qayerga urishni bilmay qolishdi.

Shunda Bjarne Stroustrup chiqib: "Hamma narsa obyekttttt!" dedi va C tiliga Obyektga yo'naltirilgan dasturlash (OOP) konsepsiyasini qo'shdi ("C with Classes" - sinflarga ega C, ya'ni C++).

OOP yordamida ma'lumotlar va ular bilan ishlaydigan xatti-harakatlarni obyektlar atrofida tashkil qilish mumkin bo'ldi:

class Student {
public:
    string name;
    int age;

    void introduce() {
        cout << "My name is " << name;
    }
};

Bu yangilik katta hajmli dasturlarni kichik mustaqil qismlarga bo'lib yozish kodni qayta ishlatish (Reusability) va tartibda saqlash muammosini hal qildi. C ning asosiy ustunligi bo'lgan yuqori tezlik va xotirani bevosita boshqarish imkoniyati esa to'liq saqlanib qoldi.

Xotirani men boshqaraman, hammasi nazoratim ostida!!!

C va C++ tillarida dasturchi xotirani o'zi qo'lda boshqarar edi (malloc/free yoki ko'rsatgichlar orqali). Bu esa tinchgina uxlayotgan dasturchining boshiga Memory Leak (xotira sizib chiqishi) va jiddiy xatolar bo'lib yog'ilishiga sabab bo'lardi. Qolaversa, turli operatsion tizimlar uchun dastur yozish bosh og'rig'i edi.

1990-yillarda James Gosling boshchiligidagi Sun Microsystems jamoasi Java'ni taqdim etdi. Java ikkita inqilobiy yechim olib keldi:

  1. Avtomatik xotira boshqaruvi: Garbage Collector orqali ortiqcha va ishlatilmayotgan xotirani o'zi tozalaydi.
  2. Platformadan mustaqillik ("Write Once, Run Anywhere"): Java kodi to'g'ridan-to'g'ri mashina tiliga emas, balki Bytecode'ga kompilyatsiya qilinadi.
Java source code 
       |
       v (javac)
Bytecode (.class) 
       |
       v (JVM)
Machine code

JVM (Java Virtual Machine) shu bytecode'ni interpreter yoki JIT (Just-In-Time) compilation yordamida bajaradi. Natijada, mos JVM mavjud bo'lgan har qanday operatsion tizimda Java dasturi o'zini erkin his qiladi.

Kodni o'qish ham muhim ekan

Endi tasavvur qiling har bir loyihada kodni tez yozish, tushunish va o'zgartirish kerak. Har doim ham eng past darajada xotira va protsessor bilan ishlash talab qilinmayvermaydi. Guido van Rossum tomonidan yaratilgan Python (1991) aynan shu ehtiyojga javob berdi.

Python o'qilishi oson sintaksis va dasturchi unumdorligiga katta e'tibor qaratdi:

numbers = [1, 2, 3, 4, 5]

for number in numbers:
    print(number)

Ko'rinishidan sodda va tushunarli. Ko'plab murakkab vazifalarni C yoki C++ga qaraganda qisqaroq kod bilan yechish mumkin bo'ldi.

Lekin "Python dangasa dasturchilar uchun yaratilgan" deyish uning asl mohiyatini tushunmaslikdir. Python - bu ishni soddalashtirish va kodning o'qilishini yaxshilashga qaratilgan samarali muhandislik yondashuvidir.

Eslatma: Python'ning keng tarqalgan CPython implementatsiyasi ham kodni avval bytecode'ga aylantirib, so'ng virtual mashina orqali bajaradi. Shuning uchun "Python faqat interpreter, Java faqat compiler" deb keskin chegara qo'yib bo'lmaydi.

Xo'sh, dasturlash tillari nega bunchalik ko'p?

Chunki har bir til turli muammolar, ehtiyojlar va ustuvorliklar asosida dunyoga kelgan:

  • Machine language: Protsessor buyruqlarini bevosita ifodalash.
  • Assembly: Mashina buyruqlarini inson uchun eslab qolish osonroq shaklda yozish.
  • C: Samarali tizimli dasturlash va nisbatan ko'chiriluvchan kod.
  • C++: Yuqori samaradorlik bilan birga murakkab abstraksiyalar va OOP imkoniyatlari.
  • Java: JVM orqali platformalararo ishlash va avtomatik xotira boshqaruvi.
  • Python: O'qilishi oson sintaksis va yuqori darajadagi dasturchi unumdorligi.

Bu tillar bir-birini butunlay almashtirib yubormadi. Bugungi kunda ham C va C++ tizimli dasturlashda, Java korporativ va backend tizimlarda, Python esa avtomatlashtirish, data science va AI yo'nalishlarida o'z o'rniga ega. Yangi til paydo bo'lishi eski til o'ldi degani emas; u shunchaki yangi muammoni osonroq hal qilish uchun keladi.

Xulosa

Dasturlash tillari tarixi - bu faqatgina yangi sintaksislar tarixi emas. Bu insonlarning kompyuterga buyruq berishni osonlashtirish, murakkab tizimlarni boshqarish, xatolarni kamaytirish va ijodiy jarayonni samaraliroq qilish yo'lidagi izlanishlari tarixidir.

Bir paytlar 0 va 1 lar bilan qiynalishdan boshlangan yo'l bugun bizni yuqori darajadagi tillar, qulay framework'lar, zamonaviy IDE'lar va aqlli AI yordamchilariga olib keldi.

Ammo bir narsa o'zgarmagan: dasturchining vazifasi faqat kod yozish emas, muammoni tushunish va unga to'g'ri yechim topishdir.

P.S. Keyingi safar kod yozayotganda compiler xato bersa, 0 va 1 larni qo'lda yozishga majbur bo'lmaganingiz uchun bir soniya shukr qiling. ๐Ÿ˜‚

Agar maqola sizga yoqqan bo'lsa, dasturlashni o'rganayotgan do'stlaringiz bilan ulashishni unutmang ๐Ÿš€