Bahasa Tertanam: Mengapa Lua?

Materi ini melanjutkan serangkaian publikasi berdasarkan laporan yang kami buat di konferensi Games Gathering 2017 Desember lalu. Dalam salah satu laporan , topik memilih bahasa skrip tertanam dibesarkan.



Apa dan mengapa bahasa scripting diperlukan


Seperti yang telah disebutkan di posting sebelumnya di blog kami, perusahaan kami telah menulis mesinnya sendiri. Hari ini kita akan berbicara tentang apa yang dipandu oleh kita ketika memilih bahasa scripting untuk mesin ini.

Mengapa ada kebutuhan untuk bahasa scripting sama sekali? Seperti kata pepatah, "dalam industri game tidak ada masalah yang kompleks, tidak perlu menuntut solusi yang kompleks . " Selain programmer berpengalaman (dan mahal!) Yang memecahkan masalah yang kompleks, kita membutuhkan orang (banyak orang!) Siapa yang akan terlibat dalam, katakanlah, pencarian. Dan, sejujurnya, kami ingin para programmer ini tidak begitu mahal, dan idealnya bukan programmer sama sekali, tetapi secara langsung desainer game dan penulis naskah.

Dengan demikian, ada kebutuhan untuk alat untuk menggambarkan sederhana, tetapi masih logis, tanpa melibatkan artileri berat oleh programmer. Kami menyimpulkan - apa bahasa scripting bagi kami? Ini adalah alat yang akan membuat pengembangan game lebih cepat dan lebih murah.
Pertanyaan segera muncul, mengapa kita tidak menggunakan sesuatu seperti XML? Faktanya adalah bahwa untuk keperluan kita, kita sering membutuhkan struktur kontrol - percabangan dan loop, sedangkan XML adalah deskripsi deklaratif.

Keuntungan lain dari bahasa scripting adalah bahwa skrip dalam suatu proyek dapat berupa kode atau sumber daya. Dan, dengan demikian, bagian skrip permainan dapat diperbarui tidak hanya dengan kode, yaitu, selama pembaruan rutin melalui mekanisme toko aplikasi. Tetapi juga dengan sumber daya - yaitu, bersama dengan materi grafis dan lainnya menggunakan CDN.

Persyaratan Bahasa Scripting Sempurna


Kami merumuskan persyaratan untuk bahasa skrip yang ideal.

  • Dinamis Dalam pemahaman kami, bahasa scripting yang ideal harus dinamis.
  • Popularitas. Dengan popularitas suatu bahasa, yang kami maksudkan adalah keberadaan komunitas yang cukup besar yang siap menjawab pertanyaan tentang sumber daya khusus seperti StackOverflow.
  • Kurva belajar yang lembut. Kami ingin mengambil, secara relatif berbicara, praktis siapa saja, dan dengan cepat melatihnya ke tingkat yang akan memungkinkan orang ini bekerja secara produktif pada tugas-tugas kami.
  • Peluang yang luas. Bahasa harus kuat dan memiliki fitur yang cukup, harus mendukung paradigma pemrograman yang berbeda. Seorang programmer profesional yang ditawari untuk menulis dalam bahasa seperti itu akan dapat melakukan ini dengan nyaman dan senang.
  • Performa tinggi. Kinerja adalah salah satu landasan industri game.
  • Sejumlah besar perpustakaan. Sangat sering, dalam penyelesaian tugas-tugas yang menghadang kita, kita tidak membuat kode baru yang fundamental, tetapi menggunakan apa yang sudah ditulis orang lain. Semakin stabil, perpustakaan yang didukung dengan baik yang dapat kita gunakan menggunakan bahasa tertentu, semakin baik.
  • Mudah ditanam. Kita berbicara tentang bahasa yang disematkan, jadi ketika memilih bahasa scripting, kemampuan untuk menanamkannya memainkan peran penting.

Mari kita menganalisis beberapa bahasa pemrograman populer yang digunakan sebagai skrip untuk memenuhi persyaratan ini.

Python


Python adalah bahasa dinamis yang sangat populer. Ini ditandai dengan kurva belajar yang cukup lembut, cukup sederhana untuk dipelajari. Namun, mempelajarinya dengan benar seharusnya tidak semudah itu. Akibatnya, programmer Python yang baik jarang dan mahal. Ini bertentangan dengan keinginan kami untuk mempercepat dan mengurangi biaya pengembangan logika game.

Python memiliki fitur hebat dan kinerja yang baik. Masalahnya adalah sistem perpustakaan yang tidak konsisten. Masalahnya yang lain, yang memainkan peran penting bagi kita, adalah bahwa dia, pada kenyataannya, bukan bahasa yang melekat. Ini adalah bahasa yang nyaman untuk memanggil perpustakaan yang ditulis dalam C atau C ++.

Mengenai kemampuan penyematan Python, kita dapat mengatakan bahwa, misalnya, ada Maya, tempat Python digunakan. Tetapi siapa pun yang melihat plugin Python untuk Maya dari dalam akan setuju dengan kami bahwa mereka tidak terlihat sangat bagus.

Akibatnya, kita dapat mengatakan bahwa Python, untuk semua kekuatannya, tidak cocok untuk kita. Sekarang pertimbangkan JavaScript.

Javascript


JavaScript, tanpa berlebihan, adalah bahasa yang hebat yang benar-benar menguasai dunia.

JavaScript adalah bahasa dinamis yang populer, ditandai dengan kurva belajar yang lembut, dengan fitur yang kaya, kinerja yang baik, dan serangkaian perpustakaan yang luas.

Jika kita membutuhkan penerjemah bahasa untuk membangun mesin permainan, kita dapat menemukan banyak penerjemah semacam itu. Pada kenyataannya, Anda harus memilih dari dua proyek semacam itu - V8 dan WebKit. Keduanya memiliki ukuran yang agak besar. Akibatnya, jika kita berbicara tentang permainan papan, kita dapat mengambil kesempatan dan menyertakan seluruh juru bahasa dalam permainan, tetapi dalam kasus permainan ponsel, opsi ini tidak cocok untuk kita.

SocialQuantum memiliki penerjemah JavaScript sendiri, yang lulus 98% dari tes, kami berencana untuk mentransfer proyek ini ke kategori open source.

Akibatnya, ternyata JavaScript terlihat seperti kandidat kuat untuk peran bahasa yang disematkan, tetapi juga tidak cocok untuk kita.

Haxe


Perlu dicatat bahwa ketika berbicara tentang JavaScript, yang berikutnya biasanya mengingat Haxe. Tetapi, pada kenyataannya, tidak ada gunanya berbicara tentang kemungkinan menggunakan bahasa ini sebagai bahasa yang disematkan, karena Haxe, pada kenyataannya, tidak sebanyak bahasa sebagai trans-kompiler ke bahasa lain. Dan ini bukan yang kita butuhkan.

Mungkin kita puas dengan ActionScript atau bahasa scripting lainnya?

ActionScript


Jika kami secara resmi menganalisis ActionScript untuk kepatuhan dengan persyaratan di atas, maka sepertinya bahasa skrip yang ideal telah ditemukan. Di sampingnya adalah sifat dinamis, popularitas, kemudahan belajar, fitur yang baik, kinerja, ketersediaan perpustakaan, kemudahan penanaman. Bahasa ini dicintai dan diingat dalam industri game, ada tertulis banyak Flash-game yang luar biasa. Masalah utama dengan ActionScript adalah bahasa ini hampir mati. Karena itu, dia juga tidak cocok untuk kita.

AngelScript, Squirrel dan lainnya


Selain ActionScript, ada banyak bahasa scripting seperti AngelScript, Squirrel dan lainnya. Di antara mereka Anda dapat menemukan orang-orang yang, secara formal, hampir sepenuhnya memenuhi persyaratan kami, tetapi biasanya ini adalah bahasa yang terkait dengan pengembang mereka, mereka memiliki beberapa masalah lama yang belum diperbaiki selama bertahun-tahun. Kemungkinan besar, mereka tidak terlalu populer, mereka tidak terdokumentasi dengan baik, ada beberapa materi pelatihan tentang mereka, mereka tidak memiliki komunitas yang sangat besar. Salah satu konsekuensi dari keadaan ini adalah kenyataan bahwa mereka sulit dipelajari - jika hanya karena tidak sepenuhnya jelas - apa itu dan bagaimana mereka bekerja.

Seperti yang Anda lihat, kami belum menemukan bahasa tertanam yang ideal. Bagaimana jika Anda membuat bahasa Anda sendiri?

Buat bahasa Anda sendiri


Ada kemungkinan bahwa bahasa yang dikembangkan dalam perusahaan idealnya sesuai dengan kebutuhannya dan akan mudah dipelajari. Tapi, kemungkinan besar, bahasa seperti itu tidak akan menjadi populer. Bahasa seperti itu akan memiliki jumlah perpustakaan minimal, atau mereka tidak akan ada sama sekali. Selain itu, sulit untuk percaya bahwa dalam kondisi modern dimungkinkan untuk membuat sesuatu yang akan bekerja lebih baik, yang akan memiliki produktivitas lebih besar dan akan lebih mudah diintegrasikan daripada sesuatu yang sudah ada di pasar.

Ada perusahaan yang mengembangkan dan menggunakan bahasa mereka sendiri, di antara mereka ada pemain pasar game yang sukses, tetapi kemungkinan besar ini bukan ide yang baik.

Setelah memeriksa bahasa pemrograman yang ada yang mengklaim tertanam dan membahas gagasan mengembangkan bahasa kita sendiri, mari kita beralih ke Lua.

Lua adalah bahasa tertanam yang kami pilih


Lua adalah bahasa yang dinamis. Ini cukup populer, sebuah komunitas besar telah berkembang di sekitarnya, terutama di bidang pengembangan game. Ini memiliki kurva belajar yang sangat lembut. Misalnya, di perusahaan kami, skrip untuk autotest ditulis dalam Lua. Kursus pengantar standar untuk autotests memakan waktu sekitar dua jam, setelah itu seseorang dapat menggunakan bahasa ini. Pada saat yang sama, Lua adalah bahasa multi-paradigma. Ini mendukung gaya fungsional pemrograman dan OOP. Sebagai hasilnya, ini tidak hanya cocok untuk menyelesaikan beberapa tugas sederhana, tetapi juga untuk hal-hal yang lebih serius yang dilakukan oleh programmer profesional.

Lua memiliki kinerja yang baik dan memiliki beberapa perpustakaan. Tidak sebanyak JavaScript, tetapi, bagaimanapun, di situs web LuaForge Anda dapat menemukan hampir semua yang Anda butuhkan. Dan akhirnya, Lua sangat mudah untuk disematkan, apalagi, itu dibuat untuk digunakan sebagai bahasa yang tertanam.

Sebagai contoh, inilah yang tampak seperti ruang kerja IDE JetBrains IDE CLion kami. Di sini Anda dapat melihat mekanisme pelengkapan otomatis yang dibuat oleh kami untuk Lua, yang kami rencanakan untuk dibuat open source. Kami akan membuat debugger open source.



Lingkungan kerja

Kami memilih Lua, tetapi ketika menggunakannya sebagai bahasa skrip yang dapat diembed, Anda biasanya menemukan keberatan yang sama yang sekarang akan kami pertimbangkan.

Keberatan untuk menggunakan Lua


Lua untuk C, bukan C ++


Tidak ada yang berpendapat bahwa Lua adalah bahasa yang cocok untuk digunakan. Hal utama yang mereka anggap minus adalah bahwa itu dibuat untuk digunakan dengan bahasa C, dan bukan C ++. Karena itu, ketika mencoba menerapkan sesuatu dalam Lua yang ada di C ++ dan bukan di C, kami mengalami masalah. Namun, orang harus mengerti di sini bahwa masalah ini diselesaikan oleh banyak orang yang cukup pintar. Di antara alat yang menyelesaikan masalah menanamkan Lua di C ++ adalah proyek, seperti Luabind, Luabridge, toLua ++, SQLuaHost. Ini bukan daftar lengkap. Mereka memiliki kelebihan dan kekurangan yang berbeda, tetapi, bagaimanapun, kemungkinan besar, semua yang Anda butuhkan sudah diterapkan di salah satu solusi ini.

Pertimbangkan, misalnya, SQLuaHost. Ini adalah ikatan yang dibuat di dalam SocialQuantum, dan yang direncanakan bersifat open source. Keputusan ini mewakili visi kami tentang bagaimana Lua harus mengikat. Oleh karena itu, sangat mungkin bahwa jika Anda tidak menemukan apa yang Anda butuhkan di binder yang ada, Anda akan menemukannya di SQLuaHost.

Lua lambat


Kami sering menemukan pendapat bahwa Lua adalah bahasa yang sangat lambat. Pertama, ini tidak benar. Lua adalah mesin bertumpuk, dan benar-benar tidak ada yang memperlambat di sana. Selain itu, kita harus memahami bahwa dalam bahasa scripting kita biasanya memberikan logika permainan, logika bisnis, dan bukan beberapa hal yang sangat berat. Akibatnya, jika skrip Lua menyebabkan permainan melambat, maka masalahnya mungkin terletak pada pengikatan suboptimal atau penggunaan beberapa fitur bahasa yang tidak tepat. Sebagai contoh, kami melakukan tes sintetis yang LuaJIT lebih cepat daripada Mono. Pada saat yang sama, tidak ada yang mau menulis tentang kode yang tidak optimal tersebut:

function myGame:onUpdate()    local tex = Texture::new(name)    self.background:setTexture(tex) end 

Di sini, di setiap centang game, tekstur baru dibuat dan ditetapkan sebagai latar belakang. Tentu saja, desain seperti itu tidak akan bekerja sangat cepat, tetapi tidak ada yang mau menulis hal-hal seperti itu.

Lua hanya cocok untuk proyek kecil.


Keberatan berikutnya adalah bahwa Lua dibuat untuk menulis beberapa hal kecil dan sesuatu yang besar tidak dapat ditulis dalam bahasa ini. Di satu sisi itu benar. Tetapi bahasa ini sangat modular. Dan dari sekian banyak blok kecil Anda dapat membuat sistem yang cukup besar dan kompleks. Dan jika Anda ingat apa yang telah dikatakan tentang multiparadigma dan OOP, ternyata OOP mendorong pengembang untuk membuat modul kecil yang dapat digunakan untuk membuat struktur besar dan kompleks.

Selain itu, sering pada Lua beberapa modul kecil ditulis dengan cepat, dan dalam industri game "lebih cepat" berarti "lebih murah".

Argumen lain yang menentang Lua


Mengkritik Lua, mereka mengatakan bahwa bahasa itu kuno, bahwa, seperti yang mereka katakan, "di luar kotak" tidak mendukung OOP, bahwa penomoran elemen dalam tabelnya tidak dimulai dengan 0, seperti yang diharapkan dari bahasa yang baik, tetapi dengan 1.


Mereka mengatakan bahwa kekurangannya adalah tidak memiliki operator ternary. Sebenarnya, ada banyak argumen yang menentang Lua, tetapi kami tidak akan membahasnya, karena kami percaya bahwa mereka, sebagian besar, berhubungan dengan kebiasaan dan preferensi pribadi para pengembang.

Ringkasan


Untuk meringkas. Jika tugas Anda adalah mendapatkan bahasa yang tertanam dengan upaya minimal, ambil Lua. Pada saat yang sama, jika Anda memiliki waktu dan sumber daya untuk mengembangkan bahasa Anda sendiri atau binding Anda sendiri - lagi - perhatikan Lua. Mengapa kami merekomendasikan Lua dalam kasus pertama dan kedua?

Dalam kasus pertama, memilih Lua, Anda akan memilih bahasa yang sangat mudah disematkan dan digunakan. Tepat ada satu tutorial tentang bahasa ini yang ditulis oleh penulisnya. Tidak ada buku lain hanya karena yang pertama menceritakan secara mutlak semua yang perlu Anda ketahui tentang Lua, dan tidak ada lagi yang bisa diceritakan tentang itu. Lua bukanlah bahasa yang ideal atau bahasa yang paling luas di dunia, tetapi, berdasarkan kriteria, itu jelas merupakan salah satu bahasa terbaik untuk disematkan. Dia adalah yang terbaik yang kita miliki saat ini. Selain itu, ada banyak alat standar untuk Lua yang sangat menyederhanakan kehidupan mereka yang menggunakannya.

Dalam kasus kedua, jika Anda memiliki sumber daya untuk mengembangkan alat, memilih Lua, Anda dapat benar-benar menghabiskan sumber daya ini, karena Lua, terlepas dari popularitasnya di lingkungan pengembangan game, bahasanya sangat diremehkan. Sebagai hasilnya, Anda akan memiliki kesempatan, mengambil Lua sebagai dasar, untuk memperhitungkan kebutuhan Anda dan mendapatkan apa yang Anda butuhkan.

Source: https://habr.com/ru/post/id428253/


All Articles