C / C ++ için derlenebilir modern alternatifler [kapalı]


38

Yeni bir yazılım ürünü yazmayı düşünüyorum. Performans kritik olacaktır, bu yüzden bir tercüman veya dil veya öykünme katmanı kullanan bir dil kullanmaktan çekinmem (java oku).

Bu da beni C (ya da C ++) kullanmayı düşünmeme yol açıyor ancak bu ikisi de diş içinde oldukça uzundu. Ben de uzun zamandır kullanmadım. Son 20 yılda birisinin muhtemelen popüler, kodlaması güzel ve derlenmiş bir şey yarattığını düşündüm.

Yüksek performanslı derlenmiş kod yazmak için C'ye daha modern alternatifler nelerdir?

Eğer C ++ 15 yıl öncekinden farklı bir canavarsa, düşünürdüm, sanırım onun doğasında bazı problemler olduğu varsayımı vardı.

Paralelleştirme önemli olabilir, ancak muhtemelen birden fazla makinede olmaz.


21
Modern C ++, C'den oldukça farklıdır. Java ya da C # gibi bir şeyle karşılaştırıldığında C'den çok daha fazladır, ancak çöp toplama yerine deterministik imha özelliği içermesi ve ayrıca bir VM'de ya da yönetilmemesi nedeniyle tanımsız davranışı vardır. Çevre, ortam. Diğer alternatifiniz D, iyi bir dil, ancak kütüphaneler ve destek konusunda hala olgunlaşmamış D.
Charles Salvia,

11
"Performans kritik olacak" bölümü hakkında ayrıntılı bilgi verebilir misiniz? Neden kritik olacak? Henüz bir şey ölçtün mü?
JesperE

3
15 yıl bilgisayar açısından bir eon ve bu süre zarfında Ericsson gibi insanlar gömülü sistemlerinde dağıtılmış, hataya dayanıklı, yumuşak gerçek zamanlı, kesintisiz uygulamaları desteklemek için Erlang gibi işlevsel dilleri kullanıyor ! Yalnızca C ++ 'ın size istediğiniz performansı verebileceğini düşünmeyin, soruna daha fazla donanım atmaktan ve başka bir dilde uygulama süresinden tasarruf etmek daha iyi olabilir.
Mark Booth

5
@JeremyFrench: Fakat yanlış varsayıma dayalı bir soru soruyorsunuz, bu performans => statik derleme.
vartec

4
Buna değer, Haskell şu anda çoğu durumda C ++ yerine benim yedek olarak hizmet ediyor.
Jon Purdy

Yanıtlar:


54

Gelişimde C ++ ile benzer hedefleri takip eden Rust Programlama Dili adı verilen bir dil var, özellikle sıfır maliyetli soyutlamalar ve bellek yönetimi üzerinde hassas kontrol. Bununla birlikte, hala çok genç olmasına rağmen belki de en dikkat çeken aday.

Rust dışında, yerel yasaları derleyen başka popüler alternatif yoktur. Elbette, Delphi ve D de var, ancak bunlar çok hızlı, popüler veya kullanılmış değil. Google’ın Go dili bir aday olabilir, ancak hala çok genç ve biraz farklı bir etki alanı hedefliyor.

Ancak, C # (Microsoft platformunu varsayarsak) ve Java'nın sanal bir makinenin üzerinde çalışsalar bile yavaş olmadıklarını unutmayın; tam zamanında kod derlemesi, geleneksel zaman öncesi derleyicilerin, program durumu ve ortamı hakkında bilgi eksikliği nedeniyle başvuru yapamadığı bazı optimizasyonlar yapabilir.

Açıkçası, eğer C ++ bir seçenekse, C moderninin daha güvenli olması, daha yüksek soyutlama seviyelerinde çalışması, daha etkileyici olması ve pratikte C'ye göre hiçbir performans kaybı olmaması nedeniyle, C'yi aday olarak görmeyeceğim. C ++ oldukça hızlıdır). Basitçe söylemek gerekirse, C ++, C'nin sağladığı her şeyi ve daha fazlasını sağlar. C işlevselliğinin çoğunun "kullanımdan kaldırıldığı" kabul edilir ve daha iyi, daha güvenli, daha hızlı ve daha sezgisel alternatifler C ++ standart kütüphanesi tarafından sağlanır.


5
C işlevinin resmi anlamda “kullanımdan kaldırılmış” olduğunu söyleyemem - C ++ 'ta C kütüphanesi işlevlerini, ham işaretçileri veya C dizilerini kullanmak için neredeyse hiçbir neden yoktur.
Charles Salvia

20
'Performans için derleme gereklidir' aleyhine konuşma için +1 yanlış varsayımı.
Telastyn,

3
@gbjbaanb Windows altında Visual Studio ve MinGW ile derlemeye çalışın ve bu konuda iyi şanslar: | Ayrıca, ABI’lar hakkında hiçbir şey bilmeyen bu araçlardan biri ile derlenmiş bir kitaplık veren bir kişiyi ikna etmeye çalışın ve size o kitaplığın kaynağını vermeli ya da nasıl derleyeceğini ve doğru özellikleri vereceğini öğrenmelidir. . Bazen korku.
kullanici827992

5
@paxRoman: C ++ da küçük programlar yazabilirsiniz, ve C daha güvenli sizden daha bunları yazmak
Kevin Cline

3
@JBRWilkinson Bildiğim kadarıyla, Objective-C'nin popülaritesi Apple platformunun dışında mevcut değil.
zxcdw

19

Ayrıca, yerel kodu derleyen ve standart kütüphanesinin sınırları dahilinde çeşitli platformlarda taşınabilir olan Ada da vardır . Dil, şu anda devam etmekte olan en son dil standardı güncellemesiyle (Ada 2012 olarak bilinir) canlı ve güzel.

Ada ile aşina olmayanlar için kısa özet:

  • Güçlü yazılmış
  • Eşzamanlılık için yerleşik destek
  • Gereksinimlerinize bağlı olarak nesne yönelimli veya prosedürel
  • GNU takım zinciri ile desteklenir (GCC Ada frontend içerir)
  • Yazılım geliştirme için de mükemmel, yani donanımla doğrudan arayüze ihtiyacınız olduğunda
  • Genel programlamayı destekler (genel paketler, prosedürler, işlevler)
  • Özellikler büyük ölçekli yazılım geliştirmeyi destekler (paketler, alt paketler, ayrı derlemeler, şartname ile uygulama arasında kesin ayrım)

1
Ada Tasks (Parallelisation!)
NWS

6
+1: Ada'yı öğrenmeye çalıştım ve bence çok sağlam ve temiz bir dil. Diğer programlama dillerinde olduğu kadar çok iş olmaması üzücü.
Giorgio,

3
Güzel söz, daha 'modern' bir şey arıyordum ama Ada'yı unuttum
Jeremy French

4
@ Jeremy French: Ada'nın sunmadığı daha 'modern' bir dilde hangi özellikleri arıyorsunuz?
Giorgio,

17

Eğer C ++ 15 yıl öncekinden farklı bir canavarsa, düşünürdüm, sanırım onun doğasında bazı problemler olduğu varsayımı vardı.

15 yıl önce, C ++ standardı yoktu. İkincisi geçen yıl yayınlandı. C ++ en iyi uygulamaları 98 standardının yayınlanmasından sonraki 5 yıl içinde çok değişti ve 11 yayıncının yayınlanmasıyla tekrar değişiyorlar.


12

Neden insanlar hep yeni diller aramakta ısrar ediyorlar?

C ++:

  • TIOBE tarafından 4 numaralı dil, ancak C ile birleştirilirse tüm rekabeti durdurur
  • Çok sayıda çerçeve var
  • Kodlamak çok kolaydır
  • Ayarlaması çok kolay
  • Çok performans
  • Çok güvenli
  • Çok iyi bir endüstri desteğine sahip
  • Çapraz platform var
  • Doğru yapıldığında fazladan VM / Altyapı / dağıtım karmaşasına gerek duymaz
  • Kolayca size bir iş inecek
  • Çok eski sistemlerde başlatmak için .so / .dll dosyasını kurmak için gerekli tüm bilgileri içerir.
  • Sorun gidermesi kolay
  • Çok pahalı
  • Çok dinamik
  • ve diğer ilginç şeyler

C ++ 'ın tek olumsuz tarafı biraz öğrenmek zorunda olman. Bu kadar.

Bunu, biri veya daha fazlası olan diğer dillerle karşılaştırın:

  • Dar destekli (OCML, Fortran, ...)
  • Yavaş (Java, Javascript)
  • Deneysel (Silverlight)
  • Hareketli bir hedef (.NET 1/2/3/4/5? Hangisi şimdi sonuncusu?)
  • Platform kilitli (.NET)
  • Yetersiz çerçeve desteğine sahip olmak (Fortran)
  • Küçük toplulukları var (ilk 10 dışında herhangi bir şey)
  • Sorun gidermek için kabuslar (Üst düzey aptal kavramlar ve diğer şeyler içeren herhangi bir şey)
  • Müşterilerin makinesinde 500 MB ön kurulum yapılması gerekiyor (JVM / .NETVM)

IMHO, ne kadar az dil kullanacağız ve destekleyeceksek, durum o kadar iyi olacaktır.

Bu, dil, destek, dokümantasyon, standardizasyon komitesi çalışmaları, daha iyi kitaplar, daha fazla bilgi, yazılımı desteklemesi daha kolay, daha iyi modeller, daha uzun dil desteği döngüleri ve dilde yazılmış daha fazla kod için çerçevelerde otomatik iyileştirmelere neden olur.

İnsanların bunu küçümseyeceğini biliyorum, ama gerçekten düşün.


71
C ++ "kodlaması çok kolay" gülünç yanlış, üzgünüm. Öğrenmesi inanılmaz derecede zor bir dildir ve modern C ++ deyimleri ve kaçınılmaz işaretçiler kullanıyor olsanız bile, onu almadan önce tonlarca şaşırtıcı derleyici ve çalışma zamanı hatalarıyla karşılaşırsınız. Ve ustalaştıktan sonra bile, sözdizimi oldukça sık karşılaşır. Güvenli C ++, genellikle büyük miktarlarda boyler kodunu üreten iç içe geçmiş şablon karmaşasını kullanır.
Konrad Rudolph

20
Çok etkileyici ve çok dinamik, dinamik dillerle karşılaştırıldığında tipik C ++ özellikleri gibi görünmüyor.
vartec

29
@gbjbaanb “öğrenmesi biraz daha zor”, bir kez daha saçma sapan bir işaret. Üzgünüm. Bütün bu dilleri yıllardır programlıyorum, açıkça C ++ 'ı tercih ediyorum (ve en ciddi programlamayı yapıyorum) ama bunun kolay olduğunu söyleyerek yanıltıcı olduğunu söyleyebilirim. Ve fantezi metaprogramlama işleri hakkında konuşmuyorum, değirmencilik kodu tarafından üretilen derleyici hatalarından bahsediyorum, ad gizleme, ADL, constdoğruluk sorunları ve bunun gibi şeyler. Etkin C ++ 'ı (Coder'ın iddia ettiği gibi) okumuş ve C ++' ın kolay olduğunu savunan herkesin zihinsel bir bağlantısı kesilir.
Konrad Rudolph

13
@gbjbaanb Ben bir C ++ programcısıyım. Bir kez daha, C ++ 'ın kolay olduğunu sanmıyorum. Ve bu yorum dizisi de C ++ sohbetinden frowns aldı. Yani o değil. Ve C ++ gotchas ve diğer dillerin gotchas'ları arasındaki fark, eğer onlar hakkında diğer dillerde bilmiyorsanız, muhtemelen iyi olacağınızdır. C ++ 'da kızarmışsın. Ve onlar hakkında bilgi sahibi olsanız bile , hala tek bir hata için derleme hataları için birkaç ekran sayfası alabilirsiniz (bugün yine başıma geldi). Hatanın düzeltilmesi basit (bir yazım hatası) olsa da, tüm bunları çözümlemek zaman alır.
Konrad Rudolph

6
Popüler bir dil ne zaman iyi oldu? PHP oldukça popülerdir ve hiçbir ciddi kişi, niş için bile "iyi" bir dil olduğunu düşünmez. Popüler dillerle ilgili tek "iyi" şey, belirli alan adlarının programlanmasını kolaylaştıracak çok sayıda kütüphane bulunmasıdır. C ++ 'ın kendisi hayal kırıklığıyla doludur.
weberc2

11

C / C ++ dişlerde oldukça uzundur .... bu iyi bir şey . Yeterince iyi tasarlandıklarını (ahem) hala çok kullanışlı olduklarını, birçok insanın bunları günlük işler için kullandığını ve kendilerinde uzman olan büyük bir geliştirici grubu bulacağınızı belirtir. Vade, değer verilmesi gereken bir şeydir.

Tüm zamanınızı yeni bir şey aramak için harcıyorsanız, sadece yeni ve bu nedenle bunun bir şekilde daha iyi olması gerektiğini düşündüğünüz için, çok fazla hayal kırıklığı içinde olacaksınız. Bu, yazılım dilleri, GUI sistemleri (not al, Microsoft ve Gnome) ve sevenler (not al, genç bayanlar :)) için geçerlidir.

Şimdi kuşkusuz, eğer C ++ deneyiminiz 20 yaşındaysa, C ++ kodu genel olarak C gibi kodlandığında, belki dili yeniden değerlendirmenin zamanı gelmiş, gün içinde hiç kullanılmamış olan tüm özellikler kullanılmıştır. bugün çok daha fazlası ve birkaç standardizasyon çalışması, dili eski C-tarzı gelişmelerden çok farklı kılmak için dili biraz genişletti. C de fena değil - birçok kodlama görevi için de mükemmel bir dil!


16
C ve C ++ 'nın Hoare’in yazılım tasarımı konusundaki yorumunu örneklediğini düşünüyorum: Ya da açıkça hiçbir eksiklik olmadığı için çok basit hale getirin ya da belirgin bir eksiklik olmadığı için çok karmaşık hale getirin.
TMN

1
Bir tür arabellek nedeniyle tekrarlanan güvenlik açıkları, bir dilin kaç yaşında veya yerleşik olduğuna bakılmaksızın "iyi bir şey" den nasıl yararlanır? Ve bu, tekrarlanan suiistimalden sonra kurulan evliliğin sürdürülmesini tartışmaktan gerçekten farklı mı?
user2864740

@ user2864740 önerdiğin şey boşanmak, çünkü karısı yaşlı ve yeni, heyecan verici bir model istiyorsan ... sahip olduğun şeylere bağlı kaldığını söylüyorum çünkü foibleri ve tuhaflıkları biliyorsun. Yeni, havalı, dillerden kaç tanesi arabellek taşması gibi sorunları çözüyor ve sonra taşan arabelleklerin ince yollarını buluyor? Öyleyse daha iyisi - tembel olmamak veya doğru yapıyı kullanmaktan kaçınabileceğiniz taşmaları mı yoksa bilmediğiniz için düştüğünüz taşmayı mı?
gbjbaanb

@gbjbaanb Hayır, bunu asla söylemedim. Durumların bağlamını iyileştirmemenin neden olduğu hasara özellikle benzetim yapıyordum . Genelde oldukça rasyoneliyim ve eğilimli konuların veya araçların "fanboi" seçimine yatkın değilim (bu sadece benim doğam). Ayrıca, C ve C ++ farklı dillerdir; Yine de ikisi de aynı örtü nedeniyle haklı. Ve bu ise sorun böyle ile.
user2864740

8

C ++ 'nın şu anki standardı 2011'de yayınlanan C ++ 11'dir . Dolayısıyla 20 yıllık bir standart değildir. Ve aralarında sayısız standartlar vardı. Her biri sayısız performans iyileştirmesi sunuyor.

Derleyiciler de sürekli gelişiyor. Optimizasyonda eskisinden çok daha iyiler.

Çalıştırılabilir formatlar da vardı 20 yıl önce geliştirdik a.out şimdi var, ELF .

Genel olarak, C ++ 'ın 20 yılda değişmediği gerçeği, gerçeğin ötesinde olamaz.

Ayrıca, C ve C ++ 'nın çok farklı diller olduğunu unutmayın.


2
Tahminime göre, 20 yıl önce ilk kez tasarlanan bir şey, ancak boş bir sayfa ile geliştirilebilecek içsel mimari sınırlamalara sahip olacaktı. Bu varsayımın yanlış olabileceğini düşünüyorum.
Jeremy French,

4
@JeremyFrench: x86 mimarisi gibi mi?
TMN

2
@TMN benim varsayımımı kanıtlayan ya da çürüten şey mi?
Jeremy French,

6
Orijinal x86 mimarisi, 8080 ile geriye dönük uyumluluk ve 68000 ve NS32032 ile rekabet edebilecek bir dizi özellik arasında kötü bir uzlaşma oldu. Bölünmüş bellek ("uzak" ve "yakın" işaretçilere sahip), yalnızca 4 genel amaçlı kayıt, değişken uzunluklu komut kodlaması, 50'den fazla JMP komutunun tadı, çok katlı üç durumlu bir sistem veri yolu ... Ve şimdi, bugün aynı temel tasarım her zamankinden daha güçlü, birçok "üstün" temiz kayrak tasarımı (Alpha, MIPS, PowerPC) onu değiştiremedi.
TMN

1
@ JeremyFrench hayır, varsayımınız yanlış değildi, en azından C ++ durumunda. C ++ 11 özellikleri kesinlikle faydalıdır; Ancak, bu noktada, bunlar saç yığını üzerinde daha fazla bok vardır. Modern dillerin özelliklerini oluşturmaya çalışırlar, ancak mevcut C ++ karmaşasıyla başa çıkmak için, istisnaları olmalı ve bu istisnaların istisnaları vb. Olacaktır.
weberc2

6

Bu dilin büyük bir uzmanı değilim, ancak OCaml'ın bakmak için ilginç bir seçenek olabileceğini düşünüyorum .

OCaml derlenmiş, işlevsel / nesne yönelimli bir dildir. C ++ ile performans karşılaştırması için bkz. C ++ vs OCaml: Ray tracer karşılaştırması . Tabii ki, bu çok özel bir örnek ve OCaml'ın performansını daha iyi hissetmek için daha kapsamlı testler yapılması gerekiyor.


Redüktör bu cevabın nasıl geliştirilebileceği konusunda bir ipucu verebilir mi? Teşekkürler.
Giorgio

3

Ürününüzün ne yapacağına bağlı. Performans gerçekten kritikse, o zaman tercih edilen dil hala FORTRAN'dır . Ayrıca Java'yı da ekarte etmedim - birçok yüksek hacimli finansal işlem uygulamasında kullanılır. Sorunlu alanınız yüksek eşzamanlılık gerektiriyorsa Erlang bir göz atmaya değer. Objective-C güzel, Apple ekosistemi dışında ne kadar iyi desteklendiğini bilmeme rağmen (derleyicilerin ve temel çalışma zamanlarının ötesinde). Haskell'in performansı hakkında da iyi şeyler duydum, ancak bunun mutlak performans mı yoksa sadece diğer fonksiyonel dillere göre mi performans olduğundan emin değilim.


2
baktığım her finans işi, Java değil, C / C ++ geliştiricileri istiyor. Java ile olan deneyimimden, size donanım yığınları atmadığınız sürece yüksek performans gösteren bir şey göremiyorum.
gbjbaanb

Wall Street'te ve ABD ile İngiltere'deki çeşitli yatırım bankalarında faaliyet gösteren pek çok Java ticaret sistemi vardır. Ayrıca Chicago Ticaret Borsası'nda oldukça yoğun kullanılıyor.
TMN

3

Projenizin performansa duyarlı olduğunu söylerken, kodun her satırını mı kastediyorsunuz? Veya normalde olduğu gibi, geri kalanı değirmen işletme kodunu sıradan çalıştırırken performans açısından daha küçük bir yüzde var mı?

Buna cevap verdikten sonra, projeniz için en büyük risk nedir: sonuçta çok yavaş ya da ilk etapta asla bitirememeniz?

Her ikisine de ikinci cevabı verdiğinizi varsayarsak, yerel interop'u destekleyen daha yüksek bir dilde geliştirmelisiniz (Python, Ruby,. Net Ailesi hepsinde buna sahip). İlk önce projeyi bitirin. Sonra profil, optimize, durulayın, tekrarlayın. Ancak bundan sonra, uygulamanızın seçim bölümünü yerel kodda yeniden yazmayı ve bu yerel kodu bitmiş ürününüze entegre etmeyi düşünün.


Bir kez Java olduğunda, çok yavaşsa onu kurtaramazsınız.
Kodlayıcı,

6
@Coder Java, seçtiğiniz dilde 'hasara yol açmanıza' izin veren bir FFI'ye (JNI) sahiptir. Bu yüzden arayüzleri iyi tasarladıysanız, bir Java uygulamasını sadece yerel bir uygulama ile değiştirebilirsiniz. Java platformu iyi düşünülmüş.
K.Steff,

1

Vala , Java ve C # 'ya benzer, yerel koda (veya tercih ederseniz C kaynak koduna) derlenir ve çok hızlıdır . Nesne yönelimli bitleri için GLib'i gerektirir ve Linux korsanları tarafından Linux korsanları için yazılmıştır, bu nedenle etki alanınız Windows ise çok iyi olmayabilir.


1

Objective-C modern, düz C ve C ++ 'ya alternatif derlenmiştir. Hem çöp toplama hem de deterministik bellek yönetimine sahiptir ve mesaj ileten OO çalışma zamanı performans için optimize edilmiştir.

GCC ve CLang aracılığıyla edinilebilir ve çeşitli platformlarda çalışan GNUStep ve Cocotron gibi uygulama kütüphaneleri vardır.

Yüksek performanslı bir iş yapıyorsanız, bunun UI yerine bu sayı sayısız veya başka bir bölme-fethetme işi olduğunu farz edeceğim, böylece UI'yi sizin için en kolay olan dilde yapabileceksiniz. örn. mini bir http sunucusu üzerinden HTML.


0

Hiç kullanmadım, fakat genel python sözdizimini korurken ve genel python sözdizimini korurken ve pitonların daha yüksek seviyeli yapılardan tam anlamıyla faydalanabilmenizi sağlayan, C tarzı ilkelleri kodunuzun performans açısından kritik kısımlarında kullanmanıza izin veren Cython'dan yemin ederim. başka her yerde zaman.

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.