Kontentga o'tish

Beqiyos sintaksisi. Birinchi ko'rinish

Ana endi Beqiyos dasturlash tili haqida kengroq tasavvurga ega bo'la boshlaymiz. Haqiqiy kodlar ustida muhokamalar qilamiz. Sintaksis bo'yicha ilk namunalarga kelishib olamiz.

Kirish

OGOHLANTIRISH

Maqolani yozib chiqib yaxshilash uchun AIga tashlagan edim. Hammayog'ini o'zgartirib yubordi. Eski o'zim yozgan variantini saqlab qolmagan ekanman. Xullas, bu maqolani boshqatadan tekshirib chiqishim kerak. Ko'p joylarini o'zgartirib yuboribdi.

Dasturlash tilining sintaksisi uning asosini tashkil etadi. Yaxshi loyihalashtirilgan sintaksis nafaqat kodning o'qilishini osonlashtiradi, balki dasturchilarning fikrlash jarayonini ham to'g'ri yo'nalishga yo'naltiradi. Beqiyosni ishlab chiqishda biz oddiy maqsad qo'ydik: O'zbekcha tabiiy fikrlash usuliga iloji boricha mos keladigan, zamonaviy va xavfsiz dasturlash tiliga ega bo'lish.

Ushbu maqolada biz Beqiyos tilining sintaksisini chuqur o'rganamiz. Har bir element uchun nafaqat sintaksis, balki dizayn qarorlari va falsafa ham tushuntiriladi.

Garchi o'tgan maqolada Beqiyos dizayni va falsafasi borasida gaplashgan bo'lsakda, yana bir bor bu to'g'risida qisqacha gaplashib o'tamiz.

Maqola tarkibi

Ushbu qo'llanmada quyidagi mavzular batafsil yoritiladi:

  1. Dizayn falsafasi va ilhomlanish manbalari — Beqiyos qanday tillardan qanday g'oyalarni oldi
  2. Izohlar tizimi — Oddiy izohlardan hujjatlashtirish izohlarigacha
  3. E'lon qilish paradigmasi — Nima uchun "nom → tur" usulini tanladik
  4. Tur tizimi va o'zgaruvchilar — O'zgarmas va o'zgaruvchan o'zgaruvchilar
  5. Boshqaruv oqimi — Shartlar va sikllar
  6. Funksiyalar ekotizimi — Oddiy funksiyalardan yuqori darajali funksiyalargacha
  7. Ma'lumotlar tuzilmalari — Ro'yxatlardan strukturalargacha
  8. Xatoliklar bilan ishlash — Zamonaviy xatolik boshqaruvi
  9. To'liq amaliy misol — Barcha tushunchalarni birlashtiradigan dastur

DIQQAT!

Sintaksis qanday ishlashini tushuntirish maqsadida ba'zi joylarda to'liq talab etiladigan va talabchan turlanish tizimini kiritmadik. Ammo, Beqiyos tili to'liq turlanish bilan yozishni talab etadi. Bu yerdagi hech bir narsa stabil spetsifikatsiya qismi emas. Hammasi, qoidalarni tushunib, belgilab olish uchundir.

1. Dizayn falsafasi va ilhomlanish

Shu paytgacha maqola yozish vaqtida ba'zi narsalarni angladim. Bunday o'ylab qarasam, jamlanib olish uchun boshlagan ishimiz yaxshi bo'lgan ekan. Ana endi aynan nima xohlayotganimizni aniqroq qilib olyapmiz. Ilk maqolada yozgan fikrlarim, ikkinchi maqolada biroz yaxshilangan, o'zgargandek tuyuldi. Vaqti kelib qayta ko'rib chiqib, ma'lum qismlarini yangilayman albatta. Va hattoki ushbu maqolada ham ba'zi fikrlarim o'zgaradigandek tuyulmoqda. Xullas, o'zimiz bilan o'zimiz kelishib olishimiz qiyin bo'lyapti. Biroq, spetsifikatsiyani ishlab chiqishimiz uchun bu maqolalarda ancha narsa ochilmoqda.


Bilasizki, Beqiyos nafaqat O'zbek dasturlash tili bo'lishi va O'zbekcha gap tuzilmalariga asoslanadi, balki ko'plab muvaffaqiyatli dasturlash tillarining ajoyib funksiyalarini o'zida mujassam etadi. Ya'ni, ulardan ilhomlanilib, o'xshash imkoniyatlarni taqdim etadi.


Ha aytgancha, kelgusi maqolalarda quyidagi mavzularda ham gaplashamiz, oldindan aytib o'tay:

  • To'liq spetsifikatsiya qanday bo'lishi kerak
  • Kompilyator arxitekturasi qanday bo'ladi
  • Boshqa tillar bilan solishtirish
  • Xotira boshqaruvi tafsilotlari haqida
  • Dastur paketlari tizimi qanday ishlaydi

Nega yangi sintaksis?

Ko'plab dasturchilar so'raydi: "Nega mavjud tillarning sintaksisini to'g'ridan-to'g'ri ko'chirish imkoni bo'la turib, bunday qilmadingiz?" Javob oddiy: til sintaksisi tafakkur tuzilmasini aks ettiradi. Ingliz tilidagi "variable x = 10" tushunchasi O'zbek tilidagi fikrlash usuliga to'liq mos kelmaydi.

Iloji boricha o'zbkecha fikrlashga oson ko'rinishga keltirishga harakat qildik.

O'zgaruvchi x 10ga teng deyishdan ko'ra, x o'zgaruvchisi 10ga teng deyish to'g'riroq bo'ladi. Yoki funksiya asosiy deyishdan ko'ra asosiy funksiya deyilsa yaxshiroq tushunamiz.

Shuning uchun ham aniqlashtiruvchi nomni oldin keltirib, uning nima ekanligi, qanday turga ega ekanligini aytish to'g'ri deb hisobladik. Shu sababli quyidagicha sintaksisni tanladik.

beqiyos
yosh o'zgaruvchi = 25

Quyidagi kabi ananaviy uslubni emas:

beqiyos
o'zgaruvchi yosh = 25

Bu oddiy ko'rinishi mumkin, lekin bu qaror chuqur falsafiy asosga ega.

Ilhomlanish manbalari

Beqiyosni ishlab chiqishda biz dunyodagi eng yaxshi dasturlash tillarining tajribasidan unumdor foydalandik.

Men shu yerga kelganda Rust dasturlash tilini C++ va boshqa dasturlash tillarida mavjud bo'ladigan ko'plab muammolarni hal qilgani haqida qiziqib qoldim va o'zimga aytdimki, nega bu Beqiyosda bo'lmasligi kerak?!

Rust — Xotira xavfsizligi ustasi

Rust bizga quyidagi kontseptsiyalarni berdi:

1. Ownership (Egalik huquqi): Har bir qiymat faqat bitta egaga tegishli bo'lishi

beqiyos
// Egalik o'tadi
s1 satr = "salom"
s2 satr = s1  // s1 endi yaroqsiz

2. Borrowing (Qarz olish): Ma'lumotlarga egalikni o'tkazmasdan murojaat qilish

beqiyos
uzunlikni_ol funksiya(matn: &satr) -> butun {
    matn.uzunlik()
}

3. Lifetimes (Amal muddati): Reference'larning yaroqlilik muddatini nazorat qilish

4. Pattern Matching: Holatlarni tekshirishning boy tizimi

beqiyos
natija tanla {
    Muvaffaq(qiymat) => qiymat,
    Xato(xabar) => 0
}

Nega Rust? Rust zamonaviy dasturlashda xotira xavfsizligi muammosini hal qildi. C/C++ tillarida mavjud segmentation fault, use-after-free, data race kabi muammolar Rust'da kompilyatsiya vaqtida aniqlanadi.

Kotlin — Zamonaviylik va amaliylik

Kotlin'dan quyidagilarni oldik:

1. Null Safety: null qiymatlar bilan xavfsiz ishlash

beqiyos
ism Tanlov<satr> = Ba'zi("Ali")
// yoki
ism Tanlov<satr> = Hech

2. Smart Casts: Tur tekshirilgandan keyin avtomatik type cast

beqiyos
agar qiymat Muvaffaq(son) {
    // bu yerda son avtomatik ishlatiladi
    chop(son)
}

3. Extension Functions: Mavjud turlarga yangi metodlar qo'shish

Nega Kotlin? Kotlin Java'ning murakkabligini kamaytirib, zamonaviy xususiyatlar qo'shdi. Uning null-safety tizimi juda samarali va amaliy.

Go — Soddalik va aniqlik

Go tilidan biz minimalizm va aniqlikni oldik:

1. Minimal sintaksis: Kam lekin kuchli kalit so'zlar 2. Concurrency modeli: Goroutines g'oyasi 3. Defer mexanizmi: Resurslarni tozalash uchun qulay yondashuv

beqiyos
fayl_ochish funksiya() {
    fayl = och("data.txt")
    kechiktir fayl.yop()  // Funksiya tugaganda bajariladi

    // fayl bilan ishlash
}

Nega Go? Go ning soddaligi va aniq sintaksisi uni o'rganish va yozish uchun juda qulay qiladi.

Python — O'qish uchun qulaylik

Python bizga quyidagilarni o'rgatdi:

1. Tushunarli sintaksis: Kod o'qish oson bo'lishi kerak 2. List/Dict comprehensions: Qisqa va aniq data transformatsiyasi 3. Dekoratorlar: Funksiyalarni bezash mexanizmi 4. Chop etish ko'nikmalari: Separator va ending tushunchalari

Nega Python? Python'ning sintaksisi deyarli ingliz tiliga o'xshaydi. Biz bu qulaylikni O'zbek tiliga moslashtirishni maqsad qildik.

TypeScript — Statik turlanish

TypeScript'dan quyidagilarni oldik:

1. Kuchli tur tizimi: JavaScript'ga statik turlar qo'shish 2. Union types: Bir o'zgaruvchi bir necha turda bo'lishi mumkin 3. Generics: Qayta ishlatiladigan tur-safe komponentlar

Nega TypeScript? TypeScript JavaScript'ning dinamik tabiatini statik nazorat bilan muvozanatlashtirdi. Bu xatolarni erta aniqlashga yordam beradi.

Sintaksis dizayni tamoyillari

Beqiyos yaratishda biz quyidagi tamoyillarga amal qildik:

1. Tabiiylik: Sintaksis O'zbek tilining grammatikasiga yaqin bo'lishi kerak

2. Aniqlik: Har bir konstruksiya bir ma'noga ega bo'lishi kerak

3. Xavfsizlik: Xavfli operatsiyalar aniq belgilanishi kerak

4. Qulaylik: Umumiy amallar oson bajarilishi kerak

5. Kengayuvchanlik: Kelajakda yangi xususiyatlar qo'shish oson bo'lishi kerak


Beqiyos ushbu tillarning eng yaxshi xususiyatlarini oladi va o'zbek tiliga moslashtiradi.

2. Izohlar tizimi: Koddan hujjatgacha

Izohlar oddiy ko'rinishi mumkin, lekin ular kodning hujjatlanishi va tushunilishida muhim rol o'ynaydi. Beqiyos uchta darajadagi izoh tizimini taqdim etadi.

2.1 Oddiy izohlar

Oddiy izohlar dasturchi o'z fikrlarini ifodalash yoki kodning ishlashini tushuntirish uchun ishlatiladi.

Bir qatorli izohlar

beqiyos
// Bu oddiy izoh

o'zgaruvchi yosh: butun = 25  // Yosh o'zgaruvchisi

Ishlatiladigan holatlar:

  • Qisqa tushuntirishlar
  • Vaqtinchalik eslatmalar
  • Qator oxirida aniqlik kiritish

Ko'p qatorli izohlar

beqiyos
/*
  Bu funksiya ikki sonni qo'shadi.
  Parametrlar: a va b
  Natija: ularning yig'indisi
*/
qo;shish funksiya(a: butun, b: butun) -> butun {
    a + b
}

Ishlatiladigan holatlar:

  • Murakkab mantiqni tushuntirish
  • Katta kod bo'limlarini sharhlash
  • Algoritmlarni tasvirlash

Uyalashgan izohlar

Beqiyos'ning muhim xususiyati - izohlarni ichma-ich yozish imkoniyati:

beqiyos
/*
  Tashqi izoh boshlanadi
  /*
    Ichki izoh
    Bu juda qulay!
  */
  Tashqi izoh davom etadi
*/

Bu xususiyat katta kod bo'limlarini vaqtincha o'chirish uchun juda foydali:

beqiyos
/*
// Bu kod vaqtincha o'chirilgan
funksiya eski_algoritm() {
    /* Bu yerda ko'p narsa bor */
}
*/

Afzalliklari:

  • Katta kod bloklarini osonlik bilan sharhlash
  • Ichki izohlar bilan konflikt bo'lmaydi
  • Debug qilishda juda qulay

2.2 Hujjatlashtirish izohlari

Hujjatlashtirish izohlari maxsus formatda yoziladi va bejirim (Beqiyos documentation generator) tomonidan avtomatik hujjat yaratish uchun ishlatiladi.

Tashqi hujjat izohlari (///)

Funksiya, struktura yoki boshqa "narsa"larni hujjatlashtirish uchun:

beqiyos
/// Ikki sonning yig'indisini hisoblaydi
///
/// # Parametrlar
/// - `a`: Birinchi son
/// - `b`: Ikkinchi son
///
/// # Qaytaradi
/// Ikkala sonning yig'indisi
///
/// # Misol
/// ```
/// natija qiymat = qoshish(5, 3)
/// tekshir!(natija == 8)
/// ```
///
/// # Eslatma
/// Bu funksiya integer overflow'ni tekshirmaydi
qoshish funksiya(a: butun, b: butun) -> butun {
    a + b
}

Blokli hujjat izohlari (/** */)

beqiyos
/**
Geometrik shakllar bilan ishlash uchun modul

Bu modul quyidagi shakllarni qo'llab-quvvatlaydi:
- Doira
- To'rtburchak
- Uchburchak

Har bir shakl uchun yuza va perimetr hisoblash
imkoniyatlari mavjud.
*/
modul geometriya {
    // ...
}

Ichki hujjat izohlari (//!)

Fayl yoki modul o'zini hujjatlashtirish uchun:

beqiyos
//! # Matematik kutubxona
//!
//! Bu kutubxona asosiy matematik amallarni bajarish uchun
//! funksiyalar to'plamini taqdim etadi.
//!
//! ## Xususiyatlar
//! - Arifmetik amallar
//! - Trigonometrik funksiyalar
//! - Statistik hisoblashlar
//!
//! ## Foydalanish
//! ```
//! manba matem::*
//!
//! natija qiymat = qoshish(10, 20)
//! ```

modul matem {
    // funksiyalar
}

2.3 Markdown bilan hujjatlashtirish

Hujjat izohlari ichida to'liq Markdown formatini ishlatish mumkin:

beqiyos
/// # Murakkab hisoblash funksiyasi
///
/// Bu funksiya quyidagi formulani ishlatadi:
///
/// ```math
/// result = (a² + b²) / (a + b)
/// ```
///
/// ## Diqqat
///
/// > **Ogohlantirish:** `a + b` nolga teng bo'lmasligi kerak!
///
/// ## Misol
///
/// | a | b | Natija |
/// |---|---|--------|
/// | 3 | 4 | 5.0    |
/// | 5 | 12| 13.0   |
///
/// ```beqiyos
/// natija1 qiymat = hisoblash(3, 4)
/// natija2 qiymat = hisoblash(5, 12)
/// ```
hisoblash funksiya(a: haqiqiy, b: haqiqiy) -> haqiqiy {
    (a * a + b * b) / (a + b)
}

Xulosaviy jadvar

TuriSintaksisMaqsadi
Qatorli izoh//Qisqa qaydlar
Blokli izoh/* */Ko'p qatorli yoki ichma ich uyalashgan izohlar
Tashqi hujjat (qator)///Narslarni hujjatlashtirish
Tashqi hujjat (blok)/** */Narsalarni hujjatlashtirish
Ichki hujjat (qator)//!Modul va paketlarni izohlash
Ichki hujjat (blok)/*! */Modul va paketlarni izohlash

2.4 Izohlar uchun eng yaxshi amaliyotlar

Yaxshi izohlar:

beqiyos
// Foydalanuvchi balini 0-100 oralig'ida normalizatsiya qilish
natija qiymat = (ball * 100) / maksimal_ball

Yomon izohlar:

beqiyos
// Natijani hisoblash
natija qiymat = (ball * 100) / maksimal_ball  // Nima uchun?

Tamoyillar:

  • Nima qilayotganini emas, NEGA qilayotganini tushuntiring
  • O'zini-o'zi tushuntiradigan kod yozing
  • Izohlar kodni takrorlamasin
  • Murakkab mantiq uchun izoh yozing
  • Eskirgan izohlarni yangilang

3. E'lon qilish paradigmasi: "Nom → Tur" yondashuvi

E'lon qiluvchilar deganda biz u funksiya, o'zgaruvchi yoki boshqa narsalar bo'lishidan qat'iy nazar barchasini nazarda tutyapmiz. Bu yerda inglizcha identifier ya'ni nomni aniqlashtirish tushunchasini yaxshilab anglab olish kerak. Xullas, biz ananaviy usuldan qochdik. Chunki, bu O'zbekcha fikrlashga xalaqit beradi. Biz avval aniqlashtiruvchi nomni e'lon qilib, keyin uning turini belgilash fikri ustida kelishdik. Bu boshida g'alati tuyulishi mumkin. Ammo, dasturchilarga aslida yordam beradi.

3.1 An'anaviy yondashuvning muammosi

Ko'plab dasturlash tillari C dan meros qolgan sintaksisni ishlatadi:

c
// C/C++/Java/JavaScript uslubi
int yosh = 25;
String ism = "Ali";

Bu usulda biz avval turni, keyin nomni yozamiz. Ingliz tili uchun bu tabiiy:

"An integer named age" — "integer" (tur) "age" (nom)

Lekin O'zbek tili boshqacha ishlaydi. Biz avval nima haqida gapirayotganimizni, keyin uning xususiyatini aytamiz:

"Yosh butun son" — "yosh" (nom) "butun son" (tur)

3.2 Beqiyos yondashuvi

Beqiyos O'zbek tiliga mos tartibni ishlatadi:

beqiyos
yosh o'zgaruvchi: butun = 25
ism o'zgarmas: satr = "Ali"

Umumiy format:

NOM KATEGORIYA[: TUR] = QIYMAT

Bu yerda:

  • NOM — o'zgaruvchi/funksiya nomi
  • KATEGORIYA — bu nima (o'zgaruvchi, o'zgarmas, funksiya, etc.)
  • TUR — (ixtiyoriy) aniq tur
  • QIYMAT — boshlang'ich qiymat

3.3 Afzalliklari

1. O'qish uchun qulaylik

beqiyos
// Tabiiy o'qiladi: "Yosh o'zgaruvchi 25 ga teng"
yosh o'zgaruvchi = 25

// vs C uslubi: "int yosh teng 25"
int yosh = 25  // notabiiy

2. Kodning ko'zdan kechirilishi

Kod o'qishda biz odatda chapdan o'ngga o'qiymiz va nomlar bizga eng muhim narsa:

beqiyos
// Nomlar chap tomonda - darhol ko'rinadigan
yosh o'zgaruvchi = 25
ism o'zgarmas = "Ali"
balansi o'zgaruvchi: haqiqiy = 1000.50

// C uslubida nomlarni topish qiyinroq
int yosh = 25;
const string ism = "Ali";
double balansi = 1000.50;

3. Tur xulosasi (Type inference)

Ko'p hollarda turni yozish shart emas:

beqiyos
// Tur avtomatik aniqlanadi
yosh o'zgaruvchi = 25           // butun
narx o'zgarmas = 99.99          // haqiqiy
ism o'zgarmas = "Ali"           // satr
faol o'zgaruvchi = rost         // mantiqiy

Kerak bo'lgandagina aniq ko'rsatamiz:

beqiyos
// Aniq tur kerak bo'lganda
yosh o'zgaruvchi: b8 = 25       // 8-bitli butun
narx o'zgarmas: h32 = 99.99     // 32-bitli float

Ammo, Beqiyosda doim ko'rsatilishi shart hisoblanadi.

3.4 Funksiyalarda qo'llash

Funksiyalarda ham xuddi shunday tartib:

beqiyos
// Nom avval, keyin tur (funksiya)
qoshish funksiya(a: butun, b: butun) -> butun {
    a + b
}

O'qish: "Qoshish funksiyasi, a va b parametrlarni olib, butun son qaytaradi"

Tabiiy o'zbek tilida gap tuzish tartibi bilan mos keladi.

3.5 Murakkab hollarda

Strukturalarda

beqiyos
Odam struktura {
    ism: satr,
    yosh: butun,
    email: satr
}

ali odam: Odam = Odam {
    ism: "Ali Valiyev",
    yosh: 25,
    email: "ali@example.uz"
}

Funksiya parametrlarida

beqiyos
// Parametr nomi avval, turi keyin
malumot_yuborish funksiya(
    qabul_qiluvchi: satr,
    xabar: satr,
    muhimlik: butun = 0
) -> Natija<(), Xato> {
    // ...
}

Umumiy turlarda (Generics)

beqiyos
royxat o'zgaruvchi: Vek<butun> = Vek::yangi()
malumot o'zgarmas: Lugat<satr, butun> = Lugat::yangi()

Boshlang'ich nuqta

Har bir Beqiyos dasturi asosiy funksiyasidan boshlanadi:

beqiyos
asosiy funksiya() {
    // Dastur kodi shu yerda
}

Bu ingliz tilida main deb ataladigan va ko'plab dasturlash tillarida mavjud bo'lgan funksiyaga to'g'ri keladi. Kompilyator dasturni ishga tushirganda avval asosiy funksiyasini qidiradi.

Modullar va import qilish

Katta dasturlar bir necha fayllarga bo'linadi, shunday vaqtda biz ularni chaqirib olib ishlatilishimiz mumkin bo'ladi:

beqiyos
// matem.bq faylidan funksiyalarni import qilish
manba matem::{qo'shish, ayirish};

// Butun modulni import qilish
manba standart::io;

asosiy funksiya () {
    o'zgaruvchi natija = qo'shish(5, 3);
}

4. Tur tizimi va o'zgaruvchilar

4.1 O'zgarmaslik sukut bo'yicha

Beqiyos'da o'zgaruvchilar sukut bo'yicha o'zgarmas (immutable). Bu xavfsizlik va aniqlik uchun muhim:

beqiyos
yosh o'zgarmas = 25
yosh = 26  // ❌ XATO: o'zgarmas o'zgaruvchini o'zgartirish mumkin emas

Nega o'zgarmaslik sukut bo'yicha?

  1. Xatolarni kamaytiradi: O'zgarmagan ma'lumotlarni nazorat qilish osonroq
  2. Parallel ishlovga yordam beradi: O'zgarmas ma'lumotlar bir vaqtning o'zida xavfsiz ishlatiladi
  3. Kodni tushunish osonlashadi: Qiymat o'zgarmasa, kodning oqimini kuzatish oson

4.2 O'zgaruvchan o'zgaruvchilar

O'zgartirish kerak bo'lganda aniq belgilash kerak:

beqiyos
hisoblagich o'zgaruvchi = 0
hisoblagich = hisoblagich + 1  // ✅ To'g'ri
hisoblagich += 1               // ✅ Qisqaroq

Bu dizayn qaror dasturchilarni o'ylashga majbur qiladi: "Bu o'zgarishi kerakmi?"

4.3 Tur tizimi ierarxiyasi

Beqiyos kuchli statik turli til. Har bir qiymat aniq turga ega.

Primitiv turlar

Butun sonlar:

beqiyos
// Ishora bilan
x1 o'zgarmas: b8 = 127        // -128 .. 127
x2 o'zgarmas: b16 = 32767     // -32,768 .. 32,767
x3 o'zgarmas: b32 = 2147483647
x4 o'zgarmas: b64 = 9223372036854775807

// Ishorasiz (faqat musbat)
y1 o'zgarmas: bm8 = 255       // 0 .. 255
y2 o'zgarmas: bm16 = 65535
y3 o'zgarmas: bm32 = 4294967295
y4 o'zgarmas: bm64 = 18446744073709551615

// Arxitekturaga bog'liq
arch_size o'zgarmas: butun = 100    // 32 yoki 64 bit
arch_unsigned o'zgarmas: bm = 100   // ishorasiz

Haqiqiy sonlar:

beqiyos
pi o'zgarmas: h32 = 3.14159          // 32-bit (float)
aniq_pi o'zgarmas: h64 = 3.14159265359  // 64-bit (double)

// Ilmiy notatsiya
katta o'zgarmas = 1.5e10    // 15,000,000,000
kichik o'zgarmas = 2.5e-3   // 0.0025

Mantiqiy:

beqiyos
faol o'zgaruvchi: mantiqiy = rost
tugallangan o'zgarmas = yolg

// Mantiqiy operatsiyalar
natija1 qiymat = rost va yolg    // false
natija2 qiymat = rost yoki yolg  // true
natija3 qiymat = !rost            // false

Belgi va satr:

beqiyos
// Bitta belgi (4 byte, Unicode)
harf o'zgarmas: belgi = 'A'
lotin_emas o'zgarmas: belgi = 'Ш'
emoji o'zgarmas: belgi = '🚀'

// Satr (UTF-8)
ism o'zgarmas: satr = "Ali"
matn o'zgarmas = "Salom, dunyo! 🌍"

// Xom satr (escape qilmasdan)
yol o'zgarmas = r"C:\Users\Ali\Documents"

// Ko'p qatorli
shеr o'zgarmas = """
Bahor keldi, gul ochildi,
Bulbul sayradi, kun kuyladi.
"""

4.4 Murakkab turlar

Tuple (O'zgarmas to'plam)

beqiyos
// Turli turlarni birlashtirish
shaxs o'zgarmas = ("Ali", 25, rost)
koordinata o'zgarmas: (haqiqiy, haqiqiy) = (10.5, 20.3)

// Ajratib olish
(ism, yosh, erkak) qiymat = shaxs
chop("Ism: {ism}, Yosh: {yosh}")

// Index bilan kirish
birinchi qiymat = shaxs.0  // "Ali"
ikkinchi qiymat = shaxs.1  // 25

Array (Qat'iy o'lchamli ro'yxat)

beqiyos
// O'lchami kompilyatsiya vaqtida ma'lum
sonlar o'zgarmas: [butun; 5] = [1, 2, 3, 4, 5]
matritsa o'zgaruvchi: [[butun; 3]; 3] = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

// Barcha elementlar bir xil qiymat
nollar o'zgarmas = [0; 100]  // 100 ta nol

// Index bilan kirish
birinchi qiymat = sonlar[0]
oxirgi qiymat = sonlar[4]

// Xavfsiz kirish
agar o'zgaruvchi Ba'zi(qiymat) = sonlar.ol(10) {
    chop(qiymat)
} aks_holda {
    chop("Index chiqib ketgan")
}

Slice (Qism ko'rinish)

beqiyos
sonlar o'zgarmas = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// Qism olish
ilk_uch qiymat = &sonlar[0..3]    // [1, 2, 3]
oxirgi_uch qiymat = &sonlar[7..]  // [8, 9, 10]
o'rtadagi qiymat = &sonlar[3..7]  // [4, 5, 6, 7]

Vector (Dinamik ro'yxat)

beqiyos
// Yangi bo'sh vektor
ismlar o'zgaruvchi = Vek::yangi()

// Qo'shish
ismlar.qosh("Ali")
ismlar.qosh("Vali")
ismlar.qosh("Gani")

// Macro bilan yaratish
sonlar o'zgaruvchi = vek![1, 2, 3, 4, 5]

// Amallar
uzunlik qiymat = ismlar.uzunlik()
sig'imi qiymat = ismlar.sigim()
birinchi qiymat = ismlar[0]

// O'chirish
olingan qiymat = ismlar.olib_tashla(1)  // "Vali" ni o'chiradi

// Tozalash
ismlar.tozala()

HashMap (Lug'at)

beqiyos
// Yangi lug'at
yoshlar o'zgaruvchi = Lugat::yangi()

// Qo'shish
yoshlar.qoy("Ali", 25)
yoshlar.qoy("Vali", 30)
yoshlar.qoy("Gani", 28)

// Olish
agar o'zgaruvchi Ba'zi(yosh) = yoshlar.ol("Ali") {
    chop("Ali ning yoshi: {yosh}")
}

// Mavjudligini tekshirish
agar yoshlar.mavjud("Vali") {
    chop("Vali ro'yxatda")
}

// Yangilash
yoshlar.qoy("Ali", 26)  // Ali yoshini yangilash

// O'chirish
yoshlar.olib_tashla("Gani")

// Iteratsiya
har (ism, yosh) in yoshlar {
    chop("{ism}: {yosh} yosh")
}

5.4 Option va Result

Option - mavjudlik

beqiyos
// Ba'zi(T) yoki Hech
topish funksiya(list: &[butun], val: butun) -> Tanlov<butun> {
    har (i, &elem) in list.sanab() {
        agar elem == val {
            return Ba'zi(i)
        }
    }
    Hech
}

// Ishlatish
natija = topish(&[10, 20, 30], 20)
tanla natija {
    Ba'zi(i) => chop("Topildi: {i}"),
    Hech => chop("Yo'q")
}

Result - xato boshqaruvi

beqiyos
// Muvaffaq(T) yoki Xato(E)
bolish funksiya(a: butun, b: butun) -> Natija<butun, satr> {
    agar b == 0 {
        return Xato("Nolga bo'lish")
    }
    Muvaffaq(a / b)
}

// ? operatori
fayl_oqi funksiya() -> Natija<satr, Xato> {
    mazmun = ochish("data.txt")?  // auto propagate
    Muvaffaq(mazmun)
}

6. Boshqaruv oqimi

6.1 Shartlar

beqiyos
// Oddiy
agar yosh >= 18 {
    chop("Katta")
} aks_holda {
    chop("Kichik")
}

// Ko'p shartli
agar ball >= 90 {
    "A'lo"
} aks_agar ball >= 70 {
    "Yaxshi"
} aks_holda {
    "Qoniqarsiz"
}

// Ifoda sifatida
holat = agar yosh >= 18 { "katta" } aks_holda { "kichik" }

6.2 Tanla (Pattern Matching)

beqiyos
// Oddiy
kun = 3
kun_nomi = tanla kun {
    1 => "Dushanba",
    2 => "Seshanba",
    3 => "Chorshanba",
    _ => "Noma'lum"
}

// Ko'p qiymat
tanla raqam {
    1 | 3 | 5 | 7 | 9 => "Toq",
    2 | 4 | 6 | 8 => "Juft",
    _ => "Boshqa"
}

// Diapazon
tanla yosh {
    0..=12 => "Bola",
    13..=17 => "O'smir",
    18..=64 => "Katta",
    65.. => "Keksa",
    _ => "Noto'g'ri"
}

// Guard
tanla son {
    n agar n < 0 => "Manfiy",
    n agar n == 0 => "Nol",
    n => "Musbat"
}

6.3 Sikllar

beqiyos
// Cheksiz
siklda {
    agar shart {
        tuxt
    }
}

// Shartli
paytki i < 10 {
    chop(i)
    i += 1
}

// For each
har i in 1..=5 {
    chop(i)
}

har (i, val) in list.sanab() {
    chop("{i}: {val}")
}

// Davom va tuxt
har i in 1..=10 {
    agar i == 5 {
        davom  // skip
    }
    agar i == 8 {
        tuxt   // break
    }
    chop(i)
}

// Label
'tashqi: har i in 1..=3 {
    har j in 1..=3 {
        agar i == 2 va j == 2 {
            tuxt 'tashqi
        }
        chop("i={i}, j={j}")
    }
}

7. Funksiyalar

7.1 Oddiy funksiya

beqiyos
salom funksiya() {
    chop("Salom!")
}

// Parametrli
salom_ber funksiya(ism: satr) {
    chop("Salom, {ism}!")
}

// Qaytaradi
qoshish funksiya(a: butun, b: butun) -> butun {
    a + b  // return kerak emas
}

7.2 Ko'p qiymat qaytarish

beqiyos
bolish funksiya(a: butun, b: butun) -> (butun, butun) {
    (a / b, a % b)
}

(bolinma, qoldiq) = bolish(17, 5)

7.3 Sukut qiymatlari

beqiyos
salom funksiya(ism: satr, til: satr = "o'zbek") {
    agar til == "o'zbek" {
        chop("Salom, {ism}!")
    } aks_holda {
        chop("Hello, {ism}!")
    }
}

salom("Ali")              // "Salom, Ali!"
salom("John", "ingliz")   // "Hello, John!"

7.4 Variadic

beqiyos
yigindi funksiya(sonlar: ...butun) -> butun {
    jami o'zgaruvchi = 0
    har son in sonlar {
        jami += son
    }
    jami
}

chop(yigindi(1, 2, 3))        // 6
chop(yigindi(10, 20, 30, 40)) // 100

7.5 Yuqori darajali funksiyalar

beqiyos
// Funksiyani parametr sifatida
qollash funksiya(list: [butun], f: fn(butun) -> butun) -> [butun] {
    natija o'zgaruvchi = []
    har elem in list {
        natija.qosh(f(elem))
    }
    natija
}

ikkilantir funksiya(n: butun) -> butun {
    n * 2
}

sonlar = [1, 2, 3, 4, 5]
natija = qollash(sonlar, ikkilantir)  // [2, 4, 6, 8, 10]

// Lambda
natija = qollash(sonlar, |n| n * 2)

// Ko'p qatorli lambda
filtr = |x| {
    agar x % 2 == 0 {
        rost
    } aks_holda {
        yolg
    }
}

7.6 Closure

beqiyos
hisoblagich_yasash funksiya() -> fn() -> butun {
    hisob o'zgaruvchi = 0

    || {
        hisob += 1
        hisob
    }
}

hisoblagich = hisoblagich_yasash()
chop(hisoblagich())  // 1
chop(hisoblagich())  // 2
chop(hisoblagich())  // 3

8. Ma'lumotlar strukturalari

8.1 Struktura

beqiyos
Odam struktura {
    ism: satr,
    yosh: butun,
    email: satr
}

// Yaratish
ali = Odam {
    ism: "Ali Valiyev",
    yosh: 25,
    email: "ali@example.uz"
}

// Kirish
chop(ali.ism)
chop(ali.yosh)

// Yangilash (o'zgaruvchi bo'lishi kerak)
ali_oz o'zgaruvchi = ali
ali_oz.yosh = 26

8.2 Metodlar

beqiyos
Doira struktura {
    radius: haqiqiy
}

tadbiq Doira {
    yangi funksiya(r: haqiqiy) -> Doira {
        Doira { radius: r }
    }

    yuza funksiya(&self) -> haqiqiy {
        3.14159 * self.radius * self.radius
    }

    uzunlik funksiya(&self) -> haqiqiy {
        2.0 * 3.14159 * self.radius
    }

    o'zgartir funksiya(&o'zgaruvchi self, yangi_r: haqiqiy) {
        self.radius = yangi_r
    }
}

// Ishlatish
doira = Doira::yangi(5.0)
chop("Yuza: {}", doira.yuza())
chop("Uzunlik: {}", doira.uzunlik())

doira_oz o'zgaruvchi = doira
doira_oz.o'zgartir(10.0)

8.3 Enum

beqiyos
Holat enum {
    Kutilmoqda,
    Jarayonda,
    Tugallangan,
    Bekor_qilingan
}

// Qiymatlar bilan
Xabar enum {
    Tuxt,
    Yozish(satr),
    OrniniOzgartir { x: butun, y: butun }
}

// Ishlatish
holat = Holat::Jarayonda

xabar = Xabar::Yozish("Salom")
xabar2 = Xabar::OrniniOzgartir { x: 10, y: 20 }

tanla xabar {
    Xabar::Tuxt => chop("Tuxtadi"),
    Xabar::Yozish(matn) => chop("Yozildi: {matn}"),
    Xabar::OrniniOzgartir { x, y } => chop("Joylashuv: ({x}, {y})")
}

9. Xatolik boshqaruvi

9.1 Option bilan ishlash

beqiyos
topish funksiya(list: &[satr], qidiruv: &satr) -> Tanlov<usize> {
    har (i, item) in list.sanab() {
        agar item == qidiruv {
            return Ba'zi(i)
        }
    }
    Hech
}

// Match
tanla topish(&ismlar, "Ali") {
    Ba'zi(i) => chop("Topildi: {i}"),
    Hech => chop("Topilmadi")
}

// Agar o'zgaruvchi
agar o'zgaruvchi Ba'zi(i) = topish(&ismlar, "Ali") {
    chop("Index: {i}")
}

// Unwrap (ehtiyotkor!)
index = topish(&ismlar, "Ali").unwrap()  // panic agar Hech

// Yoki standart
index = topish(&ismlar, "Ali").unwrap_yoki(0)

9.2 Result bilan ishlash

beqiyos
fayl_oqi funksiya(fayl: satr) -> Natija<satr, Xato> {
    agar !fayl_mavjud(&fayl) {
        return Xato("Fayl topilmadi")
    }

    mazmun = fayl_ochish(&fayl)?  // ? - xato tarqatish
    Muvaffaq(mazmun)
}

// Ishlatish
tanla fayl_oqi("data.txt") {
    Muvaffaq(mazmun) => {
        chop("Oqildi: {}", mazmun.uzunlik())
    },
    Xato(xabar) => {
        chop("Xato: {xabar}")
    }
}

9.3 Panic va assert

beqiyos
// Panic - dastur to'xtaydi
agar muhim_shart_buzilgan {
    panic!("Jiddiy xato yuz berdi!")
}

// Assert
tekshir!(yosh > 0, "Yosh musbat bo'lishi kerak")
tekshir_teng!(2 + 2, 4)
tekshir_noteng!(yosh, 0)

10. To'liq amaliy misol

Keling, barcha o'rgangan narsalarimizni birlashtiriladigan to'liq dastur yozamiz:

beqiyos
//! Talabalar boshqaruv tizimi

/// Talaba ma'lumotlari
Talaba struktura {
    ism: satr,
    yosh: butun,
    kurs: butun,
    ballari: Vek<haqiqiy>
}

tadbiq Talaba {
    /// Yangi talaba yaratish
    yangi funksiya(ism: satr, yosh: butun, kurs: butun) -> Talaba {
        Talaba {
            ism,
            yosh,
            kurs,
            ballari: Vek::yangi()
        }
    }

    /// Ball qo'shish
    ball_qosh funksiya(&o'zgaruvchi self, ball: haqiqiy) -> Natija<(), satr> {
        agar ball < 0.0 yoki ball > 100.0 {
            return Xato("Ball 0-100 oralig'ida bo'lishi kerak")
        }
        self.ballari.qosh(ball)
        Muvaffaq(())
    }

    /// O'rtacha ball
    ortacha funksiya(&self) -> haqiqiy {
        agar self.ballari.bo'sh() {
            return 0.0
        }

        jami o'zgaruvchi = 0.0
        har ball in &self.ballari {
            jami += ball
        }
        jami / self.ballari.uzunlik() as haqiqiy
    }

    /// Baho
    baho funksiya(&self) -> satr {
        ortacha = self.ortacha()
        tanla ortacha {
            90.0.. => "A'lo",
            80.0..90.0 => "Yaxshi",
            70.0..80.0 => "Qoniqarli",
            _ => "Qoniqarsiz"
        }
    }

    /// Ma'lumotni chop etish
    chop funksiya(&self) {
        chop("=== {} ===", self.ism)
        chop("Yoshi: {}", self.yosh)
        chop("Kurs: {}", self.kurs)
        chop("O'rtacha: {:.2}", self.ortacha())
        chop("Baho: {}", self.baho())
    }
}

/// Talabalar ro'yxatini boshqarish
TalabalarRoyxati struktura {
    talabalar: Vek<Talaba>
}

tadbiq TalabalarRoyxati {
    yangi funksiya() -> TalabalarRoyxati {
        TalabalarRoyxati {
            talabalar: Vek::yangi()
        }
    }

    qosh funksiya(&o'zgaruvchi self, talaba: Talaba) {
        self.talabalar.qosh(talaba)
    }

    eng_yaxshi funksiya(&self) -> Tanlov<&Talaba> {
        agar self.talabalar.bo'sh() {
            return Hech
        }

        eng o'zgaruvchi: Tanlov<&Talaba> = Hech
        eng_ball o'zgaruvchi = 0.0

        har talaba in &self.talabalar {
            ortacha = talaba.ortacha()
            agar ortacha > eng_ball {
                eng_ball = ortacha
                eng = Ba'zi(talaba)
            }
        }

        eng
    }

    barchasini_chop funksiya(&self) {
        chop("\n=== Barcha talabalar ===\n")
        har (i, talaba) in self.talabalar.sanab() {
            chop("{}. {}", i + 1, talaba.ism)
            talaba.chop()
            chop()
        }
    }
}

/// Asosiy funksiya
asosiy funksiya() -> Natija<(), satr> {
    chop("=== Talabalar tizimi ===\n")

    // Talabalar yaratish
    ali o'zgaruvchi = Talaba::yangi("Ali Valiyev", 20, 2)
    ali.ball_qosh(85.0)?
    ali.ball_qosh(90.0)?
    ali.ball_qosh(88.0)?

    vali o'zgaruvchi = Talaba::yangi("Vali Karimov", 19, 1)
    vali.ball_qosh(75.0)?
    vali.ball_qosh(80.0)?
    vali.ball_qosh(78.0)?

    nodira o'zgaruvchi = Talaba::yangi("Nodira Rahimova", 21, 3)
    nodira.ball_qosh(95.0)?
    nodira.ball_qosh(92.0)?
    nodira.ball_qosh(98.0)?

    // Ro'yxatga qo'shish
    royxat o'zgaruvchi = TalabalarRoyxati::yangi()
    royxat.qosh(ali)
    royxat.qosh(vali)
    royxat.qosh(nodira)

    // Natijalarni ko'rsatish
    royxat.barchasini_chop()

    // Eng yaxshisini topish
    tanla royxat.eng_yaxshi() {
        Ba'zi(talaba) => {
            chop("🏆 Eng yaxshi talaba: {}", talaba.ism)
            chop("   O'rtacha balli: {:.2}", talaba.ortacha())
        },
        Hech => chop("Talabalar yo'q")
    }

    Muvaffaq(())
}

11. Xulosa

O'rganilgan mavzular

Ushbu to'liq qo'llanmada biz Beqiyos dasturlash tilining sintaksisini chuqur o'rgandik:

1. Dizayn falsafasi

  • Nima uchun O'zbekcha grammatikaga mos sintaksis muhim
  • Qaysi tillardan qanday xususiyatlar olingan
  • Asosiy dizayn tamoyillari

2. Izohlar tizimi

  • Oddiy izohlar (bir va ko'p qatorli)
  • Uyalashgan izohlar (Beqiyos'ga xos)
  • Hujjatlashtirish izohlari (///, //!, /** */)
  • Markdown qo'llab-quvvatlash

3. E'lon qilish paradigmasi

  • "Nom → Tur" yondashuvi va uning afzalliklari
  • Tur xulosasi (type inference)
  • O'qish va yozish qulayligi

4. Tur tizimi

  • Primitiv turlar (butun, haqiqiy, mantiqiy, satr)
  • Murakkab turlar (tuple, array, vector, hashmap)
  • Option va Result turlari
  • O'zgarmaslik sukut bo'yicha

5. Boshqaruv oqimi

  • Shartli operatorlar (agar, aks_holda)
  • Pattern matching (tanla)
  • Sikllar (siklda, paytki, har)

6. Funksiyalar

  • Oddiy va parametrli funksiyalar
  • Ko'p qiymat qaytarish
  • Yuqori darajali funksiyalar va lambda
  • Closure va scope

7. Ma'lumotlar strukturalari

  • Struktura e'lon qilish va metodlar
  • Enum va variant'lar
  • Trait'lar va polimorfizm

8. Xatolik boshqaruvi

  • Option turi - qiymat mavjudligi
  • Result turi - muvaffaqiyat/xato
  • ? operatori - xatolarni tarqatish
  • Panic va assertion'lar

Beqiyos'ning asosiy kuchliklari

1. Xavfsizlik

beqiyos
// Ownership tizimi xotira xavfsizligini ta'minlaydi
// Null pointer exception'lar yo'q (Option ishlatiladi)
// Data race'lar kompilyatsiya vaqtida aniqlanadi

2. O'zbekcha tabiiylik

beqiyos
// Sintaksis O'zbek tiliga mos
yosh o'zgaruvchi = 25
agar yosh >= 18 {
    chop("Katta")
}

3. Zamonaviy xususiyatlar

beqiyos
// Pattern matching
tanla qiymat {
    Ba'zi(n) agar n > 0 => "Musbat",
    Ba'zi(0) => "Nol",
    Ba'zi(_) => "Manfiy",
    Hech => "Yo'q"
}

// Generics
royxat o'zgaruvchi: Vek<butun> = vek![1, 2, 3]

4. Aniqlik va tushunarlilik

beqiyos
// Har bir e'lon aniq
o'zgaruvchi vs o'zgarmas
Ba'zi() vs Hech
Muvaffaq() vs Xato()

"Til - bu nafaqat muloqot vositasi, balki tafakkur tuzilmasidir. Beqiyos orqali biz O'zbekcha fikrlaydigan, xavfsiz va zamonaviy dasturlarni yaratamiz."

— Otabek Sadiridinov, 2026-yil 11-yanvar


© 2026 Beqiyos Project. Barcha huquqlar himoyalangan.
Litsenziya: MIT License