Windows 10 如何做到全平台統一?
想知道不同的架構下怎麼做到統一。。。我知道以後的應用是appx通用應用。那以後比如那ARM 架構的手機可以運行 x86 架構應用? 打個比方,有兩台 WP 10 的手機,一個 x86 架構 CPU,一個 ARM 架構 CPU,其他配置一樣,同一款應用,在哪個架構下佔優?。。。不是很會表達。。。就是比如。。。運行效率,響應速度。。。大概意思,知識大漏洞,問得不是很專業,請見諒。
因為內容太長,我先在前面做一個總結,有耐心的可以繼續看正文:
1、EXE本身就是個容器,它可以在ARM平台上包含ARM的native code執行,也可以在x86平台上包含x86的native code執行,本質上無差別(所以麻煩那些說EXE不能在ARM平台上運行的同學自刪答案可以嗎?)。
2、APPX文件里並不包含位元組碼,而是各種架構的native code的混合物,微軟確實想用.net的位元組碼來統一天下,但現在大部分APPX文件都是native code。
-------------------------正文-------------------------
從原理上說,一個操作系統能同時在不同的平台上運行「相同」(注意引號)的代碼,無非有兩種形式:
1、學Java那樣,做位元組碼,然後解釋執行,只需要在不同平台上做好解釋器即可;
2、如果要同時支持x86平台和ARM平台,那麼就同時發布兩個版本的二進位文件,然後封裝到一起就好了;
你們覺得微軟會那種方式呢?
。
。。。。。
。。。。。。。。。。
。。當然是第二種了!微軟自古以來兼容性的包袱都非常,你們以為微軟可能會徹底從寫一個平台把上萬個WindowsAPI用Java或者別的什麼語言重新封裝一次?別做夢了。你們以為Windows能在ARM上運行肯定是微軟搞了什麼黑科技吧?其實只不過是把目標文件設置成ARM格式然後重新把Windows編譯一遍而已,arch相關的部分要重新實現一下就OK了。也就是說在ARM上運行的Windows,用的就是ARM的硬體指令,根本沒有什麼黑科技。N年前就有人試過,把Windows改成Java的話效率會降低到原來的三分之一(不對這句話真實性負責)。
然後有人會舉手提問說:唉?不對啊,Windows不是出了一種新的格式叫APPX嗎?不是號稱這種格式跨平台嗎?好吧,讓我們來揭開APPX文件格式的神秘面紗:
APPX在維基百科(APPX)上的解釋如下:
APPX is the file format used to distribute and install application software and middleware for Windows Store apps applications in Windows 8 and beyond.[1] It also replaces the XAP file format on Windows Phone, from version 8.1, in an attempt to unify the distribution of applications for Windows Phone and Windows 8.[2]
其中側欄特意標註了一下:
Type of format: Package management system, file archive
明白了嗎?APPX本質就是一個打包好的可執行文件的容器,這個容器里你放什麼東西都行。還不相信?那我舉例來證明,我剛到某手機論壇上下載了一個破解的WP應用,剛下載下來是這樣的:
看我用7-zip把它解壓:
果然有appx文件:繼續解壓APPX:
看看這是什麼啊:
APPX里解壓開以後有一堆資源文件和一個EXE,還有幾個DLL!
打開這個EXE看看真相吧:
居然連Dos Stub頭都有。注意在偏移量0x100的地方有個PE頭的東西,0x104位置上是0x01C4,這是什麼東西呢?在微軟的SDK里是有解釋的:這個位置兩個位元組表示機器類型,而0x01c4也找到了解釋:
0x01c4 - ARMv7 (or higher) Thumb mode only
這裡有更多的機器類型的編碼:windows - Check if exe is 64-bit
也就是說,其實EXE可執行文件(準確的說應該叫PE)是可以封裝任何平台的機器碼的,不管是ARM還是x86,根據SDK里的說法,實際上還可以支持MIPS、SH、PPC、alpha等。一個編譯成ARM平台的EXE文件,運行在ARM手機上,完全沒有問題。
EXE是跟平台無關的,誰說EXE只能在x86上運行?
所謂能在ARM上運行的APPX,就是先用編譯器把遊戲重新編譯一下,生成ARM平台的可執行文件,這個可執行文件再用APPX打包換個名字就OK了,但這個可執行文件根本不能在x86上跨平台運行:
。。。。。說好的跨平台呢?。。
。。其實真正的跨平台是這樣的,如果一個APPX想跨平台,開發者要同時編譯ARM平台和x86平台兩種目標文件,生成兩個EXE,一個在ARM上跑,一個在x86上跑,然後把兩個EXE同時打包到同一個APPX里。於是這樣就跨平台了。
其實就是發布兩個不同的版本嘛。
APPX跨平台的格式:
這樣APPX就可以同時在兩個平台上使用了。
是不是很機智呢?
所以,大家可以洗洗睡了,根本不存在真正的跨平台。
---------------------補充---------------------
有人說安卓apk里也有native code,不能證明有native code就一定沒有別的,問題是:
1、APPX里沒別的東西,只有一個EXE文件,那麼代碼只能是在EXE文件里。
2、EXE的Header里標註的整個EXE是ARMv7的native code,那麼請問如果有位元組碼,那麼位元組碼放到什麼地方?下面還有一個截圖,另一個APPX解壓的效果:
請問位元組碼藏在哪裡?當然,我不排除ARM平台EXE里有某些section是位元組碼,但整體就是一個ARMv7的PE文件。
況且,C#反編譯出來是這樣的:
APPX里的EXE反編譯出來是這樣的: 別跟我說這是一種東西,別跟我說後面的那種也是位元組碼。------------------一下內容寫給不懂跨平台開發的同學------------------跨平台開發並不是說有兩套代碼,代碼實際上只有一套,編譯的時候選擇目標文件是多個平台即可。
也就是說,編譯的時候費點時間,開發的時候並不怎麼區分平台:
全選上就是了。---------------------再補充---------------------
有人覺得這樣會不會安裝包變大?實際上大不了多少。
軟體佔地方的都是各種資源,真正的code部分其實很小,根據我解壓的內容可以看到,EXE不是最大的,最大的都是各種資源,APPX做到code和資源分離,這樣就夠了。一個遊戲上GB,大部分都是貼圖、聲音、視頻這些東西。
Win10所謂的統一,更像是統一API,要知道在之前,並非所有API都是完全一樣的,如果API不一樣,跨平台想用一套代碼基本不可能。一個源碼編譯兩份二進位,對於 C# 之類的語言不要太簡單
簡化給一般人看的解釋圖:
評論中有讓我用 @可可蘇瑪 的方式來解釋一下的評論,想來是看不懂字兒的,我來更新一下吧,
一般有兩種處理方法,而且這兩種都在 OS X 中出現過。
1,加一個 Simulator 層,當 Apple 在從 PowerPC 過度到 x86 時,曾經在機器中加入了一個名為 Rosetta 的層,讓 x86 架構的 Mac 可以運行 PowerPC 架構的應用程序,說白了,Rosetta 就是個虛擬機,它翻譯指令,緩存指令,以便達到可以接受的性能。
2,使用 Universal Binary,也叫 Fat Binary,具體來說就是在一個 Mach-O 可執行文件中含有多個架構的代碼,典型的,如一個 Fat Binary 含有 PPC,x86 的代碼,當這個二進位可執行文件被載入時,系統可以根據當前的架構,挑選一個代碼來運行。而在用戶看來,這個可執行文件除了體積大一點以外,沒有別的區別。
Windows 10 其實應該是使用了類似 2 的方法,(這是我猜的,我沒去看 Windows 10)其實如果 Apple 想要做統一,基本上也不用費事,本身 iOS App 就可以在 x86 架構下運行,如果想做成統一的,使用 Fat Binary 即可。Windows Mobile一直默默運行著exe乃們都忘了嘛!
那些說這是為了在pc上用移動app,或移動端用pc軟體真是夠了,別再瞎BB了好嗎
移動和桌面的場景不同決定了不可能出現一個產品一套交互就可以高效的解決兩個平台的交互。
所以MS推這個玩意的意圖非常明顯啊,就是為了推win10平板,保證一個app可以在x86和arm內核的機器內有效運行,而不用開發者單獨打包開發。忽悠,接著忽悠唄。微軟本來就是靠忽悠發家的。話說自從我發現我已經無意間忽略了微軟整整一代操作系統(原來windows已經無足輕重到讓人如此輕易忽略一代的地步了么?再關注windows的新版本豈不是很low?)win10現在已經不在在下觀察範圍以內了,純粹是看到樓主的這個問題隨便推斷一下。從win8開始微軟就這麼忽悠,我當時就寫了好幾篇帖子說這事情肯定是扯淡,然後果然出來以後變成了win8和win8rt吧?多少人的臉被打腫了:-)本地程序肯定是沒戲的,我估計最後還是按照C#或者java的路子來走,新程序走中間代碼唄,反正不管用什麼辦法,就算(不考慮模擬會造成的性能巨大損失的情況下)兼容了大型遊戲但手機平板的性能肯定還是跑不動,操作肯定也反人類到一種境界,有必要去模擬么?剛給家裡老人買了個平板,發現四五百塊錢的intel平板跑android幾乎比所有arm平板都流暢呢,而且幾乎沒發現不能正常工作的應用,針對樓主的問題,google已經給出了答案。(目前只發現了知乎和酷市場工作不正常,遊戲我幾乎沒玩過哈,所以不發表意見,理論上應該有很多不能用)
說白了就是x86的電腦可以用arm設備(手機、小尺寸平板)上面的一些通用應用。
不是手機能用exe,而是電腦能用通用應用。因為這個『全平台UI統一』的思路就是錯的。什麼是全平台統一,是統一的體驗嗎?你再怎麼統一,PC,平板,手機,它們的人機交互方式是不一樣的,各自有各自的局限性,也有各自的優勢。強行去設計一個系統在三個不同交互方式的設備上運行,這是很SB的做法。什麼才是真正的全平台統一?應該突出的是一個無縫隙,比方說,我在onenote for wp上做了一個筆記草稿,回到家打開筆記本就可以直接修訂排版。比方說我用Adobe的移動套件簡單剪輯視頻素材點一下保存,然後在地鐵上可以拿出平板可以繼續修正或者可以校對字幕的時間軸。等回到家,打開筆記本或者台式機可以繼續之前的工作。這些叫統一。微軟強行的去統一應用的UI設計和交互方式,有些東西,比如onenote,你可以統一交互方式,有些比如adobe套件是沒法統一的。一味的追求全平台統一內核,對用戶實際的交互體驗毫無幫助。PC上競爭不過exe,平板上對觸屏又遠不如IOS友好,手機上生態圈一塌糊塗。即使最後所有的UWP都實現全平台運行,UWP依然不會得到大部分人的認可。
和AppStore里的app一樣,多個平台的目標代碼打到一個包里。編譯的時候要生成各個指令集的目標代碼,當然前提是windows的各種動態靜態鏈接庫都要提供相應版本,也就是windows自己編譯成各個平台的目標代碼。
其實iOS和AppStore的app也能跑在x86上,看mac上的模擬器就知道了砍掉手機端啊!!!!……話說谷歌的筆記本瀏覽器都快官方支持運行安卓應用了
我覺得你們要是了解一下「編譯」過程,或有Linux基礎可能就會比較容易理解這個問題。
源代碼一般只有一份(或者對特殊的架構有部分處理,基本可以看成相同的),然後通過編譯器來翻譯成機器代碼,注意,所謂跨平台不過是把源代碼通過不同的編譯器翻譯成針對不同平台的機器代碼 最終的實現不過是改變編譯器。Windows還是抄Linux的編譯設計方案吧。至於有人說JAVA的native code,也是基本一樣,需要不同的平台編譯器。所以微軟只要設計出針對ARM平台的編譯器,剩下的很好實現。
等windows10 死了你們再回答也不遲啊
推薦閱讀:
※德州儀器退出移動CPU領域的原因是什麼?如果德儀沒有退出,那麼現在的移動領域會有怎樣的變化?
※魅藍note的CPU帶寬夠用嗎?
※如何評價小米旗下松果電子首款自主研發處理器「澎湃S1」?
※小米為啥要自己做soc?
※如何簡單易懂地介紹 64 位和 32 位晶元的區別?
TAG:微軟Microsoft | ARM | 計算機 | SoC | Windows10 |