it-swarm.asia

Neden C'den daha hızlı, "daha iyi" bir dil çıkmadı?

Bugün tüm yeni "modern" dillerle, C nasıl hala en hızlı ve "makineye en yakın" olarak müjdelenir? Gerçekten bir şeyler yapmak için tek bir doğru yol olduğuna inanmıyorum ve C çok uzun bir süredir var (60'lardan beri!). Yaklaşık 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 bellek ayırma gibi belirli görevlerle ilgilenip kütüphaneleri ve benzeri şeyleri kullandığını biliyorum. Sadece neden C için gerçek bir ikinci seçenek olmadýđýný soruyorum.

C o kadar mükemmel olabilir ki, bilgisayarı çalıştırmanın başka hiçbir yolu mümkün değildir (geliştirici-benimseme bir yana)?

DÜZENLEMEK Bak, C'yi veya en sevdiğiniz dil ne olursa olsun vurmaya çalışmıyorum. C'nin neden standart haline geldiğini ve diğer alternatiflerin neden hiç ortaya çıkmadığını ve C'nin sadece "kabul edildiğini" merak ediyorum.

149
Jason

C çok basit bir dildir ve bu yüzden uzun ömürlülüğü ile birlikte hızlı ve optimize edilmiştir. Ayrıca, gömülü ortamlar, mikroişlemciler vb.

Gerçekten basit ve hızlı bir dili yenmek zor. Böyle bir dil üzerinde geliştirilecek tek şey kullanılabilirliktir: benzer, genel kod oluşturmak için gereken zamanı azaltın ve soyutlamalarla modellemeyi kolaylaştırın.

C++ burada devreye giriyor. C++ C kadar hızlı olabilir. Şey, C++ çok daha karmaşık bir dildir, bu da kesinlikle verimliliği arttırdığı anlamına gelir; insanlar bunu nasıl kullanacaklarını bildiği sürece. C++ ve C artık değil neredeyse aynı dildir.

Şimdi, D bir adım daha yükseldi. Hızlı kod, isteğe bağlı çöp toplama vb. İçin aynı yetenek, ancak asla yakalanmadı. Umarım bu değişir, çünkü C++ ile hangi salgınları düşürür: C ile geriye dönük uyumluluk.

Bu yüzden sorunuzu cevaplamak için “daha ​​iyi” yargılamak zor bir şeydir. Basitlik ve hız açısından, C muhtemelen yapabileceğimiz en iyiye yakındır. Verimlilik ve basitlik açısından, C++ muhtemelen yapabileceğimiz en iyisidir, ancak bu görüş çok daha farklıdır. Son olarak, dışa vurulmuş ve temizlenmiş bir dil açısından, C'nin hızı ve basitliği ile D, bu bağlamı kazanır.

164
GManNickG

C dillerinden daha hızlıdır.

C'den daha hızlı diller vardır. Örneğin, daha önce de belirtildiği gibi Fortran çok iyi gidiyor çünkü çok daha kısıtlı takma dil kurallarına sahip.

Derleyici oluşturma gibi üst düzey bir dil olarak kullanıldığı ön tarafta C'ye saldıran diller gibi deneysel Meclis gibi var. Hiç C-- ya da Janus'u duydun mu? Ancak bu ikisi LLVM projesi tarafından öldürüldü.

APL veya diğer matematiksel dillerin, Vektör işleme birimleri için destek oluşturdukları için özel uygulama alanlarında C'yi sudan çıkaracağına bahse girerim. Bu C için mümkün olmayan bir şeydir (ve çocuklar: HAYIR! C bağlantısı olan özel optimize edilmiş kitaplıkların C ile dil olarak bir ilgisi yoktur).

Ayrıca CPU üreticileri diğer dillerde derleyici yazarlarına yardımcı olan her şeyi kaldırdı - SPARC hızlı? Rüzgarda gitti) LISP uygulamasını yapmak için etiketli aritmetik montajcı kodlarını unutmayın.

Ve mikro ölçütlerden uygulama geliştirmeye geçerseniz, uygulama geliştirme için daha hızlı diller vardır. Buradaki kişisel örneğim her zaman SmartEiffel. C'yi hedefler ancak gerçek dünya uygulama geliştirmede C'den daha hızlı hale getiren global sistem optimizasyonunu kullanır.

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

Bir megabyte ints dizisindeki qsort çağrısını, dizi erişimi ve yerleşik '<' operatörünü kullanan iyi elle yazılmış bir uygulama ile karşılaştırın.

64
Lothar

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

  • C bir zamanlar uygulama dili olarak yaygın bir şekilde kullanıldı ve bu alanda C++, Java ve son zamanlarda her türlü diğer dili (özellikle dinamik diller) kaybetti.

  • C, sunucu kodu yazmak için kullanılan bir dildi. Web, Perl, Java, Python, VBScript, VB.NET, Ruby, C # - ve C'nin sunucu kodu için her türlü anlam ifade ettiği durumlar arasında çok çeşitli dilleri bu alana itti.

  • C bilimsel hesaplama için kullanılmıştır, ancak Matlab ve Mathematica gibi alana özgü diller ile SciPy gibi kütüphanelerle rekabet etmektedir. Bu nişte kod yazan bir çok insan ticaret tarafından kodlayıcı değildir ve C onlar için çok uygun değildir.

Ancak C'nin niş sistem kodu. İşletim sistemi çekirdekleri. Sürücüler. Çalışma zamanı kitaplıkları. O alanda o kadar kurulmuş ki, C++ bile onu yavaşça değiştiriyor.

C, 1970'lerde UNIX nedeniyle geri döndü, çünkü rakip diller çok kısıtlayıcı veya çok yavaştı ve C kodu makul derecede taşınabilir (o zaman bile yalan) olarak kabul edildi. Ancak bugünün en büyük avantajları ilgisiz ve esas olarak onlarca yıllık nişine hakim olmasından kaynaklanıyor. C için iyi araçlar vardır: derleyicileri optimize etmek, çekirdek hata ayıklayıcıları, sürücü kodundaki hataları bulmak için etkili statik analiz vb. Hemen hemen her büyük platform bir C ABI'yi tanımlar ve genellikle kütüphaneler için lingua franca'dır. C kodunu bilen ve C'nin sorunlarının ve tuzaklarının ne olduğunu bilen bir programcı havuzu var.

Uzun vadede, bu niş gitmiyor; ve C'nin bazı sorunları var. Ancak yeni gelenlerin rekabet etmesi hala çok zor olacaktır.

35
Jason Orendorff

Çok iyi bir yorum yazarak: Bir dili hızlı ve "makineye yakın" yapmak için pek çok farklı yol yoktur - C iyi yaptı ve bunu geliştirmek için neredeyse hiç yer yok.

Orijinal cevap:

Çalıştırmak hızlı mı, hızlı yazmak mı?

Diller hızlı veya yavaş değildir yürütmek, özel uygulamalar vardır. Bir dil, bir şekilde hızlı uygulamalar almayı kolaylaştırdığı zaman diğerlerinden daha hızlı olarak düşünülebilir. Bu her zaman "makineye yakın" anlamına gelir. Ancak makineler katlanarak daha hızlı hale geldiğinde, bu zamanla giderek daha az ilginç 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 geldi. Dil tasarımındaki hemen hemen tüm çabalar son 5 yıldır bu yönde ilerlemiştir.

Demek ki: makineye daha yakın ve C'den daha hızlı diller mevcut; onlar C'den önce gelenler: Assembler, Fortran. Muhtemelen unutulmuş olanlar.

25

Fortran, bellek referanslarını işleme biçimi nedeniyle sayısal görevler için C'den daha hızlıdır (C işaretleyicilerini optimize etmek daha zordur). Matlab ve Numpy gibi şeylerin temelindeki ağır sayısal kütüphaneler Fortran'da hala yazılmıştır.

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

21
zaharpopov

Ne halt, ben 0.02 $ ile chime.

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

C, bir sistem dili olarak tasarlanmıştır, yani Unix işletim sisteminin yazıldığı dil olarak tasarlanmıştır. Bu nedenle, basit, güçlü ve hızlı olacak şekilde tasarlanmıştır. Basit bir dil, sistem dışı programcıların genellikle tehlikeli olduğunu düşündükleri yoluyla 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 Cep Referansları hariç) ve benim Ruby Cep Referansı. C oldukça güçlü. donanım ile konuşmak, manuel olarak kontrol etmek ve bellekle değiştirmek vb. C yeteneğine sahiptir.

Bununla birlikte, bir programcının bakış açısından, C o kadar basit değildir. Hız ve güç, manuel bellek yönetimi pahasına gelir ve çok fazla OOP destek dili yerleşiktir. C++ (en sevdiğim dil değil) bir programcının bakış açısından çok daha basit, ancak çok daha az basit Objective-C (muhtemelen en sevdiğim dil), aynı basitliğe sahip, dili basit tutma yönünde hafif eğik (çöp toplama, örneğin Objective-C için yeni gelen bir şey). çoğumuzun C dilinde yazıldığını bildiğimiz için, daha yeni, daha karmaşık ama "daha kolay" dillerin yaygın olarak benimsenmesi zordur.

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

16
alesplin