Genel olarak OS'es ve bilgisayarların daha derin bir anlayış almak için C öğrenme değer mi?

18 Cevap php

Ben şu anda bir Actionscript 3 ve PHP geliştiricisi olarak çalışıyorum. Ben Php sonra Actionscript 3 geçti ve şimdi ben Python öğreniyorum öğrenmeye başladı. Bu 3 dil bunlardan hiçbiri düşük seviye bellek yönetimi ve hangi veri türü farklı numaralar için kullanmak bilmek gibi şeyler hakkında endişelenmenize gerek üst düzey diller vardır.

Ben 3 farklı programlama dilleri bilmek bile ben bir şey eksik gibi hissediyor. Örneğin ben bile bir yığın taşması (Evet, ben stackoverflow bu soruyu yazıyorum çünkü ben utanılacak gerektiğini biliyorum) ne olduğunu bilmiyorum ve neden oluşur. Ben iş benim doğrultusunda bu tür problemlerin yüz asla gitmem çünkü ben bu tür şeyleri bilmek asla.

Yani benim size soru oldukça basittir. Ben iş benim doğrultusunda onunla çalışmak için gitmiyorum bile C öğrenme yararlanacak?

18 Cevap

Bu iyi bir adım, ama İtalyanca öğrenme Dante'nin İlahi Komedya anlamak için yeterli olup olmadığını soran gibi. Üst düzey programlarda yok OS ve düşük seviyeli programlamada farklı bir çok şey var. C, günün sonunda, sadece bir dildir.

Ben kesinlikle C öğrenmek söylüyorlar, ama böylece derleyici inşaat, temel işletim sistemi kavramları ve benzeri şeyler üzerinde bazı kitap okumak için kullanmak istiyorum. Eğer gerçekten düşük düzey kavramları öğreneceksiniz orası.

Şey öğrenme nadiren bir zaman kaybıdır. Ve C öğrenmek için oldukça basit bir dildir. Ben ticari olarak öğretmek için kullanılan ve biz 4,5 gün içinde çok yaptım. Yani bir deneyin derim.

Ben Joel tarafından bu makaleyi okumanızı öneririz:

http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html

Daha az ya da Java ve C / C + + arasında bir karşılaştırma yapar, ama endişelerinizi epeyce giderir düşünüyorum.

Bir şey bilmiyorsanız, ilk önce, sen utanılacak asla. Ayrıca, yığın taşması (cevap isim kendisi olduğunu) anlamak çok da zor değil.

Ben her zaman sadece teoride bir şeyler öğrenme korkunç bir zaman var. Ellerim kirli alabilirsiniz sürece, ben tamamen kavramını kavramak yok. C derece kullanışlı giriyor gerçekten. Sen Os internals & okuyabilirsiniz taşmaları yığını ancak C ile eylem onları görmek mümkün olacaktır.

C öğrenmesi kolay bir dil olduğunu, ancak (tüm huyların ile) master için çok zor bir dil. Yani, (eğer gelişmiş kavramları ana istiyorsanız özel) ama ben deneyimlerinden söz onun tamamen buna değer çaba biraz gerektirecektir o.

Eğer ciddi bir programcı olmak istiyorsanız kesinlikle gerekir.

Id even suggest to have a look at assembler. you dont have to code real-world programs, but i think its essential to know how control structures and functions look in assembler. This gives you a better understanding of what really happens and you'll get a better feeling which stuff in high-level languages is expensive.

But C (beeing something like an assembler-macro) should be the first step. Try to get as much index errors (access array elements out of bound) and memory leaks (keep on allocating memory without freeing it after use) as you can. Keep your code complex enough so that you dont find them too soon. ;) Youll love your higher languages even more after that.

Ve: ne i OOP anlaşılması açısından çok öğreticidir bulunmuş nesne yönelimli düz C. Bu C bazı bilgi talepleri kodlama oldu:

http://www.state-machine.com/devzone/cplus_3.0_manual.pdf

Belki. Ben aşağıdan yukarıya çalışıyorum çünkü ben, hemen hemen sadece şimdi için C yazmak. Ben başlamadan önce de (en azından biraz) iyi yazılım mimarisinde tecrübeli olabilir: Ben öyle düşündüm ben üniversiteye gitmeden önce öldürmek için zaman bir grup var. Öğrenmek için üst düzey kavramları daha kolay (bazı durumlarda) yapar, vb soruna yetenek çözmek, ben çok gençken ben PHP ve VB6 öğrendim artırır. Ben bir "dize" tek bir değer olmadığını kavramak için C ve montaj, benim için en zor şey aşağı taşındı, ama ne zaman bir tek değerler dizisi - ve ben sadece birini diğerine karşılaştırmak olamazdı - I vb - her karakter dizisi hareket ve farkı bulmak zorundaydı. Bu gibi küçük şeyler beni yeniden düşünmek ve bilgisayarlar aslında nasıl çalıştı yeniden öğrenmek yaptı. Ben işlemci kayıtları (!? Eğer 32 bit yararlı bir şey koymak nasıl) tamamen yararsız olduğunu düşündüm - Ben dizeleri dışında yaklaşık o şeyi bulmadan önce ben, demek istiyorum.

Söyleniyor, ben bunu kullanmak asla olmasına rağmen, alt düzey programlama öğrenme potansiyel faydaları hakkında gevezelik. Ama benim için, ne olursa olsun nedeni ile gelip - bu genel ilgi çoğunlukla bulunuyor. Ben C eğlenceli olduğunu düşünüyorum, ve daha ben onunla başarmak, daha iyi benim beceri hakkında hissediyorum. Vb bir yığın taşması ne gibi şeyler, hesaplamalı matematik, düşük seviyeli bellek yönetimi (geçersiz veya boş işaretçileri, yığın yolsuzluk ve parçalanma, vb), öğrenme ilgi bir sürü bulabilirsiniz yoksa - o zaman bir garantisi yok ondan 'll really yarar. Ama olabilir.

Eğer mimarisi hakkında bilgi edinmek için C öğrenmek yaparsanız - ve nasıl şeyler aslında works başlık altında - belki ne deneyin. Ben sık sık bilgisayar aslında bunu yapmak için ne sormak nasıl işleyeceğini görmek için montaj kodu aşağı derlemek. Her görev için alınan her adımını görmek için. Aslında, bu char *a = "a string" ve char a[] = "a string" arasındaki farkı anladım nasıl. P.: Daha yüksek seviyeli diller gerçekten nasıl ağrısız fark olacaktır Ancak iyi yarar

Kayıt için - her süreç bir çağrı yığını verilir. Bu daha önceden belirlenmiş bir boyutta olan bellek bloğudur. Bu esas olarak, lokal değişkenler için kullanılır. Eğer yerel bir değişken yapmak her zaman, bunun içeriği yığının sonuna eklenir - ve bir işlev (ve bu değişkenler kapsam dışına) zaman, bu veriler tekrar kapalı alınır. Çok şeyler yığının sonuna eklendiğinde bir yığın taşması olur ve taşması önceden ayrılan bellek alanı olduğunu. Bu yığını İRİ nesneler koyarak, ya da çok fazla özyineleme (bir fonksiyon kendisini çağıran) bir sonucu olarak genellikle. Ayrıca ben sadece çok işlevleri kadar karışık olsun eğer yineleme sorunu olarak (bu durumda) temelde aynı olan, işlev çağrılarının içine çağırır sanırım.

İhtiyacınız olan her şeyi programlama olursa olsun dil öğrenmek bulunuyor. Her paradigmanın en az birini öğrenmek için çalışın. C iyi bir başlangıç ​​noktasıdır.

MEZUNLARI ... Stack Overflow

Ayrıca derleyici İnşaat bakmak gerekir. Size herhangi bir dil veya programlama paradigması bağımsız davlumbaz altında "mekaniği", hakkında bir çok fikir verecektir.

Gömülü bir geliştirici olmak, C benim ekmek ve tereyağı dildir ama benim için kızartma kızartma patates ile sığır eti ve iyi bir sos gibi tadı. Ben bugün başlayan olsaydı ben ana yola olacak iki dil vardır; Belki C ve C # ve sadece C # ile başa çıkmak için kendini bastardise olmaz bu yönetilmeyen yerel uygulamalar için, C + + çat pat atmak.

Bu gün assembler hakkında muck gerek pratikte yoktur. C derleyicileri ve yonga tasarımı böylece bir C derleyici oluşturur olandan daha verimli assembler yazmak mümkün neredeyse asla iç içedir. Buna ek olarak C. kullanarak yatan sistemin anlaşılması tüm alabilirsiniz

Şimdi, o önce tüm romantik geliyor. yeniden ifade bana izin ver. Eğer Bu "Hello World" çıktısı daha uzaktan daha yararlı bir şey olsun önce okuma bir sürü, bir sürü mis-yapıyor olacak demektir C. değerli bir şey yazmak için eğer altta yatan sistemini anlamak gerekir anlayış ve dokümanlar yazma adamlar hakkında neler konuştuğunu anlamak ancak docs okuma ahbap, aksi halde onlara okuma olmaz çünkü, yeniden-okuma fazla.

C sözdizimi çok, çok kolaydır, ve bir program "yazma" çok kolaydır. Zorluk Hiçbir şey içeri giriyor programınız ve iş yatan OS ve donanım arasındaki etkileşim Başlarken C ücretsiz olduğunu, ancak Aye! güzel bir dil olduğunu.

Herhangi bir dil öğrenme MY tavsiyem: Eğer öğrenmek istediğiniz dili kullanmak için kendiniz yapmak ve zorlamak zorunda projeyi bulun.

Ben C öğrenmek gerektiğini düşünüyorum

Peki, yerine (sadece) öğrenme C yerine, K & R2 okuma olmalıdır.

Burada K & R2 hakkında öğretir ne bir çamaşır listesi:

  • C
  • Sınıflandırma
  • İkili arama ağaçları
  • Hash tabloları
  • Bellek ayırma algoritmaları
  • Von-Neumann düz bellek makine mimarisi
  • Sistem programlama (wc olduğunu --- ya da yapılabilir --- şaşırtıcı derecede kompleks)
  • Kernel ile arabirim

Eğer gerçekten C "olsun", ayrıca çıplak metal kolay erişim; Bu makine-yerli çağrı yığını almak için çok daha kolay olur. Eğer işlev işaretçileri, if-then-else blokları, "goto" ve "dönüş" arasındaki benzerliği görmek sonra, taşması iş patlatır anlamak çok daha kolay olur.

C öğrenme iyi bir şeydir. Size otomatik programların nasıl çalıştığı hakkında her şeyi öğretir, ancak bu bilginin doğru çekilmek yapar çünkü değil çünkü.

"Evet" - burada verilen birçok cevaplar gibi cevabım olacak, "Ben kullanmak asla bir dil öğrenmek gerekir" Ben onu görmek yolu, senin sorunun.

Önemli ölçüde Eğer diğer dillerde kod yazma denemek yılına kadar anlamak asla bir şekilde programlama becerilerini ve faydasını artırmak ve daha hızlı düşünmek değil sadece bulmak değil, aynı zamanda daha basit, daha temiz ve daha iyi kod yazmak istiyorum.

Bildiğiniz üç dil tüm script dilleridir ve değişken ve bellek atama için çok fazla bir şey yok. C zaten bildiğiniz farklı bir dünya ve programlama yaklaşım içine size yol açacak.

this bağlantısını kontrol edin.

P.S. Yığın taşması daha iyi anlaşılması için Jonathan'ın cevap kontrol ve sitenin üstüne güzel sackoverflow.com 'nin resme bakın.

Bu bir yıllık soru ve birçok bit konuda dökülen edilmiştir. Cevap: evet.

  • Eğer günlük olarak bir gün kullanmak bile, bilgisayar kene kılan bir çalışma düşük düzeyde bilgi her zaman yararlı olacaktır.

  • Sen daha sık düşündüğünüzden daha bilgiyi kullanmak (ve bazı durumlarda kendisi C) olacaktır.

  • Eğer dil doğrudan değil programlama bile genel olarak daha iyi bir programcı yapacak birçok deneyimler vardır. C bir örnektir. Diğer örnekler fonksiyonel programlama, Lisp, montaj dil ve ayrıştırıcı yazmayı öğrenme vardır.

C de oldukça basittir, bu yüzden genellikle dışarı yapılır öğrenmekten daha kolay. K & R C kitap nedenle kompakt. Python, Lua veya Tcl gibi birçok dilde yazılmış C modülleri de dahil olmak üzere kendilerini borç - bu genellikle bir sistem geliştirmek için iyi bir yoldur.

Yani, bu tartışmanın her zaman olduğu gibi çözmek gibi görünüyor: Evet. Bunu birçok faydalarını göreceksiniz C öğrenin.

Cevap çok basit: Evet, olur.

Onlar kilometre taşları gibi gibi herhangi bir geliştirici için yararlı olması gerektiğini bazı diller vardır. Ben C, Java, PHP gibi dillere ait olduğunu söyleyebilirim. Sitem hiç kullanmak değil ama şu anda ben, sadece eğitim için JavaScript üzerine bir kitap okuyorum ve muhtemelen olmayacak.

If you like it, go for it!

Diğerleri öğrenme, işaret gibi yeni bir şey her zaman buna değer.

Ancak, yıllık geçmiş birkaç C öğrenilen biri olarak konuşuyorum; Ben C öğrenme için herhangi bir pratik uygulamalar varsa sorunun cevabı bağlıdır düşünüyorum

Benim örnekte; Ben sunucu programları, gömülü programlama C zevk ve temelde her yerde (montaj daha fazla delilik riske atmadan) mümkün olduğunca kontrol etmek istiyorum.

Yani benim önerim size Sonra yaparak öğrenirler C. geliştirmek için mantıklı olacağını ilgilendiren bazı mini-proje bulmak olmasıdır.

Örneğin ben bile ne bir yığın taşması [... olduğunu ...] bilmiyorum ve neden oluşur.

Bir fonksiyonun bir başka aradığında, bilgisayar nerede olduğunu arayan yürütme hatırlamak gerekiyor. Bu bilgiler, bir yığın saklanır: bir işlev çağırarak bir işlev dönen dönüş adresini çıkar ve orada (ya da daha doğrusu geri gider, oysa, "yapıldığında BURAYA $ dönmek" diyerek yeni bir rekor iter işlev çağrısından sonra bir sonraki şey bu sadece) iade edilmiştir.

Tipik (OS veya dil çalışma zamanı tarafından belirlenir) yalnızca bu yığının için alanı sınırlı miktarda var. Bu alanın dışında çalışan bir yığın taşması denir.

Ayrıca bakınız http://en.wikipedia.org/wiki/Stack_overflow

(Bazı Python atılmış olan) Ben de bir Actionscript 3 geliştirici değilim. C öğrenme güncel bir projedir. Objective-C içine biraz güvercin ve AppStore benim ilk app sunulan, ama ben ne yapıyorum düşük bir düzeyde anlayış istiyorsunuz. Ben bir derleyici yazarken veya Linux çekirdeği hack çok fazla ilgi yok, ama ben dokunmak aslında her şey C / C + + özünde, bu yüzden en azından dili üstünkörü bir anlayış almak için zaman zaman değer olduğunu anlamaya.

Mevcut deneyimi ile bunu yararlanarak açısından, the Alchemy project tatlı, ve AS3 C / C + + kitaplıkları kaldıraç sağlar. Bu bazı heyecan verici etkileri vardır.

Şahsen ben her yıl bir dil öğrenme gevşek bir amacı var. Bu yıl Objective-C, ama o içine almak bana bir adım geri almak ve kesinlikle zarar veremez düz C öğrenmek istiyorum yaptı, ve size uzun vadede daha iyi bir programcı yapacaktır.

Benim cevabım: belki. Bu sorular karar vermenize yardımcı olabilir:

  1. Do you have to solve tough mathematical problems involving numerical methods (calculus, linear algebra, diff-eq, finite element analysis, etc.)? Many of the best libraries are written in C, and understanding how to implement those algorithms in another language would require you to understand C so you could translate them.
  2. Do you need to devise compact data structures that waste no memory? My experience in C enabled me to create collection and string classes in Java that used much less memory than the standard classes provided in the J2SE library.
  3. Do you need to interface with legacy applications? Many are written in C or C++.

Orada C öğrenme için birçok iyi nedeni vardır, ancak bunu yapmak niyetinde programlama ne tür bağlıdır, ve C sağlayacak öğrenme thqat beceri ve ihtiyacınız becerileri arasında bir kesişim olup olmadığı.

Çoğu zaman bir şey yapmak nasıl bilerek mutluyuz. Ama sonunda nasıl neden alacak. Bir şey yapıyorsun niye soruyorsun o zaman C nedeniyle sık sık bu kadar düşük düzeyde doğanın size o cevap verebilir. Tabii ki, herhangi başka bir 'ham' dil size aynı cevapları verecektir. Raw tarafından size doğrudan bilgisayara erişim, yerine API katmanları ve sınıfların çok sayıda altında gizli sağlayan bir dil demek.

Tabii ki, bazı insanlar sormazlar neden ... nasıl onlar için yeterli genelde iyi olmadığını. Onlar alışkanlık C öğrenmek istiyorum olanlar