C öğrenmeyi düşünüyorum
C'yi öğrenmemek için belirli bir neden yok ama C ++ 'ı önerebilirim. C'nin yaptığı şeylerin çoğunu sunar (çünkü C ++, C'nin süper bir kümesidir) ve büyük miktarda "ekstra" içerir. C ++ 'dan önce C öğrenmesi gerekli değildir - onlar etkili bir şekilde ayrı dillerdir.
Başka bir deyişle, C bir ağaç işleme aletleri seti olsaydı, muhtemelen şöyle olurdu:
- çekiç
- çiviler
- el testeresi
- Matkap
- blok zımpara makinesi
- keski (belki)
Bu araçlarla her şeyi inşa edebilirsiniz - ama güzel olan her şey potansiyel olarak çok zaman ve beceri gerektirir.
C ++, yerel nalburdan elektrikli el aletleri topluluğudur.
Başlamak için temel dil özelliklerine sadık kalırsanız, C ++ 'ın ek öğrenme eğrisi azdır.
Ancak insanlar 'tehlikeli' olarak kullanılıyorsa neden C (veya C ++) kullanıyorlar?
Çünkü bazı insanlar IKEA'dan mobilya istemiyor. =)
Cidden, C veya C ++ 'dan "daha yüksek" olan birçok dil, bazı yönlerden onları (potansiyel olarak) "kolay" yapan şeylere sahip olsa da, bu her zaman iyi bir şey değildir. Bir şeyin yapılmasından hoşlanmazsanız veya bir özellik sağlanmazsa, bu konuda yapabileceğiniz fazla bir şey yoktur. Öte yandan, C ve C ++, birçok şeye doğrudan erişebildiğiniz (özellikle donanım ya da OS-akıllıca) ya da başka bir şekilde yapamayacağınız şekilde kendi başınıza yaratabileceğiniz yeterli "düşük seviye" dil özellikleri (işaretçiler dahil) sağlar. uygulandığı gibi diller.
Daha spesifik olarak, C, birçok programcı için arzu edilen kılan aşağıdaki özelliklere sahiptir:
- Hız - Yıllar boyunca göreceli basitliği ve derleyici optimizasyonları nedeniyle, doğal olarak çok hızlıdır. Ayrıca, birçok insan dili kullanırken, hedefleri daha da hızlı kılan özel hedeflere giden birçok kısayol bulmuşlardır.
- Boyut - Hız için listelenenlere benzer nedenlerle, C programları çok küçük yapılabilir (hem uygulanabilir boyutta hem de bellek kullanımı açısından), bu da sınırlı belleğe sahip ortamlarda (yani gömülü veya mobil) istenebilir.
Uyumluluk - C uzun zamandır etrafta ve herkesin bunun için araçları ve kütüphaneleri var. Dilin kendisi de seçici değildir - bir işlemciden bir şeyleri tutmak için talimatlar ve hafıza yürütmesini bekler ve bu onunla ilgilidir.
Ayrıca, bir Uygulama İkili Arabirimi (ABI) olarak bilinen bir şey var . Kısacası, programların bir Uygulama Kodu Arabirimi'ne (API) göre avantajları olabilecek makine kodu düzeyinde iletişim kurmasının bir yoludur . C ++ gibi diğer diller bir ABI'ye sahip olsa da, genellikle bunlar C'lerden daha az aynıdır (üzerinde anlaşılırlar), bu nedenle C, bir sebepten dolayı başka bir programla iletişim kurmak için bir ABI kullanmak istediğinizde iyi bir temel dili oluşturur.
Programcılar neden Java veya Python veya Visual Basic gibi derlenmiş başka bir dil kullanmıyorlar?
Verimlilik (ve bazen belleğe nispeten doğrudan erişim olmadan uygulanamayan bellek yönetimi programları).
İşaretçilerle doğrudan belleğe erişme, kirli pençelerinizi küçükler ve sıfırlar üzerine doğrudan dolabınızdaki sıfırlar ve sıfırlar üzerine koyabileceğiniz ve öğretmenlerin sadece oyuncakları dağıtması için beklemek zorunda kalmayacağınız bir çok temiz (genellikle hızlı) hileci sunar çalma saatinde tekrar toplayın.
Kısacası, malzeme eklemek potansiyel olarak gecikme yaratır veya istenmeyen karmaşıklığı beraberinde getirir.
Komut dosyası dilleri ve bu ilklerle ilgili olarak, ikincil programların C (veya herhangi bir derlenmiş dilin) olduğu kadar verimli çalışmasını gerektiren dilleri almak için çok çalışmak zorundasınız. Hareket halindeyken bir tercüman eklemek doğal olarak azaltılmış çalıştırma hızı ve arttırılmış bellek kullanımı olasılığını ortaya çıkarır çünkü karışıma başka bir program ekliyorsunuz. Programlarınızın verimliliği, bu programın verimliliğine, orijinal program kodunuzu ne kadar iyi yazdığınıza (zayıf =) bağlıdır. Programınızdan bahsetmiyorum bile ikinci programa bile tamamen bağımlıdır. Bu ikinci program belirli bir sistemde bir nedenden dolayı yok mu? Kod yok git.
Aslında, "ekstra" bir şey eklemek, potansiyel olarak kodunuzu yavaşlatır veya karmaşıklaştırır. "Korkutucu işaretçiler olmadan" dilde, her zaman arkanızda temizlemek veya başka şeyler yapmak "güvenli" yollarını anlamaya kod diğer bit bekliyor - Programınız çünkü hala yapılabilir olabilir aynı bellek erişimi işlemlerini yapıyor işaretçileri. Sen sadece bunu yapan kişi değilsin (bu yüzden bunu yapamazsın, dahi = P).
Tehlikeli derken, işaretçilerle ve benzeri şeylerle demek istiyorum. [...] Yığın Taşması sorusu gibi Alınan fonksiyon neden kullanılmaması gereken çok tehlikelidir?
Kabul edilen cevaba göre:
"1999 ISO C standardına kadar dilin resmi bir parçası olarak kaldı, ancak 2011 standardı tarafından resmen kaldırıldı. Çoğu C uygulaması hala onu destekliyor, ancak en azından gcc kullanan herhangi bir kod için bir uyarı veriyor."
Bir dilde bir şey yapılabileceği için yapılması gereken aptalcadır. Dillerin düzeltilen kusurları vardır. Eski kod ile uyumluluk nedenleriyle, bu yapı hala kullanılabilir. Ancak bir programcının kullanmaya zorlayan hiçbir şey yoktur () ve () aslında bu komut daha güvenli alternatiflerle değiştirilir.
Daha da önemlisi, gets () ile olan sorun başlı başına bir işaretçi sorunu değildir. Belleği nasıl güvenli bir şekilde kullanacağınızı bilmeyen bir komutla ilgili bir sorun. Soyut anlamda, tüm bunlar işaretçi meseleleridir - sizin yapmanız gerekmeyen şeyleri okumak ve yazmak. İşaretçilerle ilgili bir sorun değil; işaretçi uygulamasında bir sorun var.
Netleştirmek için, işaretçiler yanlışlıkla istemediğiniz bir hafıza konumuna erişene kadar tehlikeli değildir. Ve o zaman bile bu, bilgisayarınızın erimesini veya patlamasını garanti etmez. Çoğu durumda, programınız işlevini kesecektir (doğru).
Bunun nedeni, işaretçilerin bellek konumlarına erişim sağlaması ve veri ile yürütülebilir kodun birlikte bellekte bulunması nedeniyle, belleği doğru şekilde yönetmek istediğinizde yanlışlıkla bozulma tehlikesi vardır.
Bu noktada, gerçekten doğrudan belleğe erişim işlemleri genellikle yıllar önce sahip olduklarından genel olarak daha az fayda sağladığından, C ++ gibi çöp toplanmamış diller bile, bellek verimliliği ile güvenlik arasındaki boşluğu doldurmaya yardımcı olmak için akıllı işaretçiler gibi şeyler ortaya koymuştur .
Özet olarak, güvenle kullanıldığı sürece işaretçiden korkmak için çok az neden vardır. Sadece South Park'ın Steve "The Crocodile Hunter" (Irwin) sürümünden bir ipucu alın - baş parmağınızı croc'ların çukurlarına sokmayın .