Neden C'den daha hızlı, “daha ​​iyi” bir dil bilmiyor? [kapalı]


147

Bugün tüm yeni "modern" dillerle, C'nin hala en hızlı ve "makineye en yakın" olarak müjdelediği nasıl? İşlerin yapılması için tek bir doğru yol olduğuna gerçekten inanmıyorum ve C çok uzun zamandır (60'lardan beri!). Neredeyse 50 yıl önce yazılmış bir şeyden daha iyi bir şey bulamadık mı?

Modern dillerin daha üst düzeyde olduğunu ve çöp toplama ve hafıza ayırma gibi bazı görevlerin yerine getirildiğini ve kütüphanelerden yararlandığını biliyorum. Sadece neden C için ikinci bir gerçek seçenek olmadığını soruyorum.

C o kadar mükemmel olabilir ki, bilgisayarı kullanmanın başka hiçbir yolu mümkün olamaz (geliştirici benimseme).

EDIT Bak, C'yi ya da en sevdiğin dil ne olursa olsun vurmaya çalışmıyorum. C'nin neden standart hale geldiğini ve diğer alternatiflerin neden hiç ortaya çıkmadığını ve C'nin sadece "kabul edildiğini" merak ediyorum.


44
C ++ yazmak kadar hızlı ve daha verimli. <3
GManNickG

6
c ++ 'ı unutmadın mı?

23
Montajın makineye en hızlı ve "en yakın" olduğunu iddia ediyorum.

27
neden tüm hareketler kapanmalı? gerçekten merak ediyorum ... alev savaşları falan başlatmaya çalışmıyorum
Jason

15
tekrar kapandı mı? jeff atwood'un kendisi tarafından yeniden açıldıktan sonra? neden bunu kapatmak istiyorsun?
Jason

Yanıtlar:


164

C çok basit bir dil ve bunun nedeni uzun ömürlülüğü ile birlikte hızlı ve optimize edilmiş bir dil. Ayrıca, gömülü ortamlar, mikroişlemciler vb. İle ilgili olarak olağanüstü derecede yaygın olarak desteklenir.

Gerçekten basit ve hızlı bir dili geçmek zor. Bunun gibi bir dilde gelişecek tek şey kullanılabilirlik: benzer, genel kod yapmak için harcanan zamanı kısaltmak ve soyutlamalar ile modellemeyi kolaylaştırmak.

C ++ 'ın geldiği yer burasıdır. C ++ C kadar hızlı olabilir. Mesele şu ki, C ++ çok daha karmaşık bir dildir, yani kesinlikle verimliliği arttırır; insanlar nasıl kullanılacağını bildiği sürece. C ++ ve C artık neredeyse aynı dil değil.

Şimdi, D başka bir adımdı. Hızlı kod, isteğe bağlı çöp toplama, vb. İçin aynı yetenek, ancak hiçbir zaman yakalanmadı. Umarım bu değişir, çünkü C ++ 'ı rahatsız eden şey düşer: C ile geriye doğru uyumluluk

Bu yüzden sorunuzu cevaplamak için "daha iyi", yargılaması zor bir şey. Basitlik ve hız açısından, C muhtemelen yapabileceğimizin en iyisine yakındır. Verimlilik ve sadeliğe göre, C ++ muhtemelen yapabileceğimiz en iyisidir, ancak bu fikir çok daha farklıdır. Son olarak, etli ve temizlenmiş bir dil açısından, C'nin hızı ve sadeliği ile, D bu bağlamı kazanıyor.


31
"Basit" ile "POV programlayıcılarından değil, derleyici POV'dan basit" demek istediniz. C basittir çünkü temelde ifadeler ve ifadelerle birleştirilmiştir. Python basit bir şekilde basit değil.
Marius

15
Ancak açıklığa kavuşturmak için, derleyicinin basitleştirilmesi, basit bir işlem yapması anlamına gelir. Belki de karmaşık fikirlerin uygulanması basit değildir.
GManNickG

16
Bunun için OCaml, C ve C ++ kadar hızlı bir şekilde optimize edilmiş yerel kod üretir ve kodun kendisi Python kadar kısa. Biraz cilada, OCaml'in maksimum hız ve minimum bellek alanı için kod yazmanız gerektiğinde C'yi istediğiniz dil olarak eşleştirebileceğini veya yenebileceğini düşünüyorum. Objective-C aynı zamanda oldukça iyi bir iş çıkarsa da, her zaman C kadar hızlı olmasa da, bütün "C cisimleriyle" olan şeyi C ++ 'in asla ve asla yapamayacağı şekilde alır.
Juliet

2
@ Thorbjørn ile anlaşmaya varıldı, C ile geriye dönük uyumluluk, C ++ 'ı yakalayıp D'nin bulamamasının nedeni. Eğer bunlardan vazgeçmeye istekliysek, D'deki artan iyileştirmelere razı olmak için hiçbir neden yoktur. Tamamen C ailesinin dışında kalan daha iyi dillere gidebiliriz. @Juliet'in dediği gibi, OCaml performans açısından uygun bir rakip olabilir. Fakat eğer derleyici yazarları, C veya C ++ 'da olduğu kadar çok zaman geçirmiş olsalardı, başka birçok dilde olabilir. Neyse, iyi cevap ve benden + 1.
jalf,

5
@Frucruccio: Evet, ancak her dil C kütüphanelerine bağlanabilir. Öyleyse, çözüme razı olmak istiyorsak, C ++ (az ya da çok) teklifleri gibi gerçek kaynak kodu uyumluluğu yerine, tamamen farklı bir dil seçebiliriz, örneğin Haskell veya Python. C ++ 'nın yakalanmasının nedeni , C kütüphanelerine bağlanabileceği değildi . O olabilir oldu derlemek C kodu.
jalf,

64

C dilden daha hızlılar.

C'den daha hızlı diller var. Örneğin, daha önce de belirtildiği gibi Fortran çok iyi yapıyor çünkü çok daha sınırlı takma dil kuralları var.

Örneğin, derleyici oluşturma gibi üst düzey bir toplama dili olarak kullanıldığı ön tarafta C'ye saldıran diller gibi deneysel düzenekler de vardır. C ya da Janus'u hiç duydun mu? Ancak bu ikisi LLVM projesi tarafından öldürüldü.

APL veya diğer matematiksel dillerin, Vector işlem birimlerini desteklemek için oluşturdukları özel uygulama alanlarında C'yi sudan dışarı atacağına bahse girerim. Bu, C için mümkün olmayan bir şeydir (ve çocuklar: HAYIR! C bağlantısı olan özel optimize edilmiş kütüphanelerin, bir dil olarak C ile ilgisi yoktur).

Ayrıca CPU üreticileri, derleyici yazarlara diğer dillerde yardımcı olan her şeyi kaldırdılar - LISP uygulamasının SPARC'da hızlı bir şekilde uygulanmasını sağlayan etiketli aritmetik montaj kodlarını hatırlıyor musunuz? Rüzgar gibi Geçti gitti.

Ve mikro karşılaştırma ölçütlerinden uygulama geliştirmeye geçerseniz, uygulama geliştirmenin daha hızlı dilleri vardır. Buradaki kişisel örneğim daima SmartEiffel. C'yi hedef alır, ancak gerçek dünya uygulama geliştirmesinde C'den daha hızlı yapan küresel sistem optimizasyonunu kullanır.

Bu alanda bile basit bir yanlış veya düşük seviye soyutlamalar bile tüm dil performansını düşürebilir. C, yüksek soyutlamalar sunmadığından çoğu insan bir programlama problemi olduğunu söylüyor ama değil. Örneğin, jenerikliğin eksikliğine bakın. C'de, jeneriklerle daha hızlı bir şekilde yazılabilen "qsort" kütüphane işlevi gibi yavaş uygulamalar ortaya çıkar (burada anahtar karşılaştırmalar için fonksiyon çağrısının ortadan kaldırıldığı).

Bir qsort çağrısını, megabayt bir dizi dizisinde, dizi erişimini ve yerleşik '<' operatörünü kullanan iyi bir el yazısı uygulamasıyla karşılaştırın.


9
Çok iyi yorum. C dili belirtiminin bazı yönlerinin (işaretçi takma kuralları gibi) gerçekten en uygun makine kodunu oluşturmayı imkansız kıldığını anlamak önemlidir. Üst düzey bir montajcı olan C "en hızlı" değil, sadece "oldukça hızlı".

1
Teşekkürler, birden fazla sonuç değeri döndürmenin olanaksızlığından bahsetmeyi unuttum. Başka bir düşük seviye özelliği, yüksek seviye montajcı olarak kullanırken çok özlüyorum.

5
Düzgün bir şekilde yazılmış olan Modern C, derleyicinin aynı optimizasyonları yapmasına izin vererek, diğer takma varsayımları diğer dillerle aynı şekilde kodlayabilir. Dilin önemli bir özelliği, programcının uygulanabilir olmadığında bu gereklilikleri yerine getirmemesini sağlamasıdır. Diğer puanlarınız açık, yani +1.
Stephen Canon,

1
@Rascher: Bu doğru ve orada her zaman bir CPU ABI belirten CPU tasarımcıları üzerinde C'nin etkisini görüyorsunuz. Ve birden fazla geri dönüş değeri, kayıt sayısı bir sorun olmasa bile akla gelmeyen bir şeydir (SPARC, PowerPC, Itanium)

13
C'deki işaretçi diğer adı restrictC99'da (10 yıl önce!) Ele alınmıştır .

35

İyi soru. Bence diller bir niş bularak başarılı. Kendi nişlerinde C'den daha iyi olan birçok yeni dil olduğunu unutmamak önemlidir.

  • C bir zamanlar bir uygulama dili olarak yaygın bir şekilde kullanılıyordu ve bu alanda C ++, Java ve son zamanlarda diğer tüm dilleri (özellikle de dinamik dilleri) kaybediyordu.

  • C sunucu kodunu yazmak için kullanılan bir dildi. Web, bu alana şaşırtıcı bir şekilde çeşitli diller koydu - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - ve C'nin sunucu kodu için her türlü anlam ifade ettiği durumlar şimdi çok azdı.

  • C bilimsel bilgi işlem için kullanılmıştır, ancak Matlab ve Mathematica gibi etki alanına özgü dillerin yanı sıra SciPy gibi kütüphanelerdeki rekabetle de karşı karşıyadır . Bu nişin içine kod yazan birçok insan ticaretle kodlayıcı değildir ve C onlar için uygun değildir.

Fakat C'nin nişi sistem kodudur. İşletim sistemi çekirdekleri Sürücüler. Çalışma zamanı kütüphaneleri. O alanda kurulur, C ++ bile yavaş yavaş yer değiştirir.

UNIX yüzünden 1970'lerde C kazandı, rakip diller ya çok kısıtlayıcı ya da yavaştı, ve C kodu makul derecede taşınabilir olarak görüldüğü için (o zaman bile yalanlar). Ancak günümüzde en büyük avantajları alakasızdır ve esasen onlarca nişine hakim olmaktan kaynaklanmaktadır. C için iyi araçlar var: derleyicileri optimize etmek, çekirdek hata ayıklayıcıları, sürücü kodunda hata bulmak için etkili statik analizler, vb. Neredeyse her büyük platform bir C ABI tanımlar ve çoğu zaman kütüphaneler için lingua franca'dır. C'yi nasıl kodlayacağını ve C'nin problemlerinin ve tuzaklarının ne olduğunu bilen bir programcı havuzu var.

Uzun vadeli, bu niş uzağa gitmiyor; ve C'nin bazı problemleri var. Ancak, yeni gelen herkes için rekabet etmek son derece zor olacaktır.


9
C, sunucu kodu için hala yaygın olarak kullanılıyor. Sadece Web değil, çoğu DNS, e-posta vb. Sunucular C dilinde yazılmıştır. Web için bile, Apache

@bortzmeyer: Apache olsa oldukça eski. Faydalı olmadığını veya büyütüldüğünü söylemiyorum, sadece C olduğu zaman yaratıldı ve çok fazla alternatif yoktu.
Macke

1
Bilimsel hesaplama için neden C'yi "uygun değil" olarak düşündüğünüzü merak ediyorum. Python kuşkusuz çalışmak için daha zevkli, ancak daha hızlı kod gerektiğinde C'nin sağlam bir alternatif olduğunu ve programlamanın diğer yönlerinden farklı olarak birçok alternatifin (C ++) masaya çok fazla getirmediğini gördüm. .
Fomite

1
Bunun ötesinde, C ile yazılmış SciPy / NumPy vb. Öğelerin miktarı zaten bunu bilmeyi faydalı kılar.
Fomite

1
@EpiGrad Belki C sizin için sağlam bir alternatiftir. Fakat C, özellikle kodlama konusunda bilgisi olmayan insanlar için oldukça dik bir öğrenme eğrisi vardır. Özellikle, bazen çöker ve eğer bir kodlayıcı değilseniz, onu çözme umudunuz yoktur. Mathematica, çok sayıda şeyi yazmayı kolaylaştırır ve yüzlerce faktöre göre daha az kodla sonuçlanır. Ve çökmez.
Jason Orendorff

25

Çok iyi bir yorumdan alıntı yapmak: Bir dili hızlı ve "makineye yakın" hale getirmenin pek çok farklı yolu yoktur - C bunu iyi yaptı ve bunu geliştirmek için neredeyse hiç yer yoktu.

Orijinal cevap:

Uygulaması hızlı mı yoksa hızlı şeyler yazmak mı?

Dillerin uygulanması hızlı veya yavaş değildir , özel uygulamalardır. Bir dilekçe, yalnızca bir şekilde hızlı bir şekilde uygulanmasını kolaylaştırdığı için diğerlerinden daha hızlı olduğu düşünülebilir . Her zaman, "makineye yakın" anlamına gelir. Ancak makineler katlanarak hızlanırken, bu zaman içinde giderek daha az ilgi çekici hale geldi. Bunun yerine, geliştirme ve taşınabilirliğin kolaylığı ve hızı çok daha önemli hale geldi, bu yüzden “daha ​​iyi”, “makineden uzakta” ​​anlamına geliyor . Son 5 yılda dil tasarımındaki tüm çabalar bu yöne gitti.

Yani işte buradasınız: makineye daha yakın ve C'den daha hızlı diller; onlar konum C önce gelenlerin Assembler, Fortran:. Muhtemelen bazıları unutulmuş olanları.


@michael - ama hala süper-yalın, süper-hızlı programlama için bir pazar var, özellikle de tüm bu mobil cihazların saldırısı ile ... C neden bu cihazların bazıları için hala en iyi seçenek? düzey düzeyinde, .NET-vs-Python-esque gibi mi?
Jason

5
Lisp. Uykulu ama unutulmuş değil! :)

2
@ Jason: Soru şu, kaç tane taşınabilir montajcıya ihtiyacınız var? C iyi bilinmektedir ve daha hızlı bir uygulamayla bir dil yazmak çok zor, öyleyse neden rahatsız ediyorsun? Takım-konuşmada gerek yok, pazar yok, motivasyon yok.

4
@ Michael, cevabınızı yorumladığınız için özür dilerim. Python / ruby ​​/ java etc bölgesinde daha fazla olmasının nedeni, mümkün olan en verimli dili denemeyi bıraktığınızda, hangi özelliklerin önceliklendirileceğine ilişkin daha fazla seçenek elde etmeniz ve her yaklaşımın yeni bir dil vermesidir. Mümkün olan en hızlı dili yazmanın çok daha az yolu var.

1
-1 için "ve buna göre daha fazla yer yok" - performansı etkilemeden C / C ++ 'da geliştirilecek çok yer var .
BlueRaja - Danny Pflughoeft

21

Fortran, hafıza referanslarını işleme biçiminden dolayı sayısal görevler için C'den daha hızlıdır (C işaretçilerinin optimize edilmesi daha zordur). Matlab ve Numpy gibi şeylerin temelindeki ağır sayısal kütüphaneler hala Fortran'da yazılmıştır.

Öte yandan, C ++ C kadar hızlı olabilir, ancak daha gelişmiş programlama özelliklerine sahiptir. 80'lerin ortalarından çok daha yeni bir dil.


1
Ve C ++ hala güncellenmektedir.
GManNickG

5
@GMan: C de


3
Eğer hatalıysam düzelt, ama bir C99 restrictpointer aynı takma semantiklere sahip olmaz mıydı Fortran? Ve fark yaratan başka ne var?

9
Bence Fortran’ın C’den daha hızlı olduğu fikri, neyin kodlandığına ve kimin yaptığına bağlı olarak bir efsanedir. Ağır nümerik kütüphanelerin Fortran'da bulunmasının sebebi Fortran'ın daha hızlı olmasından değil, rutinlerin Fortran'da ilk olarak kodlanmış olmasından ve az sayıda kişinin de siniri olması veya yeniden yazması gerekmesidir. Bu algoritmaları yazan ve inceleyen az sayıdaki matematik gurusu Fortran'da mutlular ve özellikle Fortran'ın daha hızlı olduğunu düşündükleri için değişmeye gerek yok.
Mike Dunlavey,

16

Ne halt edersem, 0.02 dolarımı alırım.

Birçok durumda, "sistemler" dilleri ve üst seviye diller arasında gerçek veya algılanan bir fark vardır. "Üst düzey" dillerin çoğunu görmezden geleceğim, çünkü hiç kimse (en azından pek değil) birçok görev için Python, Ruby, vb. Dillerin çalışmasının daha kolay olduğunu iddia edemez.

C bir sistem dili olacak şekilde tasarlandı, yani Unix işletim sisteminin yazıldığı dil olarak tasarlandı. Bu nedenle basit, güçlü ve hızlı olacak şekilde tasarlandı. Basit bir dil, sistem dışı programcıların sıklıkla tehlikeli gördüğü yollarla güç kazanır: işaretçiler, manuel bellek yönetimi vb. Daha önce de belirtildiği gibi, C oldukça basittir. K&R, programlama rafımdaki en küçük kitap (O'Reilly Pocket Referanslarını saymıyor) ve Ruby Cep Referansımdan yalnızca marjinal olarak "daha büyük". C oldukça güçlü. Donanımla konuşmanız gerekiyorsa, manuel olarak kontrol edin ve hafızayla vb. Değiştirin. C kabiliyetine sahiptir.

Bununla birlikte, bir programcının bakış açısından, C o kadar basit değildir. Hız ve güç, manüel bellek yönetimi ve dilde yerleşik pek fazla OOP desteği pahasına değil. C ++ (en sevdiğim dil değil) bir programcının bakış açısından çok daha basit, derleyici açısından daha az basit. Objective-C (belki de en sevdiğim dil) aynı tradeofere sahip, dili basit tutmak yönünde hafifçe eğilmek (çöp toplama, örneğin Objective-C'nin yenisidir). Ancak, bilgisayar dünyasının çoğumuzun C dilinde yazıldığını bildiğinden, daha yeni, daha karmaşık ama "daha kolay" dillerin yaygın olarak benimsenmesini sağlamak zordur.

Bazı durumlarda, özellikle mevcut "standart", C kadar "yeterince iyi" olduğunda, sadece "daha iyi" bir şey (C ++, Objective-C, D vb.) İçin çekiş kazanması için çok fazla teşvik yoktur. "daha iyi" bir şey yaratmak için bile yeterli teşviktir.

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.