《碼農·碼農論劍(第22期)》的筆記

碼農·碼農論劍(第22期)

圖靈社區
歡迎你,很高興你選擇了Java 8
2016-02-28
JVM是一個程序,提供了運行Java程序所需的運行時環境。如果某個硬件和操作系統平臺沒有相應的JVM,就不能運行Java程序。
2016-02-28
整個流程從Java源碼開始,經過javac程序處理後得到類文件,這個文件中保存的是編譯源碼後得到的Java字節碼。類文件是Java平臺能處理的最小功能單位,也是把新代碼傳給運行中程序的唯一方式。
新的類文件通過類加載機制載入虛擬機,從而把新類型提供給解釋器執行。
2016-02-28
字節碼和運行於硬件處理器中的機器碼不太一樣。計算機科學家視字節碼爲一種“中間表現形式”,處在源碼和機器碼之間。
字節碼的目的是,提供一種能讓JVM解釋器高效執行的格式。
2016-02-28
javac是編譯器嗎
編譯器一般生成機器碼,而javac生成的是和機器碼不太一樣的字節碼。不過,類文件有點像對象文件(例如Windows中的.dll文件,或Unix中的.so文件),人類肯定讀不懂。在計算機科學理論的術語中,javac非常像編譯器的“前半部分”,它生成的中間表現形式可以進一步處理,生成機器碼。
不過,因爲類文件的生成是構建過程中單獨的一步,類似於C/C++中的編譯,所以很多開發者都把運行javac的操作稱爲編譯。我們把“編譯”看作一個單獨的術語,表示JIT編譯,因爲只有JIT編譯纔會生成機器碼。
2016-02-28
字節碼真的與設備無關嗎?那字節順序呢
不管在哪種設備中生成,字節碼的格式都是一樣的,其中也包括設備使用的字節順序。如果你想知道,我告訴你,字節碼始終使用大字節序(big-endian)。
2016-02-28
Java是解釋性語言嗎
JVM基本上算是解釋器(通過JIT編譯大幅提升性能)。可是,大多數解釋性語言(例如PHP、Perl、Ruby和Python)都直接從源碼解釋程序(一般會從輸入的源碼文件中構建一個抽象句法樹)。而JVM解釋器需要的是類文件,因此當然需要多一步操作,即使用javac編譯源碼。
2016-02-28
其他語言可以在JVM中運行嗎
可以。JVM可以運行任何有效的類文件,因此,Java之外的語言可以通過兩種方式在JVM中運行。第一種,提供用於生成類文件的源碼編譯器(類似於javac),以類似Java代碼的方式在JVM中運行(Scala等語言採用的是這種方式)。Java之外的語言可以使用Java實現解釋器和運行時,然後解釋該語言使用的源碼格式。JRuby等語言採用的就是這種方式(不過JRuby的運行時很複雜,某些情況下能輔助JIT編譯)。
2016-02-28
Java和C語言比較
Java面向對象,C面向過程。Java通過類文件實現可移植性,C需要重新編譯。
Java爲運行時提供了全面的監測程序。Java沒有指針,也沒有指針相等性運算。
Java通過垃圾回收提供了自動內存管理功能。Java無法從低層佈局內存(沒有結構體)。
Java沒有預處理器。
2016-02-28
Java和C++比較
Java的對象模型比C++簡單。Java默認使用虛分派(virtual dispatch)。
Java始終使用值傳遞(不過Java中的值也能作爲對象引用)。Java不完全支持多重繼承。
Java的泛型沒C++的模板強大(不過危害性較小)。Java無法重載運算符。
2016-02-28
Java和PHP比較
Java是靜態類型語言,PHP是動態類型語言。Java有JIT,PHP沒有(PHP6可能會有)。
Java是通用語言,PHP在網站技術之外很難見到。Java支持多線程,PHP不支持。
2016-02-28
Java和JavaScript比較
Java是靜態類型語言,JavaScript是動態類型語言。Java使用基於類的對象,JavaScript使用基於原型的對象。
Java提供了良好的對象封裝,JavaScript沒有提供。Java有命名空間,JavaScript沒有。
Java支持多線程,JavaScript不支持。
2016-02-28
Java 1.3引入了HotSpot虛擬機和JIT編譯器,而且在隨後的15年裏,一直在革新和改進虛擬機及其性能。現在,Java平臺的速度異常快,經常會在流行的框架性能評測中取勝,甚至打敗了編譯成本地機器碼的C和C++。
Python的禪定一刻
2016-02-28
Python可以應用在許多計算環境下,如下所示:
命令行窗口圖形用戶界面,包括Web
客戶端和服務端Web大型網站後端
雲(第三方負責管理的服務器)移動設備
嵌入式設備Python程序從一次性腳本到幾十萬行的系統都有。我們會介紹Python在網站、系統管理和數據處理方面的應用,還會介紹Python在藝術、科學和商業方面的應用。
掌控Web的語言JavaScript
2016-02-29
JavaScript的特點
JavaScript程序設計語言有如下幾個特點:解釋型語言
JavaScript是一種解釋型語言,和解釋型語言相對的是編譯型語言。解釋型語言直接在運行環境中執行代碼,所以一般來說,與編譯型語言相比,解釋型語言的開發更爲容易。特別是JavaScript,其運行環境是已經普及的瀏覽器,所以能夠很容易地嘗試開發。這是其他程序設計語言所不能比擬的。解釋型語言的劣勢在於,其運行速度通常都會慢於編譯型語言,不過這也只是理論上的情況。現在,解釋型語言和編譯型語言之間的界線正在變得越來越模糊。編譯型語言在有了足夠快速的編譯器和功能強大的開發環境之後,也能實現和解釋型語言相匹敵的開發難易度。同時,解釋型語言由於使用了JIT(Just In Time)這種能夠在運行中進行編譯的技術,使得運行速度得以改善。
如今,在選擇程序設計語言時,比起選擇編譯型語言還是解釋型語言,更重要的是考慮語言的設計目的。是爲了使開發過程變得輕鬆還是爲了提高執行效率,語言最初的設計理念不同,其性質自然會有差異。設計JavaScript之初,優先考慮的是使開發過程變得輕鬆,因此提供了多種特性。類似於C和Java的語法結構
JavaScript的語法結構與C和Java相似。JavaScript同樣有if或while這類關鍵字,其語法結也與C和Java類似。它們乍一看很像,因此有這些語言開發經驗的人很容易就能熟悉JavaScript。不過需要注意的是,它們之間的相似性其實並不如表面看起來的那麼強。動態語言
JavaScript與C和Java所不同的一點在於,JavaScript是一種動態語言,將在之後詳述。單從代碼的角度看,動態語言的變量和函數是不指定返回值類型的。JavaScript之所以被設計成動態語言,和選擇將其設計爲解釋型語言的理由一樣,都是優先考慮了開發難易度的結果。對解釋型語言以及動態語言的特性的喜好雖然見仁見智,但語言本身並沒有高下優劣之分。基於原型的面向對象
解釋型動態語言並不少見,現有的較爲知名的腳本語言大多都屬於這一類型。不過基於原型的面向對象特性,使得JavaScript與它們有所不同。基於原型的面向對象特性和基於類的面向對象特性是有所差別的,在此請先了解這一點即可,更爲詳細的內容將會在之後詳述。目前,被稱爲面嚮對象語言的程序設計語言,大多提供了基於類的面嚮對象語言功能。JavaScript雖然並不是第一個採用基於原型的面向對象特性的語言,不過可以說是這類語言中最爲著名的。同樣,基於原型與基於類的面嚮對象語言之間的差異,也主要是個人喜好的區別,而並非是孰優孰劣的問題。字面量的表現能力
字面量的表現能力是JavaScript開發生產力得以提高的一個重要原因。在Perl之後,很多語言都提供了功能強大的字面量功能。雖然其中表現突出的不止JavaScript一種,不過由於它的字面量功能相對來說非常優秀,所以作爲語言特點之一列舉於此。函數式編程
最後來介紹一下函數式編程。函數式編程是一種歷史悠久,而又在最近頗爲熱門的話題。函數式編程在面向對象一詞誕生以前就已經存在,不過它在很長的一段時間裏都被隱藏於過程式編程(面向對象也是過程式編程的一種)的概念之下。然而現在這種狀況正在逐步發生改變,JavaScript正是這一改變過程中的一部分。儘管JavaScript能直接支持的程序設計範式在本質上還是過程式的,但由於具備了匿名函數,可以把函數作爲對象來使用,所以同時也能夠支持函數式編程。
2016-03-05
函數的聲明與調用
可以通過函數聲明語句來定義一個函數。函數聲明語句以關鍵字function開始,其後跟有函數名、參數列表和函數體。其語法如下所示://函數聲明語句的語法
function 函數名 ( 參數, 參數, ……) { 函數體
}代碼清單2是個具體例子,其中函數名爲sum,參數名爲a和b。函數聲明中所寫的參數稱爲形參(形式參數)。代碼清單2中的函數sum對兩個參數做了加法運算,並通過return語句返回結果。代碼清單2 函數sum的聲明
function sum (a, b) { return Number(a) + Number(b);
}可以像下面這樣來調用函數sum。調用函數時,傳遞給函數的參數稱爲實參(實際參數)。下面代碼中以3和4作爲實參調用了函數sum。
//函數sum的調用 js> sum (3, 4);
7函數聲明時不必指定形參的類型。任何類型的值都可以作爲實參傳遞,因而開發者在設計函數時需要考慮接收錯誤類型的值的情況。此外,形參的數量和實參的數量可以不一致,這一點將在之後再具體說明。JavaScript的這些特性,與始終嚴格檢查參數類型的Java形成了鮮明的對比。因此,在JavaScript中自然也就不存在函數重載這一特性(即可以存在多個參數不同的同名函數)。不過JavaScript的變量本身就沒有類型可言,所以形參沒有類型也不奇怪。
匿名函數還可以通過匿名函數表達式來定義一個函數。其語法形式爲在function後跟可以省略的函數名、參數列表以及函數體。其語法如下所示:
//匿名函數的語法 function ( 參數, 參數, ……) {
函數體 }
function 函數名 ( 參數, 參數, ……) { 函數體
}可以看到,函數聲明語句和匿名函數表達式在語法上幾乎一模一樣,唯一的區別僅僅是能否省略函數名稱而已。不過,因爲匿名函數表達式是一種表達式而非語句,所以也可以在表達式內使用。另外由於它是表達式因此也會有返回值。匿名函數的返回值是一個Function對象的引用。把它簡單理解爲返回一個函數也沒有問題。
不過請不要因爲它們都是表達式,而將匿名函數表達式與函數調用表達式相混淆。函數調用表達式在大部分程序設計語言中都是存在的,而匿名函數表達式在一些程序設計語言中並不存在(至少Java中的方法是無法實現這樣的功能的)。其實,通過表達式來定義一個函數並不是什麼新的功能。早在與JavaScript有些類似的Lisp語言的時代,這種功能就已經存在,並且在一些比較新的程序設計語言中,這一功能正在變得越來越常見。
爲什麼我們需要的新語言是Go
2016-03-05
Java標準庫中的線程,而不是協程,具體代碼如下:
public class MyThread implements Runnable {
String arg;
public MyThread(String a) { arg = a;
}
public void run() { //...
}
public static void main(String[] args) { new Thread(new MyThread("test")).start();
//... }
}
如何發佈自己的播客
2016-03-06
我們直接採用Jekyll來生成播客網站,相信Jekyll大家都非常熟悉,即使不熟悉也沒關係,因爲Jekyll的官網上有詳細的使用說明。
2016-03-06
因爲UPYUN相對來說價格比較有優勢(不是廣告啦,你們看我都沒加鏈接),同時對國外用戶也比較友好,雖然我們多數是做針對國內用戶的中文播客,但是發佈到iTunes Store是需要美國那邊人工審覈的,我們第一次選擇的CDN就是因爲對國外線路支持不夠完善導致上架iTunes Store被拒。
創建Podcast FeedPodcast使用專門格式的RSS Feed作爲訂閱源,蘋果官方有提供完整的技術說明文檔,

多看筆記 來自多看閱讀 for Android
duokanbookid:41a12bcfde034b69a92e05e47c0319ba
發佈了69 篇原創文章 · 獲贊 7 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章