it-swarm.dev

C. bilmiyorum ve neden öğreneyim ki?

İlk programlama dilim PHP ( gasp ). JavaScript. Son zamanlarda C # ile çalıştım.

Daha önce hiç C gibi düşük veya orta seviye dillere bakmadım.

Geniş kapsamlı programlama topluluğundaki genel fikir birliği, "C gibi bir şey öğrenmeyen bir programcının açıkçası işaretçiler, veri türleri, değerleri referansa göre geçirme vb.

Katılmıyorum. Şunu iddia ediyorum:

  1. Üst düzey dillere kolayca erişilebildiğinden, daha fazla "programcı olmayan" dalıyor ve ortalığı karıştırıyor
  2. Yüksek seviyede bir dilde gerçekten bir şeylerin yapılabilmesi için, "öğrenme-düşük-seviye-ilk" in çoğu tarafının evangelize ettiği benzer kavramları anlaması gerekir.

Bazı insanlar C'yi bilmelidir; bu kişilerin düşük ve orta seviye kod yazmalarını gerektiren işler vardır. C'nin harika olduğuna eminim ve C'yi bilen birkaç kötü programcı olduğundan eminim.

Neden önyargı? İyi, dürüst, aç bir programcı olarak, C'yi (öngörülemeyen bir nedenden dolayı) öğrenmek zorunda kalsaydım, C'yi öğrenirdim. Orada çok sayıda dil göz önüne alındığında, iyi programcılar bizi neyin geliştirdiğini öğrenmeye odaklanmamalı mı? Bizi neyin ilgilendirdiğini öğrenmemeli miyiz? Sonlu zamanımızı ileriye doğru hareket ettirmemeliyiz? Neden bazı programcılar buna katılmıyor?

Yaptığınız işte mükemmellik için çabalamanın, iyi programcılar ve kötü programlar arasındaki temel deterministik özellik olduğuna inanıyorum.

Java, Pascal, PHP veya JavaScript gibi yüksek düzeyde bir dilde yazılmış bir şeyin C'nin önceki bilgisinden gerçekten nasıl faydalandığına dair gerçek dünya örnekleri var mı? Örnekler en çok takdir edilecektir.

58
Stephen

C'yi bilmenin avantajı, bir bilgisayarın nasıl çalıştığı hakkında çok iyi bir fikriniz olması. Sadece programlama modelinizin nasıl çalıştığı değil, belleğin nasıl düzenlendiği vb.

C'nin altındaki tek seviye, belirli bir CPU tarafından konuşulan Meclis'tir.

(C'yi bilmenin aynı zamanda daha üst düzey bir dilde ne kadar az iş yapmanız gerektiğini de takdir etmenizi sağlar. Ve umarım bu üst düzey dilde çalışmakla ilgili maliyet değerini takdir edin.)

113
Frank Shearar

Buradaki cevapların hiçbirinin OP'nin aradığı şey olduğunu düşünmüyorum, bu yüzden kendi fikrimi atacağım.

Bak, ben özür dilemeyen bir C burcuyum. Benim tutumum C'yi bilmiyorsanız, bir dereceye kadar bir programcı olarak ne yaptığınızı gerçekten bilmediğinizdir. Sanırım burada bahsettiğiniz bir çeşit "taraflı" insanım.

Ancak, pratikte, siz gerçekten bir programcı olarak ne yaptığınızı bilmeniz, gerçekten harika, kullanışlı yazılımlar geliştirmenizi engellemez. üst düzey araçlar kullanarak. Yani, Stack Overflow'un yaratıcısı Jeff Atwood, görünüşe göre C'yi bile bilmiyor ve yine de Stack Overflow'un oldukça iyi bir web uygulaması olduğunu söyleyebilirim.

C (veya C++ veya Assembly) öğrenmeye karar verip vermediğiniz, ne tür bir programcı olmak istediğinize bağlıdır. Sadece harika web uygulamaları veya iş uygulamaları geliştirmek istiyorsanız, bu iyi - C'yi öğrenmeye gerek yok. Ama gerçekten Excel'de yapıyorsunuz - eğer sanat durumunu zorlayan gerçekten harika projeler üzerinde çalışmak istiyorsanız, o zaman gerçekten kendinizi bir programcı olarak yeterince ciddiye almanız gerekir. bilgisayarların nasıl çalıştığını gerçekten anlamak . C aslında OS lingua franca ve hemen hemen her şeye güç veren dil olduğu için (Linux çekirdeğinden çoğu Java VM'ler, Python) = ve Ruby tercümanlar, SQL veritabanları, web sunucuları ve hemen hemen her aygıt sürücüsü), dilin samimi bir şekilde anlaşılması uzun bir yol kat eder.

C (veya C++) bilmenin, milyonlarca (veya yüz milyonlarca) insanı etkileyen büyük açık kaynaklı projelere katkıda bulunmak için büyük bir fırsat yarattığından bahsetmiyoruz. Python yorumlayıcıyı veya Chromium web tarayıcısını geliştirmek için çalışmak ister misiniz?) İlk olarak C'yi ve ikincisi için C++ bilmeniz gerekir.

Bu yüzden C'yi Latince gibi ölü doğal dillerle veya at ve at arabası gibi modası geçmiş teknolojilerle karşılaştırmak tamamen yanlıştır. 21. yüzyıl yazılım altyapımızın büyük bir kısmı C kodu ile güçlendiriliyor, bu yüzden C bugün her zamanki gibi geçerli.

Yani, C öğrenip öğrenmemeniz gerçekten bir programcı olarak kariyerinizden ne istediğinize bağlıdır.

72
Charles Salvia

Pratik bir kural, genellikle çalıştığınız alanın altındaki en az bir soyutlama düzeyini anlamanız gerektiğidir. PHP veya JavaScript yorumcunuzun gerçekten C veya C++ 'da uygulanabileceğini düşünün. Sonunda yorumlayıcıda bir hataya, hatta C çalışma zamanı hatasına çarpacaksınız.C'yi anlamadıysanız, bakımcıya bir hata raporu göndermekle sınırlı olacaksınız. C'yi tanıyorsanız, onlara sorunun tam olarak nerede olduğunu ve ne olduğunu söyleyebilirsiniz.

Bu aynı zamanda, C/C++ ile çalışıyorsanız, en azından platformunuzda Meclisi okuyabilmeniz gerektiği anlamına gelir.

İhtiyacınız olduğunda C öğrenmeye gelince: gözlemcim, çoğu programcının Perl/Python/Javascript'i talep üzerine öğrenebileceği, ancak montajcı/C/LISP'nin çok daha fazla zaman gerektirdiği görülüyor, bu yüzden ihtiyaçtan önce en azından bazı temel bilgileri öğrenmeye değer doğar.

12
Charles E. Grant

C ilk olarak öğrenmeniz gerektiğini kabul etmiyorum, ancak C sonunda öğrenmeniz gerektiğine inanıyorum. Tüm soyutlamalar sızıntılıdır ve C'yi anlamak, süslü bir üst düzey soyutlama kullandığınızda gerçekte ne olduğunu anlamayı kolaylaştırır. Bununla birlikte, aynı zamanda tüm ciddi programcıların en azından montajcı okumayı öğrenmeleri gerektiğini düşünüyorum.

Bu düşük seviyeli kavramları öğrenmek, yüksek seviyeli şeyler hakkında akıl yürütme yeteneği sunar. Örneğin, C++ ve D'de sanal işlevlere yönelik varsayılan bağımsız değişkenler, dinamik (çalışma zamanı) türüyle değil, nesnenin statik (derleme zamanı) türüyle belirlenir. Acı ve çağrı kurallarının nasıl çalıştığını ve sanal fonksiyonları tersine uygulamanın neden son derece zor olacağını anlamadığınız sürece bu bir anlam ifade etmiyor.

7
dsimcha

Önyargı statükodan biridir. Eski günlerde (1980'ler ve öncesi), C/C++ performans uygulamaları için neredeyse bir gereklilikti. Bu değişti, ancak üst düzey geliştiriciler genellikle o eski skool geçmişinden geliyor ve bu bağlamdaki şeyleri görüyorlar.

Gerçek gelişim için diğer diller are kullanılır - C # Java gibi popüler bir dil iken PHP ve Python için popülerdir) dahili projeler ve açık kaynak seçmeniz durumunda bu alanda en az temel bilgiye sahip birisinin elinizin altında olması her zaman yararlıdır PHP projesi için, hata izleme sisteminiz diyelim. teknik özellikler hala 25 yıl önce yazılmış standart şablondan geliyor gibi görünüyor.

7
JohnL

Ne harika bir sümüklüböcek! (Sözde söyledikleri gibi: Bu özel bir mücadele mi, yoksa herkes katılabilir mi?)

Ben bir profesördüm ve bulduğum şey (bazı deneme-yanılma sonrası), temel düzeyde, bir bilgisayarın ne yaptığını anladıysa, öğrencileri karmaşık programlama kavramlarına yönlendirmenin daha kolay olmasıydı. Tüm nitty ayrıntılarında değil, temel prensip, hafızanın ne olduğu, talimatların ne olduğu vb. Gibi. C hakkında sevdiğim şey, makineye yakın olmasıdır.

Bu, diğer öğretmenlerin aynı yere geldiği anlamına gelmez. Üst düzey dilde başladılar (BASIC :-) ve belirgin bir olumsuz etkisi olmadan oradan ileriye gittiler.

Sonuç olarak Stephen, haklı olabilirsin. Ben öyle düşünmezdim ama daha önce yanılmışım.

6
Mike Dunlavey

Zorunlu Joel blog yayınını göndermekten nefret ettiğim kadar, ona katılıyorum burada . C, programlamanın ortak dilidir. Onunla bir şekilde iletişim kuramayan herhangi bir üst düzey dili düşünemiyorum. Bu nedenle, C hala tip programlayan sistemler için popüler bir seçimdir. C olmadan işletim sistemi düzeyinde bazı şeylerle arayüz kuramazsınız.

Bunun yanı sıra, üst düzey diliniz yeterince hızlı olmadığında ne yapmayı planlıyorsunuz? C'nin nasıl yazılacağını bilmek, Ruby, Python veya PHP gibi üst düzey, dinamik olarak yazılmış bir dil kullanırken özellikle önemlidir. Ancak Java ve C # programcılarının bile zaman zaman C'ye düşmeleri gerekir.

6
Jason Baker

Sanırım bu bir ilerleme.

Yirmi yıl önce, geleneksel bilgelik, C gibi daha üst düzey dillerden ne kazandığınızı anlamak için montajcıyı öğrenmek zorunda olmanızdı (bu yüzden üniversitede VAX Macro kullanarak bir montajcı sınıfı almak zorunda kaldım; sanırım mezun olduktan sonra ne kadar yararlı olduğu ortaya çıktı).

C'nin öğrenmesi biraz zor olduğu ve neredeyse hayır soyutlamalar sağladığı (işaretçiler ve bayt akışları hemen hemen budur), bir şekilde öğrenmenin sizi bir şekilde daha iyi bir programcı yapacak veya size daha fazla fikir vereceği bir batıl inanç var. donanım seviyesinde nasıl çalıştığına dair.

Bu (zorunlu olarak) doğru değildir. Standart C, metale diğer 3GL'lerden (Pascal, Fortran, vb.) Daha yakın olamaz. Bazı C ygulamalar, bazı alanlara daha fazla erişim sağlayan kancalar sağlayabilir, ancak genel olarak çıplak işaretçiler neredeyse aldığınız kadar yakındır, ki bu hiç de yakın değildir. Örneğin, kayıtlara veya durum sözcüklerine doğrudan erişemezsiniz.

Sonunda, her şey opcodes ve adresleme modlarına gelir, bu yüzden gerçekten şeylerin daha düşük düzeyde nasıl çalıştığıyla ilgileniyorsanız, C üzerinden öğrenme montajcısına daha iyi hizmet edersiniz.

Kendi başına, C öğrenmek (mutlaka) sizi daha iyi bir programcı yapmaz. Yine de, gerçek dize türleri ve standart konteyner kütüphaneleri için kesinlikle bir takdir verecektir.

4
John Bode

Procoective sordu: C öğrenmek zorunda olmadığınızı onaylamak istiyor musunuz? saf C (mutlaka C++ değil) öğrenirseniz, bir bilgisayarın yürütme modelini tam olarak anlayacaksınız. Özellikle bellek ve ayırma hakkında. Bu şeyler aynı zamanda üst düzey dillerde programlama yapan kişiler için de önemlidir.

PHP programcı için kodun belirli bir makinede nasıl yürütüldüğüne dair daha az şeffaftır. PHP programcı Ağ aktarımı şişe boynu olduğundan) uygulama vb.

Düz PHP/Python/C #, dil ve CPU arasında çok sayıda soyutlama katmanına sahiptir. bu katmanlar o kadar kalındır ki, bunlara bakmanıza izin vermezler. C'yi öğrendiğinizde, siz ve CPU ile işletim sistemi arasında ince bir sayfa vardır. Bu, programlamayı kolaylaştırmaz (ve daha da iyi olmayabilir). Ama aslında CPU'nun nasıl çalıştığını öğrenebilirsiniz. "Orta" C'yi öğrendikten sonra, aslında bu bilgiyi daha üst seviyedeki dile bağlamaya başlayabilirsiniz. Bu kazanacağınız acil faydadır.

Bence bir programcı her zaman farklı programlama kavramlarını öğrenmek için biraz zaman harcamalıdır. C'ye bir göz atmak kesinlikle işe yarıyor, aynı zamanda Clojure, Haskell, Prolog gibi daha yüksek seviyeli programlama dillerine de göz atıyor.

Bunlarda usta olmanıza gerek yok, sadece programlama dillerinin "seviyelerinin" ikili olmadığı dersini öğretecekler, ancak birçok seviye var. Bunları yukarıdan aşağıya doğru tanıyın (Assembler). Seni daha iyi bir programcı yapacak.

2
wirrbel

Dilde yazılmış çok önemli kodların büyük bir miktarı nedeniyle, C ile yazılan kodu okumak için yeterli C'yi bilmeniz gerekir. Bu, dilde kod yazmak zorunda kalmadan konuyla ilgili kapsamlı bir el kitabından (Kochan'ın "C" programlamasını kullandım) iyi bir şekilde geçmekten koruyacağınız şeyle ilgili. Dili yoğun bir şekilde kullanmanızı gerektiren bir duruma gelirseniz, iyi bir temel oluşturacaksınız. Makine size uygun olmayan bir kara kutu ise muhtemelen Duntemanns Assembly kitabı gibi bir şey çalışmak istersiniz. Ayrıca Petzold "Kod" öneririz.

Bunun dışında - C'deki temel okuryazarlık ve altta yatan makine ile temel aşinalık - en iyi çalışma zamanınızı SICP, TCP/IP Illustrated veya Beton Matematik, algoritmalar veya veri yapısı gibi gerçek şeyler üzerinde harcayarak hizmet etmelisiniz. . Gerçek şeyler.

PHP) kodlama yaparken C'yi incelemek için çok fazla zaman harcamak fırsat maliyetine değmez.Öğrenmesi gereken daha faydalı şeyler var.C gerçekten sadece çalışma ile iyi öğrenebileceğiniz başka bir dildir ve kullanın, ancak ihtiyacınız olduğunda alabilir.

Zor şeyleri terlet.

2
naftalimich

Dil bir araçtır. Sadece web sayfaları ve benzeri şeyler yazmak zorunda kalırsanız, o zaman C'yi öğrenmek zorunda kalmadan uzaklaşabileceğinizden eminim, aynı şekilde sadece plastik model kitleri yaparsanız sadece keskin bir bıçak ve yapıştırıcıya ihtiyacınız vardır, anahtar normalde gerekli değildir.

Son derece kısıtlı bellek kaynaklarına sahip gömülü sistemler için kod yazıyorum (son zamanlarda yaptığım en büyük 16kbayt ve bu BÜYÜK idi) Bu pazarda C veya montajcı sadece seçenekler ve kabarık üst düzey dillerden herhangi biri çalışmıyor.

2
uɐɪ

Deneyimlerime göre, bir süre C/C++ iyi programcıları VB6 kodlayıcılarından ayıran iyi bir tampondu. Beş garip C/C++ yaptıktan sonra VB6'da çalıştım. Kodlayıcıların kalitesine (veya eksikliğine) hayran kaldım. Dilin bağırsaklarına, tasarıma veya performansa pek ilgi göstermediler. Ne yazık ki, şirket .Net'e taşındığında, C/C++ kodlayıcıları ve .Net kodlayıcıları aynı araçları kullanıyordu. VB kodlayıcılar VB.Net kodlayıcıları daha da kötüydü.Tüm geliştirme ASP.NET'e gittiğinde durum daha da kötüleşti. Aniden bir kontrolü sürükleyip bırakabilen herkes bir programcıydı.

İş piyasasında, sert çekirdekli kodlayıcıları (eski C/C++) ve turistleri ayırt etmek için çok fazla şey yoktu.

Bu nedenle, özgeçmişinizde C veya C++ bulunması riff-raff'tan farklı olmanıza yardımcı olabilir.

2
dave

C (ve muhtemelen C++), içinde denize açıldığınız denizdir. Kodunuzu çalıştıracak işletim sistemi muhtemelen C (ve C++) olarak kodlanmıştır. Bu nedenle işletim sistemi hizmetlerine erişmek için yerel API'niz C cinsinden olacaktır.

Aşağıda ne olduğunu bilmeden yapabiliyorsanız, C'yi bilmenize gerek yoktur. Ancak, çoğu programcının hayatlarının bir döneminde daha düşük seviyelere dalması gerekir.

Ayrıca geliştirme alanlarındaki uzmanlığınıza da dayanmaktadır. Örneğin, HTML, Javascript ve bazı sunucu tarafı komut dosyaları yazan bir web geliştiricisinin C hakkında hiçbir şey bilmesine gerek olmayabilir, ancak dağıtılmış bir sistem veya oyun geliştiricisi olacaktır.

Mesleğiniz için çok temel bir şey öğrenmek için birkaç hafta harcamak asla acıtmaz.

1
Mert Akcakaya

C, diğer dilleri yazmak için kullanılan dildir. CPU ve diğer donanımlarla istediğiniz kadar samimi olmanızı sağlar.

C'yi bilmiyorsanız, diğer dillerin yaptıkları sonuçlara nasıl ulaştığını bilmiyorsunuz.

Soyutlama elbette önemli bir kavramdır ve herkesin kendi seçim çerçevesinin vaat ettiği sonuçları nasıl elde ettiğini bilmesi gerekmez. İyi bir kod yazmak için 20 yıl C yazmak veya çok sayıda miras kullandığınızda düşüncelerinize ne olacağını düşünmek zorunda değilsiniz.

Şimdi, 4 zamanlı bir motorun nasıl çalıştığını anlamadan veya gerçekten bir vites değiştirme (manuel vites kutusu) kullanmadan bir araba kullanabilirsiniz.

Bununla birlikte, kaputun altında neler olup bittiğini anlarsanız, zaman zaman bu bilgiye sahip olmayan bir kişinin çoğaltmak için mücadele edeceği olağanüstü sonuçlar elde edebileceksiniz.

1
Bill Michell

C'nin birçok avantajı vardır:

  1. C düşük seviyeli bir dildir. Çekirdek ve sürücü geliştirmek için c'yi kullanabilirsiniz.
  2. C en hızlı dildir. Birçok güç yazılımı c tarafından geliştirilebilir. Örneğin: memcached, redis, nginx, Apache, mysql vb.
  3. C, platformlar arası bir dildir. C tarafından geliştirilen program her platformda çalıştırılabilir. Diğer platformlar arası diller bunu yapamaz. Java, python, php vb iOS platformunda çalışamaz.
  4. C++ pek çok gömülü sistemde çalışamaz.
1
Edward Shen