如何创建比C语言更快的编程语言?
【CSDN編譯整理】近日,beza1e1上發(fā)表了一篇博客《Faster than C》,在Hacker News和Reddit Programming上引發(fā)了開發(fā)者們的激烈討論?,F(xiàn)將此文編譯,我們一起來(lái)探討下。
單從編程語(yǔ)言特性來(lái)判斷,雖然Fortran語(yǔ)言也以快而著稱,但開發(fā)者們還是將C語(yǔ)言稱之為領(lǐng)導(dǎo)者。開發(fā)者創(chuàng)建新一門語(yǔ)言通常以C語(yǔ)言為參照對(duì)象,將語(yǔ)言編譯時(shí)間與C語(yǔ)言進(jìn)行對(duì)比,會(huì)因比C語(yǔ)言慢多少而引以自傲。然而,很少有語(yǔ)言能夠擊敗C。
那么,什么樣的語(yǔ)言才能比C更快呢?
更好的別名機(jī)制(Better Aliasing Information)
別名實(shí)際上是指兩個(gè)引用指向同一個(gè)內(nèi)存位置。例如,典型的內(nèi)存復(fù)制(not memcpy from stdlib.h!)
根據(jù)目標(biāo)架構(gòu),編譯器利用代碼對(duì)此進(jìn)行大量的優(yōu)化。比如,X86利用SSE指定MOVDQU,它可以復(fù)制16字節(jié),而非4字節(jié)(sizeof(void*))。然而,因?yàn)锳liasing(別名),dst中以src+1為例,在這種情況下,結(jié)果在dst出現(xiàn)的第一句一定是*src,由于C語(yǔ)義的原因,編譯器不允許使用MOVDQU。
在C99中新增了限制性關(guān)鍵字,我們?cè)谶@里使用的編碼src和dst與其他地方引用的不同。在某些情況下這種機(jī)制比較受用,能夠起到幫助,但在我們的例子中卻不受用。
Fortran語(yǔ)義稱函數(shù)參數(shù)從未有過(guò)別名(alias ),Fortran中單獨(dú)有數(shù)組類型,而在C中,數(shù)組實(shí)質(zhì)上是指針。這就是為什么Fortran經(jīng)常比C更快的原因以及為什么依然要在Fortran中編譯數(shù)值庫(kù)的原因,當(dāng)然它還涉及到指針?biāo)惴ǖ某杀締?wèn)題。
因此,想要?jiǎng)?chuàng)建一門比C更快的語(yǔ)言應(yīng)該提供更容易被編譯器處理的別名機(jī)制。
在編譯階段完成運(yùn)算(Push Computation to Compile-Time)
在編譯時(shí)應(yīng)當(dāng)減少運(yùn)行時(shí)間,當(dāng)然,在C編譯器像1+2這樣的案例,加法運(yùn)算在編譯階段就完成了。編程語(yǔ)言利用完美的元編程語(yǔ)言能夠使程序員可以做一些特定優(yōu)化的應(yīng)用。一個(gè)簡(jiǎn)單的實(shí)例,比如fib(20)可以寫成6765。一個(gè)真實(shí)的例子,Eigen C++ library for linear algebra通過(guò)使用C++模板來(lái)避免復(fù)制和一些計(jì)算指令 。Lisp是宏觀系統(tǒng)技術(shù)之父。比如,一個(gè)學(xué)生使用Scheme的編碼奇聞。基本上,程序員可以在編譯過(guò)程中修改抽象的語(yǔ)法樹,用這樣的元編程特性來(lái)權(quán)衡是很復(fù)雜的。程序員往往會(huì)低估了如何編譯正確宏的困難性如同他們會(huì)低估如何編譯正確的并發(fā)程序一樣。
一門語(yǔ)言的設(shè)計(jì)者應(yīng)該好好思考下元編程。在編譯的時(shí)候多思考要像C++ 模板那樣能夠提供多種益處的性能。
運(yùn)行優(yōu)化(Runtime Optimization)
在運(yùn)行時(shí),有動(dòng)態(tài)信息顯示不適用于靜態(tài)編譯器,C語(yǔ)言可以復(fù)制任何一個(gè)特定的示例,一般情況下,它是不可行的。該技巧只解決了問(wèn)題的一小部分。
運(yùn)行時(shí)優(yōu)化whole-world變得相當(dāng)?shù)娜菀住1M管這可能是靜態(tài)的,C語(yǔ)義(編譯單元)和強(qiáng)制性的預(yù)處理器使其編譯起來(lái)更難,盡管Python通過(guò)inlining across file borders(PyPy)擊敗了C。
當(dāng)然也有使用JIT,但在嵌入式系統(tǒng)語(yǔ)言是不適宜的。雖然Java,C#或者是其他語(yǔ)言擊敗了C,但它們不會(huì)威脅到C的用戶群。
結(jié)束語(yǔ):
想要?jiǎng)?chuàng)建一門比C要快的新的語(yǔ)言,更好的別名機(jī)制是我唯一確定能提高語(yǔ)言速度的方法,因?yàn)樵贑中無(wú)法實(shí)現(xiàn)Fortran的速度,另外就是思考如何用更簡(jiǎn)單的方法編寫出更快的程序。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的如何创建比C语言更快的编程语言?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C#中开发之Socket网络编程TCP/
- 下一篇: TCP/IP网络断和127.0.0.1回