Derin bir C ++ bilgisi, diğer dilleri daha hızlı / daha kolay öğrenmenize yardımcı olur mu? [kapalı]


9

C ++ 'nın tüm önemli yönlerini öğrenmiş ve dilin temellerini çok iyi bilen birinin diğer dilleri (Python, Perl, Java gibi) daha hızlı ve daha kolay öğrenmesi olasılığı var mı?


9
Ben C ++ bunu yapmak için diğer birçok dillerden farklı yeterli olduğunu iddia ediyorum daha (o bildiğiniz tek dil ise) başka bir şey almak için kafa karıştırıcı. Birçok dil C ++ sözdizimini paylaşır, ancak çok azı aynı yönde gelişmiştir. C ++, yalnızca C ++ 'a özgü çok sayıda tarihsel hamleye sahiptir. Hızla yeni dilleri seçmenin en iyi yolu, sadece farklı paradigmalardan farklı dilleri öğrenmeye odaklanmaktır. Ne kadar çok paradigma aşina olursanız, o paradigmalardan başka şeyler almak o kadar hızlı olur.
KChaloux

3
C ++ bilmenin genel olarak diğer dilleri öğrenmeniz için size bir avantaj sağladığını düşünmüyorum. Gerçekten hangi dilleri öğreneceğinize bağlı. Programlama dilleri profesörüm genel kavramları anlamaya odaklanmamız gerektiğini söylerdi: bu kesinlikle bireysel dilleri öğrenmeyi çok daha kolaylaştıracaktır.
Giorgio

9
Bir dili derinlemesine öğrenmek, genel olarak programlamayı öğrenmeye doğru iyi bir başlangıçtır, ancak dile özgü know-how'ı genel bilgi ile karıştırmanız mümkündür. Modern C ++ harika bir dildir, ancak orta seviyeye ilerledikten sonra, bilinen diğer perspektiflere ulaşmaktan büyük kazanç elde edersiniz - belki bunları asla ciddiye almasanız bile OCaml ve Ruby'ye bir göz atın. Kararlı bir programcı olduğunuzda ve dile özgü ve genel şeyler arasında ayrım yapabildiğinizde, ustalık her zaman zaman alır, ancak yeni dillerde üretken olmak oldukça kolaydır.
amon

1
Neyle karşılaştırılmış? Başka bir dili iyi öğrenmek, C ++ 'ı iyi bilmek ama derinlemesine bilmemek, hiçbir şey bilmemek?
Telastyn

2
Evet, ama tam tersi. Ocaml veya Scheme'yi bilmek, birçok C ++ 11 yeni özelliğin daha kolay anlaşılmasını sağlar
Basile Starynkevitch

Yanıtlar:


12

Genel olarak

Herhangi bir programlama diliyle ilgili derin bilgi birikimi, diğer dilleri daha hızlı seçmenize yardımcı olacaktır. Bunun nedeni kısmen programlama sözdizimini öğrenmekten daha çok düşünmenin bir yoludur . Çoğu programlama uygulaması diğer programlama dillerinin çoğu için de geçerli olacaktır. Bu nedenle insanlar ikinci programlama dilini her zaman birinciden daha hızlı öğrendiğinizi söylerler.

Belirli Terimlerle

C ++, diğer dillerden çok daha fazla 'kontrol' sağlayan bir dildir. Bu hem iyi hem de kötü olabilir. Örneğin, gerçek bir silah, ormana gittiğinizde bir hava tabancasından daha iyidir (çünkü aslında onunla bir şeyler vurabilirsiniz), aynı zamanda sizin ve çevrenizdekiler için de daha tehlikelidir. C ++, diğer birçok dilde endişelenmenize gerek olmayan bellek yönetimi gibi kavramlara sahiptir. Ancak bu kavramları tam olarak kavramak, otomatik bellek yönetimi dilleriyle çalışırken bile anlamsız olmaktan uzaktır. Ayrıca bitsel işlemler gerçekleştirebilir ve C ++ gibi bir dille 'metale' çok daha aşağı inebilirsiniz. Bu alanlarda temel bir anlayış bile, herhangi bir dilde bir programcı olarak size çok yardımcı olabilir.

Kişisel görüş

Şahsen C ++ öğrenmeden önce Java'yı ilk 3 yıl önce öğrendim ve bir şekilde pişman olduğumu söylemeliyim (uni ders ...). Bu öğrenme C ++ (hala öğreniyorum - 'derin' bilgiden uzak: D) istediğim kadar basit değil. Bunu başka türlü yapsaydım, bunun benim için çok daha kolay olacağını söyleyebilirim. Özellikle bir şeyin neden belirli bir şekilde yapıldığını bildiğinizde ve sadece dilin otomatik büyüsünden emin değilsiniz. Eğer bir fikir vermeme izin verilirse, şunu öneririm: C (temel ve evrensel programlama paradigmaları için) -> C ++ (OOP'un bellek yönetimi ile birlikte temel anlaşılması için) -> O zaman bir 'gerçek' OOP diline bir iyi bir temel veya C ++ 'ta daha gelişmiş konulara devam edebilirsiniz.


3
Üniversitemizin pascal ile başlamamıza sevindim. Sonra C'ye ilerledik (bellek yönetimi ve bit işlemleri bölümü için) ve nihayet oop için java'ya ilerledik (bu tabii ki başka bir oo dili olabilirdi). Dürüst olmak gerekirse, java ile kaç üniversitenin başladığını oldukça rahatsız edici buluyorum . Kaçınılmaz olarak java (ve daha da önemlisi, OOP) yanlış öğreneceksiniz, çünkü gerçek OOP hala ORve arasındaki farkla mücadele eden yeni başlayanlar için çok karmaşıktırAND
Lovis

2
@Doval: Çöp toplama, bellek yönetimi konusunda endişelenmemek yanılsaması verir . Bunun ne kadar yanıltıcı olduğunu görmek için yönetilen kod programlarının ne kadar sık ​​bellek sızıntısı çektiğine bakın, çünkü bazı referanslar beklenmedik bir yerde (koleksiyonlar çok yıllık bir suçludur) geçerli kaldı.
Mason Wheeler

1
@Doval: Yanlış boyut, yer, hizalama: derleyici tarafından uygun boyut bilindiğinde ve ayırıcı yerleşimi ve hizalamayı işlediğinde, bunlardan herhangi birini nesne yönelimli bir dilde tam olarak nasıl yapar? Erken serbestlik: GC'nin tam olarak önlemesi gereken şey budur, bu yüzden bu tartışma ile ilgili olmadığını söylemek sadece doğru değil doğrudur. Ama bunu her tahsiyi bir bellek sızıntısına dönüştürme pahasına yapıyor . Ve diğer nesnelerin verilerini durdurmamak , bir çöp toplama sorunu değil , bir sınır kontrol sorunudur.
Mason Wheeler

2
C ++, C ++ uygulamasına özgü olan çok fazla öğrenme talep eder, ancak C ++ dışında hiç kullanılmayacak, çünkü kitapların ve çeşitli sistemlerin sonsuz tuhaflıkları. Deneyimlerime göre C ++ yazan herkes temelde tüm C ++ 'ın kötü yazılmış olduğunu ve çoğunlukla C ++' a özgü tuhaflıklar ve tuhaflıklarla dolu olduğunu kabul eder. Bu dilin etrafında yolunuzu öğrenmek, çoğu dilde C ++ 'ın sahip olduğu sorunların çoğu eksik olduğunda diğer dillerde yararlı bir şey yapmaz.
Jimmy Hoffa

2
@Doval: Evet, bütün mesele bu : Genel olarak bu şeyler algoritmik olarak kararsızdır , bu yüzden doğru bir şekilde ele alınmaları için algoritma değil akıllı bir kişi tarafından ele alınmaları gerekir. Ve "bu bir sızıntı değil, verimsiz bir program" demek, sadece anlamsal saç bölünmesi; dışarıdaki bir gözlemciye göre, programın davranışı, özellikle de bellek altında yük sıkışmasının ciddi sorunlara yol açabileceği çoklu görev sistemleri bağlamında, bellek sızdıran bir programla aynıdır.
Mason Wheeler

9

Ne yazık ki hayır. Bu aslında programlama sınıflarında, özellikle başlangıç ​​seviyesindeki sınıflarda C ++ öğretirken büyük bir sorundur: programlama ilkelerini öğrenebilir veya C ++ dilini öğrenebilirsiniz, ancak C ++ dilinde her ikisini de etkili bir şekilde öğrenmek için çok fazla tuzak ve aptal küçük gotchas var bir dönemlik dersin kapsamı!

C ++ 'da denenmiş ve sonunda sırf atalet yoluyla dilde deyimsel hale gelen birçok şey var, o zamandan beri diğer tüm dillere bakıldı ve reddedildi, çünkü büyük bir hata olduğu ortaya çıktı. Bunların en önemlileri C ++ 'ın Şablonları ve C ++' ın nesne modelidir (değer türleri olarak nesneler asla iyi bir şey değildir, çünkü Liskov'un yerine koymayı ve OOP'un kendisini bozar.)

Bu yüzden önce C ++ hakkında derin bir bilgi sahibi olursanız ve daha sonra diğer programlama dillerini öğrenmek istiyorsanız, diğer programlama dillerinde etkili olabilmek için öğrenmeniz gereken çok sayıda zararlı ve ters ürperti kabuk olacaktır.


4
Java ve C # 'ın kesinlikle daha zayıf bir şablon sistemine sahip olmasının nedenleri vardır, ancak bunun nedeni her şey hakkında tam meta verilere ihtiyaç duymalarıdır. Ve değer olarak nesnelerin şeyleri nasıl kırdığını açıklamakla ilgilenirim. Özellikle referanslar var ...
Deduplicator

3
@Deduplicator: Java ve C # tamamen farklı bir jenerik sisteme sahiptir , çünkü deneyim şablonların her türlü ciddi soruna neden olduğunu gösterir, bunların çoğu Şablon sistemi ilk etapta iyi planlanmadığı için ortaya çıkar. ( Belli bir örnek vermek için kazayla tamamlama !) Ve değerler olarak nesneler Liskov ikamesini kırıyor, çünkü üst öğesi Base olan bir Derived sınıfınız varsa ve Base'de sanal bir yöntemi geçersiz kılıyor ve bunu varsayılan olarak geçirerek geçiyorsunuz. Base alan ve sanal yöntemi çağıran bir işlev, Türetilmiş sürümü çağırmaz.
Mason Wheeler

2
@MasonWheeler: Ah, dilimlemeyi kastediyorsun .
Fred Larson

2
@FredLarson: Böyle yaygın, zararlı bir sorunun bunun için özel bir ismi olacağını tahmin etmeliydim. (Ve bu C ++, aptal bir isim. C ++ dünyasının dışındaki bir programcı "dilimleme" duyduğunda, muhtemelen dizi dilimlemeyi düşünür
Mason Wheeler

4
Yazdığınız birçok şeyi kabul etsem de, çok önyargılı bir bakış açısına sahip olduğunuzu düşünüyorum ;-) IMHO öğrenme C ++ insanları küçümsüyor.
Doc Brown

8

Hayır. C ++ 'ı iyi bilmek, C ++ gibi diğer dilleri öğrenmeyi kolaylaştıracaktır. Ama bu sıkıcı olurdu. Neden aynı iki dili bilmek istiyorsun? Bu sana bir şey almıyor. (Bunun C ++ 'a özgü olmadığını unutmayın. Herhangi bir dil için geçerlidir. Doğal dillerle karşılaştırın: İtalyanca öğrenmek diğer dilleri öğrenmeyi kolaylaştırmaz. İspanyolca, Fransızca veya Portekizce öğrenmeyi kolaylaştıracak ve üç öğrenmeyi kolaylaştıracaktır. bunlardan dördüncüyü öğrenmeyi kolaylaştıracaktır, ancak tüm Romance dillerini öğrenmek bile bir parça Fince, Çince, Hintçe, İbranice, Arapça, Paştu, Yunanca vb. öğrenmenize yardımcı olmaz.)

Programlama dilleri paradigmaları uygular. Peter van Roy 34 ana programlama paradigmasının bir posterini topladı .

Paradigmalar, sırayla, kavramlardan oluşur. Bu poster yaklaşık 18 kavramı listeliyor.

Tüm paradigmalar (veya en azından posterdekiler) bu kavramlardan oluşur. Tüm diller, bu kavramlardan oluşan bir veya daha fazla paradigma uygular. Dolayısıyla, bu kavramları öğrenirseniz, (bir anlamda) her programlama dilini bir kerede öğreneceksiniz.

Elbette hala birçok dile özgü tuhaflıklar var (aralarında sözdizimi). Ayrıca, bu poster yazmayı tamamen görmezden gelir ve tabii ki bağımlı bir tip sistemi bir yana, Sistem F <: style tarzı tip sistem, Scala tarzı tip sistem veya dinamik ördek tipi tip sistem arasında önemli bir fark vardır. à la Idris, Agda, Coq, Guru veya ATS.


Hintçe , Hindu değil . Hiçbir şey İtalyanca veya C ++ ;-) +1 olsun, "Hindu öğrenme" size yardımcı olmayacaktır.
PKG

Aslında, gerçekten benzer olsa da, farklı dilleri öğrenmek hala zihninizi genişletir ve böylece daha uzak diller için size biraz yardımcı olur.
dyesdyes

C ++ doğal dillerden farklı olarak çok paradigma bir dil olduğu için doğal dillerle karşılaştırmaya katılmam gerekir. Ayrıca, bir dil özelliğini ayrıntılı olarak öğrenerek, o özellik için tasarım kararlarını bilirsiniz ve büyük olasılıkla diğer uygulamaların artılarını ve eksilerini anlarsınız. Örneğin, dinamik jeneriklere karşı faydalarını ve dezavantajlarını öğrenmeden c ++ şablonlarını derinlemesine öğrenmeyi deneyin. C # 'dan (bugünlerde zor) bahsetmiş olsanız bile, dinamik jeneriklerin ne olduğunu hala bilirsiniz ve daha sonra bunları öğrenirken C # jenerik sınırlamalarını anında bilirsiniz
Rado

5

Herhangi bir programlama dilini derinlemesine bilmek , başkalarının, en azından aynı ailedeki diğer dillerin öğrenilmesinde yardımcı olacaktır. Örneğin, C ++ bilgisi LISP veya Haskell ile pek yardımcı olmaz, ancak nesne yönelimli prosedürel diller için faydalı olacaktır. Benim yaklaşımım, dillerin farklı ailelerinden (prosedürel, işlevsel, nesne yönelimli, vb.) Her birinden bir dil öğrenmek ve öğrenmekti, o zaman bu bilgi o ailedeki diğer dillere aktarılabilir. Öte yandan, derin bir APL bilgisi başka hiçbir şeye yardımcı olmaz ...


3
Kendini veya Smalltalk veya Ruby kodunu C ++ 'ı ilk dil olarak öğrenen biri tarafından yazıldığını gördüm. Aslında şunu söyleyebilirim ki, C ++ bilmek OO öğrenmek için oldukça zararlıdır. Benlik veya Gazetecilik bunun için çok daha uygun olacağını düşünüyorum. Derin bir APL bilgisi olan BTW, en azından J ve K gibi dillere yardımcı olacaktır. , Uygulayıcılar, Monadlar ve Kategoriler.
Jörg W Mittag

1
@ JörgWMittag: COBOL'u herhangi bir dilde yazabileceği iyi biliniyor ... amaç nedir?
Tekilleştirici

@Deduplicator İlk diliniz COBOL ise, diğer dillerde COBOL yazmanız çok daha olasıdır.
Doval

Aslında, COBOL ile hemfikirim. Yıllar önce Pascal'da COBOL yazan bir adamım vardı
Jim Nutt

5

Burada farklı bir yorum yapacağım.

C ++, nesne sahipliği ve ömrü gibi kavramları dikkatlice düşünmeye zorladığından, bellek ve veri yapıları hakkında bilgi edinmek için iyi bir dildir. Bellek ve veri yapıları hakkında bilgi edinmek, herhangi bir yazılım mühendisliği müfredatının önemli parçalarından biridir.

Ancak veri yapıları hakkında bilgi sahibi olmalısınız. Eğer sadece "C ++ öğrenirseniz" çok fazla kazanmazsınız ve kısa vadede diğer dilleri öğrenme sürecini yavaşlatabilir.

Kolejdeyken, Veri Yapıları, CS1'den sonra (sınıfın en az yarısının çıkmış olduğu) alınan birinci sınıf seviyesinde bir dersti. Zordu. Tabii biçimi Burada [Meselâ daha önce hiç görmediğiniz bir veri yapısı var" temelde oldu solcu yığın ]., Byte-için-byte haftada C ++ bunu gerçekleştirme ve çıkış tam olarak bizim beklenen çıkışı maç yapmak, biz bu yüzden otomatik olarak not verebilir. " Ardından, önümüzdeki hafta yeni bir veri yapısı ve yeni bir atama alacaksınız. Muhtemelen bir derste, diğer derslerimin hepsinde yaptığımdan daha fazla şey öğrendim.

C ++ 'nın değerli olması için yapmanız gereken bir tür öğrenme.


2

Öğrendiğiniz her dil bir sonraki dili öğrenmeyi kolaylaştırır, özellikle de aynı paradigmada. Birbirlerinden yoğun bir şekilde ödünç alırlar ve bir süre sonra yeni bir dilin sadece birkaç farklı bükülme ile diğer dillerden bir dizi özellik gibi göründüğü noktaya gelirsiniz.

C ++ bu konuda diğer dillerden daha iyi veya kötü olduğunu düşünmüyorum. Bildiğim daha ayrıntılı dillerden biridir ve diğer birçok dilde kolay olan bazı şeyleri zorlaştırır, ancak bu, bir sonraki dili öğrenmeyi kolaylaştırmak anlamına gelmez . Yine de genellikle bir sonraki dilin kullanımını kolaylaştırır . Bir fark var.


0

Hayır. C'yi veya "temelde C" olan C ++ alt kümesini derinlemesine bilmek, diğer dilleri öğrenirken, en azından uygulamalarının ne yapması gerektiğini resmederken yardımcı olacaktır. Öte yandan, derin bir C ++ bilgisi, diğer dilleri öğrenirken çoğunlukla kafa karıştırıcı veya ilgisiz bilgi olacaktır; C ++ 'ın nesne yönelimini bir yüzey seviyesinden daha fazla öğrenirseniz, örneğin Perl / Python / Ruby'ye geçtiğinizde, bildiğiniz şeyleri kullanmaktan daha fazlasını öğrenmek için daha fazla zaman harcarsınız, çünkü bu dillerdeki nesneler bir bambaşka bir yolC ++ 'dan daha. Aynı şey, diğer birçok dil ve diğer dil özellikleri için daha büyük veya daha az ölçüde doğrudur (örneğin, C ++ şablonları ve Haskell polimorfizmi temel olarak aynı özelliktir, yine tamamen farklı uygulamalarla). C ++ 'ın derin bilgisi çoğunlukla C ++' ya özgü olacaktır.


bu yazıyı okumak oldukça zor (metnin duvarı). Sakıncası var düzenleyebilir daha iyi bir şekle ing?
sivrisinek
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.