
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:
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.