basa programming anyar Mash

Pikeun sababaraha taun kuring nyobian leungeun kuring dina ngembangkeun basa programming kuring sorangan. Abdi hoyong nyiptakeun, dina pamanggih kuring, basa anu paling saderhana, pinuh fungsi sareng merenah.

Dina artikel ieu abdi hoyong nyorot tahap utama karya kuring jeung, mimitian ku, ngajelaskeun konsép dijieun tina basa jeung palaksanaan mimitina, nu ayeuna keur dipake dina.

Hayu atuh nyebutkeun sateuacanna yén kuring nulis sakabéh proyék di Free Pascal, sabab ... program dina eta bisa dirakit pikeun sajumlah badag platform, sarta kompiler sorangan ngahasilkeun binaries pisan dioptimalkeun (Kuring ngumpulkeun sakabeh komponen proyék jeung bandéra O2).

Runtime basa

Anu mimiti, éta patut ngobrol ngeunaan mesin virtual anu kuring kedah nyerat pikeun ngajalankeun aplikasi anu bakal datang dina basa kuring. Kuring mutuskeun pikeun nerapkeun arsitektur tumpukan, meureun, sabab éta cara panggampangna. Kuring teu manggihan hiji artikel normal ngeunaan kumaha carana ngalakukeun ieu dina basa Rusia, jadi sanggeus familiarizing sorangan jeung bahan basa Inggris, abdi diuk handap pikeun ngarancang jeung nulis sapedah sorangan. Satuluyna kuring baris nampilkeun gagasan "maju" kuring jeung kamajuan dina masalah ieu.

palaksanaan tumpukan

Jelas, di luhureun VM aya tumpukan. Dina palaksanaan kuring gawéna di blok. Intina ieu mangrupikeun saderhana petunjuk sareng variabel pikeun nyimpen indéks dina tumpukan luhur.
Nalika dimimitian, susunan 256 elemen dijieun. Upami langkung seueur pointer didorong kana tumpukan, ukuranana ningkat ku 256 elemen salajengna. Sasuai, nalika miceun unsur tina tumpukan, ukuranana disaluyukeun.

VM ngagunakeun sababaraha tumpukan:

  1. tumpukan utama.
  2. A tumpukan pikeun nyimpen titik balik.
  3. Tumpukan runtah.
  4. Coba / nyekel / tungtungna meungpeuk Handler tumpukan.

Konstanta jeung Variabel

Ieu basajan. Konstanta diatur dina sapotong leutik misah kode sarta sadia dina aplikasi hareup via alamat statik. Variabel mangrupakeun Asép Sunandar Sunarya ti pointers tina ukuran nu tangtu, aksés ka sél na dilaksanakeun ku indéks - i.e. alamat statik. Variabel tiasa didorong ka luhur tumpukan atanapi dibaca ti dinya. Sabenerna, sabab Bari variabel kami dasarna nyimpen pointers kana nilai dina mémori VM, basa didominasi ku gawé bareng pointers implisit.

Pamulung runtah

Dina VM kuring éta semi-otomatis. Jelema. pamekar sorangan mutuskeun mun nelepon collector sampah. Teu tiasa dianggo nganggo counter pointer biasa, sapertos Python, Perl, Ruby, Lua, jsb. Éta dilaksanakeun ngaliwatan sistem spidol. Jelema. lamun variabel dimaksudkeun pikeun ditugaskeun hiji nilai samentara, a pointer kana nilai ieu ditambahkeun kana tumpukan sampah. Dina mangsa nu bakal datang, kolektor nu gancang ngalir ngaliwatan daptar tos rengse disiapkeun tina pointers.

Nanganan coba / nyekel / tungtungna blok

Sapertos dina basa modéren, penanganan iwal mangrupikeun komponén anu penting. Inti VM dibungkus dina blok try..catch, nu bisa balik deui ka palaksanaan kode sanggeus nyekel iwal ku ngadorong sababaraha émbaran ngeunaan eta kana tumpukan. Dina kode aplikasi, anjeun bisa nangtukeun try / nyekel / tungtungna blok kode, nangtukeun titik Éntri dina nyekel (pangecualian Handler) jeung tungtungna / tungtung (tungtung blok).

Multithreading

Éta dirojong dina tingkat VM. Ieu basajan tur merenah ngagunakeun. Gawéna tanpa sistem interupsi, jadi kode kudu dieksekusi dina sababaraha threads sababaraha kali leuwih gancang, mungguh.

Perpustakaan éksternal pikeun VMs

Teu aya deui jalan pikeun ngalakukeun tanpa ieu. VM ngadukung impor, sami sareng kumaha éta dilaksanakeun dina basa sanés. Anjeun tiasa nyerat bagian tina kode dina Mash sareng bagian tina kode dina basa asli, teras ngaitkeun kana hiji.

Panarjamah tina basa Mash tingkat luhur ka bytecode pikeun VM

basa panengah

Pikeun gancang nulis penerjemah tina basa kompléks kana kode VM, kuring mimiti ngembangkeun hiji basa panengah. hasilna mangrupa tontonan dahsyat assembler-kawas nu euweuh titik husus dina tempo di dieu. Kuring ngan bakal nyebutkeun yén dina tingkat ieu penerjemah ngolah paling konstanta sarta variabel, Etang alamat statik maranéhanana sarta alamat titik Éntri.

Arsitéktur panarjamah

Kuring henteu milih arsitéktur anu pangsaéna pikeun palaksanaan. Penerjemah henteu ngawangun tangkal kode, sapertos anu dilakukeun ku penerjemah sanés. Anjeunna kasampak di awal struktur. Jelema. lamun potongan kode keur parsed Sigana mah "bari <kaayaan>:", mangka écés yén ieu téh bari loop ngawangun sarta perlu diolah salaku ngawangun loop bari. Hal kawas switch-kasus kompléks.

Hatur nuhun kana solusi arsitéktur ieu, penerjemah tétéla henteu gancang pisan. Sanajan kitu, betah modifikasi na geus ngaronjat sacara signifikan. Kuring nambihan struktur anu diperyogikeun langkung gancang tibatan kopi kuring tiasa niiskeun. Pangrojong OOP lengkep dilaksanakeun kirang ti saminggu.

Optimasi kode

Di dieu, tangtosna, éta bisa geus dilaksanakeun hadé (jeung bakal dilaksanakeun, tapi engké, pas hiji meunang sabudeureun eta). Sajauh ieu, optimizer ukur terang kumaha carana motong kode anu henteu kapake, konstanta sareng impor tina rakitan. Ogé, sababaraha konstanta kalawan nilai sarua diganti ku hiji. Éta hungkul.

Basa mash

Konsep dasar basa

Gagasan utama nyaéta pikeun ngembangkeun basa anu paling fungsional sareng saderhana. Jigana nu ngembangkeun copes kalawan tugas na kalawan bang a.

Blok kode, prosedur sareng fungsi

Sakabéh konstruksi dina basa dibuka ku titik dua. : sarta ditutup ku operator tungtung.

Prosedur jeung fungsi dinyatakeun salaku proc jeung func, masing-masing. Argumen dibéréndélkeun dina kurung. Sadayana sapertos seueur basa sanés.

Operator kasumpingan anjeun bisa balik nilai tina fungsi hiji, operator peunggas ngidinan Anjeun pikeun kaluar tina prosedur / fungsi (lamun éta di luar loop).

Kode sampel:

...

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

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

Desain Dirojong

  • Gelung: keur..tungtung, bari..tungtung, nepi ka..tungtung
  • Kaayaan: lamun..[lain..]tungtung, pindah..[kasus..tungtung..][lain..]tungtung
  • Métode: proc <name>():... end, func <name>():... end
  • Label & goto: <ngaran>:, luncat <ngaran>
  • enumerations Enum jeung arrays konstan.

Variabel

penerjemah bisa nangtukeun aranjeunna otomatis, atawa lamun pamekar nulis var saméméh nangtukeun aranjeunna.

Conto kode:

a ?= 10
b ?= a + 20

var a = 10, b = a + 20

Variabel global sareng lokal dirojong.

OOP

Nya, kami parantos sumping ka topik anu paling nikmat. Mash ngadukung sadaya paradigma program berorientasi obyék. Jelema. kelas, warisan, polymorphism (kaasup dinamis), réfléksi otomatis dinamis sarta introspeksi (pinuh).

Tanpa ado salajengna, éta hadé pikeun ngan masihan conto kode.

Kelas anu sederhana sareng damel sareng éta:

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

Kaluaran: 30.

Warisan sareng polimorfisme:

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

Kaluaran: 60.

Kumaha upami polimorfisme dinamis? Leres, ieu refleksi!:

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

Kaluaran: 60.

Ayeuna hayu urang sakedap pikeun introspeksi nilai sareng kelas saderhana:

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

Bakal kaluaran: leres, leres.

Ngeunaan operator ngerjakeun jeung pointers eksplisit

Operator ?= dipaké pikeun nangtukeun variabel hiji pointer ka nilai dina mémori.
Operator = ngarobah nilai dina mémori ngagunakeun pointer ti variabel.
Tur ayeuna saeutik ngeunaan pointers eksplisit. Kuring ditambahkeun kana basa ambéh maranéhanana aya.
@<variabel> - nyandak pointer eksplisit ka variabel.
?<variabel> — meunangkeun variabel ku pointer.
@= - napelkeun nilai ka variabel ku pointer eksplisit ka dinya.

Kode sampel:

uses <bf>
uses <crt>

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

Bakal kaluaran: sababaraha angka, 10, 11.

Coba..[nyekel..][tungtungna..]tungtung

Kode sampel:

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

Rencana pikeun mangsa nu bakal datang

Kuring tetep ningali sareng ningali GraalVM & Truffle. Lingkungan runtime kuring henteu gaduh kompiler JIT, janten tina segi kinerja ayeuna ngan ukur bersaing sareng Python. Kuring miharep yén kuring bakal tiasa nerapkeun kompilasi JIT dumasar kana GraalVM atanapi LLVM.

gudang

Anjeun tiasa maén sareng pamekaran sareng turutan proyék éta nyalira.

website
Repository on GitHub

Hatur nuhun pikeun maca dugi ka ahir upami anjeun leres.

sumber: www.habr.com

Tambahkeun komentar