<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      .NET的前世今生與將來

      2018-09-15 08:13  靈感之源  閱讀(8240)  評論(89)    收藏  舉報

      筆者注

      謹以此文紀念我敬重的2016年9月17日去世的 裝配腦袋 逝世兩周年

      讓大家久等了,前后花了1年的時間,幾經改版,終于完成撰寫了一萬字長文,回顧和展望.NET這16年來的成功與失敗。最終能成文是因為我給自己承諾必須趕在 裝配腦袋 逝世兩周年前發表。愿天堂沒有bug,活著的開發人員珍惜寫好每一行代碼的機會。

      前言

      .NET正式誕生了16年了,目前是微軟技術棧的主要開發平臺。筆者有幸在2002年在生產環境使用.NET 1.0 beta,一直到現在.NET Core 2.1,見證了.NET從最開始蹣跚學步的嬰兒,到現在在各大領域大放異彩的巨人。

      在過去的10多年中,開始那些年,.NET被質疑、誤解,一些開技術人員覺得.NET就是Java的復制品,沒有什么值得學習和使用的,而且,一些反微軟陣營的技術人員,為了反對而反對。正是由于這些偏見,至今,一些公司仍然不愿意使用.NET,即便.NET從第一天開始就已經提交到ECMA標準和使用Rotor開放了代碼和免費使用。

      本文試圖給大家展示一個完整的.NET歷史、現狀、生態圈,希望在.NET擁抱開源界的時候,業界也能擁抱.NET,更多技術人員參與到.NET的大家庭中來。

      現在,讓我們一起回顧一下.NET過去10多年的發展吧。

      .NET技術棧

      如果你想對.NET的整個技術棧有全面的理解和并希望深入研究,可以看筆者的爆棧下面的.NET技術棧:http://overflowstack.github.io/
       

      誤解

      現在業界/一些開發人員對.NET這個平臺有諸多誤解,他們的想法可以概括如下:
      • .NET是封閉的
        • 實際上,.NET從第一天開始便把標準提交到ECMA,并且利用Rotor 開放了源代碼(詳見這里),感謝RednaxelaFX的指正
      • .NET只能在Windows平臺上跑
        • .NET 2004年開始就能在Linux上面跑了(Mono,詳見后面內容)
      • .NET帶來的費用高
        • .NET是開源的,可以在多平臺跑,沒有費用可言
      • .NET性能低
        • .NET(相關開發語言如C#)的性能在多個性能測試平臺上是領先的(詳見后面內容)
      • .NET是微軟的
        • 這是典型的為了反而反,類似的幼稚行為是在微軟最近收購了GitHub后,一些開發人員馬上遷移到GitLab上,然而他們可能不知道:
          • GitLab是在微軟Azure托管的(不過他們最近遷移到Google Cloud了)
          • GItLab之前發生過因為主數據庫PostgreSQL備份/恢復出錯導致了客戶數據丟失的問題
       

      前世

      Windows 32

      在2000年前,在微軟平臺上做開發,一般用的Windows 32 API,主要有以下幾種開發方案:
      • Visual C++
        • 通用解決方案,可以是桌面應用(如MFC),也可以是C/S應用
      • Visual BASIC
        • 快速應用開發(RAD)的一種,一般做圖形界面(GUI)應用
        • 組件一般采用ActiveX(COM),利用注冊表做接口管理
        • 提醒:VB在.NET沒有缺席
      • Delphi
        • 另外一種RAD,兼顧了VB的組件化和VC++的很好的底層API交互支持
        • Anders Hejlsberg是這個產品的首席架構師(提醒,他是.NET的核心人物之一,看下面內容)
       
      做Win 32開發,會面對一個問題:版本控制,因為接口改變了,但因為發布管理不統一,導致了不同版本互相覆蓋,調用錯亂,這就是飽受詬病的.DLL地獄(Windows類庫一般用.DLL做后綴):
      • 標準Win32 DLL:要么隨意放到Windows System32目錄,要么Program Files (x86)目錄
      • ActiveX DLL:雖然統一用注冊表做版本信息管理,但是因為發布的時候版本沒定義好,導致使用regsvr32.exe注冊的時候可能會把上一個版本覆蓋
       
      做Web開發,當年微軟提供了ASP(Active Server Pages),使用VBScript做服務器端腳本,利用ActiveX做實際業務交互,譬如ADODB做數據庫存儲,但是這個解決方案在內存處理、安全方面都存在諸多問題。
       
       

      前期

      背景

      誕生

      微軟劍橋研究院的技術人員,在1998年開始研究下一代的開發技術,他們的思維很超前,去年他們發了一篇文章,介紹這個項目的發展史,上面的圖片,清晰可見一些.NET的特性,還有一些還沒有被實現。

      .NET這個開發平臺,學習多個開發平臺的特性,譬如Java,把開發語言Java等(筆者注:別的Java平臺語言下面提及)編譯成中間語言(IL),運行時JIT。不過.NET更進一步,支持本地化編譯。

      2002年,微軟正式對外發布了.NET 1.0。

      最近,Oracle宣稱.NET的主要對手Java的安裝量超過20億,筆者還沒有找到.NET安裝量的官方數字。

      .NET的名字

      相信很多人會問,為什么會取.NET這個名字?適逢當年2000-2002年互聯網大潮,微軟打算推出一個適應互聯網需求的開發平臺,所以干脆用了.NET這個名字。當時很多公司開發的產品都加了.NET后綴,甚至公司域名都采用了.NET而不是.COM。
       

      .NET特性

      首先,.NET是一個開發平臺,從1.0開始支持GUI(WinForm)、CUI(控制臺)、Windows Service、Remoting等等Windows平臺的開發,也支持ASP.NET (WebForm)開發web系統,所以從最開始,.NET就支持多平臺開發??梢哉f.NET從第一天開始便是為了互聯網而生的。

      .NET編譯生產的文件叫程序集Assembly,就是代碼物理的集合,命名空間用來邏輯歸類代碼。

       

      語言 vs 平臺

      有一些同學把語言和平臺搞混了,譬如他們會說.NET是一種語言。讓我們來捋一下關系吧:
      • 平臺:.NET
        • 語言:C#,F#,VB.NET,等等
      • 平臺:JVM
        • 語言:Java、Scala、Clojure,等等
       
      有趣的是,現在流行的開發平臺大多采用了類似的編譯、運行、調優機制:
      1. 編譯成中間語言(IL)
      2. 運行時即使編譯成machine code(JIT,后述)
      3. 有辦法改變JIT的行為(調優)
      4. 有辦法預編譯成machine code

      言歸正傳,.NET平臺上最主流的3種開發語言分別是C#、VB.NET和F#。

      Pascal之父、Delphi首席架構師Anders Hejlsberg,當年還在Borland,被微軟CEO Bill Gates重金邀請加盟微軟,主導開發.NET平臺上的全新開發語言,這就有了現在.NET平臺上最流行的開發語言C# ,取義C++的++ ,即(C++)++,合在一起就是4個+,碰巧和音符的C?一樣,所以讀作C sharp,不是C井,謝謝。因為這個升C的字符比較難敲,所以,一般用數字3上面的那個#符合代替(對,?和#不是同一個字符)。C#是目前全球最流行的開發語言之一。

      如果你想深入了解C#,可以參考Jon Skeet編寫的《C# in depth》,JK很奇怪,他是在Stack Overflow上是排名第一的回答者,C#專家,然而,他卻是在Google工作的(潛伏的臥底?)。

      筆者對BASIC有著非常深厚的感情,第一次接觸這個語言是1992/1993年的時候,后來用了GWBASIC、TrueBASIC、TurboBASIC、QBASIC、QuickBASIC、Visual BASIC (1.0版本還是DOS下的,用的ASCII字符拼接成圖形界面)。

      如果你用Visual BASIC 5/6,相信不會對VB.NET太陌生,盡管VB.NET用起來有點別扭。VB.NET表面上是微軟照顧老VB用戶在.NET平臺上的實現,但這個語言實在太別扭。在VB 11.0之前,它是盡量和C#高度交互的,很多語言特性都盡量“兼容”,但是11.0之后,開發團隊決定和C#分道揚鑣,各自演進。

      說起VB.NET,相信一些開發人員還記得@裝配腦袋,他從老VB開始就是忠實用戶,在博客、技術會議中和大家分享各自VB.NET/編譯器技術和心得,他兩年前不幸因病去世,愿天堂沒有bug。

      VC++一直以開發高性能著稱程序,在.NET世界,VC++.NET,可以和.NET程序集交互,當然,你仍然可以選擇寫不基于.NET的代碼。不過,如果你用,NET的話,為什么不直接用C#?除了VC++.NET,微軟還有C++/CLI這個專門設計來和.NETA交互的兼容C++的語言,用來開發.NET托管代碼。

      如果你需要高性能、喜歡函數式編程,那么F#這個函數式的開發語言會比較適合你,它天生以高性能并行計算著稱??赡苣氵€已經猜到,F#里的F代表Functional函數式。

      微軟當年雄心勃勃,希望把.NET打造為大一統的開發平臺,當年Java如日中天,微軟自然不會放過這個機會:難道還有直接把對手的支持者拉攏過來的而擴大市場更好的辦法嗎?此消彼長,道理大家都懂。所以微軟推出了J#。不過這個項目有點尷尬,最開始是想和Java進行交互,利用Java成熟的平臺組件,后來項目沒有被維護了,但是,.NET 4.5之前,想要自己讀寫zip文件,.NET框架內置的類庫中,只有J#有一個類庫,否則只能用第三方的方案。

      J#出師未捷身先死,長使英雄淚滿襟。然而這并沒有阻止.NET的雄心。大家知道JVM是一個運行平臺,在這基礎上,有各種語言,Java是老大哥,Scala有取而代之的趨勢,最近Google因為不滿Oracle拿Java版權大棒亂揮舞,近年大力扶植JetBrains的Kotlin。同樣,.NET平臺上,也有多種語言,除了上述的幾種,還有Fantom、Visual COBOL、ClojureCLR等。

      為了和動態語言交互,.NET引入了 Dynamic Language Runtime (DLR),這樣,各自動態語言就可以和.NET互相調用,而這個平臺下的語言一般有一個前綴:Iron。當年出現了IronPython、IronRuby、IronScheme等項目。然而,這個項目沒有被維護了?;蛟SIron是因為這個名字起得比較晦氣,都“打鐵”了。

       
       

      核心特性

      每種語言/開發平臺都有自己的看家本領:語言特性(面向對象 vs 函數式、強類型 vs 動態類型、并行計算等等)、生態圈(開放、大量的第三方庫/擴展支持)等等。

      .NET的運行時Common Language Runtime(CLR)是.NET的核心,負責程序的解釋和運行。.NET程序啟動的時候,會經過多達50步才正式開始跑你寫的第一行代碼,中間是各種元數據的查找、分析等。如果程序是第一次執行,CLR會把要執行的代碼路徑進行JIT(即時編譯),這個過程會有各種優化,舉個例子:冷代碼(如異常處理邏輯)會相對熱代碼(正常邏輯)執行較慢,這就是為什么如果過度使用異常來做控制,會有性能瓶頸。

      如果你想對CLR進入深入的了解,可以參考傳奇開發人員Jeffrey Richter編寫的《CLR via C#》,他是經典開發書籍《Windows via C/C++ 》的作者。

      .NET大量封裝Win 32 API,這叫InterOperability(InterOp)。如果你需要調用第三方甚至自己編寫的Windows 32,可以通過這個實現。

      還記得DLL地獄嗎?.NET的程序集經過SN(強命名)簽名后,可以通過gacutil注冊到Global Assembly Cache(GAC),這樣任何一個程序可以直接調用。因為它通過程序集名稱(assembly name)來區分每個程序集的唯一性,所以不會出現不同版本的程序集互相覆蓋的問題。

      C/C++,沒有第三方的庫,你需要手工控制內存的調用和回收,好處是按需調用,省內存,高效,然而對開發人員有較高要求,所以一般使用第三方的解決方案。Java和.NET,都有自己的
      Garbage Collection (GC)。.NET GC分3個階段,不同階段針對對象的不同生命周期。如果你希望深入研究GC,可以參考下面的"高性能"部分。

      不同于現在各種基于Google Chromium二次打包的瀏覽器殼,除了完整版,.NET還包括多個不同的兄弟框架,譬如.NET Execution Environment (DNX)、Compact Framework (CF)用于移動設備、Microsoft Framework (MF)用于嵌入式設備。

       

      開發

      Visual Studio是最受微軟技術開發人員歡迎的IDE,你可以通過它使用上述各種語言開發、調試、測試、發布各種應用?;蛟S你不知道,Visual Studio作為通用的IDE,被其它產品借用,譬如微軟SQL Server的管理工具SQL Server Management Studio (SSMS)就是基于Visual Studio的,所以大部分快捷鍵和功能是一致的。

      剛開始的時候微軟推出的.NET針對自家Windows桌面開發推出了Windows Form(WinForm)這個開發方案。出發點是想把所有界面元素OO化,通過事件驅動,底層還是Win32那套消息機制,GDI+渲染。不過默認的渲染效果有審美疲勞,所以有些應用采用了國內比較流行的皮膚做法,通過owner draw實現自主的渲染,擺脫了單一的UX體驗。

      不喜歡WinForm的事件模型?不喜歡自己實現雙向綁定?不喜歡WinForm太傳統的Win32 GUI元素?那么,WPF應該會是你的選擇。它使用XAML作為界面語言,DirectX渲染,邏輯代碼可以選擇C#或者VB.NET。之所以使用XAML(XML格式),是為了把界面描述標準化,這是iOS、Android和Xamarin的標準做法。

      .NET的推出是為了應對互聯網時代,必不可少的,需要提供網站開發方案。微軟把當年的基于ActiveX + VBScript的服務器端開發解決方案ASP(Active Server Pages)升級,成為了ASP.NET。WebForm的設計思想是復制WinForm,但是封裝得不好,導致用戶被迫強行做各種js和css hack,尤其是它復制WinForm的事件模型,導致各自不必要的Postback,而且頁面有著極其臃腫的ViewState來維護當前的狀態,所以很多時候頁面加載耗時甚長,久等不見內容。當然你可以用UpdatePanel做異步ajax更新提升用戶體驗。

       
      WebForm設計缺陷包括但不僅限于:
      • 早年的封裝沒有考慮各個瀏覽器的兼容性,開發者必須做各種js/css hack
      • 表格postback設計導致不理想的用戶體驗
      • 使用ViewState做當前頁面的狀態保持,但這個ViewState是寫入到頁面的,默認是寫入到文件前面部分,但頁面數據量多的時候(如使用DataGrid),這個ViewState會相當大,導致頁面加載緩慢,雖然有辦法把ViewState放到頁面后面部分,讓加載看起來快點,但是根本問題沒有解決。而且ViewState會出現各種損壞的情況導致功能無法使用
      • 容易導致開發人員把界面、業務邏輯和數據存儲都放到同一個文件里面,難以維護和做單元測試
      • 慢,慢,慢,重要的事情要說三遍
       
      為了解決在飽受詬病的WebForm中出現的各種問題,微軟推出了ASP.NET MVC,這是對當年市場上日漸流行的Web設計方式Model View Controller的回應,這個產品后來開源了。ASP.NET MVC的設計思想是好的,把界面、業務邏輯、數據模型等分離,這樣不同角色的人員可以獨立進行開發,互不干擾。
       
      ASP.NET MVC自帶幾種渲染器:
      • ASP.NET WebPages就是ASPNET WebForm (不要用)
      • ASP.NET Razor 就是.cshtml/.vbhtml文件的渲染器 (還是不要用)

      你可能會問,那到底用什么做頁面渲染?簡單來說:不要在服務器端做渲染,因為所有界面渲染都不應該是服務器的事情,現在用戶的瀏覽器渲染能力很強,這種事情完全應該留給客戶的機器去做,這樣服務器的壓力會大減。服務器應該做的事情只是接受請求,根據業務邏輯處理數據、讀取/存儲數據。

      所以,頁面渲染,應該選擇成熟Web前端MVC方案,譬如AngularJS、React等。

      網絡開發,除了網站,還有一些不可見的后臺服務。Web Services是跟隨ASP.NET 1.0推出的,協議基于XML,現在使用這個技術的產品比較少了。后來微軟推出了大一統的WCF(Windows Communication Foundation)平臺,是相對較新的一套Web服務解決方案,支持多種傳輸協議和安全機制,但配置繁瑣。

      ASP.NET Web API是ASP.NET MVC的一個組件,提供構建RESTful API的方案,目前比較多產品使用。

      大家還記得Java Applet嗎?當年Flash大行其道,但其問題太多,安全問題、CPU占用問題、穩定性等等。為了對抗如日中天的Flash,微軟推出了Silverlight。Silverlight的性能不亞于Flash,而且比隔三差五要打安全補丁的Flash安全很多,但是兩者都無法擺脫基于ActiveX插件的問題,即便預先安裝,也常有版本兼容問題導致無法在瀏覽器加載,而且默認那套銀灰色的界面確實有審美問題。

       
      Silverlight的著名的應用:
      • 當年奧運會MSNBC的網絡直播采用Silverlight解決方案
      • 微軟的本地虛擬機管理平臺Windows Controller,用的就是Silverlight
      • 微軟云平臺Azure,早期版本,使用了Silverlight做界面
       

      不過和Flash抵擋不了技術發展的洪流一樣,Silverlight也被迫退出了市場。對了,Flash在中國還是奇葩地存在,由某個流氓公司特供中國版,切記不要使用。

      一個成熟的開發平臺,單純有好的語言、基礎庫還是不足夠的。當年為了方便開發人員,微軟提供了一整套的常用功能框架,叫Enterprise Library,包括功能如讀寫配置、數據訪問、日志、緩存等,而這個項目的前身是Best Practice Application Blocks,就是類似廣大開發愛好者常常自己搞的工具庫。

      大家還記得ActiveX年代的ADODB嗎?在.NET世界,我們有升級版:ADO.NET。通過ADO.NET,你可以訪問各大數據庫系統。大部分數據庫系統是支持多線程的,所以需要讀寫數據的時候:

      • 當你單線程讀寫數據的時候,已經用了command.Prepare(),甚至在允許表鎖定的情況下用了connection.BeginTransaction()還是覺得慢,那么,
      • 可以用多線程,這里可以Parallel下的方法,一般多線程下會快帶來幾倍的性能提升,如果你還是覺得慢,那么,
      • 使用bulk copy。一般大型數據庫系統都提供這個,譬如SQL Server提供SqlBulkCopy(本質上是BULK INSERT),譬如PostgreSQL提供的COPY命令
       
       

      隨著技術的發展,面向對象進入數據存儲和訪問領域。譬如數據訪問,這些解決方案叫O/RM,對象關系映射。在Java領域著名的Hibernate被移植到.NET成了NHibernate,Dapper也是一個不錯的輕量級的選擇。微軟也推出了自己的Entity Framework,后來并開源了。

      不過不管是Code First、Model  First還是Database First,這些OO化的O/RM,因為對象化這個過程,性能損耗不可避免,而且,不同的解決方案要么解決不了延遲加載,要么做不好緩存,或者動態生成的SQL效率低下。如果你需要絕對的高性能,還是應該手工寫SQL,并且封裝到存儲過程,這樣業務邏輯不需要在每次執行的時候都在客戶端/服務器不斷傳輸。想象一下,即便某業務邏輯執行速度很快,但數量巨大,譬如一天100萬次,當這個業務邏輯很復雜,譬如100K,那么一天光是這些SQL的網絡流量起碼是100GB,如果如果是封裝成SP,那么,可能就是100MB。

      同時,使用這些O/RM,一般會遇到對具體某種RDBMS的特性支持不好的情況,需要使用底層SQL直接調用操作,這樣O/RM就無法直接切換到別的數據庫系統了。

      NoSQL蓬勃發展,在傳統關系型數據庫系統中被常規化的數據(一條數據會被存儲到不同的字段甚至不同的表),現在作為一個json文件(字符串)被存儲到各種類型的NoSQL中。NoSQL優勢是快速的讀寫,因為避免了多表關聯的可能,一次讀取,一次寫入。但是真因為這樣,絕大部分NoSQL無法做跨表(集合)的關聯,因此一般的做法是用定時任務生成目標數據,這種解決方案有2個問題:數據非實時和冗余的空間占用,同時,json文件本身的所有屬性是鍵值對,所以空間占用遠遜于RDBMS。

      市面上不乏基于.NET的NoSQL,部分還是開源的,筆者覺得最好的一個是開源的STSDb,獨創的Waterfall索引比傳統的b+樹要跟高性能。

      大量業務系統都需要用到工作流。WF(Windows Workflow)是微軟額外推出的基于.NET的工作流系統,不過這個方案配置起來有點羅嗦。

       

      生態圈

       

      從別的成熟平臺中移植著名的項目是業界慣常的做法。一些著名/優秀的項目被移植到.NET,譬如Java世界的hibernate (nhibernate)、junit (nunit)、iText  (iTextSharp)、Quartz (Quartz.net)、Lucence (Lucence.net)、Log4j (log4net)。

      一個開放平臺的成熟,離不開社區的支持。開源/代碼托管網站,早期的有SourceForge.net、CodeProject等,后來微軟自己推出了自己的GotDotNet,后來變成了CodePlex.com,然而幾個月前這個項目已經停止運轉,大部分項目都被作者各自遷移到GitHub。

      .NET框架和C#從第一天開始,就作為ECMA標準公開了源代碼,這為后來的Mono和跨平臺打下了堅實的基礎。幾年前,微軟把.NET完全開源了,包括編譯器、框架、類庫等等。

      著名的Linux GUI解決方案GNOME之父Miguel de Icaza,創建了Mono項目,讓.NET真正跨平臺,在Linux、MacOS下運行。Mono項目同時帶來了SharpDevelop這個IDE,后來又被移植到別的平臺上成為了MonoDevelop。

      Mono項目近年被Ubuntu擁抱,跟隨標準發布預裝。

       

      今生

      .NET的發展腳步沒有停下來,它不斷進化,現在,.NET已經在各大平臺扎根。

      最近的15年周年紀念活動,Anders Hejlsberg被Channel 9邀請參與活動,并講述了他對C#的看法,他表示:“我也沒想到C#能如此興盛。”

      如果說.NET平臺是心臟,那么,語言就是骨絡。目前.NET平臺上3大主流開發語言有各自的演進路線。C#作為先鋒在新特性上不斷快速進化,譬如LINQ/Lambda、async/await并行計算等,當然動態特性也是值得提及的。如果一個東西走起來像鴨子,叫起來像鴨子,它可能不是一只鴨子而是被鴨子帶壞了的鸚鵡。如果你想知道C#的各種技術內幕,可以看Matt Warren的技術博客,他是C#語言委員會的成員之一,這個委員會決定每個版本的新特性。

      Roslyn作為新一代的編譯工具,使用C#編寫,終于實現了.NET的自舉,這是一個語言成熟的標志。

      開發工具

      不僅僅是各種語言跨平臺,微軟的開發工具也能跨平臺。Windows上最佳開發IDE Visual Studio現在不僅僅在Windows上跑,微軟推出的兄弟Visual Studio Code還支持Linux和MacOS,還有Visual Studio For Mac。

      相信做過開發的同學都對各種第三方依賴組件的引入、維護都很煩惱,NPM、webpack、Chocolatey、Maven Repository等都是著名的包管理解決方案,微軟效仿之,推出了NuGet。本質上NuGet包和Office系列的文件類似,都是zip文件,里面有一些元信息和實際文件。通過Visual Studio的項目Package菜單你可以直接生成NuGet包。早期的NuGet不允許直接下載包,非常惱人,必須通過客戶端如Visual Studio,現在允許了。

      如果你想架設自己的NuGet包管理平臺,可以使用ProGet。

       

      案例

      或許你會想,.NET到底有什么優秀的案例?

      如果你做Web開發,相信你聽過甚至用過OWIN項目,它包括了SignalR、Nancy、Katana等項目。如果你用過IoC,你應該聽過甚至用過Windsor,它是Castle項目的一員,包括了ActiveRecord、MonoRail等。相信你用過stackoverflow?它以及眾多兄弟網站,都屬于StackExchange,而這些所有網站都是基于ASP.NET的。微軟自家一些產品也是完全或者部分使用.NET實現的,譬如BizTalk、Blend等。

      如果你想了解更多的優秀.NET解決方案,可以看這個非常詳細的列表:https://github.com/Microsoft/dotnet/blob/master/dotnet-developer-projects.md

      了解或者開發過云應用嗎?業界領先的公有云提供商微軟Azure,這個平臺大部分技術都是基于.NET的。對了,Bing搜索引擎也是。

      Unity是流行的2D/3D游戲開發平臺,其腳本系統主要是Mono,它剛剛對外宣布支持最新版版本Mono。另外一個游戲引擎Godot,也是使用Mono作為腳本引擎。

      有些技術牛人,利用.NET打造自己的開源的操作系統。譬如比較早期的Cosmos OS ( https://www.gocosmos.org/ ),還有近期的FlingOS( http://www.flingos.co.uk/ )。由此可見.NET作為一個開發平臺的能力和潛力。

      為了實現跨CPU平臺(x86和ARM等),微軟為 Windows帶來了UWP,開發者可以使用多種開發語言(.NET家族的,甚至HTML/WinJS)開發Windows平臺應用,界面語言是XAML,這些應用不僅僅可以在Intel的x86平臺下跑,還可以在ARM上跑。大家還記得Windows Phone和Surface嗎?

      跨平臺

      之前說過Mono這個跨平臺開發解決方案,在支持Linux/MacOS的基礎上,它繼續進化,衍生出Xamarin項目,實現了對主流手機系統蘋果iOS、Google Android、微軟WP甚至三星Tizen的支持。

      2016年微軟收購了Xamarin,整合到Visual Studio里,并且將其開源,創始人Miguel de Icaza成為微軟的Distinguished Engineer。

      DotNet Anywhere (DNA)是另外一套跨平臺解決方案:https://github.com/chrisdunelm/DotNetAnywhere

      2016年,微軟為了大一統.NET平臺標準,推出了.NET Standard,可以把這個看成一個協議,而不是具體實現。具體實現是.NET完整版 4.x、.NET Core 2.x、Xamarin等。

      .NET完整版4.x現在統治Windows平臺,Xamarin復制移動平臺,而.NET Core則主打跨平臺,如Linux、MacOS、Docker、嵌入式設備、IoT等,譬如已經有Raspberry Pi等設備在運行.NET Core?;蛟S你不知道,Docker For Windows是用.NET編寫的。

      .NET Core做法和.NET完整版在API層面基本上一直和兼容,區別在于,.NET完整版是依賴本地GAC安裝/本地目錄的.NET程序集,而.NET Core是依賴NuGet包,所有基礎類庫都是NuGet包,而這些包不像老版本的node.js那樣都安裝到本地目錄,而是集中安裝到本機的NuGet庫里。

      和.NET Core匹配的有ASP.NET Core,允許開發人員開發在Linux等平臺跑的Web系統。

      .NET開發初期,大量借鑒Java這個平臺的優點,近年,Java作為平臺和作為語言,分別復制了,NET和C#的一些特性。JavaScript的一些新特性直接復制了C#的特性。

       
       

      高性能

      業界做性能測試的時候,一般會用這句話:“不服跑個分!”。網上有各種性能評測文章/比較網站,最近看過一個完整,各種語言互相比較,其中.NET和Java的結果差異不大,11個比較項目中,.NET 6 : 5 Java。

      .NET為了提高性能,通過如下幾個不同狀態下方式:

      • 語言:支持Parallel等并行計算
      • 編譯:編譯器會做各種優化,譬如代碼內聯,像常量和枚舉等,會直接把實際值復制到調用方
      • JIT:除了根據代碼訪問路徑進行動態即使編譯之外,還可以使用更可控的Profile Guided JIT
      • 本地化:可以使用多種方式進行本地化編譯,譬如ngen命令行和C# Native
      • LLVM:有一個開源項目,叫SharpLang,使用LLVM作為基礎對C#代碼進行編譯。R大指出還有 https://github.com/dotnet/llilc 這個項目
       
      以上是語言/框架層面的優化,如果做了上述的事情后仍然對性能不滿意,那么你可以:
      • 優化算法,有可能帶來數十倍的性能提升
      • 重構設計和實現,原來的設計可能是錯的,也可能是現在有更好的解決辦法,重構/重新實現可以改善性能
      • .NET運行時的調優
        • 如果你使用多線程(包括Parallel),那么你可以修改一下ThreadPool的MinThreads數量
        • 如果你調用HttpClient/HttpWebRequest等網絡方法,那么,你可以修改一下ServicePointManager的DefaultConcurrentConnectionLimit,因為微軟為了遵循古老的HTTP規則,對同一個網站最多只允許2個并發連接
        • 修改GC為Server模式
       
      如果你還需要更高效的解決方案,可以考慮Map Reduce分布式計算,所謂的分而治之

      如果你想深入研究如何編寫高性能的.NET程序,可以參考Ben Watson編寫的《Writing High-Performance .NET Code》這本書。

      如果你還是不滿足于性能表現,可以使用GPU加速,目前比較成熟的解決方案是AleaGPU,對C#的支持非常友好。

      將來

      Web前端開發技術日新月異,但同時也存在各種臟亂差的情況(筆者會另外撰文詳細述說)。近來各大瀏覽器加入了對Web Assembly的支持,Web Assembly允許開發人員用如C++等語言實現邏輯,然后編譯成二進制的Web Assembly。

      最近,微軟宣布ASP.NET項目引入了Blazor項目(取義Browser + Razor),這個項目是基于DotNet Anywhere的,允許開發人員用.NET + Razor實現前端功能。

      在Windows平臺上(x86和ARM),你可以使用.NET設計UWP應用,但其它平臺上,你不能用.NET做帶界面的應用。最近對外公布的AvaloniaUI,允許大家使用UWP類似的技術在Linux和MacOS上實現桌面應用,這個項目的名字看出來和當年的Avalon項目的關系了嗎?

      現在技術界喜歡搞cross play,譬如Windows 10下自帶了Linux子系統,SQL Server也可以在Linux上跑,JavaScript可以通過node.js寫服務器端代碼,.NET也可以寫Web Assembly做前端。

      .NET發展16年,為業界帶來各種新技術的同時,也給人類的發展做出了重大貢獻,它會繼續和老對手Java等一起齊頭并進,互相追趕和促進。

       

      謹以此文紀念我敬重于于2016年9月17日去世的 裝配腦袋 逝世兩周年。

       

      如果你看到這里,那告訴你一個消息:世界那么大,我想去看看。再次上路,去追求心中的理想。

       

      爆棧網

      爆棧網Kayow.com融合了我10多年來的經驗、心得、吸取的教訓,頻繁地發表高質量的技術文章: http://kayow.com

       

      版權所有

      所有文章內容版權所有,任何形式的轉發/使用都必須先征得本人書面同意。本人保留一切追究的權利。

      主站蜘蛛池模板: 啊轻点灬大JI巴太粗太长了在线| 又爽又黄又无遮掩的免费视频| 影音先锋AV成人资源站在线播放| 免费无码黄十八禁网站| 麻豆一区二区中文字幕| 日韩不卡在线观看视频不卡| 国产精品午夜福利片国产| 国产无码高清视频不卡| 久久综合精品成人一本| 无码AV无码免费一区二区| 美女内射毛片在线看免费人动物| 国内自拍小视频在线看| 欧美和黑人xxxx猛交视频| 亚洲 丝袜 另类 校园 欧美| 久久亚洲国产精品五月天| 亚洲人成网站77777在线观看| 凹凸国产熟女精品视频| 嫩b人妻精品一区二区三区| 久久精品国产再热青青青| 99久久久国产精品免费无卡顿| 人妻内射一区二区在线视频 | 一色屋精品视频在线观看| 毛葺葺老太做受视频| 免费现黄频在线观看国产| 扒开双腿猛进入喷水高潮叫声| 亚洲无人区一码二码三码| 久热这里只有精品12| 国产亚洲精品97在线视频一| 国产精品剧情亚洲二区| 97se亚洲国产综合自在线观看| 乱色老熟妇一区二区三区| 日本熟妇XXXX潮喷视频| 国产成人午夜福利院| 人妻精品动漫H无码中字| 公天天吃我奶躁我的在线观看| 国产最新AV在线播放不卡| 精品久久人人做爽综合| 忘忧草在线社区www中国中文 | 国产一区二区丰满熟女人妻| 日韩少妇人妻vs中文字幕| 国产睡熟迷奷系列网站|