天天看點

從計算的本質到程式設計語言

所謂計算,是建構在一套公理體系上的,并且在此基礎上不斷向上演化。抽象地說,就是從一個符号串 f 變換成另一個符号串 g 。比如說, 從符号串 12+3 變換成15就是一個加法計算。如果符号串 <code>f </code>是 <code>x^2 </code>,而符号串 <code>g </code>是 <code>2x </code>,從

f 到 g 的計算就是微分。定理證明也是如此, 令 <code>f </code>表示一組公理和推導規則, 令 <code>g </code>是一個定理,

那麼從 <code>f </code>到 <code>g </code>的一系列變換就是定理 <code>g </code>的證明。它們都是從己知符号串開始,一步一步地改變,經過有限步驟,最後得到一個滿足預先規定的符号串的變換過程。

數值計算:數值計算包括實數和函數的加減乘除、幂運算、開方運算、方程的求解等;

符号推導:符号推導包括代數與各種函數的恒等式、不等式的證明,幾何命題的證明等;

計算理論的研究:側重于從數學角度證明表達能力和正确性,比較典型的、、pi演算這些都屬于這個範疇。

計算模型的研究:側重于對真實系統的模組化和刻畫,比如、bsp模型、logp模型等等。

程式設計語言的切入點不同,同時可能會是兩種範式之一或混合,比如 lisp 側重于前者(lamda演算),c 注重于後者(馮諾伊曼模型),而更多的語言都在尋求某種折衷。

随着計算機硬體和編譯技術的發展,流行語言新特性越來越向lisp進行靠攏,語言設計思想逐也漸向lisp靠攏。

<code>(過程式)c</code> -&gt; <code>(面向對象)c++</code> -&gt; <code>(反射+垃圾回收,運作時擷取類型)java</code> -&gt; <code>(動态,運作時可以改變類型python)</code>-&gt;<code>(代碼可以生成代碼,編譯時和運作時無絕對區分(common lisp)</code>

turing completeness:a computational system that can compute every turing-computable function is called turing complete (or turing powerful). alternatively, such a system is one that can simulate a universal turing

machine.

turing equivalence:a turing-complete system is called turing equivalent if every function it can compute is also turing computable; i.e., it computes precisely the same class of functions as do turing machines.

alternatively, a turing-equivalent system is one that can simulate, and be simulated by, a universal turing machine. (all known turing-complete systems are turing equivalent, which adds support to the church–turing thesis.)

程式設計語言決定程式設計思想,是描述算法的基礎。算法和其複雜度分析都是相對于某種計算模型,而程式語言就是描述這種計算模型的符号系統。算法必須用某種語言表述出來。

學習程式語言,要了解其最核心最精華的原理,這才是本質。最好方式是寫簡單的解釋器,實作最基本的功能。之後程式設計語言的新特性你都大概知道可以如何實作,而不隻停留在使用者的水準。推薦用scheme,很适合寫解釋器。 每種語言都有其适用的場合,都有其優點缺點,都有其設計哲學和程式設計思想。“c++高大上,我就學c++,别的都不學” 這種想法是絕逼不可取的。要精通一兩門語言沒錯,但是也要多學其它,學習的能力思想,是最重要的。

當選擇一門語言來做東西時,要根據項目需求來評估下它的庫、文檔、工具支援、與作業系統的內建、資源,還有那麼一堆其實和計算機工作原理沒什麼關系的東西,以及,一堆和如何讓人更好工作的緊密相關的東西。

練習資料結構,使用c++,擁有靈活的指針來操作記憶體;

入門函數式,不妨用scheme,小而純粹,學習新思想;

平時的積累,就好好學習c++和java,業界的絕對主流;

平時自己做小東西玩兒,首推python,友善又快速;

做項目時,項目用什麼,就學什麼;

這是個曠日持久的論戰,一不小心就被噴死。我還是要在這裡說一下自己的看法:

對于編輯器:

emacs 是最牛逼的編輯器,難度最大,内置的是牛逼閃閃的lisp語言,linus,馬克·紮克伯格等一堆大牛都在用;

vim 比較純粹,編輯功能很強大,難度比emacs小,擴充性不如emacs;

sublime 雖然和上面的兩個不能比,但是内置了python,可開啟vim模式,gui最華麗,簡單;

對于ide:

windows下最好的是visual studio,寫 c# 和 c++;

對于java ide,最好的是 jetbrains 的intellij idea;

對于python ide,最好的是 jetbrains 的 pycharm;

繼續閱讀