10 poin oleh GN⁺ 2024-12-28 | 7 komentar | Bagikan ke WhatsApp
  • Semakin banyak belajar tentang desain dan implementasi Lua, semakin terkesan. Jarang ada perangkat lunak yang bisa melakukan banyak hal dengan sedikit kode
  • Namun, Lua tidak mendapatkan pemasaran dan perhatian sebanyak bahasa lain. Akibatnya, hanya sedikit pengembang yang mengetahui fitur dan keunggulan Lua
  • Lua terutama dipandang sebagai bahasa niche yang digunakan untuk game dan sistem embedded

[Karakteristik dan keunggulan Lua]

Bahasa yang mudah dipahami

  • Lua adalah bahasa skrip imperatif yang gratis dan reflektif. Dibuat pada tahun 1993, dan dirancang agar bisa di-embed ke aplikasi lain untuk diperluas.
  • Desainnya rapi dan kodenya cepat. API C-nya mudah digunakan dan performanya baik.
  • Sintaksnya ringkas dan minimalis, sehingga mudah diakses bahkan oleh pemula.

Kemampuan embedding yang unggul

  • Lua dirancang agar mudah di-embed ke dalam aplikasi yang ditulis dalam bahasa lain, terutama C dan C++.
  • Ini adalah pilihan yang sangat baik untuk scripting dan ekstensi pada game serta aplikasi embedded.
  • Contoh: embed Lua ke program C
    #include <lua.h>  
    #include <lauxlib.h>  
    #include <lualib.h>  
    
    int main() {  
        lua_State *L = luaL_newstate();  
        luaL_openlibs(L);  
        luaL_dofile(L, "./myscript.lua");  
        lua_close(L);  
        return 0;  
    }  
    

Mendukung banyak paradigma pemrograman

  • Lua mendukung pemrograman imperatif, fungsional, dan berorientasi objek, baik secara mandiri maupun dengan pustaka yang sesuai.
  • Memberikan fleksibilitas untuk memilih gaya pemrograman sesuai kebutuhan pengguna

[Potensi kekurangan Lua]

Konvensi indexing

  • Di Lua, indexing umumnya dimulai dari 1, tetapi ini hanyalah konvensi. Array dapat diindeks dengan 0, bilangan negatif, atau nilai lain.
  • Lua sebenarnya tidak memiliki array; yang ada hanya table, yaitu hash key-value, sehingga bisa diindeks dengan berbagai nilai seperti 0 atau negatif
  • Pustaka standar dan fungsi bawaan mengasumsikan table mirip array dengan indeks yang dimulai dari 1.

Penanganan error

  • Penanganan error di Lua mungkin tidak terasa intuitif bagi pengembang yang datang dari bahasa lain.
  • Di Lua, error dapat diperlakukan sebagai nilai. Error bisa ditangkap menggunakan pcall.
    function risky_function()  
        error("Something went wrong!")  
    end  
    
    local status, err = pcall(risky_function)  
    if not status then  
        print("Error: " .. err)  
    end  
    

Array yang berakhir dengan nil

  • Array Lua (table yang digunakan sebagai array) akan berhenti saat menemui nilai nil, dan ini bisa menyebabkan perilaku yang tidak terduga
    local arr = {10, 20, 30, nil, 50}  
    for i, v in ipairs(arr) do  
        print(v) -- output: 10, 20, 30 (berhenti di nil)  
    end  
    
  • Fungsi ipairs akan menghentikan iterasi saat menemui nilai nil
  • Jika ada celah kosong dalam array, lebih baik gunakan pairs daripada ipairs. Semua item, termasuk yang mengandung nilai nil, dapat dijelajahi

[Ringkasan]

  • Lua adalah bahasa pemrograman yang kuat, efisien, dan serbaguna, serta layak mendapatkan lebih banyak pengakuan.
  • Berkat kesederhanaan, kemampuan embedding, dan performanya, Lua cocok untuk berbagai aplikasi seperti game dan sistem embedded.
  • Meski diremehkan, Lua layak dicoba berkat kesederhanaan dan performanya
  • Digunakan dalam sistem plugin nvim dan efisien.

7 komentar

 
jhj0517 2025-01-03

> Di Lua sebenarnya tidak ada array; yang selalu ada hanyalah tabel berupa hash kunci-nilai, sehingga bisa diindeks dengan berbagai nilai seperti 0 atau bilangan negatif

Saya sempat memakai Lua sebentar karena addon WoW, dan yang paling membekas bagi saya adalah bagian ini. Hampir semua struktur data selalu memakai tabel.

 
asdwqr 2024-12-31

Saya cuma tahu nama Lua, tapi setelah melihat tulisan ini jadi merasa bahasanya kurang bagus wkwk..

 
bbulbum 2024-12-30

Saya tidak begitu tahu, tetapi saya pernah mendengar bahwa kompatibilitas mundur antarversinya sangat buruk..

 
ffdd270 2024-12-30

Secara pribadi, dibanding Ruby.. untuk pertanyaan seperti "setidaknya apakah kode lama masih bisa jalan??" memang sedikit lebih baik, tetapi khususnya di 5.3 cara menangani number berubah dibanding versi sebelumnya, jadi kalau dinaikkan dari 5.1 ke 5.3 akan muncul banyak bug yang secara internal sulit dilacak...

Dan ada juga banyak tempat yang memakai LuaJIT, dan karena antarmukanya juga sedikit berbeda, rasanya masalah yang muncul akibat perbedaan kecil itu yang paling serius. Ada cukup banyak bagian yang perilaku internalnya berubah jadi memang tidak banyak yang bisa dilakukan.. =m =.

 
secret3056 2024-12-30

Saya pernah punya pengalaman menulis edge driver SmartThings dengan Lua.
Lumayan bisa dipakai, tapi itu bukan bahasa yang sesuai selera saya.

Saya pribadi menganggap environment pengembangan dan DE juga bagian dari sebuah bahasa,
dan pertama-tama, rasanya komunitasnya agak terpecah.

Ada beberapa language server, tapi masing-masing ada saja fitur yang kurang, atau pengindeksan kodenya lambat, dan kalau ada perubahan, prosesnya mengulang lagi dari awal.

Indexing berbasis 1 dan penulisan type hint lewat komentar juga kurang cocok buat saya,
dan type hint itu pun tampaknya tidak punya standar, melainkan berbeda-beda di tiap language server.

Coroutine-nya juga mengingatkan saya pada Python jadul...

Untuk embedding atau FFI, memang terasa cukup praktis.

 
ffdd270 2024-12-30

Language server Lua yang dibuat oleh sumneko akhir-akhir ini keren banget 'hm'... (dibuat sekitar 2022 atau 2023) dan indexing-nya menurut saya cukup cerdas.

Kelebihan Lua (sekaligus kekurangannya) menurut saya muncul saat kita mulai melakukan hal-hal aneh; sangat mudah untuk menimpa method milik object lain sampai-sampai terasa absurd. Karena itu, saya merasa ini bahasa yang sangat enak dipakai secara serampangan, menulis apa pun yang terpikir begitu saja.

Soal type hinting... seperti yang Anda bilang, memang ada sangat banyak solusi yang sudah muncul, tetapi hampir tidak ada solusi yang benar-benar mapan, jadi saya menaruh harapan pada luau buatan tim Roblox..

 
GN⁺ 2024-12-28
Komentar Hacker News
  • Lua bagus untuk di-embed, tetapi memilihnya sebagai bahasa scripting di Redis adalah keputusan yang banyak disesali. Saya sendiri tidak menyukai bahasanya. Dibandingkan dengan apa yang saya harapkan pada level abstraksi tersebut, rasanya ada banyak friksi. Keputusan desain kecil yang menumpuk membuat bahasa ini terasa agak tidak bersahabat. Namun, karena cepat, mudah diintegrasikan, penggunaan memorinya kecil, dan andal, Lua tetap layak dipilih. Bahkan di level C-API pun ada kesan tidak bersahabat karena pendekatan akses berbasis stack. Saya pernah terpapar bahasa stack seperti FORTH, tetapi saat menulis binding tetap terasa perlu senam mental.

  • Jika Anda menyukai Lua, saya sarankan melihat Terra. Terra adalah bahasa pemrograman sistem tingkat rendah yang di-embed dan di-meta-programkan di dalam Lua. Ia bertipe statis dan dikompilasi seperti C/C++, serta memungkinkan manajemen memori manual. Namun, tidak seperti C/C++, Terra sejak awal dirancang agar bisa di-meta-programkan dengan Lua. Program Terra menggunakan backend LLVM yang sama dengan yang dipakai kompiler C milik Apple. Artinya, kode Terra dapat memberikan performa yang mirip dengan kode C yang setara.

  • Saya baru-baru ini mengintegrasikan Lua dengan game engine kustom, dan saya setuju betapa rapi integrasinya dengan bahasa lain. Antarmukanya bersih sehingga mudah membuat binding secara otomatis. Saya menggunakan Roslyn Incremental Source Generators untuk menghasilkan binding antara C# dan Lua secara otomatis, dan berkat desain antarmukanya, itu sama sekali tidak sulit. Berkat Lua stack, dynamic typing, dan "table", mudah untuk membuat marshaller bagi kelas data arbitrer antara C# dan Lua. Namun, ada banyak kritik yang valid terhadap bahasanya sendiri. Saya terutama tidak suka indexing berbasis 1. Sambil mengatasi masalah-masalah ini, saya sedang mempertimbangkan untuk merancang bahasa scripting embedded dengan antarmuka serupa.

  • Saya jadi tidak semakin menyukai Lua. Justru rasa frustrasinya makin kuat. Sudah lama sejak terakhir kali saya menulis Lua, tetapi saya tetap merasa bahasa ini tidak intuitif. Saya tidak mengerti mengapa array adalah table, mengapa diakhiri dengan nil, dan mengapa dimulai dari 1. Saya tidak merasa Lua diremehkan. Lua sangat populer untuk menulis script di game engine (lama).

  • Saya pernah membuat chatbot dengan perintah plugin Lua, tetapi pengalaman mengintegrasikannya ke program C++ sangat buruk. Saya tidak mengerti mengapa orang bilang embedding-nya mudah. Anda harus banyak memanipulasi stack. Bahasanya sendiri merepotkan dan sama sekali tidak membantu ketika Anda melakukan kesalahan. Saya tidak akan pernah lagi memakai Lua dan akan menghindari proyek yang menggunakannya.

  • Lua sulit dipakai untuk menulis kode dalam jumlah besar karena weak typing, tidak adanya type hints, dan minimnya penanganan error. Bahasa ini tidak diremehkan. Seiring waktu saya semakin menyukai bahasa bertipe statis dan type hints (Python, TypeScript). Menulis kode Python atau JS tanpa hint dalam komunitas itu merugikan. Baru-baru ini saya menulis ulang 1.5k cloc JS menjadi TypeScript. Selalu saja ada puluhan kasus null yang terlewat, akses properti null, atau null yang secara semantik meragukan.

  • Saya pikir sebagian besar aplikasi yang membutuhkan scripting seharusnya meng-embed JavaScript. Ada keuntungan besar dari ekosistem yang sudah ada. Orang memang tidak selalu menyukainya, tetapi jutaan orang sudah mengenalnya. Tidak perlu mempelajari ulang keanehan seperti indexing array dan terminasi nil, serta puluhan hal lain tentang Lua yang baru diketahui saat runtime. Ada engine JS dalam berbagai ukuran, dan sebagian besar sistem operasi menyediakan engine berkualitas tinggi serta framework embedding yang bisa diakses tanpa instalasi. Daripada memaksa pengguna mempelajari bahasa baru, lebih baik menggunakan bahasa standar. Ini bisa menghemat waktu baik bagi pengguna maupun diri Anda sendiri.

  • Saya menikmati bekerja dengan Lua dan menurut saya ini bahasa yang sangat bagus. Terutama karena antarmuka untuk embedding ke C/C++ bersih dan fleksibel. Memang ada masalah performa, tetapi mengingat Lua banyak dipakai untuk game logic di video game berperforma tinggi, masalah itu jelas bisa diatasi. Namun, ada masalah lain yang membingungkan dan membuat bahasanya sulit. Karena mempelajari antarmuka Lua dan C sama banyaknya dengan mempelajari Lua itu sendiri, berpindah antar-distribusi terasa lebih membingungkan daripada bahasa lain. Meski begitu, saya tetap merasa bahasa ini diremehkan.

  • Meng-embed Lua itu menyenangkan, tetapi seperti wasm, sangat jarang saya benar-benar perlu menjalankan kode baru tanpa mengompilasi ulang seluruh binary. Hal paling menyenangkan adalah membuat game engine dengan C++ dan menggunakan Lua untuk semua game logic. Siklus debug yang cepat sangat berguna. Hal paling menyenangkan kedua adalah membuat bot IRC yang bisa me-reload logika Lua. Hal paling menyenangkan ketiga adalah menggunakan Lua sebagai bahasa konfigurasi yang Turing-complete. Saat saya membutuhkan array, saya membuat array di Lua. Hal yang paling tidak menyenangkan adalah plugin Blender yang mengekspor model 3D menjadi Lua yang dihasilkan otomatis.

  • Saya pikir Lua justru terlalu dibesar-besarkan, karena sangat luas dipakai di industri game. Satu-satunya kelebihan Lua adalah mudah di-embed ke C++. Selain itu, semuanya seperti mimpi buruk.