Babel plaginlarini yaratish bo'yicha ushbu batafsil qo'llanma yordamida JavaScript kodini o'zgartirish imkoniyatlarini oching. JavaScript sintaksisini sozlash, kodni optimallashtirish va butun dunyo dasturchilari uchun kuchli vositalar yaratishni o'rganing.
JavaScript Kodining Transformatsiyasi: Babel Plaginlarini Yaratish Bo'yicha To'liq Qo'llanma
JavaScript - bu internetning muhim qismini quvvatlantiruvchi ajoyib darajada ko'p qirrali til. Biroq, JavaScript'ning doimiy rivojlanishi, yangi xususiyatlar va sintaksisning tez-tez paydo bo'lishi dasturchilar uchun qiyinchiliklar tug'diradi. Aynan shu yerda kodni o'zgartirish vositalari, xususan Babel, yordamga keladi. Babel dasturchilarga eng so'nggi JavaScript xususiyatlaridan foydalanish imkonini beradi, hatto ularni hali qo'llab-quvvatlamaydigan muhitlarda ham. Aslini olganda, Babel zamonaviy JavaScript kodini brauzerlar va boshqa ish vaqti muhitlari tushuna oladigan versiyaga aylantiradi. Maxsus Babel plaginlarini yaratishni tushunish dasturchilarga bu funksionallikni kengaytirish, kodni optimallashtirish, kodlash standartlarini joriy etish va hatto butunlay yangi JavaScript dialektlarini yaratish imkonini beradi. Ushbu qo'llanma barcha darajadagi dasturchilar uchun mos bo'lgan Babel plaginlarini yaratish bo'yicha batafsil ma'lumot beradi.
Nima uchun Babel? Nima uchun Plaginlar?
Babel - bu zamonaviy JavaScript kodini (ESNext) barcha brauzerlarda ishlay oladigan JavaScript'ning orqaga mos keluvchi versiyasiga (ES5) aylantiradigan JavaScript kompilyatoridir. Bu turli brauzerlar va muhitlar bo'ylab kod mosligini ta'minlash uchun muhim vositadir. Ammo Babelning kuchi oddiy transpilatsiyadan tashqariga chiqadi; uning plaginlar tizimi asosiy xususiyatidir.
- Moslik: Eng zamonaviy JavaScript xususiyatlaridan bugunoq foydalaning.
- Kodini Optimallashtirish: Kodning ishlash samaradorligini va hajmini yaxshilang.
- Kod Uslubini Qo'llash: Jamoalar bo'ylab bir xil kodlash amaliyotlarini joriy eting.
- Maxsus Sintaksis: O'z JavaScript sintaksisingiz bilan tajriba qiling va uni joriy eting.
Babel plaginlari dasturchilarga kodni o'zgartirish jarayonini sozlash imkonini beradi. Ular JavaScript kodining tuzilmaviy tasviri bo'lgan Abstrakt Sintaktik Daraxt (AST) ustida ishlaydi. Bu yondashuv kodning qanday o'zgartirilishini nozik darajada nazorat qilish imkonini beradi.
Abstrakt Sintaktik Daraxtni (AST) Tushunish
AST bu sizning JavaScript kodingizning daraxtsimon tasviridir. U kodingizni kichikroq, boshqarish oson bo'lgan qismlarga ajratadi, bu esa Babelga (va sizning plaginlaringizga) kod strukturasini tahlil qilish va o'zgartirish imkonini beradi. AST Babelga o'zgaruvchilar, funksiyalar, sikllar va boshqa til konstruksiyalarini aniqlash va o'zgartirish imkonini beradi.
AST Explorer kabi vositalar kodning ASTda qanday tasvirlanishini tushunish uchun bebaho hisoblanadi. Siz JavaScript kodini ushbu vositaga joylashtirib, uning mos keladigan AST tuzilmasini ko'rishingiz mumkin. Bu plagin yaratish uchun juda muhim, chunki siz ushbu tuzilmani kezishingiz va o'zgartirishingiz kerak bo'ladi.
Masalan, quyidagi JavaScript kodini ko'rib chiqaylik:
const message = 'Hello, World!';
console.log(message);
Uning AST ko'rinishi taxminan shunday bo'lishi mumkin (soddalashtirilgan):
Program {
body: [
VariableDeclaration {
kind: 'const',
declarations: [
VariableDeclarator {
id: Identifier { name: 'message' },
init: Literal { value: 'Hello, World!' }
}
]
},
ExpressionStatement {
expression: CallExpression {
callee: MemberExpression {
object: Identifier { name: 'console' },
property: Identifier { name: 'log' }
},
arguments: [
Identifier { name: 'message' }
]
}
}
]
}
ASTdagi har bir tugun kodda ma'lum bir elementni ifodalaydi (masalan, `VariableDeclaration`, `Identifier`, `Literal`). Sizning plaginingiz ushbu ma'lumotdan kodni kezish va o'zgartirish uchun foydalanadi.
Babel Plaginlarini Yaratish Muhitini Sozlash
Ishni boshlash uchun siz o'z dasturlash muhitingizni sozlashingiz kerak. Bunga Node.js va npm (yoki yarn) o'rnatish kiradi. Keyin, siz yangi loyiha yaratib, kerakli bog'liqliklarni o'rnatishingiz mumkin.
- Loyiha papkasini yarating:
mkdir babel-plugin-example
cd babel-plugin-example
- Loyihani ishga tushiring:
npm init -y
- Babel yadrosi va bog'liqliklarini o'rnating:
npm install --save-dev @babel/core @babel/types
@babel/core: Asosiy Babel kutubxonasi.@babel/types: AST tugunlarini yaratish uchun yordamchi dastur.
Siz shuningdek test qilish uchun `@babel/preset-env` kabi plaginlarni o'rnatishingiz mumkin. Ushbu oldindan sozlangan to'plam ESNext kodini ES5 ga o'zgartirishga yordam beradi, ammo oddiy plagin yaratish uchun majburiy emas.
npm install --save-dev @babel/preset-env
Birinchi Babel Plaginingizni Yaratish: Oddiy Misol
Keling, har bir faylning yuqori qismiga izoh qo'shadigan oddiy plagin yaratamiz. Ushbu misol Babel plaginining asosiy tuzilishini namoyish etadi.
- Plagin faylini yarating (masalan,
my-babel-plugin.js):
// my-babel-plugin.js
module.exports = function(babel) {
const { types: t } = babel;
return {
name: 'add-comment',
visitor: {
Program(path) {
path.unshiftContainer('body', t.addComment('leading', path.node, 'Ushbu kod mening Babel plagimim tomonidan o\'zgartirildi'));
}
}
};
};
module.exports: Ushbu funksiya argument sifatida Babel instansiyasini qabul qiladi.t(@babel/types): AST tugunlarini yaratish uchun metodlarni taqdim etadi.name: Plagin nomi (nosozliklarni tuzatish va identifikatsiya qilish uchun).visitor: Visitor funksiyalarini o'z ichiga olgan obyekt. Har bir kalit AST tugun turini ifodalaydi (masalan, `Program`).Program(path): Ushbu visitor funksiyasi Babel `Program` tuguniga (ASTning ildizi) duch kelganda ishga tushadi.path.unshiftContainer: AST tugunini konteynerning boshiga (bu holda, `Program`ning `body` qismiga) qo'shadi.t.addComment: Boshlovchi izoh tugunini yaratadi.
- Plaginni sinab ko'ring: Sinov faylini yarating (masalan,
index.js):
// index.js
const greeting = 'Hello, Babel!';
console.log(greeting);
- Babelni sozlang (masalan,
.babelrc.jsfayli yordamida):
// .babelrc.js
module.exports = {
plugins: ['./my-babel-plugin.js']
};
- Kodni o'zgartirish uchun Babelni ishga tushiring:
npx babel index.js -o output.js
Ushbu buyruq `index.js` faylini plaginingiz bilan qayta ishlaydi va o'zgartirilgan kodni `output.js` ga chiqaradi.
- Natijani tekshiring (
output.js):
// Ushbu kod mening Babel plagimim tomonidan o'zgartirildi
const greeting = 'Hello, Babel!';
console.log(greeting);
Siz o'zgartirilgan kodning boshida qo'shilgan izohni ko'rishingiz kerak.
Plagin Tuzilishiga Chuqurroq Nazar
Babel plaginlari ASTni kezish va kodni o'zgartirish uchun visitor naqshidan (pattern) foydalanadi. Keling, plaginning asosiy tarkibiy qismlarini batafsilroq ko'rib chiqamiz.
module.exports(babel): Plaginni eksport qiladigan asosiy funksiya. U Babel instansiyasini qabul qiladi, bu sizga `types` (t) yordamchi dasturi va boshqa Babel xususiyatlariga kirish imkonini beradi.name: Plaginingiz uchun tavsiflovchi nom. Bu nosozliklarni tuzatishda va Babel konfiguratsiyasida plaginni aniqlashda yordam beradi.visitor: Plaginingizning yuragi. Bu turli AST tugun turlari uchun visitor metodlarini o'z ichiga olgan obyekt.- Visitor Metodlari: `visitor` obyektidagi har bir metod AST tugun turiga mos keladi (masalan, `Program`, `Identifier`, `CallExpression`). Babel ushbu turdagi tugunga duch kelganda, u mos keladigan visitor metodini chaqiradi. Visitor metodi joriy tugunni ifodalovchi va ASTni kezish va o'zgartirish uchun metodlarni taqdim etuvchi `path` obyektini qabul qiladi.
pathobyekti: `path` obyekti plagin yaratishda markaziy o'rin tutadi. U ASTni kezish va o'zgartirish uchun ko'plab metodlarni taqdim etadi:
path.node: Joriy AST tuguni.path.parent: Joriy tugunning ota tuguni.path.traverse(visitor): Joriy tugunning bola tugunlarini rekursiv tarzda kezib chiqadi.path.replaceWith(newNode): Joriy tugunni yangi tugun bilan almashtiradi.path.remove(): Joriy tugunni o'chiradi.path.insertBefore(newNode): Joriy tugundan oldin yangi tugun qo'shadi.path.insertAfter(newNode): Joriy tugundan keyin yangi tugun qo'shadi.path.findParent(callback): Shartni qanoatlantiradigan eng yaqin ota tugunni topadi.path.getSibling(key): Qo'shni tugunni oladi.
@babel/types bilan Ishlash
@babel/types moduli AST tugunlarini yaratish va o'zgartirish uchun yordamchi dasturlarni taqdim etadi. Bu yangi kod yaratish va mavjud kod tuzilmalarini plagin ichida o'zgartirish uchun juda muhim. Ushbu moduldagi funksiyalar turli AST tugun turlariga mos keladi.
Mana bir nechta misollar:
t.identifier(name): Identifikator tugunini yaratadi (masalan, o'zgaruvchi nomi).t.stringLiteral(value): Satr literali tugunini yaratadi.t.numericLiteral(value): Raqamli literal tugunini yaratadi.t.callExpression(callee, arguments): Funksiya chaqiruvi tugunini (CallExpression) yaratadi (masalan, funksiya chaqiruvi).t.memberExpression(object, property): MemberExpression tugunini yaratadi (masalan, `object.property`).t.arrowFunctionExpression(params, body): ArrowFunctionExpression tugunini yaratadi.
Misol: Yangi o'zgaruvchi e'lon qilish:
const newDeclaration = t.variableDeclaration('const', [
t.variableDeclarator(
t.identifier('myNewVariable'),
t.stringLiteral('Hello, world!')
)
]);
Amaliy Plagin Misollari
Babel plaginlarining ko'p qirraliligini namoyish etish uchun ba'zi amaliy misollarni ko'rib chiqamiz. Ushbu misollar keng tarqalgan foydalanish holatlarini ko'rsatadi va o'z plaginlaringizni yaratish uchun boshlang'ich nuqtalarni taqdim etadi.
1. Console Log'larni O'chirish
Ushbu plagin kodingizdagi barcha `console.log` bayonotlarini olib tashlaydi. Bu, ayniqsa, production buildlar paytida tasodifan tuzatish ma'lumotlarini oshkor qilishning oldini olish uchun juda foydali bo'lishi mumkin.
// remove-console-logs.js
module.exports = function(babel) {
const { types: t } = babel;
return {
name: 'remove-console-logs',
visitor: {
CallExpression(path) {
if (path.node.callee.type === 'MemberExpression' &&
path.node.callee.object.name === 'console' &&
path.node.callee.property.name === 'log') {
path.remove();
}
}
}
};
};
Ushbu plaginda `CallExpression` visitori funksiya chaqiruvining `console.log` bayonoti ekanligini tekshiradi. Agar shunday bo'lsa, `path.remove()` metodi butun tugunni olib tashlaydi.
2. Shablon Literallarini Birlashtirishga O'zgartirish
Ushbu plagin shablon literallarini (``) `+` operatori yordamida satrlarni birlashtirishga aylantiradi. Bu shablon literallarini tabiiy ravishda qo'llab-quvvatlamaydigan eski JavaScript muhitlari uchun foydalidir (garchi Babel odatda buni avtomatik ravishda bajaradi).
// template-literal-to-concat.js
module.exports = function(babel) {
const { types: t } = babel;
return {
name: 'template-literal-to-concat',
visitor: {
TemplateLiteral(path) {
const expressions = path.node.expressions;
const quasis = path.node.quasis;
let result = t.stringLiteral(quasis[0].value.raw);
for (let i = 0; i < expressions.length; i++) {
result = t.binaryExpression(
'+',
result,
expressions[i]
);
result = t.binaryExpression(
'+',
result,
t.stringLiteral(quasis[i + 1].value.raw)
);
}
path.replaceWith(result);
}
}
};
};
Ushbu plagin `TemplateLiteral` tugunlarini qayta ishlaydi. U ifodalar va quasis (satr qismlari) bo'ylab takrorlanadi va `t.binaryExpression` yordamida ekvivalent birlashtirishni yaratadi.
3. Mualliflik Huquqi Bildirishnomalarini Qo'shish
Ushbu plagin har bir faylning boshiga mualliflik huquqi bildirishnomasini qo'shadi va bu ma'lum joylarga kod qo'shishni namoyish etadi.
// add-copyright-notice.js
module.exports = function(babel) {
const { types: t } = babel;
return {
name: 'add-copyright-notice',
visitor: {
Program(path) {
path.unshiftContainer('body', t.commentBlock(' Copyright (c) 2024 Your Company '));
}
}
};
};
Ushbu misolda faylning boshiga ko'p qatorli izoh blokini qo'shish uchun `Program` visitoridan foydalaniladi.
Plagin Yaratishning Ilg'or Texnikalari
Asoslardan tashqari, Babel plaginlarini yaratishni takomillashtirish uchun ilg'or texnikalar mavjud.
- Plagin Opsiyalari: Foydalanuvchilarga plaginingizni opsiyalar bilan sozlash imkonini bering.
- Kontekst: Holatni boshqarish yoki asinxron operatsiyalarni bajarish uchun Babel kontekstiga kiring.
- Manba Xaritalari (Source Maps): O'zgartirilgan kodni asl manbaga qayta bog'lash uchun manba xaritalarini yarating.
- Xatoliklarni Boshqarish: Foydalanuvchilarga foydali fikr-mulohazalar berish uchun xatoliklarni to'g'ri boshqaring.
1. Plagin Opsiyalari
Plagin opsiyalari foydalanuvchilarga plaginingizning xatti-harakatini sozlash imkonini beradi. Siz ushbu opsiyalarni plaginning asosiy funksiyasida belgilaysiz.
// plugin-with-options.js
module.exports = function(babel, options) {
const { types: t } = babel;
const { authorName = 'Unknown Author' } = options;
return {
name: 'plugin-with-options',
visitor: {
Program(path) {
path.unshiftContainer('body', t.commentBlock(` Copyright (c) 2024 ${authorName} `));
}
}
};
};
Ushbu misolda plagin standart qiymati 'Unknown Author' bo'lgan authorName opsiyasini qabul qiladi. Foydalanuvchilar plaginni Babelning konfiguratsiya fayli (.babelrc.js yoki babel.config.js) orqali sozlaydilar.
// .babelrc.js
module.exports = {
plugins: [[
'./plugin-with-options.js',
{ authorName: 'John Doe' }
]]
};
2. Kontekst
Babel holatni boshqarish va bir nechta fayl transformatsiyalari davomida saqlanib qoladigan operatsiyalarni bajarish imkonini beruvchi kontekst ob'ektini taqdim etadi. Bu keshlashtirish yoki statistika to'plash kabi vazifalar uchun foydalidir.
Kontekstga Babel instansiyasi orqali, odatda plagin funksiyasiga opsiyalarni uzatishda kiriladi. `file` ob'ekti o'zgartirilayotgan joriy faylga xos kontekstni o'z ichiga oladi.
// plugin-with-context.js
module.exports = function(babel, options, dirname) {
const { types: t } = babel;
let fileCount = 0;
return {
name: 'plugin-with-context',
pre(file) {
// Har bir fayl uchun bir marta ishlaydi
fileCount++;
console.log(`Transforming file: ${file.opts.filename}`);
},
visitor: {
Program(path) {
path.unshiftContainer('body', t.commentBlock(` Transformed by plugin (File Count: ${fileCount})`));
}
},
post(file) {
// Har bir fayldan keyin ishlaydi
console.log(`Finished transforming: ${file.opts.filename}`);
}
};
};
Yuqoridagi misol pre va post xuklarini (hooks) namoyish etadi. Bu xuklar faylni qayta ishlashdan oldin va keyin sozlash va tozalash vazifalarini bajarishga imkon beradi. Fayllar soni `pre` da oshiriladi. Eslatma: Uchinchi argument, `dirname`, konfiguratsiya fayli joylashgan katalogni taqdim etadi, bu fayl operatsiyalari uchun foydalidir.
3. Manba Xaritalari (Source Maps)
Manba xaritalari o'zgartirilgan kodni tuzatish uchun juda muhimdir. Ular o'zgartirilgan kodni asl manba kodiga qayta bog'lash imkonini beradi, bu esa tuzatishni ancha osonlashtiradi. Babel manba xaritalarini avtomatik ravishda boshqaradi, lekin siz ularni build jarayoningizga qarab sozlashingiz kerak bo'lishi mumkin.
Manba xaritalari Babel konfiguratsiyangizda yoqilganligiga ishonch hosil qiling (odatda sukut bo'yicha). Webpack yoki Parcel kabi bandlerlardan foydalanganda, ular odatda manba xaritalarini yaratish va integratsiyalashni o'z zimmalariga oladilar.
4. Xatoliklarni Boshqarish
Ishonchli xatoliklarni boshqarish juda muhim. Foydalanuvchilarga muammolarni tushunish va tuzatishda yordam berish uchun mazmunli xato xabarlarini taqdim eting. Babel xatolar haqida xabar berish uchun metodlarni taqdim etadi.
// plugin-with-error-handling.js
module.exports = function(babel) {
const { types: t } = babel;
return {
name: 'plugin-with-error-handling',
visitor: {
Identifier(path) {
if (path.node.name === 'invalidVariable') {
path.traverse({})
path.buildCodeFrameError('Invalid variable name: invalidVariable').loc.column;
//throw path.buildCodeFrameError('Yaroqsiz o\'zgaruvchi nomi: invalidVariable');
}
}
}
};
};
Manba kodidagi xato joylashuvini o'z ichiga olgan xato xabarlarini yaratish uchun path.buildCodeFrameError() dan foydalaning, bu foydalanuvchiga xatoni aniqlash va tuzatishni osonlashtiradi. Xatoni tashlash transformatsiya jarayonini to'xtatadi va xatoni konsolda ko'rsatadi.
Babel Plaginlaringizni Sinovdan O'tkazish
Plaginlaringiz to'g'ri ishlashini va kutilmagan xatti-harakatlarni keltirib chiqarmasligini ta'minlash uchun puxta sinovdan o'tkazish juda muhim. Plaginingiz kodni kutilganidek o'zgartirishini tekshirish uchun unit testlardan foydalanishingiz mumkin. Keng qamrovni ta'minlash uchun turli xil stsenariylarni, jumladan, to'g'ri va noto'g'ri kiritishlarni sinab ko'rishni o'ylab ko'ring.
Bir nechta test freymvorklari mavjud. Jest va Mocha mashhur tanlovlardir. Babel plaginlarni sinash uchun yordamchi funksiyalarni taqdim etadi. Bular ko'pincha kiritilgan kodni transformatsiyadan keyingi kutilgan natija kodi bilan solishtirishni o'z ichiga oladi.
Jest va @babel/core yordamida misol:
// plugin-with-jest.test.js
const { transformSync } = require('@babel/core');
const plugin = require('./remove-console-logs');
const code = `
console.log('Hello');
const message = 'World';
console.log(message);
`;
const expected = `
const message = 'World';
`;
test('console.log bayonotlarini o\'chirish', () => {
const { code: transformedCode } = transformSync(code, {
plugins: [plugin]
});
expect(transformedCode.trim()).toBe(expected.trim());
});
Ushbu test plaginni sinov kiritish satriga qo'llash uchun @babel/core dan `transformSync` dan foydalanadi, so'ngra o'zgartirilgan natijani kutilgan natija bilan solishtiradi.
Babel Plaginlaringizni Nashr Etish
Foydali Babel plaginini ishlab chiqqaningizdan so'ng, uni dunyo bilan baham ko'rish uchun npm ga nashr etishingiz mumkin. Nashr etish boshqa dasturchilarga plaginingizni osongina o'rnatish va ishlatish imkonini beradi. Plagin yaxshi hujjatlashtirilganligiga va qadoqlash hamda tarqatish uchun eng yaxshi amaliyotlarga rioya qilishiga ishonch hosil qiling.
package.jsonfaylini yarating: Bu plaginingiz haqidagi ma'lumotlarni (nomi, tavsifi, versiyasi va hokazo) o'z ichiga oladi. Topilish imkoniyatini yaxshilash uchun 'babel-plugin', 'javascript' va boshqa kalit so'zlarni kiritganingizga ishonch hosil qiling.- GitHub repozitoriysini yarating: Plaginingiz kodini ommaviy yoki shaxsiy repozitoriyda saqlang. Bu versiyalarni boshqarish, hamkorlik va kelajakdagi yangilanishlar uchun juda muhim.
- npm ga kiring: `npm login` buyrug'idan foydalaning.
- Plaginni nashr eting: Loyiha katalogingizdan `npm publish` buyrug'idan foydalaning.
Eng Yaxshi Amaliyotlar va Mulohazalar
- O'qilishi va Qo'llab-quvvatlanishi: Toza, yaxshi hujjatlashtirilgan kod yozing. Izchil kod uslubidan foydalaning.
- Samaradorlik: Plaginingizning ishlash samaradorligiga ta'sirini, ayniqsa katta kod bazalari bilan ishlaganda, hisobga oling. Keraksiz operatsiyalardan saqlaning.
- Moslik: Plaginingiz Babelning turli versiyalari va JavaScript muhitlari bilan mos kelishiga ishonch hosil qiling.
- Hujjatlar: Misollar va konfiguratsiya opsiyalarini o'z ichiga olgan aniq va to'liq hujjatlarni taqdim eting. Yaxshi README fayli juda muhim.
- Sinovdan o'tkazish: Plaginingizning barcha funksiyalarini qamrab oladigan va regressiyalarning oldini oladigan keng qamrovli testlar yozing.
- Versiyalash: Plaginingiz relizlarini boshqarish uchun semantik versiyalashga (SemVer) amal qiling.
- Jamiyat Hissasi: Plaginingizni yaxshilashga yordam berish uchun jamiyat hissalariga ochiq bo'ling.
- Xavfsizlik: Potensial xavfsizlik zaifliklarining oldini olish uchun foydalanuvchi tomonidan taqdim etilgan har qanday ma'lumotni tozalang va tekshiring.
- Litsenziya: Boshqalar plaginingizdan foydalanishi va unga hissa qo'shishi uchun litsenziyani (masalan, MIT, Apache 2.0) qo'shing.
Xulosa
Babel plaginlarini yaratish butun dunyodagi JavaScript dasturchilari uchun keng moslashtirish imkoniyatlarini ochadi. AST va mavjud vositalarni tushunib, siz ish jarayonlaringizni yaxshilash, kodlash standartlarini joriy etish, kodni optimallashtirish va yangi JavaScript sintaksislarini o'rganish uchun kuchli vositalar yaratishingiz mumkin. Ushbu qo'llanmada keltirilgan misollar mustahkam poydevor yaratadi. O'z plaginlaringizni yaratayotganda sinovdan o'tkazish, hujjatlashtirish va eng yaxshi amaliyotlarni qo'llashni unutmang. Yangi boshlovchidan mutaxassisgacha bo'lgan bu sayohat uzluksiz jarayondir. Doimiy o'rganish va tajriba qilish Babel plaginlarini yaratishni o'zlashtirish va doimo rivojlanayotgan JavaScript ekotizimiga hissa qo'shishning kalitidir. Tajriba qilishni, tadqiq qilishni va yaratishni boshlang – sizning hissangiz, shubhasiz, butun dunyo bo'ylab dasturchilarga foyda keltiradi.