上古時代,程序員絕對是個高門檻職業,只能用匯編編程,寫個程序非常難。
機器指令集互不兼容,程序不可移植,只能重寫。
IBM決定改變這種狀況,推出了有著相同體系結構和指令集的機器家族System/360。
計算機廠商眾多,硬件和指令集是難以統一的,那就在上面加一個抽象層吧:操作系統。
70年代,AT&T的Ken Thompson 和Dennis Ritchie發明了一個優秀的操作系統:Unix, Dennis Ritchie還發明的偉大的C語言。
Unix用C語言重寫以后,變成了一個可移植的操作系統,屏蔽了底層硬件的差異,其上的應用程序也就可以移植了。
但讓人沒有想到的是,各大廠商和高校推出了自己的Unix版本,最后居然發展出了100多種Unix變體。
為了維護操作系統之間的兼容性,IEEE牽頭定義了系統級和用戶級的API,Portable Operating System Interface(簡稱POSIX)。
POSIX標準形成了標準,吸引了后來者入局。
有了POSIX,在不同操作系統間移植軟件就輕松了很多。
除了統一操作系統統的API,還有些大神決定對編程語言開刀,在操作系統之上再增加一個抽象層:虛擬機。
虛擬機的出現,徹底隱藏了硬件和操作系統的細節,從此以后,絕大多數程序員只需要考慮業務邏輯就可以了,軟件開發門檻再次被降低。
2007年,移動互聯網時代來臨,新的開發平臺出現了。
(注:喬布斯當年從Apple出走,創立NeXT公司,推出了NeXTSTEP操作系統,這個系統的原生語言就是Objective-C,而macOS和iOS都源于NeXTSTEP,所以iPhone選擇Objective-C也算一脈相承)
Java 沒有在iPhone中安家落戶,但是卻進入了Android手機。
Android和iOS成為兩大手機操作系統,互不兼容。
應用開發再次分裂,變得不可移植。
一個公司要開發原生App,必定要維持兩套班子:iOS程序員和Android程序員。
iOS和Android差異巨大,很難像POSIX那樣統一接口,也很難再通過虛擬機來屏蔽掉差異(Android本來就運行在虛擬機之上)。
這該怎么辦?
Facebook推出了一個方案:用JS寫App,通過React Native來“翻譯”成原生的界面。
Reactive Native 是用JSX語法寫界面和邏輯,可以實現熱更新,但是畢竟它畢竟和原生API直接隔了一層,有一個“翻譯”的成本,還是比不上原生的效率。
Google則走了另外一條路,推出了Flutter。
但是,這兩套方案都有著這樣那樣的缺點,手機端應用的可移植性還任重而道遠。
在未來,也許會出現一個新的技術或者平臺,徹底解決手機應用可移植性的問題。
即使統一以后,新的平臺(物聯網?)很可能還會造成新的分裂。
縱觀軟件這幾十年的發展,就會發現一個特點:
為了彌合各個技術平臺的差異,實現軟件開發大一統,抽象的層次越來越多、越來越高。
但是每一次統一以后,新的技術平臺很快出現,再次分裂。
真是應了中國的古話:天下大勢,分久必合,合久必分。
原文地址:https://mp.weixin.qq.com/s/pJtHUosqyVvkGycKJFLbFw