- CobolCraft adalah server Minecraft yang diimplementasikan dalam COBOL, dan mendukung Minecraft 1.21.4, versi terbaru pada saat penulisan
- Sudah mengimplementasikan pembuatan medan tak terbatas, pemuatan chunk dinamis, penyimpanan data world dan pemain ke disk, impor world yang sudah ada, multiplayer, tampilan status server, penghancuran dan pemasangan blok, inventaris, crafting, pengambilan item, chat, perintah, dan lainnya
- Blok yang memiliki banyak status, arah, dan interaksi membutuhkan banyak kode khusus agar perilakunya terimplementasi dengan benar, dan masih ada banyak blok yang belum didukung
- Dikembangkan dengan GnuCOBOL di Linux x86_64 atau arm64, dan distribusi menggunakan Docker juga dimungkinkan, tetapi dukungan untuk sistem operasi lain seperti Windows belum diuji
- Mengekstrak data JSON dari datapack bawaan Minecraft serta
.jar server dan klien resmi, lalu menggunakannya untuk pembuatan kode COBOL saat kompilasi dan pemuatan data saat runtime
Fitur server Minecraft yang diimplementasikan CobolCraft
- CobolCraft adalah server Minecraft yang ditulis dalam COBOL dan mendukung Minecraft 1.21.4
- Fitur yang sudah diimplementasikan mencakup:
- Pembuatan medan tak terbatas dan pemuatan chunk dinamis
- Penyimpanan data world dan pemain ke disk
- Dukungan format file Minecraft dan impor world yang sudah ada
- Multiplayer dengan jumlah pemain bersamaan yang dapat dikonfigurasi
- Ping/server status agar terlihat online di daftar server
- Penghancuran dan pemasangan blok, serta kode loot table yang dibuat otomatis
- Interaksi blok berbasis klik kanan
- Inventaris pemain
- Crafting 2x2 dan 3x3
- Entitas item dan pengambilan item
- Chat
- Perintah dalam game dan perintah konsol interaktif
- Konfigurasi berbasis
server.properties
- Whitelist persisten yang disimpan di
whitelist.json
- Tabrakan blok-pemain dan fisika entitas yang sangat dasar
- Damage jatuh, damage void, kematian, respawn
Cakupan dan batasan dukungan blok
- Blok yang memiliki banyak status, arah, dan interaksi membutuhkan banyak kode terspesialisasi agar berperilaku dengan benar
- Masih ada banyak blok yang belum didukung
- Blok yang berfungsi mencakup:
- torches
- slabs
- stairs
- rotated pillars seperti logs
- buttons non-interaktif
- doors
- trapdoors
- beds
- signs
Build dan lingkungan eksekusi
- CobolCraft dikembangkan dengan GnuCOBOL dan ditujukan untuk berjalan di Linux
- Arsitektur target adalah x86_64 dan arm64
- Dukungan untuk sistem operasi lain seperti Windows belum diuji
- Dengan Docker, distribusi lintas platform dimungkinkan
- Hal-hal yang diperlukan untuk distribusi Linux adalah:
- GnuCOBOL 3.1.2 atau lebih baru
- GnuCOBOL 3.2 atau lebih baru disarankan demi performa
make
gcc, g++
zlib
curl untuk mengunduh .jar server resmi
- Java 21 atau lebih baru untuk mengekstrak data dari
.jar server
- Perintah build dan menjalankannya adalah sebagai berikut:
make --jobs=$(nproc)
make run
- Dapat dijalankan menggunakan image Docker Hub atau dengan membangunnya sendiri
docker pull meyfa/cobolcraft:latest
git clone https://github.com/meyfa/CobolCraft.git cobolcraft && cd cobolcraft
docker build --tag meyfa/cobolcraft .
Konfigurasi server dan akses jaringan
- Konfigurasi server dilakukan dengan mengubah file
server.properties
- File ini dibuat otomatis saat pertama kali dijalankan, lengkap dengan nilai default untuk semua opsi yang didukung
server-port: default 25565
level-name: default "world"
white-list: default false
motd: default "CobolCraft"
max-players: default 10, maksimum 100
- Secara default, server hanya dapat diakses dari sistem sendiri melalui
localhost:25565
- Agar dapat diakses dari luar, seperti jaringan lokal, VPN, port forwarding, atau server sewaan, port dapat di-bind ke
0.0.0.0:25565:25565 saat menjalankan Docker
docker run --rm -it -p 0.0.0.0:25565:25565 meyfa/cobolcraft
Alasan membuat server Minecraft dengan COBOL
- Pengembang sebelumnya sama sekali tidak punya pengalaman dengan COBOL, tetapi setelah melihat rumor dan stigma tentang COBOL, ia ingin mengenal bahasa ini lebih jauh
- Ia memilih cara belajar terbaik dengan menulis sesuatu sendiri
- Karena kompleksitas dan skala kode Minecraft, pilihan menulis server Minecraft dalam COBOL dinilainya sebagai ide yang baik sekaligus buruk
- Pekerjaan yang mudah di bahasa lain harus dibuat dari awal
- Parsing dan encoding JSON
- Pemrosesan berbagai jenis data biner
- Networking multiplayer real-time
- Memindahkan sistem Minecraft yang berorientasi objek ke bahasa prosedural
- Kurva belajar yang curam membuatnya meneliti dan memahami COBOL beserta konsepnya secara mendalam, dan ia menyatakan proses itu terasa memuaskan
- Untuk orang yang baru menggunakan COBOL, ia merekomendasikan GnuCOBOL Programmer's Guide
- Untuk materi belajar protokol Minecraft, dapat merujuk ke dokumentasi wiki.vg
- Dalam beberapa kasus, melihat trafik server nyata dengan alat seperti Wireguard juga dapat membantu memahami aliran informasi
Struktur sumber dan binary eksekusi
- Kode sumber COBOL terutama berada di direktori
src/
src/main.cob adalah entry point
src/server.cob berisi kode startup server dan logika game
- Direktori
codegen/ berisi generator kode yang ditulis dalam COBOL
- Menghasilkan kode sumber tambahan dari data JSON seperti datapack bawaan Minecraft
- Direktori
cpp/ berisi sumber C++ untuk integrasi sistem operasi yang sulit ditangani dengan COBOL
- Manajemen socket TCP tingkat rendah
- Timing presisi
- Penanganan sinyal proses
- Semua sumber COBOL dan C++ dikompilasi menjadi satu binary
cobolcraft
Ekstraksi data Minecraft dan pemrosesan JSON
- Aplikasi server dan klien resmi Minecraft Java Edition berisi banyak data
- Blok, item, tipe entitas
- biomes
- ID protocol paket
- tags seperti blok yang dapat ditambang dengan pickaxe
- recipes
- loot tables yang menunjukkan item apa yang jatuh dalam kondisi apa saat sebuah blok dihancurkan
Makefile CobolCraft memiliki target untuk mengunduh .jar resmi dan mengekstrak data sebagai JSON
- Data JSON yang diekstrak digunakan dengan dua cara
- Membuat kode COBOL seperti loot table blok secara otomatis saat kompilasi
- Memuat data ke memori saat runtime
- Kedua pekerjaan ini menggunakan parser JSON umum yang ditulis dalam COBOL dan sudah diuji unit
Pengujian dan pembaruan
- Unit test berada di direktori
tests/
- Pengujian menggunakan framework test kustom berbasis copybook
- Melacak test suite, unit, dan assertion
- Memberikan ringkasan di akhir eksekusi
- Perintah untuk menjalankan test adalah
make test
- Tujuan utama pengujian adalah memverifikasi area yang sulit di-debug seperti encoding dan decoding JSON serta data biner
- Pengujian logika game itu sendiri dianggap tidak sepenting itu
- Prosedur dan tahap pengujian untuk memperbarui server ke versi Minecraft baru ada di
Updating.md
Lisensi dan merek dagang
- CobolCraft didistribusikan dengan MIT License
- “Minecraft” adalah merek dagang Mojang Synergies AB
- CobolCraft bukan proyek yang berafiliasi dengan Mojang atau didukung oleh Mojang
1 komentar
Komentar Hacker News
Ada banyak rumor dan stigma seputar COBOL; akan menarik kalau dituliskan wawasan apa yang sebenarnya didapat
Aku juga selama ini cuma mendengar cerita-cerita semacam itu, dan penasaran apa saja yang dihadapi seorang pemula COBOL saat mengimplementasikan proyek pertama yang cukup kompleks
Meski begitu, tidak seperti FORTRAN lama yang mengabaikan spasi, tidak ada kasus
DO 10 I=1.10diam-diam dikompilasi sebagai assignmentDO10I = 1.10, bukan error sintaks loop. Padahal kode yang dimaksud mungkinDO 10 I=1,10Kalau tertarik, ada catatan dari pembuatan compiler dari COBOL ke C# di sini: https://github.com/otterkit/otterkit-cobol/issues/40
Sekarang aku yakin COBOL hanyalah assembler tingkat tinggi
Keren sekali
Untuk proyek kelulusan SMA, aku membuat sistem COBOL lengkap yang mengotomatisasi odds taruhan sepak bola. Teknologinya sudah ketinggalan zaman, tapi sekolahku belum mengejar perkembangan zaman
Benar-benar tidak cocok, tapi aku menyukai setiap barisnya. Ada kepuasan aneh pada bahasa yang setiap kali diketik seolah berbisik, “ingat kartu berlubang?”
Mungkin aku keliru, tapi rasanya cukup sering melihat proyek sampingan kecil namun mengesankan yang ditulis dengan bahasa sederhana dan biasa seperti C, atau COBOL dalam kasus ini
Sebaliknya, proyek Rust yang serupa sering terlihat punya jumlah baris kode sekitar 10 kali lipat tapi nyaris tidak berjalan
Hipotesisku: bahasa yang sederhana memudahkan kita menangkap ide dengan cepat seperti blueprint dan membuat codebase yang berantakan sekalipun berjalan dulu. Sementara bahasa modern memaksa kita menulis kode yang lebih tahan lama. Atau mungkin bahasa modern memang melakukan sesuatu yang salah
Ada server yang sudah dikembangkan 3–5 tahun tapi belum selesai, dan ada juga yang berfokus pada fitur tertentu untuk pameran redstone seperti https://github.com/MCHPR/MCHPRS
Server COBOL ini belum mengimplementasikan pemrosesan pencahayaan, dan karena spawning mob juga bergantung padanya, itu termasuk salah satu bagian tersulit. Beberapa block juga belum sepenuhnya diimplementasikan. Menyelesaikan server Minecraft membutuhkan bertahun-tahun, jadi membuat sesuatu dengan cepat tidak selalu merupakan jalan terbaik
Aku sedang mengerjakan 2 game dengan Rust, dan kalau memilih engine yang tepat, prototipe gameplay yang sangat minimal cukup mudah dibuat. Namun semakin banyak fitur ditambahkan, kodenya membengkak besar, dan proses mengubah single-player menjadi multiplayer berantakan total. Aku juga membuang waktu mengikuti tren lalu menghapusnya lagi
Rust benar-benar tidak menyukai struktur graf yang saling terhubung secara kompleks seperti objek-objek game. Setiap kali satu event game memicu pembaruan pada berbagai tipe, muncul gesekan. Opsinya bisa saja menerima itu dan menulis sedikit lebih banyak kode, atau mencari solusi sistematis yang menulis lebih banyak kode di awal tapi menghemat waktu nanti
Aku memilih yang kedua dan melakukan beberapa eksperimen, tetapi titik impasnya terasa terlalu jauh untuk proyek kecil dengan titik impas 1
Bahkan dalam bahasa yang sama pun perbedaannya bisa lebih dari satu digit. Di Rust ada 2 engine 3D yang layak dipakai; satu terkenal, punya banyak kontributor, dan mendapat pendanaan yang cukup untuk menggantikan gaji Bay Area. Yang lain hampir dibuat oleh satu orang, yang bertahan dengan tabungan atau bergantian bekerja penuh waktu
Namun engine pertama sangat fokus pada promosi dan sudah bertahun-tahun menjanjikan banyak fitur tetapi sedikit yang terlihat, sedangkan yang kedua unggul baik dalam jumlah fitur maupun kualitas implementasi
Pada akhirnya menurutku ini soal sikap. Ada orang yang coding untuk bersenang-senang, orang yang punya tujuan jelas dan fokus mencapainya, orang yang melakukannya demi uang, dan orang yang tertarik pada pengakuan publik. Codebase berantakan tidak selalu diperlukan, tetapi ada wilayah tengah yang produktif. Semakin seseorang fokus pada pamer, semakin mudah ia mengejar tren dan arsitektur yang mencolok
Premis inti Rust adalah menukar kecepatan pengembangan dan fleksibilitas dengan keamanan memori, tetapi dalam pengembangan game ternyata kecepatan pengembangan dan fleksibilitas jauh lebih penting daripada keamanan memori
Jika yang dibuat adalah microkernel dengan spesifikasi formal yang blueprint-nya sudah sangat rinci, Rust bisa menjadi pilihan bagus. Sebaliknya, jika perlu cepat melempar lumpur ke dinding untuk melihat gameplay seperti apa yang menyenangkan, Rust membuat proses itu lebih sulit dibanding hampir semua bahasa lain, dengan keuntungan yang juga tidak jelas. Hasilnya hanya potongan gameplay cepat dan berantakan yang dibuat dalam waktu lebih lama dan sedikit lebih aman dari sisi memori
Aku bukan satu-satunya orang yang setelah mencoba pengembangan game dengan Rust kemudian benar-benar meninggalkannya untuk penggunaan itu. Misalnya ada “Leaving Rust gamedev after 3 years” [0], yang sampai sekarang termasuk salah satu tulisan terkait Rust di Hacker News yang paling banyak didiskusikan dan disukai
Secara lebih luas, jelas Rust mendapat perhatian yang jauh lebih berlebihan daripada Cobol. Karena itu ada banyak contoh developer yang rentan terhadap hype—biasanya pemula yang antusias—dengan berani mencoba proyek open source atau hobi menggunakan Rust. Sebaliknya, menulis server Minecraft dengan Cobol butuh sedikit lebih banyak keunikan dan nyali, dan itu umumnya terkait dengan lebih banyak pengalaman
[0] https://news.ycombinator.com/item?id=40172033
Sebagai catatan, aku memasukkan diriku sendiri ke golongan kedua
Pernah ada masa ketika karena berusaha menulis kode yang tahan lama, pada akhirnya aku tidak menyelesaikan apa pun. Selama bertahun-tahun aku menemukan keseimbangan, belajar bahwa kode sampah yang diperbaiki berulang-ulang pada akhirnya berubah menjadi sesuatu yang layak, dan sejak itu aku melakukannya seperti itu
https://raw.githubusercontent.com/meyfa/CobolCraft/main/src/...
Bagi orang yang punya latar belakang bahasa prosedural, sebenarnya tidak terlalu sulit dipahami, dan sedikit mengingatkan saya pada server gim yang ditulis dengan VB yang pernah saya lihat sekitar 20 tahun lalu
Sejak berhenti memakai COBOL pada 1978, saya tidak pernah mau mengakui bahwa saya tahu bahasa ini
Saya berharap tidak melihat kode ini, lalu membuat tanda salib dan pergi minum kopi kental :-)
Meski begitu, mengesankan bahwa ini berhasil dibuat
Boleh saja diejek, tetapi kodenya cukup mudah dibaca
Berbeda dengan beberapa bahasa modern yang membuat kita harus menatapnya selama beberapa menit untuk memahami apa yang terjadi
Saya pernah bertanya di daftar C++ internal apakah satu baris kode tertentu akan menyebabkan memory leak; itu kode yang murni memakai template STL dan type casting. Namun para pakar tidak bisa mencapai kesepakatan apakah yang saya lakukan benar. Ada yang bilang akan terjadi leak, ada yang berpendapat tidak
Kisah kecil nyata ini mengatakan banyak hal tentang C++. JavaScript juga penuh dengan hal-hal seperti ini
Saya mulai memprogram pada 1976, belajar COBOL dan ICL PLAN, memakai kartu berlubang, lalu setelah selesai pelatihan memakai terminal. Programnya 100% program batch
Ada bias yang sangat kuat terhadap keterbacaan, agar siapa pun bisa membaca dan memahami source code. Namun keterbacaan itu agak terimbangi oleh keharusan membaca dan memahami core dump yang dihasilkan ketika program gagal. Paling bagus, kegagalan bisa dilacak sampai baris kode tertentu, sehingga kebiasaan menjalankan program di kepala menjadi tertanam
Ketika saya meninggalkan instansi pemerintah dan pindah ke pemrograman komersial, sampai awal 80-an pun masih tetap COBOL dan program batch. Saya menjalani dukungan malam selama 3 tahun, dan di situlah nilai COBOL terlihat. Bahkan ketika mengambil listing dan core dump yang belum pernah saya lihat, biasanya saya bisa memperbaikinya cukup cepat. Tentu saja selalu dengan catatan bahwa itu perbaikan taktis
Memang bisa agak panjang lebar, tetapi jauh lebih mudah dibaca daripada bahasa-bahasa yang lebih “modern”
Setidaknya secara teori begitu
MOVE FUNCTION MIN(BLOCK-ENTRY-MINIMUM-STATE-ID(LK-BLOCK), STATE-ID) TO BLOCK-ENTRY-MINIMUM-STATE-ID(LK-BLOCK)Saat SMA, saya belajar sedikit COBOL di sebuah kota kecil di Pakistan
Tidak buruk, dan saya mengerjakan proyek yang meniru laporan keuangan. Memang ada sisi-sisi aneh, tetapi bagi kebanyakan manusia, yakni non-programmer, bahasa pemrograman apa pun mungkin cukup aneh, jadi saya kurang paham stigma yang melekat pada COBOL
Pada periode yang sama saya juga belajar C, dan yang itu terus bertahan :-)
Saya selalu mendengar bahwa programmer Cobol langka sehingga mendapat gaji tinggi
Saya penasaran apakah proyek ini membuat tawaran kerja berdatangan
Cobol sering dipakai dalam operasi bisnis yang sangat kompleks
Kalau tidak begitu, cukup buat satu cross-compiler lalu selesai
COBOL sebenarnya terlihat seperti bahasa yang cukup keren
Kodenya juga benar-benar tertata rapi
Saya suka ada unit test