Neden C ve C ++ 'ı bilerek C ++ 11'i öğreneyim? [kapalı]


28

Her iki dile de yapışıp ikisinin bir karışımını yazmama rağmen, C ve C ++ 'da programcıyım. Bazen sınıflarda kod olması, muhtemelen operatörün aşırı yüklenmesi veya şablonlar ve çok iyi olan STL açıkça daha iyi bir yoldur. Bazen basit bir C fonksiyon imlecinin kullanımı çok daha okunaklı ve açıktır. Bu yüzden her iki dilde de güzellik ve pratiklik buluyorum. "Bunları karıştırıp bir C ++ derleyicisi ile derlerseniz, artık bir karışım değil, hepsi C ++" tartışmasına girmek istemiyorum, sanırım hepimiz onları karıştırmakla ne demek istediğimizi anlıyoruz. Ayrıca, C vs C ++ hakkında konuşmak istemiyorum, bu soru tamamen C ++ 11 ile ilgili.

C ++ 11, C ++ 'ın çalışma biçiminde önemli değişiklikler olduğunu düşündüğüm şeyi ortaya koyuyor, ancak farklı koşullarda farklı özelliklerin davranış şeklini değiştiren birçok özel durum, istisnalar ve düzensizlikler ortaya koydu, çoklu mirasa kısıtlamalar getirdi, anahtar kelimeler, uzantılar gibi davrananlar string değişmezlerin, lambda fonksiyon değişkeni yakalama, vb.

Gelecekte bir noktada, C ++ derken herkesin C ++ 11 alacağını biliyorum. Bugünlerde C dediğin gibi, büyük olasılıkla C99 demek istiyorsun. Bu beni C ++ 11 öğrenmeyi düşündürüyor. Sonuçta, C ++ 'da kod yazmaya devam etmek istersem, bir noktada iş arkadaşlarım olduğu için bu özellikleri kullanmaya başlayabilirim.

Mesela C al. Yıllar sonra, C de kod öğrenen ve yazan birçok insan var. Neden? Çünkü dil iyi. Bunun anlamı, iyi bir programlama dili oluşturmak için birçok kurala uymasıdır. Bu nedenle, güçlü olmanın yanı sıra (kolay ya da zor, neredeyse tüm programlama dilleri vardır), C normaldir ve varsa birkaç istisna vardır. C ++ 11 ancak sanmıyorum. C ++ 11'de sunulan değişikliklerin dili daha iyi hale getirdiğinden emin değilim.

Öyleyse soru şudur: Neden C ++ 11'i öğreneyim?

learning  c++  c  c++11 

3
Bu forumda C ++ 11 saldırısı olmamalı ve bu konuda tamamen katılıyorum: her geliştiricinin programlama dilleri ve araçlarla ilgili kişisel zevklerine sahip olma hakkı olduğunu biliyorum. Bununla birlikte, benim için çok daha pratik bir sorun var: Ben bir C ++ geliştiricisiyim ve C ++ 11'i sevmiyorum, C ++ 11 kullanmaya zorlanacak mıyım veya piyasada kalmam / başka bir dile geçmem gerekecek mi? birkaç sene?
Giorgio

Bunun hakkında biraz düşündüm, elbette D programlama dili veya Go gibi sıfırdan daha modern diller var. Bunlar, sorun alanınız için uygun olabilir, daha kolay, daha tutarlı, vb. Ancak pazar payı. Sektördeki kilit oyunculardan hiçbiri D'yi desteklemiyor ve hatta Go bile googles "deneylerinden" biri gibi görünüyor. +11, geniş endüstri desteğinin yanı sıra daha iyi okunabilir, daha güvenli ve daha hızlı kod yazmanıza izin veren yararlı gelişmeler olmalıdır.
Nils

@giorgio, geçtiğimiz iki yıl boyunca, C ++ 'ı daha önce yaptığım kadar kullanmayı bıraktım (çoğunlukla dini C ++ hayranlarının ne kadar olduğunu farkettim, bu sorunun cevaplarını okudum), ama yine de istekli bir şekilde C ++ kütüphanesinde çalıştım. için C ++ 11 kullanıldı. Benim deneyimim şuydu: C ++ 11, C ++ 'in berbat köşelerine hitap ediyor ve bu çok beğeniliyor ve gerçekten de onu geliştiriyor. Yaptığı şekilde kendi boktan köşeleri var (düzenlenmemiş orijinal yazıya bakınız). Bununla birlikte, eğer "normal yoldan" bir şeyler yaparsanız, bu berbat köşeler yoldan çıkmış gibi görünüyor (örn. İleride kullanmak üzere bir lambda saklamayın).

Giorgio, demek istediğim, C ++ 11 başlangıçta kötü gözükebilir, aslında C ++ korkunç görünüyor, ama C ++ ile baş edersen, muhtemelen C ++ 11'i de seversin. Sadece boktan parçalarına dokunmaktan kaçının, gerçekten de tadını çıkarabilirsiniz.

@ anon: Bir dilin berbat kısımlarından kurtulmanın bir yolu, geçmişi kesmek ve yeni bir dile başlamak, Apple'ın Swift ile yaptığı gibi (sayısız örnekten sadece birini adlandırmak). Eski kodla arayüz oluşturma, ayrı bir derleme ile yapılabilir. C ++ ile ilgili sorun, muhtemelen C ++ 'ın tek gerçek dil olduğuna inanan bir taraftar topluluğu tarafından desteklendiğinden dolayı süresiz olarak artmasıdır. Alt satır: C ++ 03'i biraz berbat buldum ama işi özellikle Qt ve boost gibi kütüphaneler sayesinde yaptım. Öte yandan, ellerimi C ++ 11’den uzak tutacağım.
Giorgio

Yanıtlar:


24

Gelecekte bir iş bulmak için bilmeniz gerektiğini düşünüyorsanız, öğrenmelisiniz. Kendine güveniyorsan, işgücünde C / C ++ [ve ne biliyorsan]] olarak pazarlanmaya devam edeceksin. Patronunuz size C ++ 11 kullanmanızı söylerse, "hayır, bunu yapmam" deyin. Seni kovarsa, git başka bir yerde çalış. Yakında bildiğiniz becerilerle tatmin edici bir iş bulamayacağınızı öngörürken C ++ 11'i öğrenin.

Gerekçemi açıklığa kavuşturmak istedim: Anti-C ++ 11 değilim. Sadece OP'nin sorusunu "Neden X'i öğrenmeliyim?" C, C ++ ile işim olduğu için hiçbir zaman ML, şema ya da haskell öğrendim. Eminim bu diller birileri için faydalıdır, fakat şu anda öğrenmem için bana faydalı değil. Biri bana ML'de programlamak için iyi para önerdi, öğrenmeye çalışabilirim.


3
Eğer bir "C / C ++" geliştiricisiyseniz ve patronunuz size C ++ 11 kullanmanızı söylerse, devam edip cephaneliğinize eklemeyiniz mi? Bütün zamanınızı dil öğrenmek için sadece onları öğrenmek için harcamamanız gerektiğine katılıyorum. Aynı zamanda, bir sonraki başvurunuzda asılsızlıktan kovulduğunuzu açıklamak zorunda kalmak yerine, sizi daha pazarlanabilir kılıyor.
Panzercrisis

Haskell ... Komik, çünkü C ++ 'a lambdaların yavaşça dahil edilmesi. : P
rbaleksandar

85

Basit. C ++ 11 kodu önemli ölçüde daha kolay, daha temiz ve daha hızlı yazmanızı sağlar.

nullptreski üzerinde bir VAST gelişmedir 0. Tip güvenlidir ve ne zaman olması gerektiğine göre dönüştürmez 0. Buna dönüşmeyecek güzel bir şey . Bunun gerçekleşmesi hiç mantıklı gelmiyor. C ++ Komitesinin değerlendirmeyi denediğinde ne bulduğunu biliyor musunuz ? Gibi şeyler . Bu ne kadar korkunç? Çünkü bir istisna var burada tek nedeni oldukça yanlış-olan ayrılmaz bir türü olarak kabul ama orada C ++ önce olduğu yani, ve C gerçeği değil dönüştürmek yapmasıdır iyi , bu kadar büyük bir ve bunu sevmelisin.nullptrint#define NULL nullptrchar c = NULL;boolnullptr

Veya referans değerlerine ve değişken şablonlara ne dersiniz? Daha hızlı, daha genel kod. Bu tam bir kazanç.

Kütüphane iyileştirmelerine ne dersiniz? Gibi şeyler function, unique_ptrve shared_ptrböylece daha iyi ne daha önce, bu C ++ 03 yolu daha iyi olduğunu iddia etmek imkânsız var daha.

#define adding_func(x, y) ((x)+(y))

Uzaktan bile eşdeğer değil. Makrolar altı milyar nedenden dolayı kötü. Hepsini burada alıntı yapmayacağım, ancak makrolardan kaçınılabilecekleri tüm amaçlar için kaçınılması gerektiği iyi biliniyor. Ne zaman yapacaksın

#define add_twice(x) (x + x)

Oh bekle, umarım artmamış bir şey vardır x. Hangi şablon fonksiyon versiyonunun tamamen bağışıklık kazandığı. Ayrıca , örneğin ad alanlarını beğenmemenizi de umuyorum .

Daha sonra, kapsamları bitmiş olan harici değişkenleri kullanmak için kendinizi tanımsız davranış dünyasına açarsınız.

İşlevsel bir API'de, örneğin STL algoritmaları, sonra referans iyidir. Kayıtlı bir geri arama ise, değere göre kaydetmeniz gerekir. İşlev hakkında sahip olduğunuz belgeler hangilerinin gerekli olduğunu açıkça belirtmelidir. Kodun bir lambda yazılmış olması, yerel değişkenlere atıfta bulunma sorunu ile ilgisizdir - eğer normal bir fonksiyon nesnesini geçerseniz, o zaman tam olarak aynı sorunu yaşarsınız. Ve bu bir sorun değil. Hiç. Çünkü yerel değişkenlere başvurabileceğiniz ve başvuramayacağınız zaman doğal olarak açıktır.

Mesela C al. Yıllar sonra, C de kod öğrenen ve yazan birçok insan var. Neden?

Sabah dişlerini fırçalamayan birçok insan var. Çok sayıda katil, tecavüzcü ve fahişe var. Ve politikacılar. İntihar eden insanlar. Bu nedenle bu aktiviteleri iyi ya da yararlı kıldığını iddia eder misiniz? Tabii ki değil. Bu, birisinin yaptığı için mantıklı bir yanılgıdır, bu yüzden iyi ya da faydalı olması gerekir.

C hala üç nedenden dolayı yazılıyor: Çünkü C ++, örneğin gömülü veya çekirdek modunda uygulanacak bir kaltak; çünkü eski kod tabanları C dilinde yazılmıştır ve C ++ 'ın mükemmel C birlikte çalışmasına rağmen şüpheli olsa da, yükseltmek çok pahalıya mal olacaktır; ve çünkü bunu yazan insanlar nasıl programlanacağını bilmiyor. Bu kadar. C yazmak için başka bir neden yok.

C veya eski stil C ++ 'ı alırsanız, pek çok istisna bulamazsınız.

Basit bir örnek olarak, zavallı C tarzı dizilere ne dersiniz? Başlarına doğrudan dizi ve işaret alamayan kişilerin sayısı müstehcendir. C Standard kütüphanesinin inanılmaz derecede güvenli olduğu gerçeğinden bahsetmiyorum bile.

Temel argümanlarınız mantıksal hatalar ve yanlış anlamalar ile dolu.


7
> Nullptr'nin dönüşüm sağlamadığı gerçeği iyidir, harikadır ve onu sevmelisin. Fikrinizi tamamlayın, ama birilerinin başkalarının SEVMESİ gerekenlerle ilgili bir süre sakinleşin, lütfen ... Bir sonraki adım C ++ avukatlarının talibanizm!
Emilio Garavaglia

5
Cevabınızın sonraki kısmının neden C ++ 'ın C ye tercih edilmesinin daha önemli olduğunu düşünüyorum. “C kütüphaneleri güvensiz” - bu nasıl soruyu yanıtlıyor? Elbette, C ++ 11'in sunduğu yeni özellikleri öğrenmelisiniz, fakat C ve C ++ aynı şeyleri yapmayı amaçlamıyor. C ++ düşük seviyede uygulamak için bir orospu ise, yani C #, Java, Python ve etajer vardır çünkü onlar değildi amaçlanan bu düşük çalıştırmak için. C ++ yerel koda göre derlendiğinden, OO ve onunla ilişkilendirilen sayfayı kritik, çekirdek düzeyinde kod için kullanabileceğiniz anlamına gelmez.
yati

11
@Shahbaz, programlama dilleri hakkında biraz daha fazla şey öğrenmeniz gerektiği (örneğin, tip sistemleri, sözlük kapsamı vb.), Tüm yorumlarınız tamamen senkronize değil. Bu kitapla başla: amazon.com/Theories-Programming-Languages-John-Reynolds/dp/…
SK-mantık

5
@ yati: C ++, C ile aynı modül sistemine sahiptir. Üye fonksiyonları düz eski C fonksiyonları olarak uygulanır. Sanal işlevler, bir DLL dosyasındaki yükleme işlevleriyle aynı şekilde uygulanır. Bunlarla ilgili hiçbir sayfa yok. Ve evet, bu kesinlikle geçerli. Başlangıç ​​olarak, Unix'in en iyisi olduğuna dair inancınız özneldir. Aksi takdirde önerdiği% 5 pazar payı. Ve ikincisi, Unix'e sonuna kadar bayılsam bile, bir örnek trend belirlemez. Aynısı, bahsettiğiniz diğer örnekler için de geçerlidir. Hangi örnekler? Anlamsızlar. C ++, C olduğu gibi işlemlere de uygundur.
DeadMG

8
@yatisagade C ++, her şey için sanal işlevleri zorlamayan çok paradigma bir dildir ve C ++ programlarım benzer. Bir kısmı, bu alt sorunu en iyi çözene bağlı olarak, nesneye yönelik tasarım, bazı kısımları işlevseldir, vb. Kullanır. Nesne yönelimli stil eklemek için C ++ 'yı takdir ediyorum ve fonksiyonel programlama için olan desteği büyük ölçüde genişlettiğim için C ++ 11'i takdir ediyorum.
David Stone

29

C ++ 11 yeni bir dil değil; bu, zaten bildiğiniz bir C ++ eklentisidir. C ++ 11 gibi diğer programlama dilleri gibi özelliklerden oluşur. Birçoğu daha önce oradaydı, bir kısmı yeni. Fakat sorunuz şu ki, dilin tüm özelliklerini öğrenmeli miyim (bu durumda C ++ 11) ya da yalnızca% 90'ını öğrenmeli miyim?

IMO, tüm dili kullanmasanız bile, en azından yeni özelliklerin sizin için ne yaptığını okumalısınız. Kütüphane / çerçeve kodunu (özellikle şablonlar) yazmayı kolaylaştırmak için birçoğu tanıtıldı (örneğin, C ++ 11'in mükemmel iletilmesi imkansızdı), ancak daha önce bu özelliğe hiç ihtiyacınız olmadıysa, şansınızı kazandınız. Bu özelliklerin C ++ 11 ile eklendiğini fark etmeyin.

Öte yandan, daha önce STL / Boost işlevselliklerini taklit eden bir kütüphane / çekirdek kodu yazarken ve dil ile sınırlı kaldığınızı fark ettiyseniz, çünkü% 95 çok hoş ve zarif bir çözüme sahip olursunuz. dilini basitçe istediğini desteklemediğini öğrendiğin için durduruldun, C ++ 11'in gerçekten müthiş gücünü anlayacaksın. Ekibimiz VS2010'a yükselttiğinden (ve süreçte Boost'u keşfettiğimizden beri), r-değer referansları ve şablon parametresi iletimi gibi şeylerden önce imkansız olan çılgınca harika bir kod ortaya koydum.

Ayrıca lambda gibi şeyler yabancı görünebilir, ancak yeni bir yapı sunmuyorlar. Bunun yerine eskiden sahip olduklarımızı daha kolay yazmamızı sağlarlar. Önceden her lambda işlevi ayrı bir sınıf olmak zorundaydı. Şimdi sadece {... kod ...}. Sevdim.

Anahtar, bu özelliklere bakmamak ve listenin ne kadar korkutucu olduğunu düşünmektir. Bunun yerine, normalde yaptığınız gibi C ++ 'ı kullanın ve bu yeni C ++ 11 özelliklerinin kullanışlı olduğu bazı senaryolara rastlarsanız (insanların% 90'ından fazlası bu noktaya asla erişemez), uzantıdan çok memnun olacaksınız dile yapıldı. Şimdilik, dilini, orada ne olduğunu bilmek için mutlaka öğrenmenizi öneririm, hepsini nasıl kullanacağınızı değil.


7
@Shahbaz - İsimsiz fonksiyonların neden eklendiğine dair niyeti hala eksik olduğunu düşünüyorum. "Değişkenleri girdi olarak kullanmadan kullanmak", kapatma olarak adlandırılır ve diğer birçok üst düzey dilde mevcuttur. Functor nesneleriyle çok sayıda şablon kodu yazdıysanız, C ++ 11 ile lambda işlevlerini açık kollarla karşılarsınız. Bunu böyle düşünün ... derleyici makine kodu ürettiğinde, şablon işlevi veya sınıf diye bir şey yoktur. Hepsi bu noktadan önce somut sınıflar / fonksiyonlar yaratmak için “somutlaştırıldı”. Lambdas durum söz konusu olduğunda aynı şeydir ...
DXM

5
... funktorlar. İnsanların tonlarca kod yazmasını sağlamak yerine, her tür işlev için ve geçmek istediğiniz her kapatma öğesi için bir tane olan C ++ 11, bir kısayol sözdizimi belirlemenize olanak tanır ve aynı şekilde tüm iç işlev sınıfını otomatik olarak başlatır şablonları başlatır. Yine, bu özelliklerin çoğunun uygulama düzeyinde kodun% 98'inde kullanılmayacağını unutmayın, ancak STL / Boost gibi kütüphaneleri çok daha güçlü ve uygulaması / bakımı / hata ayıklaması yapmak için eklenmişlerdir
DXM

10
@Shahbaz: Tamam, lambda işlevlerini veya kapanışlarını anlamıyorsunuz. Bu makul. Birçok farklı dilde kullanılmaları, onları anladığınızdan veya anlamadığınızdan ve çok fazla eleştirmeden önce onları anlamanız gerektiğini faydalı olmalıdır.
David Thornley

8
@Shahbaz: Eğer kapanışların global değişkenlere benzer olduğunu düşünüyorsanız, kapanışları anlamıyorsunuz. (İpucu: küresel değişkenler sorunlara neden olur çünkü herhangi bir işlev onları değiştirebilir.) Uygulama değil, lambda kavramını anladıysanız, onu sınıfların ve kodun karışıklığına bağlamazsınız. C ++ Standardındaki her şey, çok sayıda zeki insanı ikna eden nedenlerden dolayı var. Sebepleri kabul etmek zorunda değilsiniz, ama onları bilmeden cehaletten eleştiriyorsunuz.
David Thornley

6
@Shhabaz, kapanışlarla globals arasında kesinlikle bir benzerlik yok, tamamen noktayı kaçırıyorsunuz. Bunu okuyun: en.wikipedia.org/wiki/Lambda_calculus ve beyninizi havaya uçurmak için: en.wikipedia.org/wiki/Combinatory_logic
SK-mantık

18

Bir işlev yazmak o kadar zor mu, işlev içeriğini kodla aynı satırda yazmak zorunda kalmayacak şekilde yazmak zorunda kalıyor musunuz?

Bunu yaptığınızda yukarı kaydırın veya yeni bir kaynak dosyayı açın ve orada işlevin tanımını ekleyin. O zaman geri dönüp üzerinde çalıştığınız şey üzerinde devam etmelisiniz, bu da sizi bir dereceye kadar rahatsız eder.

Bunun dışında, başkaları size kod okurken bir lambda bazı durumlarda, "Ah, bu işlev ne yapar?" Demek yerine, kendinden belgelendirilebilir. ve onun beyanına atlayarak kendi yerinde ne yaptığına bir göz atabilirsiniz.

Herb Sutter tarafından lambdalar hakkında güzel bir konuşma var, belki seni daha iyi ikna edebilir:

http://channel9.msdn.com/events/PDC/PDC10/FT13

Peki neden kodu bir lambda işlevi yapmak yerine oraya yazmıyorsunuz?

Çünkü STL algoritmalarını veya kullandığınız herhangi bir fonksiyonu bir fonksiyona geçirmenizi gerektiren durumlarda yapamazsınız.

#define adding_func (x, y) ((x) + (y))

Lambdas yerine bu kullanımı haklı çıkarmanın bir yolu yoktur, kodunuzu her yerde makrolarla dolduramazsınız. Makroların ve fonksiyonların farklı amaçları vardır ve biri genel olarak diğerinin yerine geçmez.

template<class Lhs, class Rhs>
auto adding_func(const Lhs &lhs, const Rhs &rhs)
                -> decltype(lhs+rhs) {return lhs + rhs;}

Katılıyorum, bu çirkin. Ancak kendimi "derleyici buna neden çıksa da neden bu ifadenin türünü bulmalıyım?" Dediğimi hatırlıyorum. birçok durumda. Bu anlarda çok yardımcı olabilir.

Sonuç olarak:

C ++ 11'in yeni özellikleri sözdizimlerinde çirkin görünse de, kısa sürede onlara alışılabileceğini düşünüyorum. Her yeni dil yapısını ilk başta öğrenmek zordur; ilk defa bir sınıf yazmayı öğrendiğinizi hayal edin: Beyanı başlık dosyasına koymak, sonunda fazladan noktalı virgül unutmamak, tanımları kaynak dosyaya koymak, başlık dosyası da dahil olmak üzere bir koruma olmasını sağlarken Birden fazla kapanım, üye işlev bildirimlerinde kapsam çözümleme operatörünü unutmama vb.

Ancak, birkaç ders yazdıktan sonra buna alışacağınızdan ve bu sürecin karmaşıklığı hakkında hiç bir fikriniz olmadığından eminim: Çünkü bir sınıfın bir programcı olarak işinizi çok daha kolay hale getirdiğini ve sizin yararınızı yaptığınızı biliyorsunuz. Bu yeni yapıdan kazanmak, dili öğrenmeye çalıştığınız süre zarfındaki fayda kaybından çok daha büyüktür . Bu, birinin öğrenmeye çalışmasının veya C ++ 11'i benzer bir şekilde kullanmasının nedeni olabilir.


Kendini belgeleme ve daha az kaydırma vb. İle ilgili argümanlar, "dağınıklık kodu", "erişimi kısıtlama" vb gibi argümanların bir zamanlar sınıf dışındaki fonksiyonların neden yasaklanması gerektiğini tartışmak için kullanıldığından eminim. İnsanların hangisinin daha iyi olduğuna karar vermek için daha deneyimli olmaları gerektiğini düşünüyorum. Bana öyle geliyor ki, bu başarısız bir deney ya da kötü bir tasarımdır. Bu deneyde laboratuar faresi olmamasına daha çok ikna oldum.
Shahbaz

Çirkin görünen sözdizimi hakkında, şu ikisini ele alalım: bool is_alive;ve bool thisSpecialObjectOfMineIsAlive;. İkisi de aynı şeyi yapıyor, ancak ikincisi gerçekten çirkin görünüyor. Niye ya? Çünkü yanlışlıkla daha fazla bilgi vermenin daha net bir şekilde yapıldığını düşündüm, ama tam tersini yaptı. Burada da aynı şey geçerli, Stroustrup bize özellikler vererek iyi bir şey ifade ediyordu, ama sadece iyi görünmesini sağlamadı. Bana göre bu kötü bir tasarım gösteriyor.
Shahbaz

3
iyi görünümlü! = iyi ve kötü görünümlü! = kötü.
DeadMG

@ Hasbaz: Bence Lambdas harika bir konsept (ve Lisp gibi dillerde uzun yıllardır). Onları Haskell'de çok kullanırım. C ++, Java vb. Dillere sığdıklarından daha az eminim. Bana biraz sonradan hissettiriyorlar: lambdalar popüler olduğu için daha sonra eklenmiş bir şey. Neden bu dillerde en baştan tanıtılmadılar? Stroustrup ve Goslin, Lisp'i hiç duymamış mıydı?
Giorgio

8

Aslında OP'nin cevapların çoğunda olduğu gibi bazı noktaları var. Fakat vizyonda "uzak" durumdalar. C ++ (C altkümesi dahil) zaman içinde bazı özelliklerin eklendiği uzun bir geçmişe sahiptir, bazıları az ya da çok sık kullanıldı ve onlardan yararlanma ve hatalar başkasına ve diğerlerine mükemmelleştirildi.

Bazen, yeni bir özellik sunduktan sonra, artık eski bir özelliğe ihtiyaç duyulmakta veya bununla çelişmektedir. "Temiz" bir dil olduğu gibi tutarlı olmalı ve artık ihtiyaç duyulan özellikler kaldırılmamalıdır.

Ancak eklemek hiçbir şeyi mahvetmez. Çıkarmak (veya değiştirmek) hala mevcut olan kodu yapım aşamasındadır, bu nedenle ne eklerseniz ekleyin, varolan kodu kırmamaya dikkat etmelisiniz (özellikle de, sessizce kırmayın , amaçlandığı şekilde farklı şeyler yapsın) ).

Bunları öğrenmek zorunda mısın? Evet, çünkü tüm özellikler iyi ya da kötü, er ya da geç kullanılmış. Bunun “kalite” dili için iyi bir şey olup olmadığı (bunun için objektif bir önlem olduğunu kabul etmek) başka bir hikaye: geriye dönük uyumluluk ne kadar sürmeli? cevap bulmak zor, biri 3 yıl, bazıları ise 50.

C ++ 'yı daha düzenli tutmanın alternatifi ... çizilmeyi yeniden başlatarak daha sık kırmaktır. Ama artık C ++ olmayacak.

Bunu da yapmak için girişimler var (örneğin, D'yi düşünün: C ++ (hatta 11) aslında çok daha diktir), ama onlar ne kadar popüler? Hızlanma zorluğunun nedenleri üzerine, halen çalışması gereken birçok kodla uyumsuzluk var.

C ++ 11, bana göre açıkça yeni ihtiyaçlar ve geriye dönük uyumluluk arasında bir uzlaşmadır. Bu, özelliklerinin ve uygulamasının belirli bir "dağınıklığı" ile sonuçlandı. Bu "dağınıklığın" bedeli, uyumsuzluk bedelinden daha az olana kadar ... bu uzlaşmayla bırakmak zorundasın.

Buna artık tahammül edemiyorsanız, başka bir genç dili düşünmek daha iyi. C ++ bu anlamda basitleştirilemez. Bu yaşta değil.


Ben de katılıyorum. Ve bir geliştirici olarak sürekli değişen bir dilin (tekrar tekrar öğrenmem gereken) olmasını çok rahatsız edici buluyorum. Eğer yeni bir dil geliştirirseniz, yeni bir başlangıç ​​yapmalı ve farklı bir isim kullanmalısınız. Eski kodla işbirliği yapmasını istiyorsanız, bunun için ayrı bir derleme var. Bu yüzden, moda olan en son özellikleri bir araya getirerek varolan bir dili değiştirme politikasını gerçekten anlamıyorum. Birinin dediği gibi: daha fazla gelişme otomatik olarak ilerleme anlamına gelmez.
Giorgio

“C ++ bu anlamda basitleştirilemez. Bu yaşta değil.”: Neden aynı yolu izleyen diğer programlama dilleri (örneğin, C, Ada, ...) değil? Belki de kendi uygulama alanlarına sahip olmaları ve olası tüm uygulama alanları için araç olmaları beklenmemektedir .
Giorgio,

@giorgio: evet ... muhtemelen "pragmatik" anlamda haklısın. Ama teoride ... pascal'in "referans dili öğretmek" ve ada "her şey programlama dilini değiştirmek" olduğu iyi günleri hatırlıyorum .
Emilio Garavaglia

Ayrıca Pascal'da programlama öğrendim. Bildiğim kadarıyla Ada birkaç revizyondan geçti ancak dilin temel tasarımı değişmedi. C ve Pascal ile aynı. Eğer biri gerçekten yeni bir dil geliştirmek isterse, net bir kesim yapmak ve D, Java, C # gibi yeni bir şey başlatmak için yeterince cesur olmalıdır. Şu anki C ++ yolundaki sorunum alıyor (gereksiz yere) çok karmaşıklaşıyor. KISS ve YAGNI ilkeleri yazılım tasarımında geçerliyse, neden programlama dili tasarımında da kullanılmamalıdır?
Giorgio,

@ Giorgio: oh ... aynen söylediğin gibi ... uygulanırlar. C # veya D'nin "kaynamış" bir C + 'dan (hislerinizin yorumlanmasından) daha iyi bir seçim yaptığını düşünüyorsanız, bunları C ++ yerine kullanın. Zaman C ++ 'da ilerlerken yavaşça ölür. Şu anda, C ++ 11'in "kaynamış" C ++ 03 ve D'ye yeni bir şans verdiğini ve D'nin başlangıç ​​bariyerini kıracak hala bir şey eksik olduğunu görüyorum. Ekonomi ve şirket çıkarları aynı zamanda kalkınmanın nasıl finanse edileceği ve teşvik edilmesinde rol oynamaktadır. Teoride haklısın ama gerçek dünya daha karmaşık.
Emilio Garavaglia

7

Yeni C ++ 11 özelliklerini yoksaymaya karar verseniz bile, C ++ Standart Kütüphanesi bunları kullanacağı için bunlardan yararlanmaya devam edersiniz. Örneğin, C ++ 98'de bir değişkene sahip olma vector<string>potansiyeli, vektör büyüdüğünde yapılması gereken kopya sayısından dolayı bir performans felaketiydi. C ++ 11 move yapıcısı ile sorun değil. Aslında, C ++ 11'in bize daha az yeni özellikler getirmesini diliyorum, özellikle de Standart Kütüphanede.


6

Yıllar sonra, C de kod öğrenen ve yazan birçok insan var. Neden? Çünkü dil iyi.

Birincisi, bugünlerde çoğu öğrenci C değil, Java ya da .NET öğreniyor. İkincisi, insanlar hala C'yi sadece bir dil olarak sağladığı avantajlar nedeniyle değil, aynı zamanda C'ye yazması gereken çok büyük miktarda mevcut yazılım olduğu için kullanıyorlar. korunmalı ve uzatılmalıdır, çünkü birçok durumda (örneğin gömülü platformlar) bir C derleyicisi vardır. Bu arada, bunlar insanların hala COBOL yazmasının nedenlerinden bazıları.

Sektördeki bir programcının, mevcut bir kod tabanına bağlı olmayan yepyeni bir proje üzerinde çalışmaya başlaması ve tek başına çalışmaya devam etmesi çok nadirdir. Bu nedenle, C ++ 11'i öğrenmenin nedeni, yeni özellikleri kullanan başkaları tarafından yazılmış olan kodlarla başa çıkmak zorunda olmanızdır. Ayrıca, eklenen özellikler bir sebepten dolayı eklendi. Onları öğrenip kullandığınızda, onları takdir etmeye başlayabilirsiniz.


Cezamı tamamen vermedin. Sonrasında cümle içinde söylediğim gibi, goodiyi bir programlama dili tasarımının kurallarını izler demektir. Nerede okuduğunuzu bilmiyorum ama 4 ya da 5 ülkeyi tanıyorum ve hepsi C ile programlama öğrenmeye başlıyor. Dediğim gibi, C ile istisnaların yanında (Java'da zıt olan bir şey yok) istisnasız bir yapı bulun).
Shahbaz

1
@ Şahbaz: Tam cümlelerden alıntı yaptım. Nedensel bir bağlantı yaptınız ve ben de en azından eksik olduğunu söyledim. Neyse ki, artık çalışmıyorum. :) Bunu yeterince yaptım. ABD'de yaşıyorum ve üniversiteye gittiğimde (15 yıldan daha uzun bir süre önce) C başlangıç ​​diliydi. Ancak, bugün çoğu ABD okulları Java ile başlayıp, orada olmadıklarını C biliyoruz birçok genç programcılar
Dima

5
@Shahbaz: Problemi istisnalar dışında dil kuralları ile görmüyorum. Evet, C, C ++ 'dan çok daha basit bir dildir. Öte yandan, C ++ daha basit kod yazmayı kolaylaştırır. Daha basit kod yazmak için daha fazla dil özelliğine ihtiyacınız var. Bu dili daha karmaşık hale getirir. Birincisi, sınıflar, referanslar, RAII, şablonlar, yapıcılar, yıkıcılar, istisnalar ve ad alanları gibi şeyler gibi. Fakat sorunuzun C vs C ++ ile ilgili olmadığını söylediniz, bu yüzden cevabı bu konuda yazmadım.
Dima

5
  • Meclis oluşturuldu çünkü insanlar makine kodu yazmayı sevmiyorlardı
  • C yaratıldı, çünkü insanlar derleme yazmayı sevmiyorlardı
  • C ++, insanlar C yazmaktan hoşlanmadığı için yaratıldı
  • C ++ 11, insanlar C ++ yazmayı sevmedikleri için yaratıldı.

C ++ kariyerinizde kendinize "Keşke functors daha basit olsaydı" ya da "NULL neden bir int?" Dediğiniz bir noktaya geleceksiniz. ve sonra C ++ 11'i anlayacaksınız.


Tüm diller yaratıldı çünkü biri mevcut olanı beğenmedi. Bu hiçbirini iyi yapmaz.
Shahbaz

Bir NULLolması gerektiğini söylemiyorum int. Olmamalı. Uygun bulmadığım şey, bunu çözen dilde bir yapı oluşturmak, ancak istisnalar ortaya koymak. Aynı şeyi daha iyi bir şekilde yapabilmeliydiler.
Shahbaz

2
"C ++ 11, insanlar C ++ yazmayı sevmedikleri için yaratıldı": C ++ yazmayı sevmiyorlarsa, C ++ neden C ++ 11'in bir alt kümesidir?
Giorgio

1
Olması gereken: C # ve Java yaratıldı çünkü insanlar C ++ yazmayı sevmiyorlardı.
Calmarius

4

Öğrenme her zaman faydalıdır. Bilgi Güçtür.

Temel olarak cevap budur. Geriye kalan her şey, bundan tam olarak nasıl faydalanabileceğinizi ve bunu bilerek hangi güçlere sahip olduğunuzu ve her numaralamanın eksik olacağı kadar çok ayrıntıya sahip.

Bir örnek kendi sorunuzdur. En azından bir kısmını öğrenmeden bile soramazsın.

Ve yorumladığım gibi - asıl kaygı neden öğrenmemiz değil kullanmanız . Ve bu tamamen farklı bir soru.


4

C ++ 11'i öğrenmelisiniz, çünkü eklenen özellikler daha iyi kod yazmanıza izin verir. Bazı insanlar NULL işaretçilerin ve lambdaların güvenliğinden bahsettiler, bu da çok hoş. Fakat C ++ 11'de özellikle büyük bir üretim ortamında en çarpıcı değişiklik olduğuna inandığım şeye dikkat çekmek istiyorum: hareket anlambilimi.

C ++ 11 'ayrı taşıma' ve 'kopyalama' kavramlarını destekler. Normalde C ++ 'ta, her ikisini de temelde yapan = operatörüne sahibiz. Fakat gerçekten, tehlikeli olan tek operatörle iki ayrı fikri ifade ediyoruz.

Bunun yararlı olduğu yerlerin en belirgin örneği yeni unique_ptr'dir. Eski auto_ptr ve scoped_ptr'nin en iyi özelliklerine sahiptir. Bir nesneye işaret eden tek işaretçi olacağına dair bir işaretçi olmasını istediğimizi varsayalım. Bir = b ile nasıl başa çıkacağız? Daha önce sıkışıp kaldık, ya tamamen izin vermeyebilirdiniz (scoped_ptr gibi) ya da auto_ptr'nin yaptığı şeyi yapabiliriz; Bu auto_ptr davranışı çok kafa karıştırıcı çünkü a = b aslında b'yi değiştiriyor. unique_ptr bunu gerçekleştirir: a = b'ye izin verilmez, ancak mülkiyeti çalmak için bir = std :: move (b) 'ye sahipsiniz. Bu nasıl faydalıdır? Burada, kopya anlambiliminden ziyade hareket anlambilimi kullanan ayrı bir (aşırı yüklenmiş) takas sürümü bulunmaktadır. Bu, unique_ptr'in değiştirilebileceği, problem olmadığı anlamına gelir. Bunun anlamı, auto_ptr'den farklı olarak, benzersiz_ptr, bir kapta kullanmak ve daha sonra sıralama demek güvenlidir. unique_ptr temelde hepsidir ve aynı nesne üzerinde birden fazla işaretçiye ihtiyacınız olmadığında tüm güvenli bellek yönetimini sonlandırır.

Bir başka harika örnek: Diyelim ki tartışılmaz bir nesne var. Bu, bazı durumlarda yararlıdır. Bu nesneyi hiçbir zaman bir işlevden döndüremezsiniz, çünkü işlev sona erdiğinde ne geri veriyorsanız onu kopyalar. İronik olan şey, genellikle derleyicinin bunu gerçekten optimize etmesidir (yani sonunda hiçbir şey kopyalanmaz, sonuçta verilen atama adresinde yaratılır). Fakat bunun neden onu umursamaz hale getirdiğimizle ilgisi yok; bir işlevden dönmek, nesneyi yalnızca iç işlev kapsamından dışına doğru hareket ettirmektir. Artık tartışılmaz ancak ARE hareketli nesneler yazabilirsiniz ve bu nesneler işlevlerden döndürülebilir.

Anlamsallığı taşı, sızdırmayan ve iş parçacığı güvenli kod yazmayı çok kolaylaştırır.


Ve ayrıca, bu arada, verimli.
Nir Friedman,
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.