C ve C ++ arasında bir dil var mı?


18

C'nin basit ve şeffaf doğasını gerçekten çok seviyorum: C kodunu yazdığımda "sızdıran soyutlamalar" ile sınırsız hissediyorum ve neredeyse her zaman ürettiğim montaj konusunda kurnaz bir tahmin yapabilirim. Ayrıca C için basit, tanıdık sözdizimini seviyorum.

Bununla birlikte, C, C ++'ın sınıflar, basitleştirilmiş cstring olmayan taşıma vb. Gibi sunduğu bu basit, yararlı doodadlara sahip değildir. ve çeşitli nedenlerle çok güvenli değil.

Yine de C ++ 'daki nesnelere aşırı vurgu yapmanın hayranı değilim ve' yeni 'operatör ve benzeri silahtan utanıyorum. C ++, örneğin bir sistem programlama dili olarak kullanılabilecek çok fazla hıçkırığa sahip gibi görünüyor.

Widget'lar ve doodadlar ölçeğinde C ve C ++ arasında oturan bir dil var mı?

Feragatname: Bunu sadece gerçek bir soru olarak kastediyorum. Seni kızdırmak istemiyorum çünkü C {, ++} 'ın planladığım her şeyi yapacak kadar iyi olduğu görüşünü paylaşmıyorum.


10
Sorunuzun "tamamen gerçek" olduğunu söylüyorsunuz, ancak çok fazla hıçkırık olması "c" gibi göründüğü için c ++ 'ı indiriyorsunuz. Bu hıçkırıklar nedir ve c ++ indiriminde geçerli nedenler midir?
whatsisname

2
'Widget ve doodad ölçeği' nedir? "Tamamen olgusal" bir soruya gerçek cevaplar vermek istiyorsanız anlamsız metriklerden kaçınmalısınız.
Caleb

2
Ve C ++ hakkında belirttiğiniz birkaç şey bazı yanlış bilgilere ihanet eder. newÇoğunlukla bir artırıldığını-up mallocolduğunu olabilir sizin için bellek başlatılıyor da alıp bakım. "Yerleşim yeni" ile ve operator newnasıl ve nerede bellek ayıracağına karar verebilirsiniz. Ve nesne vurgulama gelince: Yukarıdaki birkaç satır, sınıfları "basit, yararlı bir doodad" olarak değerlendirdiğinizi belirtir. Kararını ver!

25
C+ Diclaimert resist. It
'10

2
Bu, süreklilik hipotezi gibi büyük bir kulağa ve muhtemelen aynı cevaba sahip gibi geliyor. ( en.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

Yanıtlar:


29

Bunlar aradığınız droidler olabilir ...

Git - http://golang.org/

D - http://dlang.org/

Rust - http://rust-lang.org/


5
@dtech: D'nin anlamsız GC / "Nesneden her şey miras" var / Değerler krateri berbat etmelidir. Bunun için zaten C # var ve aslında iyi araçlar var. Git, neden attığımla ilgili anılarımın biraz puslu olduğunu itiraf ediyorum, ama hatırladığım gibi, çok kullanışlı bazı özellikleri kesti.
DeadMG

4
-1 "ne C ++ olmalıydı" için. C ++ budur ve üstesinden gelemezseniz, bu büyük ölçüde sizin probleminizdir. Size daha uygun bir dil kullanarak başa çıkabilirsiniz, ancak bu C ++ 'nın bu dil gibi olması gerektiği anlamına gelmez .
back2dos

7
@ DeadMG D'de 2 anlamlı ifade yaptınız: GC zorunludur ve her şey bir nesne olmalıdır. Her ikisi de yanlış. Bu, sonucunuzun gerçek bilgiye göre daha fazla cehalete dayandığını düşündürüyor. CodexArcanum ile hemfikirim.
deadalnix

5
@deadalnix: Teknik olarak GC'yi kullanmamayı seçebilirsiniz. Ancak GC'nin hangi kütüphane işlevlerini veya dil özelliklerini kullandığını bilmenin veya kontrol etmenin bir yolu olmadığından, onu kullanmayan bir program üretmenin gerçekçi bir yolu yoktur. Ve Object'den miras almayan bir sınıf oluşturamazsınız. Ve structs, C ++ değerlerine kıyasla ciddi bir şekilde gimped-miras yok, rvalue referansları yok, bu nedenle D'de C ++ eşdeğeri kadar verimli olan bir değer dizesi sınıfı kadar basit bir şey üretmek imkansız. Bunlar D dili hakkında gerçeklerdir.
DeadMG

5
@DeadMG: Kalıtım olmadan yapıları yapmak bir özelliktir , "dikkat çekmek" değildir. Doğru yaptıkları bir şey, tarihte hemen hemen her OO dilinin "C ++" olarak adlandırılmadığı (Simula, orijinal OO dili dahil) ve C ++ 'ın inanılmaz derecede yanlış yaptığı bir şey. Kalıtım ve değer türleri karışmaz. Nesne kimliğini bozar, Liskov İkame'yi bozar, tüm OO paradigmasını bozar.
Mason Wheeler

19

C ++ ile kabaca paralel olan veya yazarların C ++ ile gördüğü sorunları gidermeye çalışan birkaç dil (ör. Java, Go, D, Objective-C) vardır.

Bununla birlikte, en azından IMO, hepsi en pratik amaçlar için C ++ 'dan önemli ölçüde daha düşük çalışır.

Ne yazık ki, hangi montaj kodunun üretileceğini bilmek için görünen zevkinize dayanarak, muhtemelen Objective C ve Java'yı derhal ekarte edebiliriz.

Teorik olarak, bunlardan en ilginç olanı Go'yu düşünürdüm - bazı orijinal kodları daha kolay hale getiren problemleri çözmek için gerçekten orijinal fikirlere ve ilginç yaklaşımlara sahiptir. Ne yazık ki, mevcut derleyiciler çok iyi kod üretmiyor ve son yıllarda bu konuda çok fazla gelişme yok.

Bu, D'yi şansa sahip tek kişi olarak bırakır. Muhtemelen C ++ (bunlardan) en çok benzeyen, aynı zamanda problem olarak gördüğünüz şeyi düzeltmek için en az olasılık (IMO).

Bu bariz bir yaklaşım bırakır: C ++ kullanın, ancak yalnızca istediğiniz parçaları kullanın ve sevmediğiniz parçalardan kaçının.


13
+1 için "C ++ kullanın ve sevmediğiniz parçalardan kaçının". Ve OP'ye C ++ hakkında daha fazla bilgi edinmesini öneririm, insanlar çoğu zaman şeyleri yeterince iyi bilmedikleri için reddederler.
Doc Brown

1
@DocBrown Belki de C ++ 'ı yeterince iyi tanımak o kadar kolay değil.
Malcolm

3
@Malcolm: Modern C ++ 'yi derinlemesine öğrenmek elbette zor. Ama öte yandan, "yeni operatörün silahtan utanması" için kesinlikle hiçbir neden yok, bu bana batıl inançlı geliyor.
Doc Brown

3
@ Malcolm: Muhtemelen konsept çok basit olduğu için . UTF-32 dizgi değişmezine veya UTF-16 dizgi değişmezine ihtiyacım var mı? Peki, wtf string kodlamalarının temellerini bildiğinizi varsayarak, cevaplamak oldukça kolay bir soru. Ve bu çok sayıda zor özellik? Bir sebepten dolayı var olurlar . Örneğin, Java'nın jenerikleri. Şablonlara göre acınasıdırlar . Tabii, öğrenecek daha az şey var, ama bunun nedeni çok kullanışlı olmamaları. Bu, Brainfuck'tan daha karmaşık bir şey demek gibi.
DeadMG

3
@ Malcolm: Bu hiç doğru değil. Popülerlik, dilin iyi / yararlı olup olmadığı dışında 99999 şeyden etkilenir.
DeadMG

16

Bununla birlikte, C, C ++'ın sınıflar, basitleştirilmiş cstring olmayan taşıma vb. Gibi sunduğu bu basit, yararlı doodadlara sahip değildir. ve çeşitli nedenlerle çok güvenli değil.

Yine de C ++ 'daki nesnelere aşırı vurgu yapmanın hayranı değilim ve' yeni 'operatör ve benzeri silahtan utanıyorum.

Üzgünüm dostum, çelişki alarmı. Cstring olmayan kullanım gerektirir new . Bu temel bir gereklilik. std::stringOlmadan yapamazsın new. Dahası, new/ deletetam olarak malloc/ freeama daha güvenlidir , çünkü yığın nesnelerinin doğru yapımını ve imha edilmesini garanti eder (tamamen gereklidir!) Ve bir NULLdönüş yerine istisna işlemeyi kullanır ve bu nedenle akla gelebilecek her modada üstündür. C ++ 11'de kendi newstil işlevinizi yazmak çok mümkündür , çünkü mükemmel yönlendirme, herhangi bir türdeki herhangi bir kurucu ile başa çıkmanıza izin verir. Eğer silah hakkında utangaçsanız new, o zaman ne ile uğraştığınızı gerçekten bilmemenizi öneririm.

Oh, evet ve akıllı işaretçiler bunu asla kendinizle başa çıkmak zorunda kalmayacak şekilde yaparlar.

Ayrıca, C ++ 'da fazla vurgu yoktur. İstemediğiniz herhangi bir nesneyi kullanmak zorunda değilsiniz. Lambdas ve istediğiniz herhangi bir zamanda işlevsel olarak programlayabilirsiniz. Kimse sizi miras ve sanal işlevleri kullanmaya zorlamıyor - aslında, birçok iyi C ++ programı nadiren miras sergiler. Şablonlar daha güçlü ve daha kullanışlı soyutlama tekniğidir. Bu Java değil.


1
Katılıyorum. C ++ 'ı istediğiniz şekilde kullanmak, (muhtemelen daha düşük) bir alternatif
aramaktan

1
Lambdaların işlevsel olarak programlamak için yeterli olduğunu düşünmüyorum. Ayrıca bir fonksiyon kompozisyon operatörü, köriler, vb. Ayrıca bkz . Stackoverflow.com/questions/1981400/functional-programming-in-c . Bana göre neredeyse OOP yapmak gibi geliyor ...
Giorgio

@Giorgio: Bu sorunun cevapları sadece "Zor!" Diyor. Gerçekten zor olduğuna dair bir kanıt göstermiyorlar . Neden fonksiyon kompozisyonu için ayrı bir operatör istesin ki? f(g(x))benim için gayet iyi çalışıyor gibi görünüyor. Ve ben de köri genel olarak C ++ 11 bir kütüphane olarak yapılabilir inanıyorum.
DeadMG

1
@DeadMG: Bir fonksiyon kompozisyonu operatörü, fonksiyonel programlamada oldukça iyi kurulmuş, temel bir kavramdır. FP'yi destekleyen bir dilde bulmayı beklerdim. Değişkenleri kullanmadan karmaşık bir işlevi diğer işlevlerin bileşimi (örneğin Unix'teki borularla yaptığınız gibi) olarak tanımlamayı çok uygun buluyorum: k = h. g. f
Giorgio

1
@ Giorgio: std::bindbu tür şeyleri destekler.
DeadMG

5

C, neredeyse C ++ 'ın bir alt kümesidir, bu yüzden C ++' ın istediğiniz parçalarını kullanabilir ve geri kalanını göz ardı edebilirsiniz. Geçerli C ++ olan geçerli C yazmak bile mümkündür.

Deyimsel C ++ yazmazsınız, ancak bu yaklaşık olarak "arada" olur.

Alternatif olarak, C'yi daha güçlü bir şeye, özellikle D ve Objective-C'ye doğru genişletmeye çalışan diğer dilleri kontrol edebilirsiniz.

Ve son olarak, projenin doğasına bağlı olarak, bir çokgrup yaklaşımı için gidebilirsiniz: projenizi modüllere ayırın ve her bölüm için en uygun dili seçin. Bunun dezavantajı, dillerin birlikte çalışmasını sağlamanızdır, bu da çabaya değmeyecek çok fazla iş olabilir.


Gerçekten de, konsol oyunu geliştirme gibi “gerçekten C ve C ++ arasında bir dil” istediğimiz sektörlerde çalışmak tam da bunu yaptık. Performans açısından kritik döngülerde bazı şeylerin sınırsız veya daha olası sınırlarının olduğu bir C ++ işlevselliği alt kümesi kullandık.
Carson63000

3

Sadece sıra dışı bir cevap sunmak için: İstediğiniz dil yoksa, neden kendiniz bir dil yapmıyorsunuz? Orada, (F) Lex ve Yacc / Bison'un eski stand-by'larının çeşitli güçlü dil geliştirme araçları var. C'yi zaten bildiğinizden, C kodunun çıktısını almak için "derleyicinize" ihtiyacınız vardır.

Bu düşündüğünüzden daha basit ve daha güçlü olabilir. C için bir ayrıştırıcı / lexer ile başlayın, sonra önemli olduğunu düşündüğünüz ekstra özellikleri ekleyin. Atlama tabloları elle yazmak rahatsız edici ise, özeti ifade etmek için bir yapı bulun ve tercümanınızın sizin için yazmasına izin verin. Temelde bu, meta programlamayı yapmak için dış araçları kullanarak daha yüksek bir ön işlemci meta programlamasıdır. C'yi bildiğiniz için son montajın nasıl olacağını her zaman bilirsiniz ve dil uzantılarınızın hangi C'ye genişleyeceğini bilirsiniz.

Açıkçası, bunun fazladan bir iş yapmadan ne kadar etkili olabileceğine dair bazı sınırlamalar var. Tam bir statik tip sistemi eklemek, almak istediğinizden biraz daha karmaşık olabilir, ancak bunun için bir zevkiniz olduğunu keşfederseniz keşfedebileceğiniz bir seçenektir. DSL uzantılarınız, bunları yapmak için zamanınız ve enerjiniz olduğu kadar güçlü ve karmaşıktır ve kim bilir, belki bir gün uzatma diliniz "bir sonraki C ++" olacaktır.


2

Hangi C ++ özelliklerinin sizin için can sıkıcı olduğunu söylemediniz. her neyse Objective-C'yi deneyebilirsiniz. C ++ 'da Standart Kitaplık yerine Nesneye Dayalı olarak vurgulanır.


2
imho Objective-C, C ++ 'a sınıfları ve C ++' dan pek çok açıdan sınıfları tanıtmak için yetersiz bir girişimdir. Ayrıca Mac OS X / iOS dışında çok az kullanılır.
dtech

1
@dtech: İlginç, Mac hayranı olmayan eski bir meslektaşım (daha ziyade Debian / Linux adamı) Objective-C'nin C ++ 'dan C ++' dan çok daha temiz bir OO uzantısı olduğuna ikna oldu. Objective-C'yi hiç denemedim, bu yüzden bu konuda bir fikrim yok.
Giorgio

1
@dtech: O zaman alçakgönüllülükle fikrinizi yeniden düşünmenizi öneririm;) Objective-C nesne yönelimi ile ilgilidir ve o zaman C ++ 'da çok daha iyi bir iş yapar, çünkü mesaj geçişi sağlar. Dilin birçok yönden C ++ 'dan daha düşük olduğunu kabul etsem de, diğer yollardan da daha üstündür.
back2dos

@Giorgio Kolejinize katılıyorum, ancak Obj-C'nin de bazı sınırları var (belki bunlardan bazıları Obj-C 2.0 ile kayboldu), örneğin "yöntemlerin" (seçiciler) aşırı yüklenmesini istiyorum - btw İstiyorum La Fortran aşırı yük fonksiyonu ...
ShinTakezou

2

Gömülü dünyada Embedded C ++ belirtildi . Birden fazla miras gibi şeyleri çıkardılar. Bildiğim kadarıyla, hemen hemen öldü.


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.