Transpiler — bir dasturlash tilidagi source code’ni abstraksiya darajasi o‘xshash bo‘lgan boshqa til yoki shu tilning boshqa versiyasiga aylantiradigan dastur. Atama source-to-source compiler ma’nosida ishlatiladi.
Oddiy compiler ko‘pincha source code’ni machine code yoki bytecode’ga aylantiradi. Transpiler esa natijada yana inson o‘qishi mumkin bo‘lgan source code hosil qiladi.
Asosiy vazifa
Transpiler yangi til imkoniyatlarini eski yoki boshqa muhitda ishlatishga yordam beradi.
Misollar:
- yangi JavaScript sintaksisini eski JavaScriptga aylantirish;
- TypeScript kodini JavaScriptga o‘girish;
- bir DSL’ni umumiy maqsadli tilga aylantirish;
- platformaga xos API chaqiriqlarini boshqa platforma variantiga moslashtirish;
- yangi standard syntaxini eski compiler tushunadigan ko‘rinishga keltirish.
Ishlash bosqichlari
Transpiler odatda quyidagi bosqichlardan o‘tadi:
- Lexical analysis — source code tokenlarga ajratiladi.
- Parsing — tokenlardan syntax tree hosil qilinadi.
- Semantic analysis — scope, type yoki symbol ma’lumoti tekshiriladi.
- Transformation — syntax tree kerakli shaklga o‘zgartiriladi.
- Code generation — target til source code’i yaratiladi.
- Source map — asl va hosil bo‘lgan qatorlar bog‘lanadi.
Barcha transpilerlar har bosqichni to‘liq bajarmasligi mumkin.
TypeScript misoli
TypeScript JavaScriptga type annotation va boshqa imkoniyatlar qo‘shadi.
function add(a: number, b: number): number {
return a + b;
}
Transpilation natijasi:
function add(a, b) {
return a + b;
}
Type annotationlar runtime JavaScriptda mavjud bo‘lmagani uchun olib tashlanadi.
Syntax transformatsiyasi
Yangi syntax eski muhitda mavjud bo‘lmasa, transpiler uni ekvivalent eski konstruksiyaga aylantiradi.
Masalan:
const value = user?.profile?.name;
eski muhit uchun shartli tekshiruvlarga aylantirilishi mumkin.
Bunday o‘zgarish faqat syntax transformatsiya bo‘lib, kerakli built-in APIlarni avtomatik qo‘shmasligi mumkin.
Polyfill bilan farqi
Transpiler syntaxni o‘zgartiradi.
Polyfill esa runtime’da mavjud bo‘lmagan API yoki built-in funksiyani qo‘shadi.
Masalan:
- arrow function — transpiler orqali o‘zgaradi;
Promise— eski muhitda polyfill talab qilishi mumkin.
Transpilation bajarilgan bo‘lsa ham, target muhit barcha runtime imkoniyatlarni qo‘llashi kafolatlanmaydi.
Compiler va transpiler
| Jihat | Compiler | Transpiler |
|---|---|---|
| Kirish | Source code | Source code |
| Chiqish | Machine code, bytecode yoki boshqa format | Boshqa source code |
| Abstraksiya darajasi | Ko‘pincha pastroq | O‘xshash |
| Natijani o‘qish | Har doim ham oson emas | Odatda o‘qish mumkin |
| Maqsad | Bajariladigan kod | Mos source code |
Amaliy vosita bir vaqtning o‘zida compiler va transpiler xususiyatiga ega bo‘lishi mumkin.
Target
Transpiler qaysi platforma yoki til versiyasiga mos kod yaratishini target orqali belgilaydi.
Target quyidagilarga ta’sir qiladi:
- qaysi syntax saqlanadi;
- qaysi syntax eski ko‘rinishga o‘tadi;
- helper functionlar;
- module formati;
- polyfill talabi;
- output hajmi.
Juda eski target ko‘proq transformatsiya va kattaroq output beradi.
Plugin va preset
Ko‘p transpiler transformatsiya qoidalarini plugin orqali qo‘llaydi.
Preset bir nechta plugin va konfiguratsiyani guruhlaydi.
Masalan, ma’lum browserlar ro‘yxatiga mos preset faqat kerakli transformatsiyalarni tanlaydi.
Pluginlar tartibi natijaga ta’sir qilishi mumkin.
Source map
Hosil bo‘lgan kod asl source’dan farq qiladi. Runtime xatosi output fayldagi qatorni ko‘rsatadi.
Source map:
- output qatori;
- asl fayl;
- asl qator va ustun;
- symbol nomi
orasidagi bog‘lanishni saqlaydi.
Debugger va error monitoring asl TypeScript yoki boshqa source’ni ko‘rsatishi mumkin.
Helper kod
Ba’zi transformatsiya takroriy helper function talab qiladi.
Masalan, class inheritance yoki async function uchun yordamchi kod.
Har fayl ichida helper nusxalanishi bundle hajmini oshiradi. Runtime helper package orqali umumiylashtirilishi mumkin.
Tree shaking bilan munosabat
Transpiler module formatini o‘zgartirsa, bundlerning tree shaking imkoniyatiga ta’sir qiladi.
Statik ES module import/export saqlansa, ishlatilmagan exportlarni aniqlash oson.
CommonJSga erta aylantirish static analysisni qiyinlashtirishi mumkin.
Semantik farq
Har yangi imkoniyatni eski tilda to‘liq bir xil semantika bilan ifodalash mumkin emas.
Masalan:
uchun farqlar bo‘lishi mumkin.
Transpiler hujjati qaysi xususiyatlar to‘liq yoki taxminiy moslashtirilishini belgilaydi.
Build pipeline
Transpiler odatda build tizimining bir qismi:
Source
→ Transpiler
→ Bundler
→ Minifier
→ Artifact
Tartib loyiha va vositaga qarab o‘zgaradi.
Ba’zi bundler transpilationni o‘z ichida bajaradi.
Incremental build
Katta loyihada barcha faylni qayta transpile qilish sekin.
Incremental rejim:
- o‘zgargan fayllarni aniqlaydi;
- cache ishlatadi;
- dependency graph orqali ta’sirlangan qismlarni yangilaydi;
- watch mode’da tez natija beradi.
Cache key konfiguratsiya va transpiler versiyasini ham hisobga oladi.
Type checking
TypeScript kabi tizimda transpilation va type checking alohida jarayon bo‘lishi mumkin.
Tez transpiler type’larni olib tashlab output yaratadi, ammo type xatolarni to‘liq tekshirmaydi.
CI’da alohida type checker ishlatilishi mumkin.
Generated code
Transpiler outputi odatda qo‘lda tahrir qilinmaydi.
Asl source yangilanganda output qayta yaratiladi.
Generated katalog:
loyiha siyosatiga bog‘liq.
Diagnostika
Transpilation muammosida:
- source syntax;
- target version;
- plugin;
- preset;
- module format;
- polyfill;
- source map;
- cache;
- tool version;
- generated output
tekshiriladi.
Runtime xatosi transpiler bugi, noto‘g‘ri transformatsiya yoki target muhit yetishmovchiligi bo‘lishi mumkin.
Bog‘liq tushunchalar
Compiler, Source code, TypeScript, JavaScript, Polyfill, Source map, Plugin, Preset, Build pipeline, AST