Derleyicisi C ile yazılmış bir dil C'den daha hızlı nasıl olabilir?


175

Julia'nın web sitesine bakıldığında, birkaç algoritmanın karşısındaki bazı dillerin bazı ölçütlerini görebilirsiniz (aşağıda gösterilen zamanlamalar). İlk olarak C dilinde yazılmış bir derleyici içeren bir dil, C kodundan daha iyi nasıl olabilir?

görüntü tanımını buraya girin Şekil: C'ye göre kıyaslama süreleri (daha küçük daha iyidir, C performansı = 1.0).



382
İnsan yapımı bir nesne olan bir araba bir insandan daha hızlı nasıl hareket eder?
babou

19
Tabloya göre, Python C'den daha yavaştır. Python'da en sevdiğiniz C derleyicisiyle aynı kodu üreten bir C derleyicisi yazmanın imkansız olduğunu düşünüyor musunuz? Peki hangi dilde yazılmış?
Carsten S

6
babou'nun yorumu dikkat çekiciydi ama aynı versiyonun birden fazla versiyonuna ihtiyacımız olduğunu sanmıyorum.
Raphael

14
İlgili bir düşünce. Pek çok derleyici kendi kendini barındırır , yani kendi dillerinde yazılır (genellikle bazı montajlar) ve önceki sürümüyle derlenir. Ancak derleyiciler daha iyi ve daha hızlı olsun. Zihin darbesi .
Schwern,

Yanıtlar:


263

Derleyicinin uygulanması ile derleyicinin çıktısı arasında gerekli bir ilişki yoktur. Sen en yaygın uygulamaları çok yavaş Python veya Ruby gibi bir dilde bir derleyici yazabilirsiniz ve bu derleyici çıkışı yüksek çünkü çalıştırmak için uzun zaman alacağını C'yi derleyici kendisini daha iyi performans gösterme yeteneğine makine kodunu optimize olabilir onunkodu yavaş bir dilde yazılmış. (Daha kesin olmak gerekirse, yavaş uygulamalı bir dilde yazılmış. Raphael'in bir yorumunda işaret ettiği gibi diller gerçekten hızlı ya da yavaş değil. Bu düşünceyi aşağıda genişletiyorum.) Derlenmiş program en kısa sürede olacaktır. kendi uygulamasına izin verildi - Python'da bir Fortran derleyicisiyle aynı makine kodunu üreten bir derleyici yazabiliriz ve derlenen programlarımız, derlemeleri uzun zaman alacak olsalar bile Fortran kadar hızlı olurlar.

Tercüman hakkında konuşursak bu farklı bir hikaye. Tercümanlar, yorumladıkları program devam ederken çalışmalıdır, bu nedenle tercümanın uygulandığı dil ile yorumlanan kodun performansı arasında bir bağlantı vardır. Tercümanın uygulandığı dilden daha hızlı çalışan bir tercüman dili yapmak biraz akıllıca bir çalışma zamanı optimizasyonu gerektirir ve son performans bir kod parçasının bu tür bir optimizasyona ne kadar uygun olduğuna bağlı olabilir. Java ve C # gibi birçok dil, tercümanların yararlarından bazılarını derleyicilerin yararlarından bazılarıyla birleştiren karma bir modelle çalışma zamanlarını kullanır.

Somut bir örnek olarak, Python'a daha yakından bakalım. Python'un çeşitli uygulamaları var. En yaygın olanı, C ile yazılmış bir bytecode tercümanı olan CPython'dur. Ayrıca Python'un RPython adlı özel bir lehçesinde yazılmış ve JVM'ye benzer bir hibrit derleme modeli kullanan PyPy de vardır. PyPy, çoğu kriterde CPython'dan çok daha hızlı; çalışma zamanında kodu optimize etmek için her türlü şaşırtıcı püf noktaları kullanır. Ancak, PyPy'nin çalıştığı Python dili, CPython'un çalıştırdığı aynı Python dilidir ve performansı etkilemeyen birkaç farklılığı engellemektedir.

Fortran için Python dilinde bir derleyici yazdığımızı varsayalım. Derleyicimiz GFortran ile aynı makine kodunu üretmektedir. Şimdi bir Fortran programı derliyoruz. Derleyicimizi CPython'un üzerinde çalıştırabiliriz ya da PyPy'de çalıştırabiliriz, çünkü Python'da yazılmıştır ve bu uygulamaların her ikisi de aynı Python dilinde çalışır. Derlememizi CPython'da çalıştırıp PyPy'de çalıştırıp, aynı Fortran kaynağını GFortran ile derlersek, derhal üç kere aynı makine kodunu alacağız, böylece derlenen program her zaman çalışacaktır. yaklaşık aynı hızla. Ancak, bu derlenmiş programın üretilmesi için geçen süre farklı olacaktır. CPython'un PyPy'den daha uzun sürmesi ve PyPy'nin en sonunda GFortran'dan daha uzun sürmesi bekleniyor.

Julia web sitesinin kıyaslama tablosunu taradıktan sonra, tercümanlar (Python, R, Matlab / Octave, Javascript) 'te çalışan dillerden hiçbirinin C'yi dövdüğü herhangi bir kıyaslama yapmamış gibi görünüyor. Bu, genellikle görmeyi beklediğimle uyumlu. Yine de Python'un son derece optimize edilmiş Numpy kütüphanesiyle (C ve Fortran'da yazılmış) yazılmış kodun, benzer kodun bazı olası C uygulamalarını attığını hayal edebiliyorum. C'ye eşit veya daha iyi olan diller derlenmektedir (Fortran, Julia ) veya kısmi derlemeli bir hibrid model (Java ve muhtemelen LuaJIT) kullanıyor. PyPy aynı zamanda hibrit bir model kullanmaktadır, bu yüzden tamamen Pyyton kodunu PyPy'de aynı Python kodunu kullanırsak, bazı kriterlerde C yendiğini görmemiz tamamen mümkün.


9
Bu inanılmaz bir cevap. Çok açık, anlaşılır ve bilgilendirici. Zaman ayırdığınız için çok teşekkür ederiz!
Alex A.

7
Hem javascript hem de java, bir JIT derleyicisiyle çalıştırılıyor, ancak java, C'den daha hızlı olan bir sınava sahip. Bir çalışma zamanı / derleyicinin daha hızlı çalışmasının en büyük nedeni, daha fazla bilgiye sahip olmaktan kaynaklanıyor. C / C ++ derleyicileri kodu (genellikle) çok daha fazla optimize edebilir, çünkü derleyici tarafından daha fazla bilgiye sahip olunması nedeniyle, el ile derleme yazan bir kişi. Elbette, teoride kişi daha iyi bir montaj kodu yazabiliyordu, ancak bu çoğu insanın sahip olduğu daha fazla bilgi ve beceri gerektiriyor. JIT dilleri bu konuda daha da genişleyebilir, üzerinde çalıştığı makine için optimize edebiliyor
Programmdude

Derleyicinin yaptığı optimizasyonlar dikkate alınması gereken önemli bir şeydir. Gerçekten akıllı bir derleyici, programın sentetik bir kriter olduğunu anlayacak ve sadece tüm kodları en iyi duruma getirerek, yalnızca beklenen çıktıları oluşturacaktır.
ghellquist

@ghellquist Eğer değerlendirme yeterince yapaysa ve derleyici yeterince akıllıysa emin olun. Bu derleyicinin uygulama diliyle doğrudan veya doğrudan ilişkili değildir, bu yüzden burada belirtmedim.
tsleyson

97

Bir erkeğin ürettiği bir makine bir erkekten nasıl daha güçlü olabilir? Bu tamamen aynı soru.

Cevap, derleyicinin çıktısının, onu uygulamak için kullanılan dil üzerine değil, derleyici tarafından uygulanan algoritmalara dayanmasıdır. Çok verimli kod üreten çok yavaş, verimsiz bir derleyici yazabilirsiniz. Derleyici hakkında özel bir şey yok: bu sadece girdi alan ve çıktı üreten bir program.


33
Bir satranç programı onu yazan insanı nasıl yenebilir?
Thorbjørn Ravn Andersen

25
Daha iyi hamleler yaparak! <rimshot>
Tony Ennis

Penn Gilette'in bir bilgisayarın satrançta bir adamı yenebilmesinin neden önemli olmadığı konusundaki cevabını söylemek: "GE tarafından tasarlanan bir robotun boks maçında bir adama kaybedeceğini mi düşünüyorsun?"
Dave Kanter

90

Bence bir iş için araçları seçerken zararlı olma noktasına yanıltıcı olan ortak bir varsayıma karşı bir noktaya değinmek istiyorum.

Yavaş veya hızlı bir dil diye bir şey yoktur. ¹

İşlemciye aslında bir şeyler yaparken yolumuz üzerinde birçok adım vardır².

  1. Belirli becerilere sahip en az bir programcı.
  2. Programladıkları (resmi) dil ("kaynak kod").
  3. Kullandıkları kütüphaneler.
  4. Kaynak kodunu makine koduna çeviren bir şey (derleyiciler, tercümanlar).
  5. Genel donanım mimarisi, örneğin işlem birimi sayısı ve bellek hiyerarşisinin düzeni.
  6. Donanımı yöneten işletim sistemi.
  7. İşlemci optimizasyonları.

Her bir öğe , bazen yoğun bir şekilde ölçebileceğiniz gerçek çalışma zamanına katkıda bulunur. Farklı "diller" farklı şeylere odaklanır³.

Sadece bazı örnekler vermek için.

  • 1'e karşı 2-4 : ortalama bir C programcısının, hem doğruluk hem de verimlilik açısından, ortalama bir Java programlayıcısından çok daha kötü kod üretmesi muhtemeldir. Bunun nedeni, programcının C'de daha fazla sorumluluk sahibi olmasıdır .

  • 1/4 vs 7 : C gibi düşük seviyeli bir dilde, programcı olarak belirli CPU özelliklerinden yararlanabilirsiniz . Daha yüksek seviyeli dillerde, sadece derleyici / tercüman bunu yapabilir ve sadece hedef CPU'yu bilirlerse yapabilir .

  • 1/4 vs 5 : eldeki bellek mimarisini en iyi şekilde kullanmak için bellek yerleşimini kontrol etmek ister misiniz? Bazı diller bunu kontrol etmenizi sağlar, bazıları vermez.

  • 2/4 vs 3 : Yorumlanan Python'un kendisi çok yavaştır, ancak bilimsel bilgi işlem için yüksek derecede optimize edilmiş, doğal olarak derlenmiş kütüphanelere popüler bağlantılar vardır . Bu yüzden işlerin çoğu bu kütüphaneler tarafından yapılıyorsa, Python'da belli şeyler yapmak hızlıdır .

  • 2 vs 4 : Standart Ruby tercümanı oldukça yavaştır. JRuby, diğer taraftan, çok hızlı olabilir. Aynı dilin başka bir derleyici / tercüman kullanarak hızlı olduğu.

  • 1/2 vs 4 : Derleyici optimizasyonlarını kullanarak, basit kodlar çok verimli makine kodlarına çevrilebilir.

Sonuç olarak, bulduğunuz kıyaslama çok anlamlı değil, en azından dahil ettiğiniz tabloya kaynatıldığında değil. İlgilendiğiniz her şey çalışma süresi olsa bile , programcıdan CPU'ya kadar olan tüm zinciri belirtmeniz gerekir ; elemanlardan herhangi birinin yerini değiştirmek sonuçları önemli ölçüde değiştirebilir.

Açıkçası, bu soruyu cevaplar çünkü derleyicinin (4. adım) yazdığı dilin bulmacanın bir parçası olduğunu ve muhtemelen hiç alakalı olmadığını gösterir (diğer cevaplara bakınız).


  1. Kesinlikle var olan diğerlerinden daha uygulamak daha maliyetlidir dil özellikleri. Ancak özelliklerin varlığı, bunları kullanmak zorunda olduğunuz anlamına gelmez ve pahalı bir özellik, daha ucuz olanların kullanımını koruyabilir ve sonuçta bunun karşılığını verebilir. (Çalışma zamanında ölçülemeyen başka avantajları da var.)
  2. Algoritmik seviyeyi atlıyorum çünkü her zaman geçerli değildir ve çoğunlukla kullanılan programlama dilinden bağımsızdır. Örneğin, farklı algoritmaların kendilerini farklı donanımlara daha iyi verdiklerini unutmayın.
  3. Burada kasıtlı olarak farklı başarı ölçütlerine girmiyorum: çalışma süresi verimliliği, bellek verimliliği, geliştirici süresi, güvenlik, güvenlik, (kanıtlanabilir mi?) Doğruluk, araç desteği, platform bağımsızlığı, ...

    Tamamen farklı hedefler için tasarlanmış olsalar bile, bir metrik dilin karşılaştırılması çok büyük bir yanlışlıktır.


1
@babou Anladım, çok güzel bir açıklama. Peki, dilleri ilgili derleyici / tercümanlarla karşılaştırmak için kullanılabilecek daha iyi bir metrik veya belki de bir metrik kümesi ne olabilir? Ayrıca, küçük bir nitpick: "Yavaş veya hızlı bir dil diye bir şey yoktur" diyorsunuz ve sonra "Python'un kendisi çok yavaş."
StrugglingProgrammer

2
@ benalbrecht Demek istediğim, böyle bir metrik için tek bir iyi dizi olmadığıdır. Bu her zaman bir takas. Aygıt sürücüleri oluşturuyorsanız, her şeyden önce doğru olmak istersiniz. Twitter'ın omurgasını inşa ederseniz, her şeyden önce verimli olmak istersiniz. Her iki durumda da, araçları kullanır ve buna izin veren kişileri işe alırsınız. Android uygulaması denetleyen bir girişimseniz, çalışanlarınızın bildiklerini ve / veya pazara çıkış sürenizi en aza indiren şeyleri kullanırsınız. Algoritmaları öğretirseniz, kısa, açık sözdizimi ve küçük boyler plakalı bir dil istersiniz. Ve bunun gibi. Öncelikler farklı ve bu yüzden farklı dillerimiz var.
Raphael


23

Burada optimizasyon ile ilgili unutulmuş bir şey var.

Fortran C'nin performansıyla ilgili uzunca bir tartışma vardı. Yanlış biçimlendirilmiş tartışmayı bir kenara bırakmak: aynı kod C ve fortran'da (testçilerin düşündüğü gibi) yazıldı ve aynı verilere dayanarak performans test edildi. Sorun şu ki, bu diller farklı, C işaretçilerin takma yapmasına izin verirken, fortran değişmiyor.

Bu yüzden kodlar aynı değildi, C test edilmiş dosyalarda hiçbir değişiklik olmadı, bu da farklılıkları verdi, dosyaları yeniden derleyiciye göstericileri optimize edebileceğini söyledikten sonra çalışma zamanları benzer hale geldi.

Buradaki nokta, bazı optimizasyon tekniklerinin yeni oluşturulan dilde daha kolay (veya yasal olmaya başladığı) olmasıdır.


X

İkincisi, VM çalışırken çalışırken basınç testi gerçekleştirebilir, bu nedenle basınçlı kod alabilir ve optimize edebilir, hatta çalışma zamanı sırasında önceden hesaplayabilir. Önceden derlenmiş C programı, genel makinelerin ailesi için çalıştırılabilirlerin genel versiyonlarının ya da basıncın (çoğu zaman) nerede olduğunu beklemiyor.

Bu testte JS de var, peki V8'den daha hızlı VM'ler var ve bazı testlerde C'den daha hızlı performans gösteriyor.

Kontrol ettim ve henüz C derleyicilerinde bulunmayan benzersiz optimizasyon teknikleri vardı.

C derleyicisinin bir kerede tüm kodun statik analizini yapması, verilen platforma ilerlemesini ve bellek uyum problemlerini çözmesi gerekirdi.

VM, kodun bir kısmını optimize edilmiş düzeneğe dönüştürdü ve çalıştırdı.

Julia Hakkında - AST kodunda çalıştığını kontrol ettiğimde, örneğin GCC bu adımı atladı ve kısa bir süre önce oradan bilgi almaya başladı. Bu artı diğer kısıtlamalar ve VM teknikleri biraz açıklayabilir.

Örnek: basit döngü alalım, değişkenlerin başlangıç ​​bitiş bitiş noktasını alan ve değişkenlerin bir kısmını çalışma zamanında bilinen hesaplamalara yükler.

C derleyicisi kayıtlardan yükleme değişkenleri oluşturur.
Ancak çalışma zamanında bu değişkenler yürütülür ve sabit olarak bilinir.
Bu nedenle, değişkenlerden kayıtları yüklemek yerine (ve değişebildiği için önbellekleme yapmamakta ve statik analizde net değildir) tamamen sabitler gibi işlem görmekte ve katlanmakta, çoğaltılmaktadırlar.


12

Önceki cevaplar , Raphael'in cevabının mükemmel şekilde açıkladığı gibi, çoğu soru pratik bir bakış açısına rağmen, pragmatik bir bakış açısına rağmen, açıklamada bulunur .

Bu cevaba ek olarak, günümüzde C derleyicilerinin C'ye yazıldığını not etmeliyiz. Tabi ki Raphael'in belirttiği gibi çıktıları ve performansları üzerinde çalıştığı CPU'ya bağlı olabilir. Ancak aynı zamanda derleyici tarafından yapılan optimizasyon miktarına da bağlıdır. C'ye C için daha iyi bir en iyi duruma getirme derleyicisi yazarsanız (daha sonra onu çalıştırmak için eskisi ile derlersiniz), C'yi öncekinden daha hızlı bir dil yapan yeni bir derleyici elde edersiniz. Peki, C'nin hızı nedir? Yeni derleyiciyi ikinci bir geçiş olarak kendisiyle birlikte derleyebileceğinizi, böylece aynı nesne kodunu vermesine rağmen daha verimli bir şekilde derleyebileceğinizi unutmayın. Ve tam istihdam teoremi , bu gelişmelere bir son vermediğini gösteriyor (gösterici için Raphael sayesinde).

Ancak, bazı temel kavramları ve özellikle de olayların operasyonel görüşünü açıkça ifade ettiği için konuyu resmileştirmenin faydalı olacağını düşünüyorum.

Derleyici nedir?

CSTCCSTP:SP SP:T TP

CSTCST{(P:S,P:T)PSSPTT}

CSTPSPTP

P:TP:SCST

Argümanı ayrıntılandırarak, muhtemelen derleyicinin iyi bir verime sahip olmasını istiyoruz, böylece çeviri makul bir sürede gerçekleştirilebilir. Bu nedenle, derleyici programın performansı kullanıcılar için önemlidir, ancak bunun anlambilim üzerinde bir etkisi yoktur. Performans diyorum, çünkü bazı derleyicilerin teorik karmaşıklığı beklenenden çok daha yüksek olabilir.

Bootstrapping hakkında

Bu, ayrımı gösterecek ve pratik bir uygulama gösterecektir.

SISCST:SSCST:SISP:SP:TST

Ancak derleyici derlemek için bu derleme özelliğini kullanabilirsiniz. CST:SSCST:TTTT


"Anlamsal olarak önemli olan, ne yapılması gerektiğidir (ve ne kadar hızlı yapılması gerektiği değil") - pratikte olmayan kriterlerin pratikte var olduğunu belirtmektedir . İşlevsel olarak eşdeğer birçok hedef program var, ancak bazı nedenlerden ötürü bazılarını tercih edebiliriz (verimlilik, boyut, daha iyi bellek uyumu, ...). Başka bir deyişle, bir derleyicinin sizin tanımladığınız bir fonksiyon olarak görülmesi bizim olmasını istediğimizden daha sınırlıdır (aynı zamanda genellikle yan etkiler, örneğin G / Ç üzerinde atlar). Yine de, istediğiniz açıklayıcı amaca hizmet eder.
Raphael

@Raphael Tam istihdam teoremiyle ilgili olarak, aklımdaydı (C hakkındaki yorumumda), ancak adı bilmiyordum ve referans bulmayı erteledi. Yaptığın için teşekkürler. --- Bahsettiğim anlambilim, hedef program değil, derleyicidir. Hedef program sadece anlamsal olarak değil, sözdizimsel ve operasyonel olarak korunur. Yoksa sözünü yanlış anladım. Metnimde işleri daha net yapmak için düzenleme yaptım.
babou

@Raphael Yorumunuzu silmediğinizden, yanlış anladığım veya düzgün bir şekilde yanıtlamadığım anlamına mı geliyor? Derleyicinin (derlenmiş programın değil) bir fonksiyon olarak görülmesi, anlamsal bir bakış açısıyla nasıl çok sınırlıdır? Elbette, bir işlev olarak, sadece derlenmiş programdan (optimizasyon yönergeleri gibi) başka argümanlar alabilir), ancak bu tartışmayı değiştirmeyecek bir ayrıntıdır.
babou

Benim yorumumun "bu modelden daha fazlası var" yönünde bir göstergesi olduğunu düşünüyorum. Yazdıkların yanlış değil, ama her şey değil. Teorik olarak, bu bariz görünüyor: orada beri "" derleyici fonksiyonu başına iyi tanımlanmış se değildir vardır sonsuz sayıda olası hedef programları tüm anlama sahip. Hangisini seçeceğimiz , derleyici tasarlamanın çok önemli bir parçasıdır.
Raphael

CP

6

By Blum hızlanma teoremi BASIC yorumlanır ilk PC çalışan aynı yönelik bir program daha yavaş çalışır çok hızlı bilgisayar / derleyici kombinasyonuna yazılı ve çalıştırmak programlar vardır. Sadece "en hızlı dil" değil. Söyleyebileceğiniz tek şey, eğer aynı algoritmayı birkaç dilde yazarsanız (uygulamalar; belirtildiği gibi, etrafta birçok farklı C derleyicisi var ve hatta oldukça yetenekli bir C tercümanı ile karşılaştım), her birinin daha hızlı veya yavaş çalışacağını .

"Her zaman daha yavaş" bir hiyerarşi olamaz. Bu, birçok dilde akıcı olan herkesin bildiği bir fenomendir: Her bir programlama dili belirli bir tür uygulamalar için tasarlanmıştır ve daha çok kullanılan uygulamalar bu tür programlar için sevgiyle optimize edilmiştir. Örneğin Perl'de yazılmış dizelerle dalga geçmeyi düşünen bir programın muhtemelen C ile yazılmış aynı algoritmayı geçeceğinden, C'nin büyük tam sayı dizilerinde munching yapılmasının Perl'den daha hızlı olacağından eminim.


1
“Her programlama dili belirli bir uygulama türü için tasarlandı” Aslında, insanların kullandığı çoğu programlama dili, genel olarak belirli uygulamalar için tasarlanmış dillerdir. Sadece belli dillerin daha çok sosyal etkilerden dolayı belirli alanlarda daha çok kullanılmasına neden oluyor.
Kübik

Sanırım "özel uygulama türü" terimini ne kadar geniş yorumladığınıza bağlı. Çoğu ana dilin DSL olmadığı doğru olsa da, kesinlikle bazı akılda tutulacak şekilde tasarlanmıştır. C, Unix uygulamak için tasarlanmıştır. Java, İnteraktif TV komut dosyası yazmak için tasarlandı. Smalltalk çocuklara öğretmek için tasarlanmıştır. ECMAScript, sunucu tarafı ve istemci tarafı web komut dosyası için tasarlanmıştır. Perl, metin işleme ve Unix komut dosyası için tasarlanmıştır. PHP, sunucu tarafı web komut dosyası için tasarlanmıştır. Erlang güvenilirlik için tasarlandı. Şema keşfetmek için tasarlandı…
Jörg W Mittag

… OO'nun temelleri ve Aktör Modeli. APL matematik öğretimi için bir notasyon olarak tasarlanmıştır. Julia, bilimsel programlama için tasarlandı. Bu dillerin tümü şimdi elbette orijinal sorun alanlarının dışında kullanılıyor, ancak bu dillerde bazı uygulamalar için onları daha iyi ya da daha kötü hale getiren bazı özellikler var. bir şeyler.
Jörg W Mittag

4

Orijinal çizgiye geri dönelim: "Derleyicisi C dilinde yazılmış bir dil nasıl C'den daha hızlı olabilir?" Bunun gerçekten demek istediği anlamına geldiğini düşünüyorum: Çekirdeği C ile yazılmış Julia'da yazılmış bir program, C dilinde yazılmış bir programdan nasıl daha hızlı olabilir? Özellikle, Julia'da yazıldığı gibi "mandel" programı, C ile yazılmış eşdeğer "mandel" programının yürütme süresinin% 87'sinde nasıl çalışabilir?

Babou'nun incelemesi, şu ana kadar bu sorunun tek doğru cevabı. Şimdiye kadar tüm diğer cevaplar aşağı yukarı diğer sorulara cevap veriyor. Babou'nun metnindeki sorun, "Derleyici nedir" teorisinin çok paragraf uzunluğundaki teorik tasvirinin, asıl posterin muhtemelen sorun anlayışı içinde olacağı şeklinde yazılmasıdır. "Semantik", "tercümanlık", "gerçekleştirme", "hesaplanabilir" kelimeleriyle ifade edilen kavramları kavrayan herkes, sorunun cevabını zaten bilecektir.

Daha basit olan cevap, ne C kodunun ne de Julia kodunun makine tarafından doğrudan çalıştırılabilir olmamasıdır. Her ikisinin de çevrilmesi gerekir ve bu çeviri işlemi, çalıştırılabilir makine kodunun daha yavaş veya daha hızlı olabileceği, ancak yine de aynı sonuca neden olabilecek birçok yol sunar. Hem C hem de Julia derleme yapar, bu da başka bir forma bir dizi çeviri anlamına gelir. Genel olarak, insan tarafından okunabilen bir metin dosyası bazı iç gösterimlere çevrilir ve ardından bilgisayarın doğrudan anlayabileceği bir talimatlar dizisi olarak yazılır. Bazı dillerde, bundan daha fazlası var ve Julia bunlardan biri - bir "JIT" derleyicisine sahip, bu da tüm çeviri sürecinin tüm program için aynı anda gerçekleşmesi gerekmediği anlamına geliyor. Ancak herhangi bir dilin son sonucu, daha fazla çeviri gerektirmeyen makine kodudur, Bir şeyi yapmak için doğrudan CPU'ya gönderilebilecek kod. Sonunda, BU "hesaplama" dır ve bir CPU'ya istediğiniz cevabı nasıl alacağınızı söylemenin birden fazla yolu vardır.

Biri hem "artı" hem de "çarpma" operatörüne sahip bir programlama dili ve sadece "artı" olan başka bir dil hayal edebilir. Hesaplamanız çarpma gerektiriyorsa, bir dil elbette "yavaştır" olacaktır, çünkü işlemcinin her ikisini de doğrudan yapabilmesi gerekir; + 5 + 5 + 5 + 5 ". İkincisi aynı cevaba ulaşmak için daha fazla zaman alacaktır. Muhtemelen, bunun bir kısmı Julia ile oluyor; belki dil, programcının, bir Mandelbrot bilgisayar setini, C ile doğrudan ifade etmenin mümkün olmadığı bir şekilde hesaplamak için istenen hedefi ifade etmesine izin vermektedir.

Kriter için kullanılan işlemci Xeon E7-8850 2.00GHz CPU olarak listelendi. C benchmarkı bu CPU için talimatlar üretmek için gcc 4.8.2 derleyicisini kullandı, Julia ise LLVM derleyici çerçevesini kullandı. Gcc'nin arka uçunun (belirli bir CPU mimarisi için makine kodu üreten bölüm) LLVM arka uçundaki kadar gelişmiş olmaması mümkündür. Bu performansta bir fark yaratabilir. Devam eden başka birçok şey daha var - derleyici, belki de programcının belirttiğinden farklı bir sırada talimatlar vererek veya "kodları analiz edip etmediklerini belirleyebiliyorsa bazı şeyleri bile yapmadan" optimize edebilir " Doğru cevabı almak için gerekli. Programcı, C programının bir kısmını yavaşlatacak şekilde yazmış olabilir, ancak

Bunların hepsi şunu söylemenin bir yolu: Mandelbrot setini hesaplamak için makine kodu yazmanın birçok yolu vardır ve kullandığınız dilin bu makine kodunun nasıl yazıldığı üzerinde büyük etkisi vardır. Derleme, komut setleri, önbellek vb. Hakkında ne kadar çok şey anlarsanız, istediğiniz sonuçları elde etmek o kadar iyi donanıma sahip olacaktır. Kıyaslama sonuçlarından elde edilen en büyük paket, Julia için verilen herhangi bir dilin veya aracın her şeyde en iyisi olmadığıdır. Aslında, tüm grafikteki en iyi hız faktörü Java içindi!


2

Derlenmiş bir programın hızı iki şeye bağlıdır:

  1. Makineyi çalıştıran performans özellikleri
  2. Yürütülebilir dosyanın içeriği

Bir derleyicinin yazıldığı dil (1) ile ilgili değil. Örneğin, bir Java derleyicisi C veya Java veya Python ile yazılabilir, ancak her durumda programı çalıştıran "makine" JVM'dir.

Bir derleyicinin yazıldığı dil (2) ile ilgili değildir. Örneğin, Python ile yazılmış bir C derleyicisinin, C veya Java ile yazılmış bir C derleyicisiyle tam olarak aynı çalıştırılabilir dosyayı verememesinin bir nedeni yoktur.


1

Daha kısa bir cevap vermeye çalışacağım.

Sorunun özü bir dilin "hızının" tanımında yatmaktadır .

Çoğu hız karşılaştırma testi, mümkün olan maksimum hızın ne olduğunu test etmez. Bunun yerine, bir sorunu çözmek için test etmek istedikleri bir dilde küçük bir program yazarlar. Program yazarken, programcı, test sırasında dilin en iyi uygulaması ve kuralları olduğunu varsayarlar. Sonra programın yürütüldüğü hızı ölçer.

* Varsayımlar bazen yanlış olabilir.


0

Derleyicisi C ile yazılmış olan bir X dilinde yazılmış kod, sağlanan C dilinde yazılmış bir koddan daha iyi performans gösterebilir, C derleyicisi X dili ile karşılaştırıldığında zayıf optimizasyon yapar. Eğer optimizasyondan uzak durursak X'in derleyicisi daha iyi üretebilirse C derleyici tarafından oluşturulandan nesne kodu, daha sonra X ile yazılmış kod yarışı kazanabilir.

Fakat eğer X dili bir yorumlanmış dil ise ve yorumlayıcı C dilinde yazılmışsa ve eğer X dili ve C dilinde yazılmış kod yorumlayıcısının aynı C derleyicisi tarafından derlendiğini varsayarsak, X’te yazılmış kod hiçbir zaman koddan daha iyi olmaz. Her iki uygulamanın da aynı algoritmayı takip etmesi ve eşdeğer veri yapıları kullanması şartıyla C ile yazılmış


2
Bu önceki cevaplara ne ekler? Ayrıca diğer paragrafta belirtilen nedenlerden dolayı ikinci paragrafınızın doğru olduğunu sanmıyorum.
Raphael
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.