Bosh sahifa Wiki Transpiler

Transpiler

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:

  1. Lexical analysissource code tokenlarga ajratiladi.
  2. Parsing — tokenlardan syntax tree hosil qilinadi.
  3. Semantic analysisscope, type yoki symbol ma’lumoti tekshiriladi.
  4. Transformationsyntax tree kerakli shaklga o‘zgartiriladi.
  5. Code generation — target til source code’i yaratiladi.
  6. 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.

Source:

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:

  • private field;
  • decorator;
  • iterator;
  • generator;
  • async stack;
  • proxy;
  • platform API

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:

  • repositoryga qo‘shilishi;
  • build vaqtida yaratilishi;
  • package ichida tarqatilishi

loyiha siyosatiga bog‘liq.

Diagnostika

Transpilation muammosida:

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