Interpreter, Compiler

Interpreter, Compiler

(Chista jargonda va imloviy xatola bn)

Engineering Notes da qiziqarli postga ko'zim tushdi. Qo'shimcha qmoqchiman. Lubboy dasturlash tilini yasash 2 ta bosqichda amalga oshadi: Frontend va Backend. (Da, til yasashdayam frontend i bekend bor, bu kulgilimas).

Qattadr CS so'zini ko'rsela bu Computer Science dgani.

Frontend

Fronttan boshlimiz. Birinchi bob leksik jihatdan analiz qlinadi. Bu narsa CS da Lexing dyiladi. Analiz qiladigan app Lexer dyiladi. Lexer yozish vashshe onson. Eng birinchi qilinadigan ish tilli tasavur qilish, qanaqa bo'ladi, nima so'zlari bo'ladi, nima ish qiladi, qatta ishlatiladi.

Davay bitta til o'ylimiz. Birinchi bosqichda Lexer dasturimizda, sintaksis to'riligini tekshirish uchun qoidala to'lplamini e'lon qilamiz. CS da bu Tokenizing dyiladi. Man JS da yozboqaman, class plas keremas:

const tokens = {
  CHUNARSIZ: 0,
  YENGI_QATOR: 1,
  AYDI: 2,
  BUTUN_SON: 3,
  PLUS: 4,
  QOSHTIRNO_IKTALI: 5,
}

Deme tilda nimala bo'lishi mumkinligini e'lon qvoldik. Endi etilik goodbye_world.til faylida yozilgan koddi xotiraga ovolamiz. (xotira dganda qatti etgnammi chungan bo'sez haqiqiy pragramisakansiz).

print 5 + 4
print "Hmm"

Yozilgan koddi biza o'yalan til qoidalariga mosligini tekshirish uchun tokenize qiladigan funksiyaniyam yozish kere. Tahminan bunaqa:

const tokenize = input => {
 const output = {}
 const lines = input.split( "\n" )
 for ( let i = 0; i < lines.length; i++ ) {
  const s = lines[ i ].split( " " ).filter( l => l.length > 0 )
  for ( const entity of s ) {
   // Agar reserved keyword bo'sa
   if ( keywords.includes( entity ) ) {
    output[ entity ] = entity
   }
   else if ( !Number.isNaN( parseInt( entity ) ) ) {
    output[ entity ] = tokens.BUTUN_SON
   }
   else if ( entity === "+" ) {
    output[ entity ] = tokens.PLUS
   }
   else if ( /^[a-z]+$/i.test( entity ) ) {
    output[ entity ] = tokens.AYDI
   }
   else {
    console.log(`line: ${i + 1} => Syntax error ${entity}`)
    return
   }
  }
 }
 return output
}

Tepadi kod rasvo, no voxt yo'q). Bu post tlli yasash uchunmas, qando yasalishini salpal chunish uchun. Atak lexer rostanam ko'p if-elif la ishlatib aniqlidi. Bu jaroynla tez bo'lishi yo sekin bo'lishi vashshe muhimmas. Sababi siz yasagan tlli ishlashi bilan ishlashdan oldin qilinadigan ishshi farqi bor. Masalan bizani misolda, hozir kod srazi ishga tushvotgani yo'q. Zato "Kodini palon qatorini palon joyida mamnaqa xato" dgan error shetta aniqlanadi.

Qo'shimcha: Rust Golangga nisbatan sekinroq compile bo'ladi, lekin runtime'da tezroq ishlidi. Golang teskarisi. Gugldigila bizaga tez ishlashidan oldin, tez kampayl bo'ladigan tl kere dyshgani uchun Golang yasalgan.

Tokenizing bosqichidan yaxshi o'tti diylik. Keyin nima bo'ladi?

Keyingi bosqichda, tokenizer funksiyasi natijasiga asoslanib darax yasaladi. bu CS da Abstract Syntax Tree (AST) dyiladi. Aslida bu oddiy Tree (darax) data struktura.

Tak, prichom botta darax? Chunki tokenizer paqat imloviy xatoni aniqlash uchun. A Tree bilan gruppavoy ketma-ketlini tori yo notoriligini tekshirsa bo'ladi. Masalan etilik jsda kod yozvossila, funksiya e'lon qilish uchun function keywordidan foydalanadi.

function ok() {}

Lekin agar boshqacha bo'sachi:

ok function() {}

Ko'rb turganilade betta umuman imloviy xato yo'. No ketma-ketlida xatoli bor. funksiyani nomi function so'zidan keyin yozilishi kere. Boshqacharo misol:

else {
  print 1
}
if ( true ) {
  print 2
}

Tepadi misoldayam imloviy xato yo'. if so'zini o'rniga fi db yozilmagan, ok, no yana ketma-ketlida xato bor.

Shunaqqb AST shu maqsadda kere bo'ladi. Brxlla buni CS da Semantic analysis dydi. Ya'ni kod, ma'no jihatda to'rimi, tipa hazm qsa bo'ladimi yomi. Man uni yozb o'tirmadim, voxtim sal chegarali.

Frontti 2 ta bosqichini blvoldik. Hammasi ok bogandan keyin front bilan bekend ortasida bitta ish bor, bu CS da (adashmasam) Static analyzing dyiladi. Mana shetta hali kod ishga tushmasdan turib nima axvolda bo'lishi mumkinligi tahlil qilinadi.

Ko'p Interpreter tlla bu bosqichchi tashab o'tadi. Mana nma uchun har xil error la app ishga tushganidan keyn chiqib keladi.

Qanaqb? Buni yo'li juda oddiy, yozgan kodizzi ishga tushirib undan kegan output qiymatlani tahlil qiladi. (qismlaga ajratib, ba'zilarini palubomu ishga tushiradi :)) Keyin CS da Type system db nomalanadigan konsepsiyaga moslashtiriladi. Buni o'ziz tanlisiz:

  • Strong
  • Weakly
  • Static
  • Dynamic

Haligi analiz zaif bo'lishi yoki umuman tashab o'tilgan bo'lishi mumkin. Brxlla buni bekend qismiga kiritadi, aslida qaysi biriga kiradi manam blmiman).

Backend

Programming language bekendi asosan A tilida yozilgan koddi B tiliga o'girish bilan shugullanadi. Brxilla "Intrpretatr bu tarjimon, koddi qatorma-qator o'qib run qiladi" dydi. Begzodaka b! Kampilyatram shunaqayu. Prosta farqi agar siz compiled koddi ishga tushirsez uje lexing, parsing, static analyzing qbolingan koddi ishlatvotgan bo'las. A interpreter tlla buni har safar boshqattan qiladi.

Tarjima dganda haligi analiz qbolingan AST ni machine-code ga o'girish chuniladi. Qanaqb o'girish Operating System (OS) ga bog'liq. Masalan terminalga ubu narsa chqarmoxchi bo'sela baribir OS ichidigi API dan poydalanasiz. cin, cout, cerr db gugldan qidiring, nimabbaloligi haqida yozilgan. Masalan JS console.log, Py da print(), Rustda printf!() ishlatganila bilan OS, cout ga ruxsat bermasa ili APIsi bo'masa bir tiyn.

Qo'shimcha pikr

Vashshe ko'p narsa OS levelga borb taqaladi. Siz yozvotgan kodiz, tlli backend bosqichida vashshe yo' bob ketadi. Takshto tllani solishtirisham bir tiyn. Hammasini o'zini maqsadi bor.

Dovomi yo'.
Aleph Nought


Report Page