Herkese selamlar, bugünkü konumuz C Hızında Ruby Yazmak Mümkün mü? Crystal Diliyle Tanışın? adlı konuyu elimden geldiğince anlatacağım. Eleştiriye her zaman açık biri olarak her insan gibi bende hata yapabilirim. konu altından saygı çerçevesinde dile getirirseniz bilgi alış-verişi/beyin fırtınası yapabilirim. :͛)͛
Crystal Dili?
Yazılım geliştirirken bir defa da olsa ikilemde kalmışızdır, Ya kod yazarken inanılmaz keyif alır, prototipleri hızlıca çıkarır ve üretkenliğin zirvesine çıkarsınız "Ruby veya Python gibi diller" tam olarak bunu sunar ya da uygulamanızın milisaniyeler içinde tepki vermesi, donanımı sonuna kadar kullanması için daha zorlayıcı, dillere yöneliriz "C, Go, Rust" gibi en iyisini aynı anda elde etmek uzun süre bir bekleyenler oldu ama ta ki Crystal dili çıkana kadar.
Eğer Ruby’nin okuması ve yazması zevkli söz dizimini seviyorsanız, yazdığınız uygulamanın bir C programı kadar hızlı çalışmasını, sunucu kaynaklarını sömürmemesini istiyorsanız, Crystal aradığınız dil olabilir. Üstelik bu sadece "Ruby'nin hızlı hali" değil; baştan aşağı farklı özelliklere sahip, yepyeni bir teknoloji.
Crystal Tam Olarak Nedir ve Ne Zaman Ortaya Çıktı?
Crystal, Ruby söz diziminden büyük ölçüde ilham alan ama arka planda LLVM yani "Low Level Virtual Machine" altyapısını kullanarak doğrudan makine kodu kullanarak ve statik olarak tiplendirilen bir programlama dilidir.
Dilin çıkışı da şöyle açıklayabilirim, Arjantin merkezli Manas Technology Solutions ekibinin yaşadığı hayal kırıklıklarıyla başlaması üzerine ekip, Ruby on Rails ile harika projeler çıkarıyor ama iş performansa, ağır veri işleme süreçlerine veya yüksek kaynak tüketimine geldiğinde tıkanıyordu. Kodu C ile yeniden yazmak ve tamamen farklı dillere geçmek istemediler. 2011 yılında "Ruby gibi yazılan ama C hızında derlenen bir dil" fikriyle yola çıktılar. 2014 yılında ilk resmi duyurusu yapılan Crystal, uzun ve titiz bir geliştirme sürecinin ardından 2021 yılında kararlı sürümü olan 1.0 ile yazılım dünyasına kalıcı olarak giriş yaptı.
Neden Sadece Hızlı Bir Ruby Değil?
İlk bakışta bir Crystal dosyasının uzantısını .rb yerine .cr yapsanız ve çalıştırsanız, çoğu basit kod hata vermeden çalışır ama altına baktığınızda Crystal, Ruby'nin dinamik ve yorumlanan yapısını tamamen reddeder. İki dilin yolları tam da burada ayrılır:
+ Ruby, kodu siz çalıştırdığınız anda her satır o an okunur ve çalıştırılır. Crystal ise kodunuzu alır, analiz eder, donanımınızın doğrudan anlayacağı o saf "1"ler ve "0"lardan oluşan tek bir çalıştırılabilir dosya haline getirir.
+ Crystal statik tipli bir dildir. Değişkenlerin türü derleme aşamasında bellidir ama Java'daki gibi her yere sürekli String, Int32 yazmak zorunda kalmazsınız. Kodun akışından değişkenin tipini kendi anlar ve arkada gizlice tanımlatır.
+ Ruby'nin kodu çalışırken kendi kendini değiştirmesi meşhurdur ama bu inanılmaz yavaşlatıcı bir unsurdur. Crystal derlenen bir dil olduğu için çalışma anında kodun yapısının değişmesine izin vermez. Onun yerine, kodunuz derlenirken sizin yerinize tekrarlayan kodları arka planda yazan güçlü bir makro sistemi sunar.
+ Crystal ile yazdığınız bir aracı derlediğinizde elinizde tek bir dosya olur. Bunu alıp başka bir sunucuya attığınızda, o sunucuda Crystal veya herhangi bir kütüphane kurulu olmasa bile tıkır tıkır çalışır.
Milyar Dolarlık Hatayı Çözen Dil, Nil Güvenliği (Nil Safety)?
Birçok programcının çalışma anında patlayan "NullPointerException veya NoMethodError" hatasıdır. Beklediğiniz veri gelmez, değer nil olur ve uygulama o an çöker.
Crystal bu sorunu temelden, kod daha çalışırken çözer. Eğer ki bir değişkenin nil olma ihtimali varsa, siz o değeri bir if bloğuyla kontrol edene kadar derleyici size hata verir ve uygulamanın çalışmasını reddeder yani uygulamanızın canlı ortamda veya bir sunucuda beklenmedik bir nil değeri yüzünden çökme ihtimali teknik olarak sıfırlanmış olur. Bu güvenlik katmanı, özellikle arka planda sessizce çalışması gereken araçlar için hayat kurtarıcıdır.
Performans dendiğinde Go'nun (Golang) "Goroutines" yapısıyla binlerce işlemi aynı anda nasıl kolayca yönettiğini biliyoruz. Crystal, eşzamanlılık konusunda tam olarak bu yapıyı benimsemiş bir dildir. İşletim sisteminin o hantal ve ağır thread'lerini kullanmak yerine, adına "Fiber" denilen ve bellek tüketimi mikroskobik düzeyde olan yapılar kullanır. Tek bir spawn komutuyla arka planda binlerce Fiber başlatabilirsiniz.
Şimdi diyelim ki siber güvenlik araştırmaları için hızlı bir port tarayıcıya yani "network scanner" ihtiyacınız var. Python ile yazsanız yavaş kalabilir, C ile yazsanız kod uzadıkça uzar. Crystal ile bu işi Fiber'lar kullanarak, işletim sistemini yormadan ve oldukça okunaklı bir şekilde şöyle yapabilirsiniz:
Kod:
require "socket"
# Hızlı, asenkron TCP Port Tarayıcı
# Kullanım: ./scanner 192.168.1.1
def port_acik_mi?(ip : String, port : Int32, timeout = 1) : Bool
begin
# Belirtilen sürede bağlanmayı dener, bağlanırsa port açıktır
socket = TCPSocket.new(ip, port, connect_timeout: timeout.seconds)
socket.close
true
rescue
false
end
end
hedef_ip = ARGV[0]? || "127.0.0.1"
# Sık kullanılan kritik portlar
hedef_portlar = [21, 22, 23, 80, 443, 3306, 8080, 3389]
puts "[*] Hedef: #{hedef_ip} taranıyor..."
# İşlemleri senkronize etmek için bir kanal açıyoruz
kanal = Channel(Int32).new
hedef_portlar.each do |port|
# Her port için arka planda inanılmaz hafif bir Fiber başlatıyoruz
spawn do
if port_acik_mi?(hedef_ip, port)
puts "[+] Port #{port} : AÇIK"
end
# İşlem bitince kanala bilgi gönder
kanal.send(1)
end
end
# Ana sürecin (main thread) erken kapanmasını engellemek için
# tüm Fiber'lardan yanıt gelmesini bekliyoruz
hedef_portlar.size.times { kanal.receive }
puts "[*] Tarama tamamlandı."
Bu kodu bir araya getirdiğinizde (crystal build scanner.cr --release) elinizde başka hiçbir şeye ihtiyaç duymayan, şimşek hızında çalışan küçük bir çalıştırılabilir dosya kalır. Söz dizimi tamamen Ruby rahatlığındadır ama çalışma mantığı ve hızı Go ile yarışır.
Nerelerde Kullanmalısınız? Nerede Dezavantaj Yaratır?
Her dilin parladığı ve tökezlediği yerler vardır illa ki. Crystal'ı her projeye zorla entegre etmek yerine, doğru yerlerde konumlandırmak gerekir.
Crystal'ın Zirve Yaptığı Alanlar:
CLI Araçları: Tek dosya halinde bir araya getirilmesi, inanılmaz başlama hızı ve bağımlılık gerektirmemesi, onu otomasyon betikleri, dork parser'lar veya log analiz araçları yazmak için kusursuz bir tercih yapar.
Yüksek Performanslı Web API'leri: Kemal adında bir mikro web framework'ü vardır. Ruby'deki Sinatra ve Python'daki Flask gibi çalışır ama saniyede on binlerce isteği hiç zorlanmadan karşılar. RAM tüketimi sadece birkaç megabayttır. Mobil uygulamalara ve arka plan servislerine veri sağlayan hızlı API'ler için biçilmiş kaftandır diyebilirim.
Veri İşleme Görevleri: Milyonlarca satırlık dosyaları parse etmek veya ağır veritabanı işlemlerini arka planda halletmek için ideal dildir.
Dezavantajları ve Gerçekler:
+ Projeniz büyüdükçe LLVM'in kodunuzu optimize edip bir araya getirmesi saniyeler, bazen dakikalar alabilir. Bu da yazılım dillerindeki o "yaz ve anında sonucu gör" pratikliğini bir miktar kırabilir.
+ Bir Node.js (NPM) ve Python (PyPI) kadar devasa bir kütüphaneye sahip değildir. Çok spesifik bir aracın ve yeni çıkmış bir API'nin hazır paketini bulamayabilir, bazen kendiniz + yazmanız veya "C kütüphanelerini" dahil etmek zorunda kalabilirsiniz.
İlk olarak Linux ve macOS için tasarlanmıştır. Windows desteği çok yeni ve hala tam oturmamış durumda şu an. Windows üzerinde geliştirenler için WSL kullanmak en kalıcı çözümdür.
Gelecekte Bizi Ne Bekliyor?
Node.js asenkron yapısıyla bir çığır açtı, Go sistem programlamayı basitleştirdi, Python ve Ruby veri ve web tarafında üretkenliği artırdı. Crystal, "Programcının mutlu olduğu dili bir araya getirip, makinenin mutlu olduğu hıza çıkarma" vizyonuyla tam bu noktada çok güçlü bir alternatif oluşturuyor. Öğrenmesi zorlayıcı, aşırı katı söz dizimleriyle boğuşmadan makineye yakın performans almak istiyorsanız, Crystal kesinlikle tercihinizde olmalı. İster yeni bir Telegram botu yazıyor olun, ister de ağ tarama araçları geliştiriyor olun, Crystal'ın sunduğu bu hıza ve sadeliğe bir şans vermek geliştirici vizyonunuzu ciddi bir şekilde anlam kazandıracaktır.
Bugünkü konumuz bu kadardı okuyan herkese teşekkür ederim. Bir başka konuda görüşmek üzere saygıyla ve sevgiyle kalın....





