2 poin oleh GN⁺ 2023-08-20 | 1 komentar | Bagikan ke WhatsApp
  • Di tengah makin pentingnya WebAssembly dalam komputasi cloud dan edge, Moonbit bertujuan menjadi bahasa Wasm-first yang memudahkan pemanfaatan efisiensi, keamanan, dan ukuran kecil Wasm
  • Rust dan C/C++ membebani dengan tingkat kesulitan belajar dan waktu kompilasi yang panjang, sementara Go memiliki keterbatasan berupa kode yang dihasilkan besar dan tidak efisien; Moonbit menargetkan celah ini
  • Fokus desainnya adalah build dan eksekusi yang cepat, output Wasm yang kecil, serta kemudahan penggunaan, mencakup optimasi beberapa representasi perantara serta analisis semantik paralel per fungsi dan reanalisis inkremental
  • Pada contoh Fibonacci, ditekankan inferensi tipe fungsi lokal, output Wasm terkecil, performa lebih cepat daripada Go dan mirip Rust, serta dukungan recursive closure dan exhaustive pattern match
  • Saat ini menyediakan IDE online, alat CLI, dokumentasi, dan ekstensi VSCode, dengan target mencapai beta status pada akhir kuartal 2 2024 serta membuka kode sumber setelah mencapai kualitas beta

Tujuan bahasa yang mengutamakan WebAssembly

  • WebAssembly adalah arsitektur set instruksi lintas platform, dan karena karakteristiknya yang efisien, aman, berukuran kecil, serta merupakan standar terbuka, perannya makin penting dalam komputasi cloud dan edge
  • Pilihan yang ada dianggap belum sepenuhnya memanfaatkan potensi Wasm
    • Bahasa Wasm level rendah seperti Rust dan C/C++ sulit dipelajari, dan waktu kompilasi yang panjang dapat memperlambat kecepatan pengembangan
    • Bahasa level tinggi seperti Go dianggap menghasilkan kode yang tidak efisien dan besar, sehingga sulit memanfaatkan keunggulan Wasm berupa kecepatan dan ukuran kecil
  • Moonbit mengarah pada bahasa Wasm-first yang cepat dibuild dan dijalankan, menghasilkan output Wasm kecil, serta mudah dipelajari seperti Go

Desain bahasa dan tim

  • Moonbit dipimpin oleh Hongbo Zhang dan tim dengan pengalaman lebih dari 10 tahun dalam desain dan pengembangan bahasa
  • Zhang telah berkontribusi pada OCaml, ReScript, dan Flow, serta menjabat sebagai chief architect untuk compiler cepat, standard library, dan build system pada toolchain ReScript
  • Desain bahasanya dipengaruhi oleh Go dan Rust
    • Mengadopsi kesederhanaan Go, terutama sistem paket
    • Mencakup ekspresivitas Rust, pattern matching, type inference, generics, dan ad-hoc polymorphism mirip trait
  • Sistem tipe yang fault tolerant dirancang dengan mempertimbangkan kecepatan, kemungkinan paralelisasi, dan pemeriksaan inkremental, dengan dukungan IDE sebagai tujuan utama

Build dan eksekusi cepat

  • Moonbit bertujuan menjadi bahasa yang cepat di seluruh stack, mencakup performa pengembangan dan performa runtime
  • Menggunakan representasi perantara (IR) multilevel untuk optimasi seluruh program
    • Mengambil pendekatan meningkatkan layout memori untuk mengurangi cache miss
    • Memberikan konteks yang lebih baik untuk analisis data flow dan control flow
    • Dianggap memungkinkan optimasi efektif dengan memahami struktur program secara lebih menyeluruh daripada sebagian besar struktur link-time optimization yang ada
    • Dapat menemukan dan menghapus redundansi tingkat tinggi yang tidak terlihat pada level rendah
  • Untuk performa build cepat yang penting bagi fitur IDE, Moonbit memungkinkan analisis semantik paralel per fungsi
    • Berbeda dari ReScript dan Rust, function-level parallel semantic analysis dimungkinkan
    • Dengan granularitas yang sama, reanalisis inkremental dilakukan sehingga diklaim dapat menangani monorepo berskala besar dan memberikan waktu respons dalam hitungan milidetik

Output Wasm kecil

  • Moonbit dirancang dengan mempertimbangkan dead code elimination yang efektif
  • Fitur bahasa yang menghambat analisis ini dikecualikan, dan standard library juga disusun dalam struktur yang memudahkan penghapusan kode mati
  • Melalui optimasi seluruh program, Moonbit berupaya mengurangi ukuran kode akhir secara signifikan
    • Pengurangan ukuran kode dianggap berujung pada peningkatan keamanan dan berkurangnya kerentanan terhadap serangan
    • Diklaim menjamin startup cepat dalam lingkungan komputasi serverless

Fitur dan alat untuk kemudahan penggunaan

  • Moonbit menyediakan manajemen memori otomatis, yang membedakannya dari Rust
  • Berbeda dari Go, Moonbit diklaim menghindari elemen berbahaya seperti pointer atau left value
  • Menyediakan fitur aman untuk pemrograman berorientasi data
    • algebraic data types
    • ad-hoc polymorphisms
    • pattern match
  • Di luar bahasa, Moonbit juga bertujuan berperan sebagai platform, dan bahkan pada tahap awal sudah menyediakan kumpulan alat
    • Alat build berkecepatan tinggi
    • Package manager
    • Compiler
    • IDE
    • Cloud IDE tanpa container yang dapat diakses dari mana saja hanya dengan browser
    • Cloud IDE tersebut juga menyediakan fitur offline dan diklaim berbeda dari Cloud IDE yang ada

Perbedaan melalui contoh Fibonacci

  • Contoh Fibonacci membandingkan implementasi fungsi fib dalam tiga bahasa: MoonBit, Go, dan Rust
  • Berdasarkan benchmark, MoonBit menunjukkan perbedaan dalam type inference, ukuran kode, performa, dan kemudahan penggunaan
    • Inferensi tipe lokal: MoonBit menginfer tipe fungsi lokal aux
    • Ukuran Wasm kecil: MoonBit menghasilkan output Wasm paling kecil
    • Performa: Lebih cepat daripada Go dan mirip Rust
    • Kemudahan penggunaan: Mendukung recursive closure seperti Go, yang diklaim sangat sulit diimplementasikan di Rust
    • Mendukung exhaustive pattern match seperti Rust, dan diklaim jauh lebih kuat daripada switch case milik Go

Status saat ini dan roadmap

  • Moonbit adalah target yang berubah cepat, tetapi saat ini menyediakan entry point yang dapat digunakan
  • Pengembangan toolchain bahasa sebelumnya membutuhkan waktu bertahun-tahun hingga 10 tahun, tetapi diklaim telah disederhanakan berkat pengalaman yang terakumulasi dan tim khusus yang dibentuk sejak awal
  • Diperkirakan mencapai beta status pada akhir kuartal 2 2024
    • beta status berarti stabilitas relatif, bug yang lebih sedikit, dan FFI yang solid untuk berinteraksi dengan Wasm host
  • Kode sumber direncanakan dibuka setelah mencapai kualitas beta
  • Rencana strategis mencakup integrasi Wasm GC untuk Wasm 2.0 dan GC mandiri untuk Wasm 1.0, serta diklaim diselaraskan dengan Wasm proposals

Kanal komunitas

1 komentar

 
GN⁺ 2023-08-20
Pendapat Hacker News
  • Saya lead proyek ini. Saat ini bisa langsung dicoba di IDE online https://try.moonbitlang.com, dan bisa dijalankan dengan F5
    Dokumentasinya ada di https://github.com/moonbitlang/moonbit-docs, dan kompilernya akan dibuka ke publik setelah mencapai status beta. Perkiraan waktunya akhir kuartal 2 2024

    • Ini pertanyaan-pertanyaan yang pertama saya cek saat melihat bahasa pemrograman baru: bagaimana menulis kode asinkron, apakah ada fitur yang kurang mainstream seperti algebraic effects, contexts/capabilities, atau linear types, apakah sistem tipenya sound dan apakah type cast diperlukan, apakah mendukung interface/trait/protocol, dan seberapa kaya dukungan generiknya
      Misalnya saya ingin mengecek apakah ada anotasi varians eksplisit untuk parameter tipe, constraint batas bawah/atas, higher-kinded types, apakah structural atau nominal subtyping yang lebih utama, serta apakah ada algebraic data types dan generalized algebraic data types
      Referensi: https://v2.ocaml.org/manual/effects.html, https://docs.hhvm.com/hack/contexts-and-capabilities/introdu..., https://austral-lang.org/linear-types
    • Sepertinya akan ada banyak orang yang ingin tahu soal lisensi, harga, dan kendali atas proyek. Membukanya sekarang mungkin bisa merugikan strategi komersial, tetapi kerahasiaan dan ketidakpastian bisa membuat minat orang menurun
    • Dokumentasi https://moonbitlang.com/docs/syntax/ sulit dibaca karena warna teks dan warna latarnya
    • Saya penasaran apakah keyword khusus fn benar-benar diperlukan. Saya tidak tahu apa perbedaan mendasar antara func dan fn
    • Saya penasaran apakah perlu membedakan func dan fn, dan apakah tanda panah -> untuk menunjukkan nilai balik dalam signature fungsi benar-benar diperlukan
      Sintaks tipe baru adalah struct User, tetapi untuk kasus ini saya rasa type User struct seperti Go lebih baik. Dengan begitu, tipe fungsi untuk variabel fn juga bisa dibuat seperti type AssignUser func(name: String, id: Int) -> Int
      Saya juga penasaran apakah : membantu lexer atau parser. Saya ingin bertanya apakah dalam signature fungsi bisa ditulis func(name String) alih-alih func(name: String), dan apakah deklarasi tipe bisa menjadi mut elems List[int] alih-alih mut elems: List[Int]. Ini memang nitpick kecil, tapi secara keseluruhan saya menyukainya
  • Situsnya membandingkan dengan Rust dan Go, tetapi bagi saya perbandingan dengan AssemblyScript terasa lebih tepat. AssemblyScript juga native WASM, dan sama-sama ekosistemnya masih kecil
    Namun berbeda dengan Moonbit, bahasanya familiar bagi orang yang pernah memakai TypeScript, jadi saya penasaran alasan untuk memakai Moonbit alih-alih AssemblyScript

    • Karena Moonbit adalah bahasa modern, sedangkan AssemblyScript mewarisi kesalahan masa lalu. Misalnya Moonbit mendukung pattern matching dan sebagian besar konstruksi bahasanya adalah expression
      AssemblyScript tidak punya pattern matching dan terutama tersusun dari statement. Moonbit punya algebraic data types, sedangkan saya tidak yakin AssemblyScript punya hal semacam itu. Mungkin ada lebih banyak perbedaan runtime juga, tetapi sulit menilainya hanya dari situs web
    • Kelihatannya jauh lebih dekat ke Grain daripada AssemblyScript: https://grain-lang.org/
    • Saya rasa perbandingan dengan Rust dan Go dibuat karena keduanya populer dan punya dukungan WASM kelas satu, tetapi saya setuju bahwa seharusnya dibandingkan dengan AssemblyScript
  • Pemakaian keyword func untuk definisi fungsi top-level dan fn untuk definisi fungsi bersarang itu kurang bagus. Seharusnya diseragamkan ke salah satu, terlepas dari konteks tertentu

    • Mungkin karena fungsi bersarang adalah closure. Tidak seperti deklarasi top-level, nama dan tipe bisa dihilangkan serta bisa menangkap nilai, jadi tidak jarang bahasa memiliki sintaks closure/lambda terpisah
      Apakah itu benar-benar perlu atau desain yang baik adalah persoalan lain, tetapi presedennya banyak
    • Saya menganggapnya desain yang elegan karena memungkinkan definisi fungsi yang lebih pendek dan mudah dibaca untuk fungsi bersarang. fn memungkinkan nama dan tipe dihilangkan, dan keyword yang pendek menunjukkan bahwa definisi fungsi juga bisa menjadi lebih singkat
  • Saya senang melihat ada bahasa garbage-collected modern yang menargetkan WASM. Pembanding terdekatnya mungkin Grain: https://grain-lang.org/

    • Katanya compiler Grain ditulis dengan ReasonML, bukan OCaml murni. Melihat teknologi-teknologi niche seperti ini ditumpuk berlapis-lapis tanpa ragu terasa agak komedi
  • “Pengembangan keseluruhan toolchain bahasa dulu memakan waktu bertahun-tahun hingga 10 tahun, tetapi kini dipermudah berkat pengalaman yang telah terkumpul dan tim khusus yang unggul yang dibentuk sejak awal Moonbit. Moonbit diharapkan mencapai status beta pada akhir kuartal II 2024, yaitu tahap yang relatif stabil, minim bug, dan memiliki FFI yang solid untuk berinteraksi dengan host Wasm. Setelah mencapai kualitas beta, source code akan dibuka. Secara strategis, sesuai dengan proposal Wasm, kami merencanakan integrasi Wasm GC untuk Wasm 2.0 dan GC buatan sendiri untuk Wasm 1.0”
    Jadi saat ini https://github.com/moonbitlang/ masih kosong

  • Melihat komentar di sini, Moonbit tampaknya memiliki garbage collection. Namun jika biner hasil Fibonacci hanya 253 byte, kemungkinan GC tidak disertakan
    Saya penasaran apakah mereka memakai WASM native GC yang sedang diusulkan, atau build system-nya cukup pintar untuk menyimpulkan bahwa GC tidak diperlukan di sini lalu menghapusnya

    • Jika klik kanan file lalu memilih Compile to Wat, menu kedua dari bawah, Anda bisa melihat teks WASM secara langsung
      Pada output contoh Fibonacci, yang terlihat hanya impor print_i32, definisi memori dan fungsi, serta ekspor _start; tidak tampak seperti ada runtime GC yang ditempelkan
    • Kemungkinan memang dihilangkan secara pintar. Karena ukuran kode adalah salah satu target mereka
  • Mengingatkan pada Grain. Karena ini juga bahasa pemrograman yang mengutamakan Wasm, sepertinya bagus jika Grain ditambahkan sebagai pembanding
    https://grain-lang.org/

  • Tautan About Team mengarah ke halaman edu.cn berbahasa Tionghoa. Kelihatannya seperti proyek universitas, tetapi saya tidak yakin. Halaman Join Us juga berbahasa Tionghoa, dan contoh di homepage tampaknya membutuhkan JavaScript dari baidu.com

    • Meski plugin umatrix dinyalakan, demo tetap berjalan. Skrip yang diperlukan berasal dari unpkg dan msecnd(domain Microsoft), dan baidu tidak diperlukan
  • Di Go, Fibonacci tidak diimplementasikan seperti itu

    • Saya tidak terlalu suka Go, tetapi harus diakui bahwa benchmark itu tidak masuk akal. Jika memakai tail call di bahasa yang tidak mendukung tail call optimization, hasilnya tentu saja buruk
      Tampaknya lebih mudah melempar beberapa angka daripada membandingkan implementasi yang idiomatis dan membahas trade-off secara cermat. Meski hanya teaser bahasa yang sederhana, agar tidak menyesatkan orang, sebaiknya ada catatan tentang TCO
    • Menggunakan WASM dan Go sebagai contoh yang dipaksakan tetapi tidak menyebut TinyGo terasa kurang jujur
    • Di Rust pun tidak diimplementasikan seperti itu. Ini benchmark yang cukup buruk. Berdasarkan pengalaman saya, penyebabnya kemungkinan tidak adanya tail recursion dan pernyataan switch, dan di Go hal itu bisa lambat
      Meski begitu, sebagai teaser untuk memperkenalkan Moonbit, ini cukup baik
  • Saya penasaran apakah proyek ini terkait dengan Meta. Pembuatnya, Hongbo Zhang, pernah mengerjakan proyek bahasa pemrograman open source seperti ReasonML dan Flow di Meta, dan menurut LinkedIn ia masih bekerja di Meta