Oscar Spencer adalah salah satu pendiri
bahasa Grain Grain, bahasa pemrograman tingkat tinggi yang diketik dengan kuat. Ini adalah bahasa hibrida yang menggabungkan beberapa fitur fungsional (misalnya, inferensi tipe, pencocokan pola, penutupan) dan pemrograman imperatif (misalnya, variabel yang dapat diubah).
Oscar Spencer, salah satu pencipta bahasa, mempresentasikan Grain di WebAssembly Summit 2021. Spencer berbicara tentang fitur-fiturnya yang paling menarik dan penting, dan juga menekankan bahwa Grain dibuat dan dioptimalkan khusus untuk WebAssembly. Itu hanya dapat dikompilasi ke dalam bytecode Wasm. Setidaknya inilah yang terjadi hari ini.
Beginilah cara para pengembang merumuskan misi bahasa Grain:
Grain berusaha untuk mengambil yang terbaik dari bahasa pemrograman fungsional dan imperatif dan membawanya ke khalayak yang lebih luas. Banyak bahasa memiliki ide-ide hebat, tetapi pada akhirnya bahasa-bahasa ini tidak tersebar luas. Ini karena mereka terlalu aneh atau terlalu sulit untuk dipelajari. Dan akibatnya, upaya mereka untuk mengumpulkan komunitas besar di sekitar mereka telah gagal. Grain harus menghembuskan kehidupan baru ke dalam ide-ide ini dan menyajikannya dengan cara yang mudah diakses, sambil tetap mudah digunakan.
WebAssembly Summit adalah konferensi tahunan yang didedikasikan untuk semua aspek penggunaan dan interaksi dengan Wasm. KTT yang dibahas dalam artikel tersebut berlangsung pada April 2021.
Tipe data
Selain yang disebut tipe data inti WebAssembly (misalnya, tipe dasar i32 alias Int32), Grain memiliki tipe data komposit. Sebagai contoh:
- Opsi adalah jenis pencacahan khusus yang mendefinisikan keberadaan opsi (opsi) sebagai Beberapa atau ketiadaan sebagai Tidak Ada;
- Hasil - semuanya standar: Err, jika ada yang tidak beres, dan Ok, jika semuanya benar;
- Stack adalah tumpukan yang tidak dapat diubah.
Grain juga mengimplementasikan tupel, catatan, array, daftar, rentang, karakter, string, set, peta, antrian, dan banyak lagi.
Berikut adalah tampilan program Grain yang paling sederhana:
import List from «list»
import Option from «option»
import { data } from «./data»
let allPairs = List.product(data, data);
let (a, b) = Option.expect (
«Expected to find values»,
List.find(((a ,b)) => a + b == 2020, allPairs)
);
print((«Values», a, b));
print((«Answer», a * b));
Contoh diambil dari kode waktu dari laporan video Spencer.
Konstruktor Generik
Grain memungkinkan, misalnya, untuk membuat enum menggunakan konstruktor generik.
enum Veggie { Squash, Cabbage, Broccoli }
enum Fruit { Apples, Oranges, Bananas }
enum Inventory<produce> { Crate(produce), Truckload(produce) }
let veggieInventory = [Crate(Broccoli), Truckload(Cabbage)]
let fruitInventory = [Crate(Apples), Truckload(Oranges)]
Dalam contoh kode di atas, parameter konstruktor Crate dan Truckload adalah variabel produksi.
Pencocokan pola
enum Topping { Cheese, Pepperoni, Peppers, Pineapple }
enum Menu { Pizza(Topping), Calzone(Topping) }
let item = Calzone(Peppers)
match (item) {
Calzone(topping) => {
if (checkSpecials(topping)) {
print(«These are half off this week.»)
} else {
print(«No current specials.»)
}
},
_ => print(«No current specials.»)
}
Bagian dokumentasi Bindings in Match Patterns mengatakan bahwa kita dapat mengikat pola (pola) yang cocok ke, misalnya, nama enumerasi. Kemudian, dengan mengganti namanya dalam kasus yang sesuai di badan ekspresi kecocokan, kita dapat secara otomatis memeriksa nilai enumerasi ini.
Dalam contoh kode di atas, nilai variabel topping terikat dengan enumerasi Topping, yang menginisialisasi elemen dalam enumerasi Menu dengan salah satu nilainya.
Pencocokan pola juga berfungsi untuk catatan, tupel, dan daftar. Mari kita lihat contoh untuk daftar:
let list = [1, 2, 3]
match (list) {
[] => print(«List contains no elements»),
[_] => print(«List contains one element»),
[_, _] => print(«List contains two elements»),
[_, _, _] => print(«List contains three elements»),
_ => print(«List containes more than 3 elements»)
}
Anda dapat membaca lebih lanjut tentang fitur bahasa ini di sini.
Secara singkat tentang kemungkinan lain dari Grain
Dalam proses pengerjaan Grain, para pengembang menaruh perhatian besar pada implementasi fungsi yang penuh dan modern. Misalnya, fungsi dapat digunakan sebagai nilai. Sama seperti JavaScript, Grain mengimplementasikan penutupan.
Grain juga tahu cara mencetak nilai tanpa mengubahnya menjadi string. Selain itu, Grain dapat mengakses WebAssembly System Interface (WASI). Antarmuka Sistem WebAssembly harus memungkinkan kode Wasm berjalan di semua perangkat dan sistem operasi. WASI menyertakan API untuk I/O asinkron, pembuatan nomor acak, mendapatkan waktu saat ini, dan banyak lagi.
Program biji-bijian dapat dibagi menjadi beberapa modul. Modul dapat diekspor atau diimpor dari modul Grain lainnya. Modul biji-bijian juga dapat menghubungkan fungsi eksternal. Tetapi hanya dengan syarat bahwa pengembang sendiri memastikan bahwa fungsi eksternal yang sesuai dibuat.
Sekarang ada penyelesaian aktif antarmuka fungsi asing (FFI - Antarmuka fungsi asing ), serta tautan statis, bekerja dalam mode 64-bit, pustaka DOM standar, dan makro.
Bagi mereka yang ingin menyelam lebih dalam
Tautan statis
Hingga rilis April 2021, semua program Grain dirakit oleh mesin js khusus yang berperan sebagai penghubung dinamis. Namun, dengan pendekatan ini, program hanya dapat dijalankan di Node.js dan browser. Grain sekarang dapat menggunakan runtime yang berdiri sendiri untuk WebAssembly - Wasmer, Wasmtime, dan Wasm3.
Kembali pada tahun 2018, para pengembang Grain dengan jelas menyadari bahwa tautan statis sangat penting untuk pengembangan proyek di masa depan. Tetapi mereka berharap dapat menggunakan alat ekosistem untuk melakukan ini. Sayangnya, tidak ada alat yang cocok ditemukan, dan Oscar memutuskan untuk menyematkan fase tautan statis langsung ke kompiler Grain. Untuk mengimplementasikan penautan statis menggunakan toolkit Binaryen, butuh sekitar 600 baris kode untuk menulis.
Namun, setelah itu saya harus menangani tugas yang lebih kompleks dan banyak - untuk menulis ulang kode JavaScript runtime dan kode AssemblyScript dari pustaka standar dalam Grain murni.
Grain vs AssemblyScript
AssemblyScript , yang mengkompilasi subset dari TypeScript ke Wasm, juga digambarkan sebagai bahasa yang dibuat khusus untuk WebAssembly. Ini juga memiliki perpustakaan standar dengan tipe komposit (misalnya untuk array atau tanggal). Seperti Grain, AssemblyScript dikompilasi ke WebAssembly menggunakan Binaryen. AssemblyScript, sebagai bahasa tingkat tinggi, bertujuan untuk memberi pengembang lebih banyak kemampuan "tingkat rendah" saat menyelesaikan tugas yang menuntut kinerja (dibandingkan dengan TS dan JS).
Namun AssemblyScript membutuhkan anotasi tambahanjenis. Dibandingkan dengan TypeScript, inferensi jenis di AssemblyScript terbatas karena jenis setiap ekspresi harus diketahui terlebih dahulu. Ini berarti bahwa deklarasi variabel dan parameter harus beranotasi atau penginisialisasi.
Grain adalah bahasa yang sangat diketik (disediakan oleh pemeriksa tipe OCaml ) yang membutuhkan sedikit atau tanpa anotasi. Ini dicapai karena fakta bahwa pengembang menerapkan mekanisme inferensi tipe.
Di mana untuk mencari?
Grain (bersama dengan CLI, compiler, runtime, dan library standar) hadir dalam satu biner. Versi ini tersedia untuk MacOS x64 , Linux x64 , dan Windows x64 . Pada platform lain, Anda dapat menggunakan kompiler Grain versi JS.
Dokumentasi Gandum.
Video dengan laporan:
Server cloud dari Macleod cepat dan aman.
Daftar menggunakan tautan di atas atau dengan mengklik spanduk dan dapatkan diskon 10% untuk bulan pertama menyewa server dengan konfigurasi apa pun!