- 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
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
Yine de eski FORTRAN gibi boşlukları yok sayıp
DO 10 I=1.10ifadesini döngü sözdizimi hatası olarak değil deDO10I = 1.10ataması olarak sessizce derlemesi gibi bir durum yoktu. Oysa amaçlanan kod muhtemelenDO 10 I=1,10idiİ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
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
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
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’ı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
Bu arada ben kendimi ikinci gruba koyuyorum
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
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
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
Biraz uzun uzadıya olabilirler ama daha “modern” dillere göre çok daha okunabilirler
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
Cobol çok karmaşık iş operasyonlarında sık kullanılıyor
Aksi hâlde bir çapraz derleyici yazıp işi bitirirdiniz
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