1 puan yazan GN⁺ 2024-12-27 | 1 yorum | WhatsApp'ta paylaş
  • CobolCraft, COBOL ile hayata geçirilmiş bir Minecraft sunucusu ve yazının hazırlandığı tarihte en güncel sürüm olan Minecraft 1.21.4 desteği sunuyor
  • Sonsuz arazi üretimi, dinamik chunk yükleme, dünya·oyuncu verilerinin diske kaydedilmesi, mevcut dünyaların içe aktarılması, çok oyunculu destek, sunucu durumunun gösterilmesi, blok kırma·yerleştirme, envanter, crafting, eşya toplama, sohbet ve komutlar gibi özellikler şimdiden uygulanmış durumda
  • Birden fazla durum, yön ve etkileşime sahip bloklar için doğru davranışı uygulamak adına çok sayıda özel kod gerekiyor ve henüz desteklenmeyen blok sayısı hâlâ fazla
  • Linux x86_64 veya arm64 üzerinde GnuCOBOL ile geliştirildi; Docker ile dağıtım da mümkün, ancak Windows gibi diğer işletim sistemleri için destek test edilmedi
  • Minecraft'ın varsayılan datapack'inden ve resmi sunucu·istemci .jar dosyalarından JSON verileri çıkarılıyor; bunlar derleme sırasında COBOL kodu üretmek ve çalışma zamanında veri yüklemek için kullanılıyor

CobolCraft'ın uyguladığı Minecraft sunucu özellikleri

  • CobolCraft, COBOL ile yazılmış bir Minecraft sunucusu ve Minecraft 1.21.4'ü destekliyor
  • Uygulanan özellikler şunları içeriyor
    • sonsuz arazi üretimi ve dinamik chunk yükleme
    • dünya ve oyuncu verilerinin diske kaydedilmesi
    • Minecraft dosya biçimi desteği ve mevcut dünyaların içe aktarılması
    • eşzamanlı bağlanabilecek oyuncu sayısının ayarlanabildiği çok oyunculu yapı
    • sunucu listesinde çevrimiçi görünmeyi sağlayan ping/server status
    • blok kırma ve yerleştirme, otomatik üretilmiş loot table kodu
    • sağ tık tabanlı blok etkileşimleri
    • oyuncu envanteri
    • 2x2 ve 3x3 crafting
    • eşya varlıkları ve eşya toplama
    • sohbet
    • oyun içi komutlar ve etkileşimli konsol komutları
    • server.properties tabanlı yapılandırma
    • whitelist.json içinde saklanan kalıcı whitelist
    • çok temel düzeyde blok·oyuncu çarpışmaları ve entity fiziği
    • düşme hasarı, void hasarı, ölüm ve yeniden doğma

Blok desteğinin kapsamı ve sınırlamaları

  • Birden fazla durum, yön ve etkileşime sahip bloklar için doğru davranışın sağlanması adına özelleşmiş kod yoğun biçimde gerekiyor
  • Henüz desteklenmeyen çok sayıda blok var
  • Çalışan bloklar arasında şunlar yer alıyor
    • torches
    • slabs
    • stairs
    • logs gibi rotated pillars
    • etkileşimsiz buttons
    • doors
    • trapdoors
    • beds
    • signs

Derleme ve çalışma ortamı

  • CobolCraft, GnuCOBOL ile geliştirildi ve Linux üzerinde çalışmayı hedefliyor
    • hedef mimariler x86_64 ve arm64
    • Windows gibi diğer işletim sistemleri için destek test edilmedi
    • Docker kullanıldığında platformdan bağımsız dağıtım mümkün
  • Linux dağıtımı için gerekenler şunlar
    • GnuCOBOL 3.1.2 veya üzeri
    • performans açısından GnuCOBOL 3.2 veya üzeri öneriliyor
    • make
    • gcc, g++
    • zlib
    • resmi sunucu .jar dosyasını indirmek için gereken curl
    • sunucu .jar dosyasından veri çıkarmak için gereken Java 21 veya üzeri
  • Derleme ve çalıştırma komutları şöyle
make --jobs=$(nproc)
make run
  • Docker Hub imajı kullanılabilir ya da doğrudan derlenip çalıştırılabilir
docker pull meyfa/cobolcraft:latest

git clone https://github.com/meyfa/CobolCraft.git cobolcraft && cd cobolcraft
docker build --tag meyfa/cobolcraft .

Sunucu yapılandırması ve ağ erişimi

  • Sunucu yapılandırması server.properties dosyası düzenlenerek yapılır
  • Bu dosya ilk çalıştırmada, desteklenen tüm seçeneklerin varsayılan değerleriyle birlikte otomatik olarak oluşturulur
    • server-port: varsayılan 25565
    • level-name: varsayılan "world"
    • white-list: varsayılan false
    • motd: varsayılan "CobolCraft"
    • max-players: varsayılan 10, en fazla 100
  • Varsayılan olarak sunucuya yalnızca kendi sisteminizden localhost:25565 üzerinden erişilebilir
  • Yerel ağ, VPN, port yönlendirme, kiralık sunucu gibi yollarla dışarıdan erişim sağlamak için Docker çalıştırılırken port 0.0.0.0:25565:25565 olarak bağlanabilir
docker run --rm -it -p 0.0.0.0:25565:25565 meyfa/cobolcraft

Neden COBOL ile bir Minecraft sunucusu yapıldı?

  • Geliştiricinin daha önce hiç COBOL deneyimi yoktu; ancak COBOL hakkındaki söylentiler ve damgalamalar nedeniyle dili daha yakından tanımak istedi
  • Dili öğrenmenin en iyi yolu olarak doğrudan bir şeyler yazmayı seçti
  • Minecraft kodunun karmaşıklığı ve ölçeği nedeniyle COBOL ile Minecraft sunucusu yazma kararını hem iyi hem kötü bir fikir olarak değerlendiriyor
  • Diğer dillerde kolay olan bazı işleri sıfırdan kurmak zorunda kaldı
    • JSON ayrıştırma ve kodlama
    • çeşitli ikili veri türlerinin işlenmesi
    • gerçek zamanlı çok oyunculu ağ iletişimi
    • nesne yönelimli Minecraft sistemlerini prosedürel bir dile aktarma
  • Keskin öğrenme eğrisi, COBOL'u ve kavramlarını derinlemesine araştırıp anlamasını sağladı; bunun da ödüllendirici bir süreç olduğunu belirtiyor
  • COBOL'u ilk kez kullananlara GnuCOBOL Programmer's Guide öneriliyor
  • Minecraft protokolünü öğrenmek için wiki.vg documentation kaynağına bakılabilir
  • Duruma göre Wireguard gibi araçlarla gerçek sunucu trafiğini incelemek, bilgi akışını anlamaya yardımcı olabilir

Kaynak yapısı ve çalıştırılabilir ikili dosya

  • COBOL kaynak kodu ağırlıklı olarak src/ dizininde bulunuyor
    • src/main.cob giriş noktası
    • src/server.cob içinde sunucu başlatma kodu ve oyun mantığı yer alıyor
  • codegen/ dizininde COBOL ile yazılmış bir kod üretici bulunuyor
    • Minecraft varsayılan datapack'i gibi JSON verilerinden ek kaynak kod üretiyor
  • cpp/ dizininde, COBOL ile yönetilmesi zor işletim sistemi entegrasyonları için C++ kaynakları bulunuyor
    • düşük seviyeli TCP soket yönetimi
    • hassas zamanlama
    • süreç sinyali işleme
  • Tüm COBOL ve C++ kaynakları tek bir cobolcraft ikili dosyası olarak derleniyor

Minecraft verisi çıkarma ve JSON işleme

  • Resmi Minecraft Java Edition sunucu ve istemci uygulamalarında çok sayıda veri bulunuyor
    • blok, eşya, entity türleri
    • biomes
    • paket protocol ID'leri
    • kazmayla çıkarılabilen bloklar gibi tags
    • recipes
    • blok kırıldığında hangi koşullarda hangi eşyanın düştüğünü gösteren loot tables
  • CobolCraft'ın Makefile dosyasında resmi .jar dosyalarını indiren ve verileri JSON olarak çıkaran hedefler bulunuyor
  • Çıkarılan JSON verileri iki şekilde kullanılıyor
    • derleme sırasında blok loot table'ları gibi COBOL kodlarının otomatik üretilmesi
    • çalışma zamanında verilerin belleğe yüklenmesi
  • Her iki iş de COBOL ile yazılmış ve birim testleri tamamlanmış genel amaçlı bir JSON ayrıştırıcısı kullanıyor

Testler ve güncellemeler

  • Birim testleri tests/ dizininde yer alıyor
  • Testler, copybook tabanlı özel bir test çerçevesi kullanıyor
    • test suite, unit ve assertion'ları izliyor
    • çalıştırma sonunda bir özet sunuyor
  • Test çalıştırma komutu make test
  • Testlerin temel amacı, hata ayıklaması zor olan JSON·ikili veri kodlama ve kod çözme gibi alanları doğrulamak
  • Oyun mantığının kendisini test etmek o kadar önemli görülmüyor
  • Sunucuyu yeni Minecraft sürümüne güncelleme prosedürü ve test adımları Updating.md içinde yer alıyor

Lisans ve ticari marka

  • CobolCraft, MIT License ile dağıtılıyor
  • “Minecraft”, Mojang Synergies AB'nin ticari markasıdır
  • CobolCraft, Mojang ile bağlantılı değildir ve Mojang tarafından onaylanmış bir proje değildir

1 yorum

 
GN⁺ 2024-12-27
Hacker News yorumları
  • COBOL’un etrafında çok söylenti ve damga var; gerçekte ne tür içgörüler edindiğini yazsa iyi olurdu
    Ben de hep bu tür şeyler duydum ve COBOL’a yeni başlayan birinin epey karmaşık bir ilk projeyi hayata geçirirken nelerle karşılaştığını merak ediyorum

    • COBOL’un nesne yönelimli varyantının adının ADD ONE TO COBOL YIELDING COBOL gibi hantal bir şey olduğu yönünde şaka yollu bir damgası var
      Yine de eski FORTRAN gibi boşlukları yok sayıp DO 10 I=1.10 ifadesini döngü sözdizimi hatası olarak değil de DO10I = 1.10 ataması olarak sessizce derlemesi gibi bir durum yoktu. Oysa amaçlanan kod muhtemelen DO 10 I=1,10 idi
    • Bu tür içgörüler güzel
      İlgilenirseniz, COBOL’dan C#’a giden bir derleyici yaparken edinilenler burada: https://github.com/otterkit/otterkit-cobol/issues/40
      Artık COBOL’un sadece yüksek seviyeli bir assembler olduğuna ikna oldum
  • Gerçekten harika
    Lise bitirme projesi olarak futbol bahis oranlarını otomatikleştiren tam bir COBOL sistemi yapmıştım. Zaten modası geçmiş bir teknolojiydi ama okul henüz çağı yakalayamamıştı
    Akıl almaz derecede uyumsuzdu ama her satırını seviyordum. Yazarken “delikli kartları hatırlıyor musun?” diye fısıldayan bir dilde garip biçimde tatmin edici bir yan var

    • Lise projesinde büyük harfli COBOL kullanmış olman gerçekten dönemin ruhuna çok uygun. Harika bir lise anısı olmuştur. Umarım tüm değişken adlarını Yunan tanrılarından seçmişsindir
  • Yanılıyor olabilirim ama C ya da buradaki COBOL gibi basit ve sıradan dillerle yazılmış küçük ama etkileyici yan projeleri oldukça sık görüyor gibiyim
    Buna karşılık benzer Rust projeleri, kod satırı sayısı yaklaşık 10 kat olmasına rağmen çoğu zaman neredeyse çalışmıyor gibi görünüyor
    Benim hipotezim, basit bir dilin fikri hızlıca bir taslak gibi yakalamayı ve dağınık bir kod tabanı olsa bile en azından çalışır hale getirmeyi kolaylaştırdığı. Modern diller ise daha uzun ömürlü kod yazmaya zorluyor. Ya da belki modern diller bir şeyi yanlış yapıyordur

    • Minecraft sunucusu, tam olarak küçük bir yan proje sayılmaz
      3-5 yıldır geliştirildiği hâlde bitmemiş sunucular var; https://github.com/MCHPR/MCHPRS gibi yalnızca redstone gösterimleri için belirli işlevlere odaklananlar da var
      Bu COBOL sunucusu henüz aydınlatma işlemeyi uygulamamış ve mob üretimi de buna bağlı olduğu için bu en zor kısımlardan biri. Bazı bloklar da tamamen uygulanmış değil. Bir Minecraft sunucusunu bitirmek için yıllar gerekir; bu yüzden hızlıca bir şeyler yapmak her zaman iyi yol değil
    • Bunun mutlaka bir yanılgı olduğunu düşünmüyorum
      Rust ile üzerinde çalıştığım 2 oyun var; uygun motoru seçince son derece minimal bir oynanış prototipi yapmak oldukça kolaydı. Ama özellik ekledikçe kod ciddi biçimde şişti ve tek oyunculudan çok oyunculuya geçiş tam bir karmaşaydı. Modanın peşinden gidip sonra onu geri sökmekle de zaman kaybettim
      Rust, oyun nesnelerinin karmaşık biçimde birbirine bağlı grafik yapılarından gerçekten hoşlanmıyor. Tek bir oyun olayının birden fazla türde güncellemeye yol açtığı her durumda sürtünme çıkıyor. Bunu kabullenip biraz daha fazla kod yazmak bir seçenekti; başta daha çok kod yazsam da sonradan zaman kazandıracak sistemli bir çözüm bulmak da bir seçenekti
      İkincisini seçip birkaç deneme yaptım ama başa baş noktasının tek kişilik küçük projelere uygun olmayacak kadar uzakta olduğunu hissediyorum
      Aynı dil içinde bile fark bir basamaktan fazla olabilir. Rust’ta kullanılabilir 2 tane 3D motor var; biri ünlü, çok katkıcısı var ve Bay Area maaşını ikame edebilecek sponsorluk da alıyor. Diğerini ise neredeyse tek kişi yapıyor; birikimleriyle idare etmekle tam zamanlı iş arasında gidip geliyor
      Buna rağmen ilk motor tanıtıma çok odaklanıyor, yıllardır birçok özellik vaat ediyor ama gösterdiği az; ikincisi ise hem özellik sayısı hem uygulama kalitesi açısından önde
      Sonuçta bunun tavır farkı olduğunu düşünüyorum. Eğlenmek için kod yazanlar var, net bir hedef koyup ona ulaşmaya odaklananlar var, para için yapanlar var, kitlesel takdirin cazibesine kapılanlar var. Dağınık bir kod tabanı şart değil ama üretken bir orta yol var. Gösterişe odaklananlar, modaların ve süslü mimarilerin peşine daha kolay düşüyor
    • Rust, oyun geliştirmede çıkış yakalamakta epey zorlandı
      Rust’ın temel önermesi geliştirme hızı ve esnekliği bellek güvenliğiyle takas etmek; ancak oyun geliştirmede geliştirme hızı ve esnekliğin bellek güvenliğinden çok daha önemli olduğu ortaya çıktı
      Ayrıntılarına kadar taslağı çıkarılmış biçimsel tanıma sahip bir mikroçekirdekse Rust harika bir seçim olabilir. Buna karşılık neyin eğlenceli bir oynanışa dönüşeceğini görmek için duvara hızlıca çamur fırlatmanız gerekiyorsa Rust, bu süreci neredeyse her dilden daha zor hale getiriyor ve avantajı da belirgin değil. Daha uzun sürede yaptığınız hızlı ve dağınık oynanış parçasının biraz daha bellek güvenli olması gibi
      Rust ile oyun geliştirmeyi denedikten sonra o kullanım için kesin olarak bırakan tek kişi ben değilim. Örneğin “Leaving Rust gamedev after 3 years” [0] var ve bugüne kadar Rust ile ilgili Hacker News yazıları arasında en çok tartışılan ve beğenilenlerden biri
      Daha geniş bakınca Rust’ın Cobol’dan çok daha fazla abartılı ilgi gördüğü açık. Bu yüzden abartı dalgalarına açık geliştiricilerin, genellikle hevesli yeni başlayanların, Rust ile açık kaynak ya da hobi projelerine cesurca giriştiği çok örnek var. Buna karşılık Cobol ile Minecraft sunucusu yazmak biraz daha fazla tuhaflık ve cesaret ister; bu da genelde daha fazla deneyimle bağlantılıdır
      [0] https://news.ycombinator.com/item?id=40172033
    • Sonuçta basit dilleri seven ve eline ne verilirse verilsin tüm evreni inşa eden gerçek hacker™ ile son trendlerin peşinden giden kod maymunu arasındaki fark gibi
      Bu arada ben kendimi ikinci gruba koyuyorum
    • İşleri bitiren insanlar genellikle kod kalitesini çok fazla umursamaz
      Uzun ömürlü kod yazmaya çalışırken bir noktada hiçbir şeyi bitiremez hale geldiğim olmuştu. Yıllar içinde dengeyi buldum; çöp gibi kodu tekrar tekrar iyileştirince sonunda düzgün bir şeye dönüştüğünü öğrendim ve o zamandan beri böyle yapıyorum
  • https://raw.githubusercontent.com/meyfa/CobolCraft/main/src/...
    Prosedürel dil geçmişi olan biri için aslında o kadar da anlaşılması zor değil; bana yaklaşık 20 yıl önce gördüğüm VB ile yazılmış oyun sunucularını biraz hatırlattı

  • 1978’de COBOL kullanmayı bıraktığımdan beri bu dili bildiğimi bile asla kabul etmedim
    Bu koda bakmamayı umarak istavroz çıkarıp koyu bir kahve içmeye gidiyorum :-)
    Yine de bunu başarmış olmaları etkileyici

  • Dalga geçebilirsiniz ama kod oldukça okunabilir
    Ne olduğunu anlamak için dakikalarca bakmanız gereken bazı modern dillerle kıyaslayınca böyle

    • Bir dönem bir FAANG şirketinde çalıştım ve dünya çapında C++ uzmanlarına erişimim vardı. Bazıları uluslararası dil standardı komitesindeydi
      Dahili C++ listesinde, belirli bir kod satırının bellek sızıntısı oluşturup oluşturmayacağını sordum; tamamen STL şablonları ve tür dönüşümleri kullanan bir koddu. Ama uzmanlar bunu doğru yapıp yapmadığım konusunda uzlaşamadı. Sızıntı olacağını söyleyen de vardı, olmayacağını düşünen de
      Bu küçük gerçek hikâye C++ hakkında çok şey anlatıyor. JavaScript de bu tür şeylerle dolu
    • COBOL’un güçlü yanı buydu
      1976’da programlamaya başladım; COBOL ve ICL PLAN öğrendim, delikli kartlar kullandım, eğitimimi tamamladıktan sonra terminallere geçtim. Programlar %100 toplu işlem programlarıydı
      Kaynak kodu herkes okuyup anlayabilsin diye okunabilirliğe çok güçlü bir eğilim vardı. Ancak bir program başarısız olduğunda oluşan core dump’ı okuyup anlamak zorunda kalmak, bu okunabilirliği bir ölçüde dengeliyordu. En iyi ihtimalle hatayı belirli bir kod satırına kadar izleyebiliyordunuz; bu yüzden programı zihnimde çalıştırma alışkanlığı edindim
      Kamu kurumundan ayrılıp ticari programlamaya geçtiğimde de 80’lerin başına kadar hâlâ COBOL ve toplu işlem programları vardı. 3 yıl gece destek görevi yaptım; COBOL’un değeri o zaman ortaya çıktı. İlk kez gördüğüm bir listeyi ve core dump’ı elime aldığımda çoğu zaman oldukça hızlı düzeltebiliyordum. Elbette bunun her zaman taktiksel bir düzeltme olduğu notunu düşmek gerekir
    • Bu yüzden Ada ve VHDL’i seviyorum
      Biraz uzun uzadıya olabilirler ama daha “modern” dillere göre çok daha okunabilirler
    • COBOL, programcı olmayan kişilerin de yazıp okuyabilmesi için tasarlandı
      En azından teoride böyleydi
    • MOVE FUNCTION MIN(BLOCK-ENTRY-MINIMUM-STATE-ID(LK-BLOCK), STATE-ID) TO BLOCK-ENTRY-MINIMUM-STATE-ID(LK-BLOCK)
  • Lisede Pakistan’ın küçük bir şehrinde biraz COBOL öğrendim
    Fena değildi; finansal tabloyu taklit eden bir proje yaptım. Tuhaf yanları vardı ama çoğu insan, yani programcı olmayanlar için herhangi bir programlama dili zaten epey tuhaf olacağından, COBOL’a yapıştırılan damgayı pek anlayamıyorum
    Aynı dönemde C de öğrendim ve o taraf bende kalıcı oldu :-)

  • Cobol programcılarının nadir olduğu için yüksek maaş aldığı hikâyesini hep duyarım
    Bu proje yüzünden iş tekliflerinin yağıp yağmadığını merak ediyorum

    • Nadir olan Cobol programcıları değil, iş mantığını anlayan insanlar
      Cobol çok karmaşık iş operasyonlarında sık kullanılıyor
    • Başkalarının da söylediği gibi, asıl mesele mevcut iş mantığının karmaşıklığı ve genellikle o kodun çalıştığı mainframe sistemleri anlamak
      Aksi hâlde bir çapraz derleyici yazıp işi bitirirdiniz
    • Bu insanlar programlama becerilerinden çok, son derece karmaşık ve çoğunlukla belgelenmemiş sistemleri ve o iş ortamına dair bilgileri nedeniyle değerli
  • COBOL gerçekten oldukça havalı bir dil gibi görünüyor
    Kod da gerçekten iyi düzenlenmiş

  • Birim testleri olmasını sevdim