Забони нави барномасозии Mash

Дар тӯли чанд сол ман дар таҳияи забони барномасозии худ кӯшиш кардам. Ман мехостам, ки ба назари ман, забони соддатарин, комилан функсионалӣ ва қулайро эҷод кунам.

Дар ин матлаб ман мехоҳам марҳилаҳои асосии корамро таъкид намоям ва дар оғоз мафҳуми офаридаи забон ва татбиқи аввалини онро, ки ҳоло дар болои он кор карда истодаам, тавсиф намоям.

Пешакӣ бигӯям, ки ман тамоми лоиҳаро бо забони Free Pascal навиштам, зеро... барномаҳоро дар он барои шумораи зиёди платформаҳо ҷамъ кардан мумкин аст ва худи компилятор бинарҳои хеле оптимизатсияшуда истеҳсол мекунад (ман ҳама ҷузъҳои лоиҳаро бо парчами O2 ҷамъ мекунам).

Вақти иҷроиши забон

Пеш аз ҳама, дар бораи мошини маҷозӣ сӯҳбат кардан лозим аст, ки ман бояд барои иҷро кардани барномаҳои оянда ба забони ман нависам. Ман қарор додам, ки меъмории стекро амалӣ кунам, шояд, зеро ин роҳи осонтарин буд. Ман як мақолаи муқаррарӣ дар бораи чӣ гуна ин корро кардан ба забони русӣ наёфтам, аз ин рӯ, пас аз шиносоӣ бо маводи инглисӣ, ман ба тарҳрезӣ ва навиштани велосипеди худ нишастам. Минбаъд андешаҳо ва таҳаввулоти «пешқадам»-и худро дар ин масъала пешниҳод мекунам.

Амалисозии стек

Аён аст, ки дар болои VM стек ҷойгир аст. Дар татбиқи ман он дар блокҳо кор мекунад. Аслан ин массиви оддии нишондиҳандаҳо ва тағирёбанда барои нигоҳ доштани индекси болои стек мебошад.
Вақте ки он оғоз карда мешавад, массиви аз 256 элемент сохта мешавад. Агар нишондиҳандаҳои бештар ба стек тела дода шаванд, андозаи он ба 256 элементи навбатӣ меафзояд. Мувофиқи он, ҳангоми хориҷ кардани элементҳо аз стек андозаи он танзим карда мешавад.

VM якчанд стекҳоро истифода мебарад:

  1. Дастгоҳи асосӣ.
  2. Стек барои нигоҳ доштани нуқтаҳои бозгашт.
  3. Анбори ҷамъоварии партовҳо.
  4. Кӯшиш кунед/сайд кунед/ниҳоят стеки коркардкунандаро блок кунед.

Константаҳо ва тағирёбандаҳо

Ин оддӣ аст. Константаҳо дар як пораи хурди алоҳидаи код коркард карда мешаванд ва дар замимаҳои оянда тавассути суроғаҳои статикӣ дастрасанд. Тағирёбандаҳо массиви нишондиҳандаҳои андозаи муайян мебошанд, дастрасӣ ба ячейкаҳои он аз рӯи индекс амалӣ карда мешавад - яъне. суроғаи статикӣ. Тағирёбандаҳоро ба болои стек тела додан ё аз он ҷо хондан мумкин аст. Дар асл, зеро Дар ҳоле, ки тағирёбандаҳои мо аслан нишондиҳандаҳоро ба арзишҳо дар хотираи VM нигоҳ медоранд, забон бо кор бо нишондиҳандаҳои номуайян бартарӣ дорад.

Ҷамъкунандаи партовҳо

Дар VM-и ман он нимавтомат аст. Онхое. худи таҳиякунанда қарор медиҳад, ки кай ба ҷамъкунандаи ахлот занг занад. Он бо истифода аз ҳисобкунаки муқаррарии нишондиҳанда кор намекунад, ба монанди Python, Perl, Ruby, Lua ва ғайра. Он тавассути системаи маркерӣ амалӣ карда мешавад. Онхое. вақте ки ба тағирёбанда арзиши муваққатӣ таъин карда мешавад, нишондиҳанда ба ин арзиш ба стек коллектори ахлот илова карда мешавад. Дар оянда коллектор аз рӯйхати аллакай омодашудаи нишондиҳандаҳо зуд мегузарад.

Коркарди блокҳои кӯшиш/сайд/ниҳоят

Мисли ҳар як забони муосир, коркарди истисно ҷузъи муҳим аст. Асоси VM дар блоки try..catch печонида шудааст, ки метавонад пас аз гирифтани истисно тавассути тела додани баъзе маълумот дар бораи он ба стек ба иҷрои код баргардад. Дар коди барнома шумо метавонед блокҳои try/catch/nihayet блокҳои кодро муайян кунед, ки нуқтаҳои вурудро дар сайд (коркарди истисно) ва ниҳоят/охири (охири блок) нишон медиҳанд.

Мултираи

Он дар сатҳи VM дастгирӣ карда мешавад. Истифодаи он оддӣ ва қулай аст. Он бе системаи танаффус кор мекунад, бинобар ин код бояд дар якчанд ришта мутаносибан якчанд маротиба тезтар иҷро карда шавад.

Китобхонаҳои беруна барои VM

Бе ин кор кардан мумкин нест. VM воридотро дастгирӣ мекунад, ба монанди он, ки он бо забонҳои дигар амалӣ карда мешавад. Шумо метавонед як қисми рамзро дар Mash ва як қисми рамзро ба забонҳои модарӣ нависед ва сипас онҳоро ба як пайваст кунед.

Тарҷумон аз забони сатҳи баланди Mash ба байткод барои VM

Забони миёна

Барои зуд навиштани тарҷумон аз забони мураккаб ба коди VM, ман аввал забони фосилавӣ таҳия кардам. Дар натиҷа як тамошои даҳшатнок ба мисли монтажчӣ ба вуҷуд омад, ки дар ин ҷо ягон нуқтаи махсусе вуҷуд надорад. Ман танҳо мегӯям, ки дар ин сатҳ тарҷумон аксари константаҳо ва тағирёбандаҳоро коркард мекунад, суроғаҳои статикии онҳо ва суроғаҳои нуқтаҳои вурудро ҳисоб мекунад.

Архитектураи тарҷумон

Ман меъмории беҳтаринро барои татбиқ интихоб накардаам. Тарҷумон мисли дигар тарҷумонҳо дарахти рамзӣ намесозад. Вай ба ибтидои сохтор назар мекунад. Онхое. агар пораи коди таҳлилшаванда ба мисли "while <condition>:" монанд бошад, пас маълум аст, ки ин сохтори даврии while аст ва бояд ҳамчун сохтори даври while коркард карда шавад. Чизе ба монанди гузариши мураккаб.

Ба шарофати ин ҳалли меъморӣ тарҷумон чандон зуд нест. Бо вуҷуди ин, осонии тағир додани он ба таври назаррас афзоиш ёфтааст. Ман сохторҳои заруриро зудтар илова кардам, ки қаҳваам сард шавад. Дастгирии пурраи OOP дар муддати камтар аз як ҳафта амалӣ карда шуд.

Оптимизатсияи код

Дар ин ҷо, албатта, онро беҳтар иҷро кардан мумкин буд (ва амалӣ карда мешавад, аммо баъдтар, вақте ки кас ба он наздик мешавад). То ба ҳол, оптимизатор танҳо медонад, ки чӣ гуна рамзи истифоданашуда, константаҳо ва воридотро аз маҷлис буридааст. Инчунин, якчанд константаҳои дорои арзиши якхела бо як иваз карда мешаванд. Ҳамааш ҳамин.

Забони маш

Консепсияи асосии забон

Идеяи асосй ин буд, ки забони функсиона-лй ва соддатаринро инкишоф дихад. Ман фикр мекунам, ки рушд аз ӯҳдаи вазифаи худ бо як таркиш мебарояд.

Блокҳои код, тартиб ва функсияҳо

Ҳама сохтмонҳо дар забон бо аломати қафо кушода мешаванд. : ва аз ҷониби оператор баста мешаванд Поён.

Тартиб ва функсияҳо мутаносибан ҳамчун proc ва func эълон карда мешаванд. Далелҳо дар қавсҳо оварда шудаанд. Ҳама чиз мисли аксари забонҳои дигар аст.

Оператор бозгашт шумо метавонед арзишро аз функсия, оператор баргардонед танаффус ба шумо имкон медиҳад, ки аз тартиб/функсия берун шавед (агар он берун аз ҳалқаҳо бошад).

Рамзи намунавӣ:

...

func summ(a, b):
  return a + b
end

proc main():
  println(summ(inputln(), inputln()))
end

Тарҳҳои дастгирӣшаванда

  • Доираҳо: барои..охир, ҳол..охир, то..охир
  • Шартҳо: агар..[else..]охир, гузариш..[касе..охир..][else..]охир
  • Усулҳо: proc <name>():... end, func <name>():... end
  • Нишонгузорӣ ва гузариш: <ном>:, паридан <ном>
  • Рӯйхатҳо ва массивҳои доимӣ.

Тағйирёбандаҳо

Тарҷумон метавонад онҳоро ба таври худкор муайян кунад, ё агар таҳиякунанда пеш аз муайян кардани онҳо var нависад.

Намунаҳои код:

a ?= 10
b ?= a + 20

var a = 10, b = a + 20

Тағирёбандаҳои глобалӣ ва маҳаллӣ дастгирӣ карда мешаванд.

ООП

Хуб, мо ба мавзӯи лазизтарин расидем. Mash ҳама парадигмаҳои барномасозии ба объект нигаронидашударо дастгирӣ мекунад. Онхое. синфҳо, мерос, полиморфизм (аз ҷумла динамикӣ), инъикоси автоматии динамикӣ ва интроспекция (пурра).

Бе тафсири бештар, беҳтар аст, ки танҳо мисолҳои рамзӣ диҳед.

Синфи оддӣ ва кор бо он:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

proc main():
  x ?= new MyClass(10, 20)
  println(x->Summ())
  x->Free()
end

Нашрия: 30.

Ирсият ва полиморфизм:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

class MyNewClass(MyClass):
  func Summ
end

func MyNewClass::Summ():
  return ($a + $b) * 2
end

proc main():
  x ?= new MyNewClass(10, 20)
  println(x->Summ())
  x->Free()
end

Нашрия: 60.

Дар бораи полиморфизми динамикӣ чӣ гуфтан мумкин аст? Бале, ин инъикос аст!:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

class MyNewClass(MyClass):
  func Summ
end

func MyNewClass::Summ():
  return ($a + $b) * 2
end

proc main():
  x ?= new MyClass(10, 20)
  x->Summ ?= MyNewClass::Summ
  println(x->Summ())
  x->Free()
end

Нашрия: 60.

Акнун биёед як лаҳза барои шиносоӣ бо арзишҳо ва синфҳои оддӣ:

uses <bf>
uses <crt>

class MyClass:
  var a, b
end

proc main():
  x ?= new MyClass
  println(BoolToStr(x->type == MyClass))
  x->rem()
  println(BoolToStr(typeof(3.14) == typeReal))
end

Баровард: дуруст, дуруст.

Дар бораи операторҳои таъинот ва нишондиҳандаҳои равшан

Оператори ?= барои таъин кардани тағирёбанда ба як нишондиҳанда ба арзиши хотира истифода мешавад.
Оператори = бо истифода аз нишондињанда аз таѓйирёбанда ќиматро дар хотира иваз мекунад.
Ва ҳоло каме дар бораи нишондиҳандаҳои равшан. Ман онҳоро ба забон илова кардам, то онҳо вуҷуд дошта бошанд.
@<тағйирёбанда> — ишоракунаки возеҳро ба тағирёбанда мегирад.
?<тағирёбанда> — тағирёбандаро аз рӯи нишондод гиред.
@= — ба тағирёбанда бо нишоннамои возеҳ ба он арзиш таъин кунед.

Рамзи намунавӣ:

uses <bf>
uses <crt>

proc main():
  var a = 10, b
  b ?= @a
  PrintLn(b)
  b ?= ?b
  PrintLn(b)
  b++
  PrintLn(a)
  InputLn()
end

Баровард: баъзе рақамҳо, 10, 11.

Кӯшиш кунед..[сайд..][ниҳоят..]охир

Рамзи намунавӣ:

uses <bf>
uses <crt>

proc main():
  println("Start")
  try:
    println("Trying to do something...")
    a ?= 10 / 0
  catch:
    println(getError())
  finally:
    println("Finally")
  end
  println("End")
  inputln()
end

Нақшаҳои оянда

Ман ба GraalVM & Truffle нигоҳ кардан ва нигоҳ карданро давом медиҳам. Муҳити кори ман компилятори JIT надорад, аз ин рӯ, дар айни замон он танҳо бо Python рақобатпазир аст. Ман умедворам, ки ман метавонам маҷмӯаи JIT-ро дар асоси GraalVM ё LLVM татбиқ кунам.

анбор

Шумо метавонед бо пешрафтҳо бозӣ кунед ва лоиҳаро худатон пайгирӣ кунед.

сомона
Анбор дар GitHub

Ташаккур ба шумо барои то охир хондан агар хонда бошед.

Манбаъ: will.com

Илова Эзоҳ