C'nin programlama arkasındaki ilkeleri öğrenmek için iyi bir dil olduğuna inanıyorum. Ruby gibi üst düzey dillerden "büyülenmiş" alt düzey dillerde öğrenmeye ne dersiniz?
C'nin programlama arkasındaki ilkeleri öğrenmek için iyi bir dil olduğuna inanıyorum. Ruby gibi üst düzey dillerden "büyülenmiş" alt düzey dillerde öğrenmeye ne dersiniz?
Yanıtlar:
Bilgisayar biliminin genel soyut anlamında, C'de bulunan ve üst düzey dillerde de bulunmayan ilkeler yoktur. Tüm bilgisayar bilimleri algoritmalara dayanır ve tüm algoritmalar C gibi Turing-complete olan herhangi bir dilde uygulanabilir.
C'nin üst düzey dillerden ayırdığı fark, makine kodunun C'den ayırdığı farka benzer: Makinenin kodla ilişkisi.
Kodu üst düzey dillerde yazarken, kodunuzun makine ile nasıl etkileşimde bulunduğu (genellikle) ile ilgilenmezsiniz. Dilin kendisi için tanımladığı sanal makine, kod yürütmenin bu yönlerinin çoğunu gizler.
C'de programınızın bellekle etkileşimi ön planda tutulur. Yığın kullanımınızı yönetmek zorunda olmanızdan daha fazlasıdır, kodunuzun yığınla etkileşimini ve kodunuzun sadece belleğe erişiminin kodunuzun davranışını ve performansını nasıl etkilediğini içerir - bellek erişim sırasını bile. dikkatinizi kaçmasına izin verilebilir, çünkü yanlış zamanda yanlış belleği okumak performansı etkili bir şekilde sakatlayabilir.
Üst düzey dillerde, bu şeyler açıkça o kadar açık değildir. Bellek, sizin bilginiz olmadan ve bazen de size sorulmadan tahsis edilir ve dağıtılır. Çoğu zaman, bu sadece kontrolünüz dışındadır. Bellek ayırma işlemlerinin çoğu, ne zaman, nerede, nasıl ve neden sizden gizlenir.
Benzer şekilde, diğer yönde, makine kodu veya montaj kodu yazmak, ön plana daha fazla ayrıntı getirir: Neredeyse hiçbir şey düşünmenizin dışında bırakılmaz ve kodunuz her tahsis, her kaynak, geçen her veri parçasının farkında olmalıdır. CPU'nun kayıtları aracılığıyla - yüksek seviye dillerden gizli olarak çıkarılacak bilgiler.
C'nin programlama arkasındaki ilkeleri öğrenmek için iyi bir dil olduğunu biliyorum.
Katılmıyorum. C, programlamanın ardındaki ilkeleri öğrenmek için çok fazla özellik yoktur. C'nin soyutlamalar yaratma özellikleri korkunçtur ve soyutlama, programlamanın ardındaki temel ilkelerden biridir.
Donanımın nasıl çalıştığını ve dolayısıyla makine için bazı mekanik sempati duymayı öğrenmek istiyorsanız, makine kodunu, yani talimat seti mimarisini öğrenmeli ve ayrıca modern CPU'ların önbellek yapısını incelemelisiniz. Montaj dilini önermediğimi unutmayın, sadece donanım talimatlarını anlayın, böylece bir derleyicinin ne ürettiğini anlarsınız.
Programlama ilkelerini öğrenmek istiyorsanız, Java, C # veya Swift gibi modern bir dil veya Rust gibi düzinelerce dilden birini kullanın. Ayrıca, fonksiyonel de dahil olmak üzere farklı programlama paradigmalarını inceleyin.
Çoğu programlama dili soyut makineler olarak tanımlanmaktadır. Daha sonra, derleyiciler, bağlayıcılar, montajcılar, tercümanlar, statik analizörler, ara diller ve donanım gibi, bir program tarafından gözlemlendiği gibi, soyut makinenin en azından beklenen tüm davranışlarını onurlandıran bir sonuç üretecek araçlar kümesi kullanılarak uygulanır. .
C, yukarıdaki kuralın bir istisnası değildir. Gerçek donanımınız hakkında hiçbir fikri olmayan soyut bir makine olarak tanımlanmıştır.
Bu nedenle, insanlar C'nin size bilgisayarınızın gerçekte nasıl çalıştığını öğrettiğini söylediklerinde, genellikle bunun anlamı C'nin C'nin nasıl çalıştığını öğretmesidir. Ancak C, sistem programlamasında çok yaygın olduğu için, birçok insanın bilgisayarı kendisiyle karıştırmaya başlaması anlaşılabilir. Ve kişisel olarak, C'nin nasıl çalıştığını bilmek, bilgisayarın nasıl çalıştığını bilmekten daha önemli olduğunu söyleyebilirim.
Ama yine de, C ve bilgisayar olan farklı şeyler. Gerçek donanım aslında karmaşıktır - C özelliklerinin bir çocuk kitabı gibi okunmasını sağlayan şekillerde. Donanımınızın nasıl çalıştığıyla ilgileniyorsanız, her zaman bir kılavuz arayabilir ve bir montajcıya kod yazmaya başlayabilirsiniz. Veya dijital devreleri öğrenmeye her zaman başlayabilirsiniz, böylece bazı donanımları kendi başınıza tasarlayabilirsiniz. (En azından, C seviyesinin ne kadar yüksek olduğunu takdir edeceksiniz.)
Tamam, aslında donanımı öğrenmek C'den başka şeyler içeriyor. Fakat C bugün programcılara başka bir şey öğretebilir mi?
Sanırım buna bağlı.
Bu olasılıklardan birini seçmek için çok hızlı olmayın. Uzun yıllardır kod yazıyorum ve hangisinin doğru cevap olduğu ya da doğru cevabın sadece ikisinden biri olup olmadığı ya da bu konuda doğru cevap diye bir şey olup olmadığı hakkında hala bir fikrim yok.
Her iki seçeneği de muhtemelen onları tanımladığım sıraya göre gevşek bir şekilde uygulamanız gerektiğine inanmaya meyilliyim. Her insan önemli ölçüde farklı şekillerde öğreniyor gibi görünüyor.
Yukarıdaki soruyu en azından önerdiğim ikinci seçeneği dahil ederek cevapladıysanız, kemerinizin altında zaten birkaç cevabınız var: daha yüksek seviyeli dillerde öğrenilebilecek her şey, C veya en az, karışıma C ilave edilerek genişletilir.
Ancak, cevabınıza bakılmaksızın, neredeyse sadece C'den (ve belki de bir avuç diğer dilde) öğrenebileceğiniz birkaç şey var.
C tarihsel olarak önemlidir. Bu, nereden geldiğimizi değerlendirip takdir edebileceğiniz ve nereye gittiğimiz hakkında belki biraz daha fazla bağlam elde edebileceğiniz bir kilometre taşıdır. Belirli sınırlamaların neden var olduğunu ve bazı sınırlamaların kaldırıldığını takdir edebilirsiniz.
C size güvenli olmayan ortamlarda çalışmayı öğretebilir. Başka bir deyişle, dil (herhangi bir dil) sizin için, herhangi bir nedenle yapamadığında veya yapmayacağınızda sırtınızı izlemeniz için sizi eğitebilir. Bu, güvenli ortamlarda bile sizi daha iyi bir programcı yapabilir, çünkü kendi başınıza daha az hata üreteceksiniz ve aksi takdirde güvenli programınızdan biraz daha fazla hız almak için güvenliği geçici olarak kapatabileceğiniz için (örn. İşaretçilerin kullanımı) C #), güvenliğin bir çalışma zamanı maliyeti ile geldiği durumlarda.
C, her nesnenin depolama gereksinimlerine, bir bellek düzenine, belleğe sınırlı bir adres alanı üzerinden erişilebileceği gerçeğine sahip olduğunu öğretebilir. Diğer dillerin bu konularda dikkatinize ihtiyacı olmasa da, edinilmiş bazı sezgilerin daha bilinçli kararlar vermenize yardımcı olabileceği birkaç durum vardır.
C, bağlantı sistemi ile bağlantı ve nesne dosyaları ve diğer karmaşıklıkların ayrıntılarını size öğretebilir. Bu, yerel olarak derlenmiş bir programın genellikle kaynak koddan yürütmeye nasıl geçtiğine dair kullanışlı bir pratik anlayış sağlayabilir.
C, tanımlanmamış davranış kavramı ile zihninizi yeni şekillerde düşünmeye zorlayabilir. Tanımsız davranış, yazılım geliştirmedeki en sevdiğim kavramlardan biridir, çünkü klasik olmayan derleyiciler üzerindeki etkilerinin incelenmesi, diğer dillerden tam olarak alamadığınız benzersiz bir zihinsel egzersizdir. Ancak, deneme yanılma özelliğini reddetmeniz ve bu yönü tam olarak takdir edebilmeniz için dili dikkatli ve kasıtlı bir şekilde incelemeye başlamanız gerekir.
Ancak belki de C'nin size küçük bir dil olarak verebileceği en önemli fark, tüm programlamanın veri ve işlemlerle sınırlı olduğu fikridir . Şeylere hiyerarşili modüler sınıflar ve sanal gönderimli arayüzler veya saf matematiksel işlevler kullanılarak işletilen zarif değişmez değerler olarak bakmak isteyebilirsiniz. Her şey yolunda - ama C size her şeyin sadece veri + işlemler olduğunu hatırlatacak . Yararlı bir zihniyet, çünkü birkaç zihinsel engeli azaltmanıza izin veriyor.
C'nin öğrenme için iyi olmasının nedeni, herhangi bir prensibi öğretmesi değildir . Size, işlerin nasıl çalıştığını öğretir .
C, sadece sürmek için inşa edilmiş 70 veya 80'lerin eski arabalarından biriyle karşılaştırılabilir. Onları parçalayabilir, vidalayarak vidalayabilir ve her parçanın nasıl çalıştığını ve bakmak için ellerinizde alabileceğiniz diğer parçalarla nasıl çalıştığını anlayabilirsiniz. Tüm parçaları anladıktan sonra, bütünün nasıl çalıştığını çok net bir şekilde görebilirsiniz.
Modern diller, motorun temelde bir kara kutu olduğu modern bir araba gibidir, ortalama bir araba sahibi tarafından anlaşılamayacak kadar karmaşıktır. Bu arabalar çok şey yapabilir, heck, bu günlerde aktif olarak kendi başlarına sürmeyi öğreniyorlar. Bu karmaşıklık ve rahatlıkla, kullanıcı arayüzü motorda olup bitenden çok daha uzağa taşındı.
C'de programlamayı öğrendiğinizde, bir bilgisayarın yapıldığı birçok vida ve somunla temas edersiniz. Bu, makinenin kendisini anlamanıza olanak tanır. Örneğin, böyle uzun bir dize oluşturmanın neden iyi bir fikir olmadığını anlamanıza izin verir:
java.lang.String result = "";
for(int i = 0; i < components.size; i++) {
result = result + components[i];
};
(Umarım, bu doğru Java, bir süredir kullanmadı ...) Bu kod örneğinden, döngü neden ikinci dereceden karmaşıklığı olduğu açık değildir. Ancak durum böyledir ve birleştirilecek birkaç milyon küçük bileşene sahip olduğunuzda bu kodun öğütme durmasına neden olmasının nedeni budur. Deneyimli C programcısı sorunun nerede olduğunu anında bilir ve büyük olasılıkla bu kodu ilk etapta yazmaktan kaçınır.
for(int i = 0; i < strlen(s); i++)
C'de yazarsanız , döngü de ikinci dereceden karmaşıklığa sahip olacak ve Java örneğinizdeki kadar açık değil ;-)
"Programlamanın ardındaki ilkeleri", özellikle teorik ilkeleri öğrenmek için C'den daha iyi diller vardır, ancak C, el işi ile ilgili bazı pratik, önemli şeyleri öğrenmek için iyi olabilir. greyfade'ın cevabı kesinlikle doğrudur, ancak IMHO, C'den öğrenebileceğiniz, hafızayı kendiniz nasıl yöneteceğinizden daha fazlasını öğrenebilirsiniz. Örneğin,
istisnalar olmadan tam bir hata işleme ile programlar nasıl oluşturulur
nesne yönelimi için herhangi bir dil desteğine sahip olmadan bir programda yapı nasıl oluşturulur
dinamik büyük boyutlu listeler, sözlükler veya faydalı bir dize soyutlaması gibi veri yapılarının yokluğunda verilerle nasıl başa çıkılacağı
derleyici veya çalışma süresi ortamı sizi otomatik olarak uyarmasa bile dizi taşmaları gibi yaygın hatalardan nasıl kaçınılır
şablonlar veya jenerikler için dil desteği olmadan jenerik çözümler nasıl oluşturulur?
ve tabii ki hafızayı kendiniz nasıl yöneteceğinizi öğrenebileceğinizden bahsetmiş miydim? ;-)
Dahası, C öğrenerek, C ++, Java, C #, Objective C'nin sözdizimsel ortaklıklarının nereden geldiğini öğreneceksiniz.
2005 yılında Joel Spolsky, daha yüksek seviyedeki herhangi bir dilden önce C öğrenmek için bir tavsiye yazdı . Argümanları
"hiçbir zaman üst düzey dillerde etkin kod oluşturamazsınız."
"En iyi programlama işlerinden bazıları olan derleyiciler ve işletim sistemleri üzerinde asla çalışamayacaksınız."
"Büyük ölçekli projeler için mimariler oluşturmaya asla güvenilmeyeceksiniz"
" while(*s++ = *t++);
bir dizeyi neden kopyaladığını açıklayamıyorsanız ya da bu size dünyadaki en doğal şey değilse, batıl inanca dayalı olarak programlıyorsunuz
Elbette, yazdığı şey kesinlikle tartışmalıdır, ancak IMHO'nun birçok argümanı bugün hala geçerlidir.
Hesaplamanın iki temel soyutlaması Turing makineleri ve Lambda hesabıdır ve C Turing makinesi hesaplama görünümü ile denemenin bir yoludur: çoğunlukla istenen bir sonuç ortaya çıkaran düşük seviyeli eylemlerin ardışıklığı. Ancak, C'nin kendi hesaplama modeliyle geldiğini unutmamalısınız. Böylece, C öğrenmek size gerçek mimarilerden oldukça farklılaşan C soyut makinenin düşük seviyeli ayrıntılarını öğretecektir. C'de öğretilen ilk şeylerden biri, derlemeyi "zeki" numaralar uygulayarak zekice yüceltmemekti ve trendin derleyicilerdeki gittikçe daha fazla optimizasyon yönünde olduğu anlaşılıyor. Diğer yüksek seviyeli dillerde olduğu gibi, C dilinde yazdığınızda, derleyiciler soyut C makinesinde ne yapmayı beklediğinizi anlar ve bunu gerçek donanımda gerçekleştirir,
Demek istediğim, C öğrenmenin, aslında donanımda gerçekte ne olduğunun iyi bir resmini vermeyeceği. "C makineye yakındır", "çoğu üst düzey dilden daha yakın" olarak anlaşılmalıdır. Eğer "nasıl çalıştığını" daha doğru bir şekilde görmek istiyorsanız, yazılım mimarisini doğrudan öğrenmek daha faydalı olacaktır.
Öte yandan, C öğrenimi sistem programlaması, düşük seviye türleri, işaretçiler ve özellikle de bellek tahsisi hakkında bilgi verebilir. Öğrenme algoritmalarına ve veri yapısına gelince, onları diğer dillerde değil de C'de öğrenmenin bir avantajı yok.
Çok açık uçlu bir soru, kesin bir cevap veremezsiniz. Dil çerçevesinin iç kısımlarını anlamanız koşuluyla her dilde hemen hemen her şeyi öğrenebilirsiniz. C sizi daha düşük ayrıntıları anlamaya zorlar, çünkü öncelikle bir işletim sistemi yazmak için tasarlanmıştır. Yıllar sonra bile, öncelikle gömülü sistemler ve açık kaynak projeleri sayesinde hala en çok kullanılan dillerden biri. Peki, soru ne öğrenmek istiyorsun? Peki hangi alanda?