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:
- Dizayn falsafasi va ilhomlanish manbalari — Beqiyos qanday tillardan qanday g'oyalarni oldi
- Izohlar tizimi — Oddiy izohlardan hujjatlashtirish izohlarigacha
- E'lon qilish paradigmasi — Nima uchun "nom → tur" usulini tanladik
- Tur tizimi va o'zgaruvchilar — O'zgarmas va o'zgaruvchan o'zgaruvchilar
- Boshqaruv oqimi — Shartlar va sikllar
- Funksiyalar ekotizimi — Oddiy funksiyalardan yuqori darajali funksiyalargacha
- Ma'lumotlar tuzilmalari — Ro'yxatlardan strukturalargacha
- Xatoliklar bilan ishlash — Zamonaviy xatolik boshqaruvi
- 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.
yosh o'zgaruvchi = 25Quyidagi kabi ananaviy uslubni emas:
o'zgaruvchi yosh = 25Bu 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
// Egalik o'tadi
s1 satr = "salom"
s2 satr = s1 // s1 endi yaroqsiz2. Borrowing (Qarz olish): Ma'lumotlarga egalikni o'tkazmasdan murojaat qilish
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
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
ism Tanlov<satr> = Ba'zi("Ali")
// yoki
ism Tanlov<satr> = Hech2. Smart Casts: Tur tekshirilgandan keyin avtomatik type cast
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
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
// Bu oddiy izoh
o'zgaruvchi yosh: butun = 25 // Yosh o'zgaruvchisiIshlatiladigan holatlar:
- Qisqa tushuntirishlar
- Vaqtinchalik eslatmalar
- Qator oxirida aniqlik kiritish
Ko'p qatorli izohlar
/*
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:
/*
Tashqi izoh boshlanadi
/*
Ichki izoh
Bu juda qulay!
*/
Tashqi izoh davom etadi
*/Bu xususiyat katta kod bo'limlarini vaqtincha o'chirish uchun juda foydali:
/*
// 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:
/// 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 (/** */)
/**
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:
//! # 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:
/// # 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
| Turi | Sintaksis | Maqsadi |
|---|---|---|
| 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:
// Foydalanuvchi balini 0-100 oralig'ida normalizatsiya qilish
natija qiymat = (ball * 100) / maksimal_ballYomon izohlar:
// 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++/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:
yosh o'zgaruvchi: butun = 25
ism o'zgarmas: satr = "Ali"Umumiy format:
NOM KATEGORIYA[: TUR] = QIYMATBu 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
// Tabiiy o'qiladi: "Yosh o'zgaruvchi 25 ga teng"
yosh o'zgaruvchi = 25
// vs C uslubi: "int yosh teng 25"
int yosh = 25 // notabiiy2. Kodning ko'zdan kechirilishi
Kod o'qishda biz odatda chapdan o'ngga o'qiymiz va nomlar bizga eng muhim narsa:
// 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:
// Tur avtomatik aniqlanadi
yosh o'zgaruvchi = 25 // butun
narx o'zgarmas = 99.99 // haqiqiy
ism o'zgarmas = "Ali" // satr
faol o'zgaruvchi = rost // mantiqiyKerak bo'lgandagina aniq ko'rsatamiz:
// Aniq tur kerak bo'lganda
yosh o'zgaruvchi: b8 = 25 // 8-bitli butun
narx o'zgarmas: h32 = 99.99 // 32-bitli floatAmmo, Beqiyosda doim ko'rsatilishi shart hisoblanadi.
3.4 Funksiyalarda qo'llash
Funksiyalarda ham xuddi shunday tartib:
// 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
Odam struktura {
ism: satr,
yosh: butun,
email: satr
}
ali odam: Odam = Odam {
ism: "Ali Valiyev",
yosh: 25,
email: "ali@example.uz"
}Funksiya parametrlarida
// Parametr nomi avval, turi keyin
malumot_yuborish funksiya(
qabul_qiluvchi: satr,
xabar: satr,
muhimlik: butun = 0
) -> Natija<(), Xato> {
// ...
}Umumiy turlarda (Generics)
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:
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:
// 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:
yosh o'zgarmas = 25
yosh = 26 // ❌ XATO: o'zgarmas o'zgaruvchini o'zgartirish mumkin emasNega o'zgarmaslik sukut bo'yicha?
- Xatolarni kamaytiradi: O'zgarmagan ma'lumotlarni nazorat qilish osonroq
- Parallel ishlovga yordam beradi: O'zgarmas ma'lumotlar bir vaqtning o'zida xavfsiz ishlatiladi
- Kodni tushunish osonlashadi: Qiymat o'zgarmasa, kodning oqimini kuzatish oson
4.2 O'zgaruvchan o'zgaruvchilar
O'zgartirish kerak bo'lganda aniq belgilash kerak:
hisoblagich o'zgaruvchi = 0
hisoblagich = hisoblagich + 1 // ✅ To'g'ri
hisoblagich += 1 // ✅ QisqaroqBu 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:
// 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 // ishorasizHaqiqiy sonlar:
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.0025Mantiqiy:
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 // falseBelgi va satr:
// 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)
// 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 // 25Array (Qat'iy o'lchamli ro'yxat)
// 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)
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)
// 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)
// 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
// 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
// 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
// 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)
// 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
// 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
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
bolish funksiya(a: butun, b: butun) -> (butun, butun) {
(a / b, a % b)
}
(bolinma, qoldiq) = bolish(17, 5)7.3 Sukut qiymatlari
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
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)) // 1007.5 Yuqori darajali funksiyalar
// 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
hisoblagich_yasash funksiya() -> fn() -> butun {
hisob o'zgaruvchi = 0
|| {
hisob += 1
hisob
}
}
hisoblagich = hisoblagich_yasash()
chop(hisoblagich()) // 1
chop(hisoblagich()) // 2
chop(hisoblagich()) // 38. Ma'lumotlar strukturalari
8.1 Struktura
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 = 268.2 Metodlar
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
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
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
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
// 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:
//! 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
// Ownership tizimi xotira xavfsizligini ta'minlaydi
// Null pointer exception'lar yo'q (Option ishlatiladi)
// Data race'lar kompilyatsiya vaqtida aniqlanadi2. O'zbekcha tabiiylik
// Sintaksis O'zbek tiliga mos
yosh o'zgaruvchi = 25
agar yosh >= 18 {
chop("Katta")
}3. Zamonaviy xususiyatlar
// 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
// 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

