C++一開始必須要定義的原因,是因為C++的編譯器是靜態分析編譯的,也就是說編譯器看到你寫的程式碼的字串,沒有執行它,就把它翻譯成機器看得懂的語言,而機器看得懂的語言必須要求任何變數的型別是確定的。而作為靜態分析,如果變數的型別都不指定,很難事先確定每個變數的具體型別,就無法編譯。

雖說很難,但並非不可能。所以隨著C++自己的進步,它也發明了auto這個型別,也就是讓編譯器根據上下文猜測這個地方的型別到底是什麼,但是即使是auto型別,在靜態編譯

錦心似玉穎兒演的誰

器下,它的型別推測能力也是差於動態解釋語言的,也就是不能啥地方都用auto。

而python作為一個動態解釋型語言,它是具體執行的時候,執行到哪行,就判斷哪行的型別,每個語句涉及到的變數的型別和內容都已經知曉,就能夠準確判斷出真實的型別。但是都是臨場判斷,判斷的程式碼都要一句一句執行,所以原生python即使寫個1 + 1也要比c++慢上不少。

那麼有沒有既靈活準確地判斷型別,又能飛快執行的語言(編譯器/直譯器)呢?

有。

例如使用了jit技術的各種語言,例如JS等;

還有julia這種“just-ahead-of-time”的語言,在julia的語法設計下,編譯器其實都不需要多麼聰明,就能在函式第一次執行的時候充分了解這個情況下它的引數型別,從而決定這個函式內部所有的變數型別,於是現場編譯符合這個引數組合型別版本的函式。再借助multiple dispatch,同一個函式直接可以對應不同型別引數的操作,而且都非常高效。以第一次執行慢一點的代價,來換取高效的編寫和執行,我覺得是十分划算的。

我從前就一直相信,一個高階抽象的動態語言,如果人能夠把它直接翻譯成C++以實現巨幅提速(直接翻譯,而不是深思熟慮改變了演算法本身),那這個過程就一定能由機器實現,所以一定會存在一種高階語言,它寫起來像python,跑起來像C一樣快。