CLR簡介(一)

来源:http://www.cnblogs.com/killmyday/archive/2016/03/11/5265209.html
-Advertisement-
Play Games

什麼是通用語言運行時(CLR),簡單來講: CLR是一個支持多種編程語言及多語言互操作,完整的高級虛擬機。 有點拗口,而且不是很有啟發性,但上面的文字是將又大又複雜的CLR的功能歸類以便容易理解的第一步。它從一萬英尺的高度來幫助我們理解CLR的設計目標。從這個高度明瞭CLR之後,我們可以深入其各個組


什麼是通用語言運行時(CLR),簡單來講:

CLR是一個支持多種編程語言及多語言互操作,完整的高級虛擬機。

有點拗口,而且不是很有啟發性,但上面的文字是將又大又複雜的CLR的功能歸類以便容易理解的第一步。它從一萬英尺的高度來幫助我們理解CLR的設計目標。從這個高度明瞭CLR之後,我們可以深入其各個組件了。

CLR: 一個(極少見的)完整編程平臺

每個程式在運行的時候都有驚人數量的運行時依賴。雖然程式很明顯都是由一種特定的編程語言寫就,但這隻是程式員編寫程式多種依據中的一種。每個有用的程式都需要某些 運行時函數庫 以便其能跟電腦的其它資源(如用戶輸入設備,磁碟文件,網路通信等)交互。程式也需要轉換成電腦硬體可以直接執行的某種格式。這些依賴的數量是如此之多,範圍之廣,使得編程語言的設計者通常都引用其它標準來規範它們。例如C++編程語言不會規定C++程式的格式,每個C++編譯器都會與特定的硬體架構(如x86架構)關聯,與特定的操作系統環境(如Windows,Linux或者Mac OS)關聯,這些架構和環境會規定可執行文件的文件格式以及載入的方式。因此,程式員不是在編寫一個“C++可執行程式”,而是“Windows X86可執行程式”或“Power PC Mac OS可執行程式”。

復用現有的硬體或操作系統標準通常都是好事情,但其使得在現有標準之上抽象出新的規範變得很難。例如,今天的操作系統沒有支持垃圾回收的堆。因此也就無法使用現有的標準來支持垃圾回收的介面(如,將字元串傳來傳去,不需要關註刪除它們)。同樣,一個典型的可執行文件格式只提供足夠運行程式的信息,但不足夠編譯器將其他可執行文件綁定在一起運行。比如說,C++程式一般都使用包含經常使用功能(如printf)的標準庫(在Windows里是msvcrt.dll),但只有這個庫是不夠的。沒有對應的頭文件(如,stdio.h),程式員是無法使用這些函數庫的。因此,已有的可執行文件格式標準不能同時描述可執行的文件格式,並添加其它一些信息。

CLR通過定義一個 [非常完整的規範]ecma-spec來描述一個程式從編譯、到部署時綁定依賴、到運行整個生命周期的所有信息。因此,除去其他細節,CLR定義了

  • 一套支持GC,並包含自己的執行程式基本操作的指令集(通用中間語言 - CLI)的虛擬機,這也就意味著CLR不需要依賴指定類型的CPU;
  • 一套描述程式里聲明的元素(如類型、值、變數等等)的元數據,以便編譯器在生成其它可執行文件時有足夠的信息來從“外部”調用程式里的功能;
  • 一個精確描述位元組應該如何在文件裡布局的文件格式,這樣我們在討論CLR EXE的時候,不與某個特定的操作系統或電腦硬體綁定;
  • 進程的生命周期語義,即一個CLR EXE引用其它CLR EXE的機制,和CLR在運行時找到進程依賴文件的規則;
  • 利用CLR內置功能(如垃圾回收、異常和泛型等)的類庫,其除了提供如整形、字元串、數組、列表和字典等基本功能意外,還提供瞭如文件、網路和UI交互等操作系統服務。

多編程語言支持

定義、規範和實現這些細節是一個艱巨的任務,這也就是類似CLR的完整抽象非常少的原因。實際上,大部分抽象都是為單個編程語言設計的。例如,Java運行時,Perl解釋器或者早期的Visual Basic運行時提供了類似的完整抽象。但CLR跟這些先行者不同之處在於其支持多種編程語言。可能除了Visual Basic(因為它採用了COM對象模型),僅使用單個編程語言的體驗是非常好的,但是要與其它編程語言互操作時體驗就有點差了。編程語言之間互操作之所以困難,是因為這些編程語言僅能通過操作系統提供的原語來與“外族”編程語言通信。而操作系統的抽象層次太低階(如操作系統不提供記憶體垃圾回收),就不得不採用一些複雜的技術。通過提供 通用語言運行時,CLR允許編程語言之間採用高階結構(如可GC的數據結構)通信,大量減輕了互操作的麻煩。

由於運行時在 許多 語言之間共用,這就意味著更多的資源可被支持。為一個編程語言實現好的調試器和性能分析工具需要大量的工作,因此只有一些很重要的編程語言才有完整的工具鏈支持。然而,CLR上實現的編程語言可以共用這些基礎架構,實現新的編程語言的工作量也大大縮減了。也許更重要的是,所有在CLR上實現的編程語言都可以訪問 所有 在CLR上實現的類庫。龐大且不斷增長的(嚴格調試和支持)功能是CLR如此成功的一個重要原因。

簡單來講,CLR是一個將位元組存到文件以創建和運行程式的完整規範。虛擬機可以使用不同編程語言寫就的類庫來運行這些程式。這個虛擬機,還有運行其上的不斷增長的類庫,就是我們說的通用語言運行時(CLR)。

來自文集:.NET框架源碼解析


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 開篇 非同步編程是程式設計的重點也是難點,還記得在剛開始接觸.net的時候,看的是一本c#的Winform實例教程,上面大部分都是教我們如何使用Winform的控制項以及操作資料庫的實例,那時候做的基本都是資料庫的demo,數據量也不大,程式在執行的時候基本上不會出現阻塞的情況。隨著不斷的深入.net,
  • 介於網路上充斥著大量的含糊其辭的Socket初級教程,擾亂著新手的學習方向,我來扼要的教一下新手應該怎麼合理的處理Socket這個玩意兒。 一般來說,教你C#下Socket編程的老師,很少會教你如何解決Socket粘包、半包問題。 更甚至,某些師德有問題的老師,根本就沒跟你說過Socket的粘包、半
  • 通過Unity依賴鏈跟蹤,給不同的對象註入不同的Logger,使得日誌記錄器的使用更加舒適。
  • 主要使用了Windows API 實現,你可以在你C盤下的system32文件夾中找到user32.dll,函數的說明在MSDN都有,只需要拿名字去搜一下就行 根據視窗的類名和視窗名稱獲取視窗句柄,成功返回一個視窗的句柄,否則返回0: [DllImport("User32.dll", EntryPo
  • Entity Framework Power Tools是一個由EntityFramework開發小組提供的工具,它可以從現有資料庫生成Fluent款式的Code First代碼。 大致來說,這個工具有這樣幾個功能:1) 按照現有資料庫結構,生成Code First POCO class、DbCon
  • 1 <Style x:Key="{x:Static GridView.GridViewScrollViewerStyleKey}" TargetType="{x:Type ScrollViewer}"> 2 <Setter Property="Focusable" Value="false"/> 3
  • 在.net開發客戶端的時候,一定會遇到用戶沒有安裝.net環境的問題,特別是現在win7,win8,win10多系統並用的時間段,很多開發者使用的是4.5的目標環境,用戶卻是使用win7的系統,這樣勢必會要安裝環境包 可是如果win7的用戶已經安裝4.5的環境呢?那麼用戶是否需要連帶著環境包一起下載
  • NuGet is a Visual Studio extension that makes it easy to install and update third-party libraries and tools in Visual Studio. NuGet is not mandatory f
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...