1 poin oleh GN⁺ 2024-12-27 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2024-12-27
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

    • Varian berorientasi objek COBOL punya stigma bercanda bahwa namanya berbentuk merepotkan seperti ADD ONE TO COBOL YIELDING COBOL
      Meski begitu, tidak seperti FORTRAN lama yang mengabaikan spasi, tidak ada kasus DO 10 I=1.10 diam-diam dikompilasi sebagai assignment DO10I = 1.10, bukan error sintaks loop. Padahal kode yang dimaksud mungkin DO 10 I=1,10
    • Wawasan seperti ini bagus
      Kalau 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?”

    • Fakta bahwa proyek SMA-mu memakai COBOL huruf kapital benar-benar pas dengan nuansa zamannya. Pasti jadi kenangan SMA yang hebat. Semoga semua nama variabelnya memakai nama dewa-dewi Yunani
  • 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

    • Server Minecraft sebenarnya bukan proyek sampingan kecil
      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
    • Menurutku itu tidak sepenuhnya keliru
      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
    • Rust cukup kesulitan menemukan terobosan dalam pengembangan game
      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
    • Pada akhirnya ini terasa seperti perbedaan antara hacker sejati™ yang menyukai bahasa sederhana dan bisa membangun seluruh semesta dengan apa pun yang diberikan, dengan code monkey yang mengejar tren terbaru
      Sebagai catatan, aku memasukkan diriku sendiri ke golongan kedua
    • Orang yang menyelesaikan pekerjaan biasanya tidak terlalu peduli pada kualitas kode
      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

    • Dulu saya pernah bekerja di perusahaan FAANG dan punya akses ke para pakar C++ kelas dunia. Beberapa di antaranya anggota komite standar bahasa internasional
      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
    • Itulah kekuatan COBOL
      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
    • Karena itu saya suka Ada dan VHDL
      Memang bisa agak panjang lebar, tetapi jauh lebih mudah dibaca daripada bahasa-bahasa yang lebih “modern”
    • COBOL dirancang agar juga bisa dipakai dan dibaca oleh orang yang bukan programmer
      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

    • Yang langka bukan programmer Cobol, melainkan orang yang memahami logika bisnis
      Cobol sering dipakai dalam operasi bisnis yang sangat kompleks
    • Seperti yang dikatakan orang lain, yang lebih besar adalah kompleksitas logika bisnis yang sudah ada dan pemahaman terhadap sistem mainframe tempat kode itu biasanya berjalan
      Kalau tidak begitu, cukup buat satu cross-compiler lalu selesai
    • Orang-orang seperti itu bernilai karena sistem yang sangat kompleks dan umumnya tidak terdokumentasi, serta pengetahuan konteks bisnis mereka, lebih daripada kemampuan pemrogramannya
  • COBOL sebenarnya terlihat seperti bahasa yang cukup keren
    Kodenya juga benar-benar tertata rapi

  • Saya suka ada unit test