Umka: bahasa skrip diketik statis baru


Versi pertama dari bahasa scripting embeddable yang diketik statis Umka yang saya kembangkan baru saja dirilis . Ini bertujuan untuk menggabungkan fleksibilitas bahasa scripting yang akrab dengan perlindungan terhadap kesalahan tipe pada tahap kompilasi menjadi bytecode. Gagasan utama bahasa ini - Eksplisit lebih baik daripada implisit - dipinjam dari "Zen of Python", tetapi seharusnya memiliki arti yang sedikit berbeda dan lebih jelas di sini.

Tidak peduli seberapa pribadi dan subyektif tayangan yang mendorong saya untuk melakukan pengembangan bahasa, saya harap rencana itu tidak naif. Di bawah potongan, saya akan berbicara singkat tentang kemampuan bahasa dan motif untuk penciptaannya.

Motif


Nilai pertama dari pengetikan dinamis biasanya disebut pemendekan siklus pengembangan / debugging dan menghemat waktu programmer. Dengan risiko menyebabkan ketidaksenangan publik, saya harus mengakui bahwa pengalaman saya sendiri tidak mengkonfirmasi hal ini dengan cara apa pun. Setiap kali setelah koreksi kecil script pelatihan jaringan saraf saya di Python, saya harus menunggu Python, NumPy, PyTorch untuk memuat, membaca array data yang besar dari file, mentransfernya ke GPU, mulai memproses - dan baru kemudian menemukan bahwa PyTorch mengharapkan tensor ukuran (1, 1 , m, n, 3) alih-alih (1, m, n, 3).

Saya siap mengakui bahwa banyak orang lebih suka bahasa yang diketik secara dinamis karena alasan pribadi mereka. Bahkan ada kemungkinan bahwa kecenderungan atau permusuhan terhadap pengetikan dinamis adalah fenomena dengan urutan yang sama dengan sikap terhadap buah zaitun dan jus tomat. Upaya-upaya pada studi objektif tentang masalah ini tampaknya mengarah pada hasil yang tidak meyakinkan .

Pada saat yang sama, popularitas TypeScript, pengenalan anotasi tipe dalam Python, diskusi panas tentang Reddit dan HabrΓ© membuat kita berpikir bahwa identifikasi aktual bahasa scripting dengan bahasa yang diketik secara dinamis sama sekali bukan dogma, tetapi kebetulan, dan bahasa skrip yang statis memiliki hak untuk tetap ada.

Jadi ada bahasa yang dinamai kucing yang dinamai beruang.

Lidah


Sintaks bahasa secara keseluruhan terinspirasi oleh Go. Contoh konstruksi sintaks dapat ditemukan di halaman proyek . Saat mendeklarasikan variabel, notasi steno dengan inferensi tipe dapat digunakan. Yang perlu diperhatikan adalah penyimpangan dari aturan Go yang dibuat dalam sintaks pointer. Pembuat Go mengeluh bahwa secara harfiah mengikuti contoh C ternyata menjadi komplikasi yang tidak perlu dari sintaks di sini dan bahwa akan lebih masuk akal untuk memperkenalkan operator dereferencing postfix seperti Pascal p^sebagai gantinya *p. Itulah yang dilakukan Umka.

PenerjemahUmka mengkompilasi menjadi bytecode, yang kemudian dieksekusi oleh mesin virtual stack. Semua pemeriksaan tipe dilakukan pada tahap kompilasi. Data pada tumpukan tidak lagi membawa informasi jenis apa pun. Penerjemah datang dalam bentuk perpustakaan dinamis dengan API sendiri dan "pembungkus" kecil - file yang dapat dieksekusi. Kode sumber ditulis dalam C99 dan porting ke platform yang berbeda. Build untuk prosesor x86-64 (Windows dan Linux) sekarang dirilis .

Manajemen memorisejauh ini dilakukan atas dasar referensi counter. Jika bahasa tersebut menyebabkan minat dan upaya dilakukan untuk menggunakannya, masuk akal untuk mengatur pengumpul sampah yang lebih maju. Bahasa ini mendukung tipe data komposit klasik (susunan dan struktur) yang ditempatkan pada tumpukan, dan susunan dinamis ditempatkan pada tumpukan. Setiap array atau struktur klasik juga dapat ditempatkan di heap dengan panggilan eksplisit new().

Polimorfisme disediakan oleh antarmuka Go-style. Tidak ada konsep kelas, objek, dan warisan.

MultitaskingIni didasarkan pada konsep "serat" - aliran disederhanakan yang diluncurkan dalam mesin virtual yang sama dan yang jelas menyebabkan satu sama lain. Intinya, ini identik dengan coroutine. Karena logika penggunaan coroutine ini sedikit menyimpang dari tradisi Go dan menjadi lebih dekat dengan Lua dan Wren, masuk akal untuk memberikan contoh kode:

fn childFunc(parent: std.Fiber, buf: ^int) {
    for i := 0; i < 5; i++ {
        std.println("Child : i=" + std.itoa(i) + " buf=" + std.itoa(buf^))
        buf^ = i * 3
        fibercall(parent)
    }
}

fn parentFunc() {
    a := 0
    child := fiberspawn(childFunc, &a)    
    for i := 0; i < 10; i++ {
        std.println("Parent: i=" + std.itoa(i) + " buf=" + std.itoa(a))
        a = i * 7
        if fiberalive(child) {
            fibercall(child)
        }
    }    
    fiberfree(child)
}

Contohnya


Sebagai contoh dasar yang menunjukkan kemampuan bahasa, saya sarankan melihat program rendering untuk adegan tiga dimensi berdasarkan penelusuran sinar balik. Ini adalah rekursi, antarmuka, array dinamis yang sangat organik; agak lebih buatan - multitasking.

Contoh penyematan penerjemah Umka dalam proyek C adalah kode sumber dari pembungkus yang dapat dieksekusi dari penerjemah itu sendiri. Ada juga contoh ekstensi bahasa Umka dengan fungsi eksternal di C.

gambar

All Articles