我常常碰到一些人在說xx語言跨平臺而yy語言不是(爲避免沒必要要的紛爭,在此不寫具體語言但不影響閱讀),從而來代表本身使用xx語言進行程序開發進而在編程語言鄙視鏈上高高在上頗有優越感。java
大概是從Java 提出的「Write once, Run anywhere」這個口號開始,跨平臺的概念開始流行起來了(我不徹底肯定時間點是否是高度重合,因此使用了「大概」這個詞)。程序員
這裏我拿Java語言舉例子來講明一下,從編碼開始到真正執行的過程是:編寫源代碼(.java)文件->編譯器編譯成字節碼(.class)文件->各類部署或分發->在計算機上開始執行->計算機加載資源->發現是Java編程的程序->調用JVM->JVM解析.class文件->JVM執行程序。咱們能夠看出程序執行過程當中真正由計算機自己執行的步驟有加載資源到調用JVM部分,當JVM開始解析.class文件並執行的過程並非直接交付給計算機執行的而是均有JVM來負責,這也是爲何這種JVM程序運行機制叫作託管環境。編程
那麼Java具體是怎麼實現跨平臺的呢?固然是由Java的開發商(先是Sun後是Oracle)實現了各個操做系統平臺(Windows,Linux和Mac系列)的JVM,須要實現哪一個平臺的支持部署時安裝上該平臺所對應的JVM(JVM以及其須要lib合起來被稱爲JRE)便可實現Java程序在該平臺的運行能力。因此從嚴格意義上來說,Java語言開發的程序自己不是跨平臺的但JVM有各個平臺對應的版本,Java能夠在各個平臺下運行;從程序員開發程序的角度來看咱們也能夠簡化爲Java程序具備跨平臺的能力。事實上當程序交付給JVM(JRE)執行的時候其並不關注程序是否是由Java語言編寫成的,其僅僅是解釋並執行類文件(.class),這樣爲JVM執行其餘語言編寫的程序提供了便利。編程語言
那其餘語言有跨平臺的能力嗎,好比C語言?C語言從開發到運行的過程相對於Java的過程有所不一樣:開發源代碼文件(.c)->編譯器編譯源代碼->運行。在編譯器編譯源代碼的過程當中沒有編譯爲中間結果而是編程成了相對應的機器碼(或Windows或Linux或Unix等),當程序執行的時候直接由CPU解釋執行,因此C語言開發的程序在這種執行機制下是不具有跨平臺執行的能力的。性能
那麼還有沒有其餘相似的程序執行機制的嗎?固然有了,好比以C#爲主的.NET系編程語言,其跨平臺的原理和Java基本相同,不過虛擬機不叫JVM而是叫CLR(Common Language Runtime),從名字上咱們能夠看出Common的是不限制各類編程語言,只要該語言編譯器能編程成符合CLR執行標準規範的中間層(相似Java語言體系中的.class)便可這個中間層的名稱叫IL,全稱是MSIL(Microsoft intermediate Language),而這套標準規範就是CLS(Common Language Specification)。可是微軟出於某些考慮在.NET推出的10多年中僅僅實現了在Windows平臺下的CLR而始終沒推出基於Linux平臺的CLR,雖然也有其餘公司嘗試推出MONO,但力度不大也沒太多的工業界影響力。在2014年以後微軟推出了.NET Core,並同步推出了各個平臺相應的Runtime。優化
截止到目前,Java的相關專利均有其公司持有,任何對這些專利有抵觸的地方均可能有被訴訟法律的風險,好比當年微軟針對性的優化Java在Windows平臺下執行性能和效率專門開發的Visual J++套件就是由於專利的問題被Sun公司起訴並獲賠的。編碼
而C#等.NET體系的編程標準均爲ECMA標準,這裏我簡單列一下其連接再也不詳述:操作系統
Common Language Infrastructure(ecma-335)htm
C# Language Specification(ecma-334)ci
任何有實力有想法的公司或我的都可以基於這些開發標準進行相應的開發,不過大部分的公司處於競爭不過微軟的地位而不在這方面多投入資源,但也有極個別的公司曾經嘗試過,好比Borland公司的Delphi.NET。
有過Java和C#,有關跨平臺,有關.NET Core等等,這些有不少能夠說的,不是短短的幾篇文章能描述清楚,有須要瞭解這些狀況的同窗仍是優先看各類官方文檔,咱們只能從各類二手資料中推斷演繹。
後續還計劃寫一篇.NET 程序在Windows平臺下執行的過程及其邏輯,但願能作到。