C öğrenmek Bilgisayar Bilimi için şart mıdır? [kapalı]


15

Ben bile bir dosya .hveya .cuzantısı ile görmek bile bir ön uç geliştirici . Temel C sözdizimini biliyorum, Unreality'de öğrendim, ancak bu kadar düşük seviyeli programlama ile hiç ilgilenmedim çünkü basit şeyler için çok fazla kurulum yapıldı.

Bilgisayar Bilimi'nin tüm yönlerini öğrenmekle çok ilgiliyim, ancak Bilgisayar Bilimi'ndeki kavramların çoğunu anlamak için belirli bir dili bilmem gerekmediğine inanmak istiyorum. Yine de Veri Yapıları ve Algoritma Tasarımı gibi temel Bilgisayar Bilimi kavramları hakkında kitap ve makaleler okumaya başladığımda, C'yi öğrenmem gerekiyor gibi görünüyor, çünkü tüm örnekler ve hatta dersler C (ve bazen de Java).

Sorum şu: C, Bilgisayar Bilimi için bir programlama dili olarak gerekli mi, yoksa CS'deki tüm kaynaklarımızın C ile yazılmış olması mı oldu? Bilgisayar Bilimleri C öğrenmeden öğrenilebilir mi?


4
İşte Joel Spolsky'nin bununla ilgili görüşü: joelonsoftware.com/articles/CollegeAdvice.html Tartışılabilir , ancak bence onun puanları var.
Doc Brown

2
Puristler, bilgisayar biliminin bilgisayarlarla ilgili olmadığını ve programlama dillerini gereksiz kıldığını savunurlar.
Blrfl

1
"Bilgisayar Bilimi" ile ne demek istiyorsun? Açıkladığınız şey çoğunlukla bilgisayar biliminin Yazılım Mühendisliği kısmı. Ayrıca, tüm kaynakların C'de nasıl yazıldığını göremiyorum . Algoritmalar / veri yapıları hakkında çok az kitap okudum ve hiçbiri C kullanmadım. Hemen hemen hepsi, herkes tarafından kolayca anlaşılabilen bir tür sahte kod dili kullandı (iyi, montaj kullanan TAOCP hariç ... ama bu başka bir hikaye)
Bakuriu

Unreality? Üniversiteden gelen bir oto-düzeltme tuhaflığı mıydı yoksa bir kara büyü okulu mu? Görünmeyen Üniversitesi biliyorum: [
Deer Hunter

Yanıtlar:


31

Buradaki akışa karşı çıkacağım ve evet diyelim, C'yi öğrenmelisiniz. Diğer cevapların çoğundaki noktalara katılıyorum, ama çok güçlü bir açıklama yapıyorsunuz.

Bilgisayar Bilimi'nin tüm yönlerini öğrenmekle çok ilgiliyim, ancak Bilgisayar Bilimi'ndeki kavramların çoğunu anlamak için belirli bir dili bilmem gerekmediğine inanmak istiyorum.

(benimkini vurgula)

İşletim sistemleri ve ağ yığınları Bilgisayar Bilimi'nin iki büyük yönüdür ve tüm baskın işletim sistemleri ve ağ yığınları büyük ölçüde C ile yazılmıştır. Bunları anlamak istiyorsanız, C'yi öğrenmelisiniz. Evet, bazı okullar öğretmeyi başarır işletim sistemi sınıflarını Java'da kullanıyorlar, ancak Homer'ı İngilizce okumak gibi.

Üstelik C, o kadar büyük bir dil değil. Bilgisayar biliminin tüm yönlerini gerçekten öğrenmek istiyorsanız, omuz silkmeli ve 'meh', 'bir dil daha nedir?'


Genelde buna katılıyorum, ama bana göre "öğrenme" C, temelde, yardım almadan önemsiz olmayan programlar yazmak için yeterince akıcı olduğum anlamına geliyor. Bu anlayış düzeyinin işletim sistemleri ve ağ programlama için bir ön koşul olup olmadığından emin değilim.
Telastyn

3
@Telastyn: Bu, işletim sistemleri kodunu ve ağ kodunu (C'nin kullanıldığı alanlar) anlamanız ve değiştirmeniz için yeterince akıcı olduğunuz anlamına gelir ve bu kadar. Bu, C'de oyun yazmayı, C'de güzel UI ve grafik uygulamaları yapmayı bilmeniz gerektiği anlamına gelmez; C, grafik veya makine istihbarat motorları; çünkü CS'nin diğer tüm alanları için başka dil seçenekleri de vardır.
rwong

12

Çok uzun bir süre boyunca, bilgisayar biliminin bir meslek yerine bir bilim olarak yükselmesi sırasında, tüm farklı üniversitelerin kullandığı tüm sistemlerde çalışan bir dil için birkaç sınırlı seçenek vardı.

Üniversiteler açık arayla Unix sistemlerini kullanma eğilimindeydi. Uygun, bu C. At evinde unix kaynak koduna olsun sonuçta her makinede C öğrenme ile başlar ve olabilir C. One programlı edildi, öğrenciler Borland Turbo Windows üzerinde C, ya da bir C derleyicisi kullanabilirsiniz MPW bir üzerinde Mac - her yerde çalıştı.

Pascal başka bir seçimdi, ama bu programlamada belirli bir noktada, gerçekten yapmanız gereken şeyi yapmak için yeterli bir dil değildi (pascal'da bir işletim sistemini programlamak acı vericiydi).

Bazı eski okullar Fortran'ı öğrendi, ama yine de, çoğu durumda daha yüksek seviyeli CS sınıfları (fortran'daki AI teorisi? Yapılabilir ama acı verici) öğretmek için yeterince güçlü bir dil değildi.

Ve böylece, uzun bir süre C seçim oldu.

Tek seçenek değil ve diğer dillerde, iç kısımların bazılarını parlaklaştırmayı ve bellek yönetimi ve benzerlerinin çirkinliği ile uğraşmak zorunda kalmadan daha üst düzey kavramları öğrenmeyi öğreten birçok kolej var. Bazıları bunun iyi, bazıları bunun kötü olduğunu düşünüyor .


Yani hayır, C öğrenmek bilgisayar bilimini öğrenmek için gerekli değildir. Orada Java veya Python'dan bilgisayar bilimi öğreten birçok kitap bulabilirsiniz. Sadece uzun bir süre, C seçim oldu ve akademik kitaplar yavaş hareket ediyordu.


Kayıt için, AI eğitimi geleneksel olarak C'nin 70'ler ve 80'ler boyunca LISP ile egghead arkadaşıyla yapıldı, ancak cevap kafadaydı.
jwrush

@jwrush Cevabım, zamanın diğer dillerine kıyasla C'de AI çalışmasını yapabileceğiniz hatlarda daha fazlaydı (LISP değil - ve AI için 90'larda bir lisp sınıfı aldım). O zaman, MIT (eggheads'ın evi), LISP'deki birçok sınıfını öğretti - ve kesinlikle başka bir seçenekti, ancak diğer alanlarda da pratik değildi. Öğretimde, her sınıfta aynı temelden çalışmak önemliydi, böylece bir ya da iki haftayı öğrencilere o sınıfa özel bir dil öğretmek için harcamak zorunda kalmadı.

12

Birinin C'ye dokunmadan iyi bir iş alabileceğini ve üretken olabileceğini itiraf ediyorum, ancak bilgisayar bilimini sağlam bir şekilde anlama konusunda ciddi olan herkes için C öğrenmeyi şiddetle tavsiye ediyorum .

Bilgisayar bilimi, herhangi bir özel programlama dilinden bağımsız olarak öğrenilebilen kavramlar ile ilgili olmasına rağmen, C öğrenerek veya C kullanarak bu alanı öğrenerek daha iyi anlaşılabilecek alanlar vardır.

  • Algoritmalar ve Veri Yapıları. Standart C'de bunlardan neredeyse hiçbiri yoktur - bunların önceden dilde veya standart kütüphanesinde uygulanması, öğrenciler için motivasyona yatkın olma eğilimindedir: " Neden hazır olan bir şeyi uygulamaya zahmet etmeliyim?"Bir C kodu parçasına baktığınızda, algoritmik maliyetini hemen görürsünüz, çünkü C'deki her şey sadece birkaç makine talimatını derler. Üst düzey diller (örn. Perl veya Python) genellikle hafif sözdizimi başlığı altında gelişmiş veri yapıları kullanır. Kod hafif hissettiriyor, ama öyle değil. Bu kod parçalarının algoritmik karmaşıklığı hakkında doğru bir şekilde akıl yürütmek için çok fazla bilgiye ihtiyacınız var, bu nedenle bu diller öğrenme algoritmaları ve veri yapıları ve her zaman yaşayan birçok programcı için uygun değildir. üst düzey dillerde, bunlarla karşılaştıklarında performans sorunları ile başa çıkamayacak durumda olma eğilimindedir.

  • İşletim sistemleri. Çoğu işletim sistemi C ile yazılmıştır. Süreç oluşturmayı hiç aramadan nasıl anlamak istersiniz fork? Java VM'nin soyutlama katmanı burada yardımcı değildir. Ve sadece bir süreç yaratmadan konuşmak daha da kötü ... Eclipse gibi standart çıktıyı pencerelerinden birine yönlendirebilecek bir yazılımı nasıl yazabilirsiniz? Bunun için işletim sistemi düzeyindeki kavramları anlamanız gerekir ve bunlara yalnızca C ile doğrudan dokunabilirsiniz.

  • İndirection. İşaretçilerle uğraşmadan C yapamazsınız. İşaretçiler sizi iki seviyede düşünmeye zorlar ve bu da soyutlama becerilerinizi geliştirir.

C bilgisinin bazı teknik avantajları da vardır:

  • Diller arası birlikte çalışabilirlik. Harika bir Ruby modülünü Python projenize entegre etmek istiyorsunuz (buradaki iki rastgele dili değiştirin). Muhtemelen bunu yapmanın tek yolu C'dir, çünkü her iki dilin C ile yabancı bir arayüzü vardır.

  • Kritik performans yazılımı yazma. Kimse bunu yapmak için düşük seviyeye gitmeyi ihmal edemez.


Her programın C ile yazılması gerektiğini söylemiyorum. Ancak C, size hangi dilde program yaparsanız uygulayın yararlı olur.


İşaretçi aritmetiği, neden olduğu için işletim sistemlerini anlamak için kritik öneme sahiptir. Örneğin yığınlar ve yığınlar neden farklıdır, sanal bellek neden iyi veya kötü performans gösteriyor, neden bazı döngüler diğerlerinden daha hızlı çalışıyor, vb.
Michael Shopsin

6

Ben de burada tahıl karşı gidip C için (biraz mizahi) estetik bir dava yapmaya çalışacağım Bazı insanlar sınıf gibi üst düzey yapıların eksikliği gibi farklı nedenlerle "çirkin" diyebilirim veya işaretçiler üzerine olan güveni, benim için durumun böyle olmadığını düşünüyorum .

TL; DR : Bence C basit, iyi C okunabilir ve vurma uçlarında bulunmanın mutluluğu var.

C basit

Standart C, bunlardan işlevler, işaretçiler ve diziler oluşturmak için yalnızca birkaç temel türü ve mekanizmayı tanımlar. Bunun da ötesinde, ilkellerden (yapılar ve sendikalar gibi) daha karmaşık türler yapmak için az sayıda kompozisyon yapısı vardır. Dilin çoğunu iki cümleyle nasıl tarif ettiğime dikkat edin . Bu, kodlama sırasında kafanızda çok fazla sözdizimsel kural ve form bulundurmanız gerekmediği anlamına gelir.

Basit güzel .

C gizli değil

Birçok üst düzey dilden farklı olarak, C'de çok sayıda garip, anlaşılmaz sembol bulmak zor olurdu. C dünyasında, hem soyutlama hem de "sözdizimsel sıkıştırma" için ana tesis işlevdir - anlamsal olarak çok basit ve kendini açıklayıcı yapı. İyi C stili neredeyse şiirsel, okunabilir güzelliği teşvik eder. Örneklemek için, aşağıdaki kod parçasını Linux çekirdeğinden okumaya çalışalım. Altta yatan veri yapılarını ve uygulama ayrıntılarını anlamadan bile, aşağıdakiler hakkında çok anlamlı olabiliriz:

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

Fonksiyonun ortasında "akımın donması durumunda, buzdolabına gerçekten donma olup olmadığını sorun" yazıyor. Dr. Seuss daha iyi yazamazdı.

Okunabilir güzel .

C şeffaftır

Bir C ifadesi bir işlev çağrısı içermediği sürece, genellikle çalışma zamanı maliyeti ve yan etkileri hakkında çok iyi bir fikir edinebilirsiniz. C programcıya kontrol sağlar ve sonuçta doğru şeyi yapmak için ona güvenir. strlen()Her operatör iyi tanımlanmış semantiğe sahip olduğundan, bu (SE için hafifçe yeniden biçimlendirilmiş) snippet'in GNU C kütüphanesinde çalıştırılmasından sonra ne olduğuna dair bir resim elde edebiliriz . C'de aşırı yükleme yoktur.

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

"Optimize edilebilirlik" amacıyla, bu özellik harika. Tartışmalı olarak, bazı üst düzey diller, üst düzey algoritmaların özlü ifadesini kolaylaştırır (sınıflar ve aşırı yükleme ile C ++ gibi), ancak C'nin taşınabilir bir montajcı olarak hareket etmek için tasarlandığı amaçlar için - C idealdir. Bazen, düşük seviyeli kodun başarılı bir şekilde yürütülmesi üzerine, bir programcı bir anlamda makineyle bir tane hissedebilir (veya sıfırdır - bu bir uygulama detayıdır). Bu, diğer dillerin kötü olduğunu, yeterince "zen" veya bunun gibi aptalca bir şey olmadığı anlamına gelmez, sadece IMO C, birçok geçerli nedenden ötürü, diğer birçok dilin seçmemeyi seçen ilginç olabilir.

Kanımca, yukarıda sunulan üç nokta, Linux tarafından aklımda bulunan karmaşık - ancak verimli - sistemlerin oluşturulmasını yönetilebilir kılmaktadır. Bu dünyanın estetik hassasiyetlerime hitap ettiğini düşünüyorum ve C'yi bir sonraki hedefi olarak düşünen herkese bu noktaları dikkate almasını tavsiye ederim. İşletim sistemleri ve neyin daha iyi ifade edilmediğini açıkça belirterek desteklendiğini hissediyorum çünkü başarılı bir programcı olmak için kesinlikle çekirdeği anlamaya gerek yok, ama bu alanları öznel olarak zorlayıcı bulabiliriz.


3

Bilgi işlem bilimini tartışmak için kullandığınız programlama dili, bilgi işlem araçlarını ve bilimini öğrenme göreviyle büyük ölçüde ilgisizdir.

Bilgisayar Bilimi, Bilgisayar Programlama Sanatı (tartışmalı olarak) seminal çalışması , konuyu bilgilendirmek için mevcut herhangi bir dili kullanmaz. Bunun yerine, Donald Knuth kurgusal bir bilgisayar ve kurgusal bir makine dili (ve ilişkili bir montaj dili) tanımlamayı seçti.

Konuyla ilgili son derece saygın bir başka çalışma olan Bilgisayar Programlarının Yapısı ve Yorumlanması da benzer bir yaklaşım benimsemiş ve LISP programlama dilinin basitleştirilmiş bir lehçesinin kendi bağlamı olarak hareket etmesini sağlamıştır. Bu dil, Şema olarak bildiğimiz dildir.

Bilgisayar Bilimi, Bilgisayar Sistemleri ve Bilgisayar Bilimi'nin eşit parçaları olan ve çok kısa olan Bilgisayar Bilimi Elemanları üzerine çok iyi bir çalışma da , makineyi inşa ettiği araçları, araçları dijital mantığın öğretilmesine yönelik daha temel bir yaklaşımı benimsiyor. ve dili, temel Bilgisayar Bilimi öğretmeden önce.

Yani, hayır, C, Bilgisayar Bilimi'ni anlamak için gerekli değildir. Önemli olan algoritmaların temel kavramlarını ve uygulamalarını anlamanızdır.


2

Geldiği disketlerle birlikte gelen kılavuzlardan vb3'ü öğrenerek programlama kariyerine başladım. Biraz java öğrendim ve saygın programlar üretebildim ama üniversitede C çalışana kadar "kaputun altında" neler olduğunu gerçekten anladığımı hissettim. Şimdi sadece .net ile çalışıyorum ve işaretçiler, geçersiz adresler veya taşmalar hakkında gerçekten endişelenmiyorum - ama anlıyorum, bu günlük olarak aldığım kararları bilgilendiriyor ve bazı eski okul şeyleri hala modern yorumlanmış dillerde, bayraklarda var , biraz akıllı operasyonlar, Boole mantığı, tüm güçlü araçlar ve çok verimli.

Learn C. Seni iyi durumda tutacaktır. C programcıları el kitabının bir kopyasını yıllarca sakladım ve Kernighan ve Ritchie'yi kapaktan kapağa okudum. C'yi anlamak için hangi dili kullandığınız önemli değildir, kesinlikle yardımcı olacaktır.


1

Bilgisayar Bilimleri C öğrenmeden öğrenilebilir mi?

Cevap Evet. CS derecem var ve C değil, Java öğrenmek için gerekli oldu. En azından okulumda, Meclis Dili, Veri Yapıları ve Veritabanı Tasarımı üzerine bazı öğretilerle Nesne Odaklı Programlamanın öğrenilmesi üzerinde duruldu.


7
Derecenizin CS'nin " tüm yönlerini" kapsadığından emin misiniz ?
SK-logic

Gerekli tüm yönleri söyleyebilirim. Hiçbir derece, bir lisans programının tüm yönlerini kapsamaz. Artı "hepsi" özneldir.
PhillyNJ

1
"Gerekli" yi nasıl tanımlıyorsunuz? Tüm olan tüm olası tüm CS uygulamasını kapsayan anlamı, -. "Öznel" değil, oldukça ölçülebilir.
SK-logic

CS'nin, asıl soruyu cevaplayan belirli bir dili değil, hesaplama ve bilgisayar teknolojisi, donanım ve yazılım çalışmalarını kapsadığı bağlamda 'gerekli' olarak tanımlarım.
PhillyNJ

Tamam, düşük seviyeli diller olmadan donanımı nasıl kapsayacaksınız? Böyle bir anahtar dil olmadan programlama dillerinin ("tüm" CS'nin son derece önemli bir parçası olan) tarihini nasıl kapsayacaksınız? İşaretçi aritmetiği ile en az bir dil olmadan programlama dili anlambilimini nasıl kapsayacaksınız? Herhangi bir şekilde, ancak C'ye benzer bir dil, herhangi bir kapsamlı CS müfredatında mevcut olmalıdır.
SK-logic

0

Bu gerçekten öğrendiklerinizle ne yapmak istediğinize bağlıdır. C'de veya bunların soyunda çok fazla algoritmanın verildiği kesinlikle doğrudur. Ancak, yıllar içinde daha fazla C ++, C # ve Java örnekleri gördüm. CS'nin öğretmeyi amaçladığı şey, genel bir bilgi işlem anlayışı ve dolayısıyla eldeki göreve uygun bir dilin nasıl seçileceği veya oluşturulacağıdır.

Bununla birlikte, hala ilk ve son dili C veya Java'nın bazı varyasyonları olan birçok insan var ve bunların hepsi CS derecesinin sağladığı herhangi bir dili anlamak için eğitime sahip olmayacak. Bazı CS mezunları bile programlama konusunda sorun yaşıyor. Dolayısıyla, kariyer yolunuza bağlı olarak onlarla iletişim kurabileceğiniz bu dilleri yeterince iyi anlamanız gerekebilir. Akademiye bağlı kalmayı planlıyorsanız, özellikle disiplinlerarası alanlarda (insanların prolog, lisp, haskell, mathematica vb. Kullandıkları) içerikle ilgili daha fazla dil engeliniz olacaktır.


-1

Gerçekten "Bilgisayar Bilimi'nin tüm yönlerini" (iddialı plan!) Öğrenecekseniz, birkaç farklı meclis dili ve en az bir HDL (ve bir netlist seviyesinde kodlama pratiği) ile uğraşmanız gerekir.

Ve bu gerçekten temel şeylere yaklaşmak için daha üst düzey bir adım olarak, kaçınılmaz olan C veya Pascal gibi bir şey almanız gerekir. Bir soyutlama merdiveni üzerindeki adımları atlamak verimsizdir.

Her neyse, bu sorunun sorulmaya değer olduğundan şüphe ediyorum. Sonuçta, C sadece küçük bir dildir. Temel bilgilerini, öğrenmeniz gerekip gerekmediğini düşünerek boşa harcadığınızdan daha kısa sürede öğrenmiş olabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.