Genel programlama için Python, web programlama için ise JavaScript biliyorum. Bu dillerin yetersiz kaldığı; ikili çalıştırılabilir dosya veya kütüphane çıkartma, performans gibi durumlarda kullanmak için derlenen bir dil öğrenmek istiyorum.
Çevremde bu konularda bir fikri olan, olmayan herkes bana C ve/veya C++'ı öneriyor ama ben hâlâ bu dillerin alamet-i farikasını anlayabilmiş değilim. Hatta bu dillerle yazılan kaliteli programların nasıl yazılabildiklerine de hayret ediyorum.
Bu Konuda Rust bana daha iyi bir seçenek gibi göründü. Hakkında araştırma yaparken denk geldiğim bir kaynak; C’den ~11,5 kat, C++'dan ise ~7,5 kat daha yavaş olduğu söylüyor. Eğer tek dezavantajı bu ise sağladığı kolaylıkların yanında hiçbir şey. Forumda “rust” kelimesini arattığımda çıkan 14 gönderinin içerisinde olumsuz tek bir cümle görmedim(şu hariç ama zaten işletim sistemi programlamayı düşünmüyorum).
Benim asıl merak ettiğim şey ise C ve/veya C++'ın yerine kullanılabilir mi? veya hangi durumlarda kullanılabilir?
Bu diller ile yapılabilen, Rust ile yapılamayan neler var? (Oyun geliştirmek haricinde)
Rust dilinin bu diller karışısındaki dezajantajları nelerdir?
Benchmark’lar dillerin değil kodların çalışma hızını ölçer. 3 yıl önceden kalma ve az bilinen bir benchmark’ın gerçeği yansıttığını düşünmeden önce kodları incelemelisiniz. Repo’daki Rust kodu optimizasyonlar açılmadan derlenmiş.
Bu çok genel bir soru olduğu için genel bir cevap vereceğim: evet.
Rust ile de oyun geliştirilebilir, neden geliştirilmesin?
Bu ölçümün gerçeği yansıtabildiğinden şüphem vardı, ne kadar doğru olduğunu öğrenmek için o bağlantıyı verdim.
Bundan eminsiniz değil mi?
, peki mesela hangi durumlarda kullanılamaz?
Bu konuda C++'dan daha iyi bir şeçenek olmadığını düşündüğüm için verilecek cevapları ekilemesin diye öyle dedim. Ama bu sitedeki oyunlar gösteriyor ki Rust ile de gayet kaliteli oyunlar yapılabiliyormuş.
LLVM birden fazla platformu destekliyor zaten. GCC’nin destekleyip LLVM’in desteklemediği platformlar var. Ama bunu sorduğunuz için söyledim, bu platformların çoğunun adını bile duymamışsınızdır diye tahmin ediyorum.
Anladım, bu bahsettiğiniz platformlar, daha çok endüstriel makinelerde kullanılan işlemci mimarileri sanırım. Verdiğiniz bilgiler için çok teşekkür ederim.
Son olarak, Rust öğrenmek için bildiğiniz güzel kaynaklar var mıdır?
Sonuçlar çıktı. Ölçümlerde, Python yaklaşık 80-90ms kadar; diğerleri ise 2-3ms kadar sapma gösterdi. Python hariç hepsi, en az bir kere birinci oldu ve Rust, C ve C++ ile aynı seviyeye yükseldi.
Belki sonuçlar bilgisyardan bilgisayara değişiyordur ama kesin olan şu ki: Rust, bu ölçümde gösterilenden daha hızlı ve daha kesin sonuçlar için daha profesyonel yöntemler gerekiyor.
Belleğe doğrudan erişim, gömülü sistemlerde kütüphane ve derleyici desteği, yeteri kadar veri soyutlama, hızlı derlenme süresi, eski alışkanlıklar… (v.s)
Python gibi soyut bir dil değil C ve C++. Hangi işlemi yaparsan yap belleğe bakmak zorundasın. Bu da tecrübeli ellerde çok güçlü olması anlamına geliyor. Ek olarak Türkiyede C dili mülakatlara girişte test olarak kullanılıyor. Türkiyedeki popüleritesinin bir sebebi de bu.
Yani demek istediğim bu özelliklerin ve daha fazlasının(bellek yönetim modeli, derleme zamanında tür çıkarımı yapabilmesi, basit sözdizimi, Cargo, vs.) Rust’ta da olduğunu sanıyorum (bazılarında yanılıyor olabilirim) ve bunlara rağmen Rust’ın hâlâ çok bilinmeyen bir dil olması biraz kafamı kurcalıyor.
Henüz 6 yıllık bir dil olması veya programcıların Rust’a önyargılı davranıyor olabilecek olmaları ihtimali buna sebep olmuş olabilir.
Ama yinede Rust’ı öğrenmek için vakit harcamaya başlamadan önce bunun doğru bir karar olup olmadığından emin olmak istiyorum.
Benim de kafamı kurcalıyor. Çok sevilen bir dil, nereye baksam olumlu yorum ama neden kullanımı az bilmiyorum.
Rust’a karşı bir önyargı var mı bilmiyorum ama varsa bile bu net olumlu bir önyargı Çünkü gerçekten olumsuz yorum bulmak çok zor ya da ben hep olumlu yorumların yapıldığı yerlere denk geldim.
Çok, çok önceden ben biraz denemiştim. Zor geldiği için bırakmıştım, syntax’ı garip gelmişti ayrıca. Sonra bırakıp işime bakmaya devam ettim. (Javascript, web apps vs.)
Basligi okudugumu hatirliyorum, hatta benchmarklara da bakmistim (bu kadar basit bir kodda dusuk seviyeli dillerin birbirini outperform etmesi cok zor / dilden cok derleyiciye/optimize ediciye kalmis bir sey.)
C’nin yerine gecip gecmeyecegini tahmin etmeye gerek yok; sonucu bekleyerek gorebiliriz.
Yillardir C’nin yerine gecmeye calisan diller var, hic biri bunu yapamadi; C’nin yeni versiyonlari disinda.
Linux’ta (kernel) Rust modul destegi ne oldu onu arastirsan daha faydali olabilir. Elin degmisken bi “hello world” modulu de yaz; biliyorum cunku ogrenmeye baslayinca “driver yazilir mi” filan diye soru gelecek
C++'a gelince benim icin yerine gecti zaten. C’nin yapabildiklerini guzel, high-level yapilarla yapabilen, her guzel algoritmayi soyut bir sekilde yazmak isteyecegim bir dil arayisindaydim. Bu arayis Rust ile sonlandi gibi. Ha nedir, hic bir sey yazmiyorum tabi dilde. Embedded isler icin, getirdikleri, toolchain desteginin kotulugune/olmamasina bile degmiyor—dili iyi bilmememi/rahat olmamami gectim.
Bu baglamda biraz Haskell gibi sanirim; bilmek ise yariyor fakat kisa vadede pratikte kullanmak super mantikli degil.
Aslıda gayet pratik bir sözdizimi var ve düşününce Rust daha mantıklı bir seçim gibi duruyor, ama nedense C kodu gözüme daha bir güzel görünüyor, tabii döngülerle çalışırken belleğin rastgele bir yerine erişince sinirimi bozmuyor da değil.
Belki de kullanım oranlarına etki eden sebeplerden biri de budur. Yani, insanlar daha iyi olanı değil, alıştıkları ve hoşlandıkları dili tercih ediyorlardır.
Hocam zaten asıl önemli olan bunu öngörüp ona göre hareket etmek değil mi? Örneğin C, 49 yıl önce çıkmış bir dil ve yeni programlama tekniklerinden yoksun. Bu bugün için sorun olmasa bile 10-20 yıl sonra bu C’nin terk ediliş sebebi olursa Rust yerine C öğrenmek bir pişmanlık olabilir.
Bunlar hangi diller? Araştırıp Rust ile benzer olup olmadıklarına bakmak isterim.
Bununla ilgili bir çalışma buldum ama nedense arşivlenmiş:
Yazılıyormuş sanırım:
Evet ben de bunu Fibonacci dizesinin 39. ve 40. elemanları ile altın oranı hesaplatmak istediğimde fark ettim. Python ile algoritmayı kurmak kolaydı ama kodu Rust’a aktarmak biraz vaktimi almıştı.
Yani bende tam bilmiyorum, bir dize üzerinde for döngüsü kurup döngüyü dize uzunluğundan daha fazla çalıştırdığımda alakasız rakamlarla karşılaşıyorum.
Örneğin:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 10; i++) {
printf("%d\n", arr[i]);
}
return 0;
}
Şimdi diyeceksin bunları neden attın? Çünkü eğer static array oluşturursan bunların adreslemesi art arda olur. Ama eğer dynamic array kullanırsan burada haklı olabilirsin.
gelelim undefined behaviour kısmına. Muhtemelen sen incelemişsindir, şuradaki adam olayı çok iyi açıklamış.
Eğer undefined behaviour olursa her şey ama her şey olabilir, yazbelden post atabilir, gmail atabilir, her şey ama her şey. Zannediyorum ki:
mesela şu out of bounds meselesini düşünelim, normalde c, senin için ramde boş bulduğu bir yeri senin kullanımına sunar ve pointerler ile bu hafızayı kullanabilirsin. Ama sen gidip de sana sunulanın dışında bir şeyi kullanırsan o kullandığın yeri kullanan başka bir programın işleyişi değişebilir. Bu yüzden her şey olabilir. Linke göre bunun çaresi dikkkatli olmak , ha bir de cpp kullanıyorsan bu iş için bir class kullananıp bir kontrol mekanizması oluşturabilirsin.
Aynı linkte The C++ guiding principle is "you don't pay for what you don't use". If your code is correct, you don't need bounds-checking, and you shouldn't be forced to pay for the overhead of runtime bounds-checking. demiş.
Lütfen kusura bakma konuyu alakasız bir şey ile çok uzattım. Bu arada ben de sayende yeni bir şey öğrenmiş oldum. O kadar ödev yaptım hiç fark etmedim böyle bir şey olduğunu
Bu arada ben rust bilmiyorum ama acaba rustta böyle bir kontrol mekanizması var mı? Bir araştırayım.
Edit: ekran kartın yanabilir cümlesini sildim,iyi bir örnek değil
Şu an, C/C++'ın potansiyel zararlarından bahsetmeden yazılmış tüm derslere, öğreticilere fena halde kızgınım.
Yani C/C++'ın güçlü olduğunu biliyordum ama donanıma zarar verebilecek kadar olduğunu sanmıyordum. En azından İ.S. çekirdeğinin buna müsade etmeyeceğini sanıyordum.
Paniğe kapılmadan önce sormak istediğim bir şey var: Bu örnek olarak verdiğim kod, sadece RAM’den veri okuyor değil mi? Yani herhangi bir programın kararsız davranmasına sebep olacak bir kod ise sistemdeki kararsızlıklara karşı teyakkuza geçeceğim.
Bence çare doğruca Rust’a geçmek.
Nasıl? Ben böyle şeylerin üniversitelerde anlatıldığını sanıyordum.
Kusur? aksine çok, çok teşekkür ederim. Böyle bilgilere internette pek rastlanmıyor. Hem pek alakasız da sayılmaz, beni C/C++'dan caydırdığını söyleyebilirim.
Rust’ta böyle şeyleri istemeden/bilmeden yapmak mümkün değil. Rust’ın derleyicisi çoğu hatayı daha derleme zamanında ayıklıyor.
O kadar korkma lütfen, böyle düşünmeni istemedim. İştetim sistemi güvensiz bir durum bulursa bunu tespit edip güvenliğini sağlıyor. Sana şöyle örnekler vereyim.
Örnek 1:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* arr = malloc(5* sizeof(int));
for (int i = 0; i < 5; i++)
printf("%d ", arr[i]);
free(arr);
}
Bu durum x behaviour (ne behaviour olduğunu bilmiyorum arastirmam lazım) Ama bu kodun çıktısı 0 0 0 0 0 olacak. Çünkü biz malloc ile alan tahsis ederken bu hafıza alanında bizim şifrelerimiz bulunabilir. İşletim sistemi bu yüzden tüm array yi tabiri caizse 0 ile initialize ediyor burada. İlgili metin:
Here’s the catch: Memory coming from the OS will be zeroed for security reasons.*
When the OS gives you memory, it could have been freed from a different process. So that memory could contain sensitive information such as a password. So to prevent you reading such data, the OS will zero it before it gives it to you.
Şunu bir incele:
Sana bir örnek daha, ama bu örnek cpp den olacak:
Bu, data structure dersimiz için yaptığımız ödev kodlarından biri. Eğer sen bu kodu derleyip
input’ı ile çalıştırırsan bir süre sonra işletim sistemi bizim programı öldürecek. (korkma UB(Undefined Behaviour) yok kodda)
yani çok korkulacak bir durum yok, adı üstünde, işletim sistemi
Bu arada ekran kartın yanar derken o kadar ciddiye alacağını düşünmedim yaw xd. Nasipsiz bir insansan neden olmasın skdjkdjdj. Ben sadece konuyu anlatmak maksatlı söylemiştim bunu, ama olabilir de(işletim sistemi bu durumu kontrol ediyor mu bilmem ama muhtemelen ediyordur). yani düşün cpu sıcaklığı arttığında falan bilgisayar otomatik kendini kapatıyor.
benim bildiğim, RAM’den okuyor.
Undefined behaviour nedir bir araştırmanı öneriyorum, ben de hakim olduğumu söyleyemem ama temel birkaç bir şey biliyorum bu UB ile ilgili. Öyle sistemini çökerteceğini zannetmiyorum, sonuçta bu kerneller ile donanımları kontrol ediyoruz. Sadece başlıklara göz attım ama bakmak isteyebilirsin. Kernel (operating system) - Wikipedia Bundan sonra ne desem yalan olur. Bilmediğim derin sulara giriyorum.
C/CPP de falan kodunu valgrind ve gdb ile debug edebilirsin. tabi rust istiyorsan neden geçmeyesin ki, ama sırf bu durum için geçmezdim ben. Tabi şahsi fikir Bu arada out of bounds durumlarını program dikkat edeceğine ben out of bounds durumu olmayan bir şekilde doğru bir kod yazarım daha iyi diye düşünüyorum ben de(çok şey konuşmayım ama :D)
Doğru sanıyorsun yukarıda örnekler verdim birtakım.