作業幾年,先后接觸c/c++,python,lua,dart,JavaScript,java各種語言,記錄下對于一個編程語言的理解
對一個編程語言的理解,應該關注兩個方面
一、語言特性
語言特性由編譯器具體實作,具體包括:
1. 強型別vs弱型別
強型別就是型別很硬,不太接受轉換
比如c++就是強型別,不同型別轉換需要各種cast
JavaScript就是弱型別,一個變數,一會數字,一會字串,一會物件都沒問題
2. 靜態型別vs動態型別
靜態型別:程式運行前確定變數型別,需事先宣告或者由編譯器推導
動態型別,程式運行時才進行型別系結和檢查
3. 靜態語言vs動態語言
程式在運行時可以更改代碼結構,比如JavaScript隨時給一個物件添加成員或者添加函式
4. 值型別vs參考資料型別
JavaScript中除了基本資料型別外,其他都是參考型別,所以變數賦值后其實指向的是同一物件
總結:變數宣告時是否需要指定型別->靜態型別vs動態型別
宣告后的型別能否相互轉換->強型別vs弱型別
程式運行時,能否改變物件內部結構->動態語言vs靜態語言
但,所有這些都不算數,對于dart語言
既可以編譯成二進制,AOT,又可以解釋運行
變數宣告既可以指定型別,也可以dynamic宣告不指定型別
不支持反射,所以是靜態語言
型別不可隨意轉換,是強型別語言
二、運行環境
運行環境就是runtime,包括虛擬機或者真實的作業系統,需要注意的有
1. 編譯運行vs解釋執行
編譯型:源代碼->編譯器->可執行代碼
解釋型:解釋器讀取源代碼,編譯,然后運行,
區別僅僅是源代碼翻譯成目標代碼的時機不同,
c/c++是編譯型,各源檔案編譯成obj,后經過連接器鏈接為可執行檔案,后作業系統加載執行
js,python是解釋型,先編譯為位元組碼,后由虛擬機加載執行,
要注意編譯單位:c/c++是以檔案為單位,nodejs和python同樣,但網頁中js是以代碼塊(<script>分割)獨立翻譯,執行,但各代碼塊共享變數
2. 異步編程模型
nodejs是單執行緒異步模型,異步模型導致回呼地獄問題,后出現await,async,以同步編程方式來撰寫異步代碼,更好維護
3. 垃圾回收
只管使用,不用操心記憶體釋放,
越高級語言,開發者越不需要關心底層,c/c++,不需要關心匯編指令,但是需要負責記憶體的申請和釋放,而java,js,dart等現代化語言,開發者不需要關心記憶體問題,這是語言發展的必然,
個人理解,希望有大神可以糾正或補充,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/47430.html
標籤:其他
上一篇:目標分析與制定演算法
下一篇:如何提高你的編程技能
