Hancurkan, dasar-dasar bahasa

gambar

Kata Pengantar


Bahasa ini dikembangkan oleh saya untuk tujuan pendidikan. Saya tidak menganggapnya (saat ini) bahasa yang dikembangkan dengan sempurna, tetapi mungkin di masa depan akan dapat bersaing dengan pesaing.

Jika Anda memiliki keinginan untuk mencobanya sendiri - unduh repositori proyek, di dalamnya Anda dapat menemukan versi rakitan proyek atau merakitnya sendiri, untuk OS Anda.

Artikel ini akan menjelaskan manual proyek kecil dan mempertimbangkan sintaks bahasa.

Variabel dan Pointer Implisit


Di Mash, setiap variabel menyimpan pointer ke objek di memori. Saat mentransfer variabel ke metode, mendapatkan hasil, atau dengan manipulasi sederhana dengannya, pekerjaan dilakukan dengan objek di memori menggunakan pointer ke sana.

Yaitu dalam kode berikut, array akan diteruskan ke metode p (arr) sebagai pointer ke objek yang sudah dibuat sebelumnya.

proc p(arr): ... end proc main(): arr ?= [1, 2, 3, 4, 5] p(arr) end 

Kehadiran pointer dalam bahasa, baik eksplisit maupun implisit, menurut saya memberikannya fleksibilitas dan fungsionalitas tambahan, meskipun dalam beberapa kasus itu berkontribusi pada generasi kesalahan.

Variabel sementara dan pengumpul sampah


Tidak seperti bahasa pemrograman serupa, Mash memiliki pengumpul sampah semi-otomatis, yang didasarkan pada mekanisme label nilai waktu, daripada menghitung pointer.

Yaitu pengembang sendiri memutuskan kapan harus membersihkan memori sampah dan juga dapat melakukannya secara manual, untuk kasus-kasus tertentu.

Pengumpulan sampah disebut menggunakan gc () dan membebaskan memori dari bawah semua objek sementara.

Banyak tindakan sederhana dengan variabel disertai dengan penciptaan objek sementara di memori.

Pengembang dapat secara eksplisit mendeklarasikan alokasi memori untuk pekerjaan lebih lanjut dengannya, mis. mendeklarasikan variabel untuk penggunaan jangka panjang.

Contoh membuat variabel sementara:

 x ?= 10 

Dan variabel yang tidak ditandai untuk pemulung:

 x ?= new(10) var x2 = 20 

Contoh menggunakan gc ():

 while a > b: doSomething(a, b) gc() end 

Memori juga dapat dibebaskan secara manual:

 var a = 10, b = 20, c = 30 ... Free(a, b, c) 

Zona Visibilitas Variabel


Variabel dalam Mash dapat dideklarasikan baik secara lokal maupun global.

Variabel global dideklarasikan antar metode, melalui pernyataan var. Metode lokal - dalam dengan cara apa pun.

Tipe data


Di Mash, pengetikan dinamis. Secara otomatis mendeteksi / mengganti tipe data untuk nomor yang tidak ditandatangani dan ditandatangani, nomor fraksional dan string. Selain itu, dari tipe data sederhana, array (termasuk multi-level), tipe enum (hampir sama dengan array), metode, tipe data logis, dan mungkin semuanya didukung.

Contoh Kode:

 x ?= 10 x += 3.14 x *= "3" x /= "2,45" x ?= [1, 2, 3.33, func1(1, 2, 3), "String", ["Enum type", 1, 2, 3], "3,14"] 

Introspeksi memungkinkan Anda untuk menentukan jenis variabel yang Anda butuhkan:

 if typeof(x) == TypeInt: ... end 

Array & Enums


Tugas langka tidak memaksa pengembang untuk mendeklarasikan array berikutnya dalam kode.
Mash mendukung array yang terdiri dari jumlah level yang sewenang-wenang, + array dapat berupa pohon, mis. ukuran sublevel dapat bervariasi pada satu sublevel.

Contoh deklarasi array dan enumerasi:

 a ?= new[10][20] var b = new[10][20] c ?= [1, [], 3, 3.14, "Test", [1, 2, 3, 4, 5], 7.7, a, b, ["77", func1()]] var d = [1, 2, 3] 

Benda apa pun yang dideklarasikan melalui operator baru tidak ditandai untuk pengumpul sampah.

Array, seperti objek biasa di memori, dibebaskan dengan memanggil Gratis ()
Pekerjaan seperti itu dengan transfer cukup nyaman.

Misalnya, Anda bisa meneruskan ke metode atau mengembalikan banyak nilai dari satu variabel:
 func doSomething(a, b, c): return [a+c, b+c] end 

Operator Penugasan


Ada sebanyak 3 operator penugasan di Mash.

  • ? =
    Menetapkan variabel ke pointer ke objek (jika variabel dideklarasikan tetapi tidak menyimpan pointer ke objek di memori, maka operator ini harus digunakan untuk menetapkan nilai ke sana).
  • =
    Tugas normal. Menetapkan objek dengan pointer dalam variabel nilai objek lain.
  • @ =
    Menetapkan nilai ke objek dengan pointer eksplisit ke objek ini (ini akan dibahas nanti).

Operasi matematika dan logis


Daftar operasi matematika dan logis yang saat ini didukung:

  • + , - , * , /
    Tidak perlu komentar.
  • \
    Divisi sepenuhnya.
  • %
    Sisa dari divisi.
  • &
    Logis "dan."
  • |
    Logis "atau".
  • ^
    Logis "eksklusif atau."
  • ~
    Logis "tidak."
  • ++ , -
    Kenaikan dan penurunan.
  • << , >>
    Bitwise kiri dan kanan bergeser.
  • == , <> , > = , <=
    Operator perbandingan logis.
  • masuk
    Cek apakah suatu objek termasuk enumerasi atau array.
    Contoh:
     if Flag in [1, 3, 5, 8]: ... 

Pointer Eksplisit


Kelihatannya, mengapa mereka diperlukan jika tidak ada petunjuk eksplisit? Misalnya, untuk memeriksa apakah variabel A dan B menyimpan pointer ke objek yang sama dalam memori.

  • @ - dapatkan pointer ke objek dan letakkan di variabel, seperti objek.
  • ? - dapatkan objek dengan pointer dari objek dalam variabel.
    Contoh:
     a ?= ?b 

Prosedur dan Fungsi


Saya memutuskan untuk membuat pemisahan bahasa dari metode untuk mengembalikan nilai ke dalam prosedur dan fungsi (seperti dalam Pascal).

Deklarasi metode dibuat seperti contoh berikut:

 proc SayHello(arg1, arg2, argN): println("Hello, ", arg1, arg2, argN) end func SummIt(a, b): return a + b end 

Konstruksi bahasa


Contoh if..else..end membangun.

 if <>: ... else: ... end 

Untuk loop.

 for([]; <>; [  ]): ... end 

Sementara Kondisi diperiksa sebelum iterasi.

 whilst <>: ... end 

Sementara Loop yang berbeda dari sementara dalam kondisi diperiksa setelah iterasi.

 until <>: ... end 

switch..case..end..else..end ... adalah konstruksi yang umum digunakan untuk membuat cabang logis.

 switch <>: case < 1>: ... end case < 2>: ... end else: ... end 

Kelas dan Elemen Bahasa OOP


Mash mengimplementasikan dukungan untuk kelas, pewarisan, introspeksi dan refleksi dinamis, polimorfisme. Yaitu Satu set standar bahasa scripting didukung.

Pertimbangkan deklarasi kelas sederhana:

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

Deklarasi kelas tidak mengandung implementasi metode yang dideklarasikan di dalamnya.
Konstruktor kelas adalah metode Buat. Sebagai destruktor - Gratis.

Setelah kelas dideklarasikan, Anda dapat menggambarkan implementasi metode-metodenya:

 proc MyClass::Create(a, b): $a ?= new(a) $b ?= new(b) end proc MyClass::Free(): Free($a, $b, $) end func MyClass::SomeFunction(x): return ($a + $b) / x end 

Anda mungkin memperhatikan simbol $ di beberapa tempat dalam kode - dengan simbol ini saya hanya mempersingkat panjang ini->. Yaitu kode:

 return ($a + $b) / x ... Free($a, $b, $) 

Setara dengan kode ini:
 return (this->a + this->b) / x ... Free(this->a, this->b, this) 

Ini berisi pointer ke instance kelas atas nama metode kelas ini dipanggil.

Untuk mewarisi fungsi suatu kelas, Anda perlu mendeskripsikan deklarasi kelas baru dengan cara ini:

 class MySecondClass(MyClass): func SomeFunction end func MySecondClass::SomeFunction(x): return ($a - $b) / x end 

MySecondClass - akan memiliki konstruktor dan destruktor dari leluhurnya + Fungsi SomeFunction, yang dimiliki oleh kelas leluhur, ditimpa oleh fungsi dari kelas baru.

Untuk membuat instance kelas, operator baru ada.

Contoh Kode:

 a ?= new MyClass //     

 b ?= new MyClass(10, 20) //         

Jenis instance kelas dapat ditentukan saat membuat instance ini, karenanya, konversi tipe tidak ada dalam bahasa tersebut.

Introspeksi memungkinkan Anda untuk menentukan jenis instance kelas, contoh kode:

 x ?= new MyClass(10, 20) ... if x->type == MyClass: // -... end 

Terkadang Anda perlu mengakses fungsi kelas dan menimpanya dengan yang baru. Contoh kode:

 func class::NewSomeFunction(x): return $x * $y * x end ... x ?= new MyClass(10, 20) x->SomeFunction ?= class::NewSomeFunction x->SomeFunction(33) // NewSomeFunction,     . 

Kesimpulan


Dalam artikel ini, saya mencoba memperkenalkan orang-orang yang berminat pada kreasi saya.

Terima kasih sudah membaca. Menunggu komentar.

Source: https://habr.com/ru/post/id437632/


All Articles