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!