国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      用于模塊化反射的限制性訪問控制的制作方法

      文檔序號(hào):11592195閱讀:295來源:國(guó)知局
      用于模塊化反射的限制性訪問控制的制造方法與工藝

      對(duì)相關(guān)申請(qǐng)的交叉引用

      本申請(qǐng)要求于2015年9月8日提交的美國(guó)申請(qǐng)no.14/847,800的權(quán)益,該申請(qǐng)要求于2015年8月25日提交的美國(guó)臨時(shí)申請(qǐng)no.62/209,878的權(quán)益;本申請(qǐng)還要求于2015年9月8日提交的美國(guó)申請(qǐng)no.14/847,833的權(quán)益,該申請(qǐng)要求于2015年8月25日提交的美國(guó)臨時(shí)申請(qǐng)no.62/209,878的權(quán)益;本申請(qǐng)還要求于2015年8月25日提交的美國(guó)臨時(shí)申請(qǐng)no.62/209,878的權(quán)益,并且這些申請(qǐng)都通過引用被結(jié)合于此。在適當(dāng)?shù)姆秶鷥?nèi),做出對(duì)所有申請(qǐng)的優(yōu)先權(quán)的要求。

      本公開涉及模塊系統(tǒng)。具體而言,本公開涉及限制對(duì)模塊系統(tǒng)中的未暴露的模塊元素的訪問。



      背景技術(shù):

      模塊系統(tǒng)準(zhǔn)許定義一組模塊。模塊系統(tǒng)中的每個(gè)模塊與相應(yīng)的一組代碼對(duì)應(yīng)。模塊系統(tǒng)指定與特定模塊對(duì)應(yīng)的一組代碼可以如何訪問與其它模塊對(duì)應(yīng)的代碼。對(duì)于特定模塊,模塊描述符(可互換地稱為“模塊接口”)表達(dá)該特定模塊可能依賴的其它模塊。對(duì)另一個(gè)模塊的依賴性的聲明可以被稱為顯式依賴性。模塊描述符還表達(dá)由特定模塊暴露給聲明對(duì)該特定模塊的顯式依賴性的其它模塊的該特定模塊的元素。未聲明對(duì)特定模塊的顯式依賴性的其它模塊被限制訪問這樣的元素。

      常規(guī)地,模塊系統(tǒng)被設(shè)計(jì)為允許某些訪問技術(shù)和/或可訪問性配置覆蓋(override)在模塊描述符中聲明的訪問限制。在一個(gè)示例中,反射應(yīng)用編程接口(api)(諸如,javase中java.lang.reflect)允許測(cè)試框架模塊訪問特定模塊內(nèi)的模塊元素,即使那個(gè)模塊元素還沒有被該特定模塊暴露給測(cè)試框架模塊。在另一個(gè)示例中,.net平臺(tái)的反射api允許訪問任何模塊的內(nèi)部。

      在本部分中描述的方法是可以實(shí)行的方法,但不一定是先前已經(jīng)構(gòu)想或?qū)嵭械姆椒?。因此,除非另外指出,否則不應(yīng)當(dāng)假設(shè)在本部分中描述的任何方法僅僅由于這些方法包括在本部分中就被認(rèn)為是現(xiàn)有技術(shù)。

      附圖說明

      實(shí)施例在附圖的圖中通過示例而非限制的方式示出。應(yīng)當(dāng)注意,在本公開中對(duì)“一”或者“一個(gè)”實(shí)施例的引用不一定是相同的實(shí)施例,并且它們意味著至少一個(gè)實(shí)施例。在附圖中:

      圖1示出了在其中可以實(shí)踐本文所描述的技術(shù)的示例計(jì)算體系架構(gòu)。

      圖2是示出適于實(shí)現(xiàn)本文所描述的方法和特征的計(jì)算機(jī)系統(tǒng)的一個(gè)實(shí)施例的框圖。

      圖3示出了根據(jù)實(shí)施例的以框圖形式的示例虛擬機(jī)存儲(chǔ)器布局。

      圖4示出了根據(jù)一個(gè)或多個(gè)實(shí)施例的java模塊系統(tǒng)中的模塊的示例。

      圖5示出了根據(jù)一個(gè)或多個(gè)實(shí)施例的操作。

      圖6示出了根據(jù)一個(gè)或多個(gè)實(shí)施例的系統(tǒng)。

      具體實(shí)施方式

      在以下描述中,為了解釋的目的,闡述了許多具體細(xì)節(jié)以便提供透徹的理解??梢栽跊]有這些具體細(xì)節(jié)的情況下實(shí)踐一個(gè)或多個(gè)實(shí)施例。在一個(gè)實(shí)施例中描述的特征可以與在不同實(shí)施例中描述的特征組合。在一些示例中,眾所周知的結(jié)構(gòu)和設(shè)備參考框圖形式進(jìn)行描述,以便避免不必要地模糊本發(fā)明。

      1.總體概述

      2.體系架構(gòu)概述

      2.1示例類文件結(jié)構(gòu)

      2.2示例虛擬機(jī)體系架構(gòu)

      2.3加載、鏈接和初始化

      3.模塊系統(tǒng)中的模塊的模塊元素

      4.用于訪問模塊元素的訪問種類

      5.控制對(duì)模塊元素的訪問

      6.示例實(shí)施例

      7.其它方面;擴(kuò)展

      8.硬件概述

      1.總體概述

      一個(gè)或多個(gè)實(shí)施例包括嚴(yán)格控制對(duì)模塊系統(tǒng)中的模塊的訪問。

      在一個(gè)實(shí)施例中,如果第一模塊內(nèi)的模塊元素還沒有暴露給第二模塊,則由第二模塊對(duì)第一模塊內(nèi)的該模塊元素的訪問被嚴(yán)格禁止。由第二模塊對(duì)第一模塊的未暴露的模塊元素的訪問被嚴(yán)格禁止,而不管(a)未暴露的模塊元素是已用公開訪問修飾符聲明還是已用非公開訪問修飾符聲明,(b)與嘗試訪問第一模塊的未暴露的模塊元素的操作相關(guān)聯(lián)的訪問級(jí)別,以及(c)是否為未暴露的模塊元素設(shè)置了可訪問性覆蓋配置。在示例中,即使當(dāng)使用具有被設(shè)置用于嘗試訪問未暴露的模塊元素的可訪問性覆蓋配置的反射操作來嘗試訪問時(shí),消費(fèi)者模塊對(duì)提供者模塊的該未暴露的模塊元素的訪問也被禁止。

      在示例中,即使當(dāng)使用具有將未暴露的模塊元素設(shè)置為可公開訪問的可訪問性覆蓋配置的反射操作來嘗試訪問時(shí),由第二模塊對(duì)第一模塊內(nèi)的該未暴露的模塊元素的訪問也被嚴(yán)格禁止。

      在實(shí)施例中,如果第一模塊內(nèi)的特定模塊元素已暴露給第二模塊,則由第二模塊對(duì)該特定模塊元素的訪問可以被允許或者可以不被允許??梢曰谝粋€(gè)或多個(gè)因素來確定對(duì)訪問已暴露的特定模塊元素的許可,這些因素包括但不限于:(a)特定模塊元素是已用公開訪問修飾符聲明還是已用非公開訪問修飾符聲明,(b)包括該特定模塊元素的第二已暴露的模塊元素是已用公開訪問修飾符聲明還是已用非公開訪問修飾符聲明,(c)與嘗試訪問第一模塊的未暴露的模塊元素的操作相關(guān)聯(lián)的訪問級(jí)別,以及(d)是否為該未暴露的模塊元素設(shè)置了可訪問性覆蓋配置。

      在示例中,在第一模塊中的模塊元素是具有非公開訪問修飾符的字段聲明。該字段聲明在具有公開訪問修飾符的類聲明內(nèi)。通過暴露包括該類聲明(以及因此包括該字段聲明)的包,字段聲明和類聲明兩者都被暴露。如果第二模塊嘗試使用反射操作來訪問(具有非公開訪問修飾符的)字段聲明,則基于該反射操作是否為該字段聲明設(shè)置可訪問性覆蓋配置來允許訪問或者禁止訪問。如果沒有設(shè)置可訪問性覆蓋配置,則字段聲明中的非公開訪問修飾符指示第二模塊被禁止訪問該字段聲明。如果設(shè)置了可訪問性覆蓋配置,則字段聲明中的非公開訪問修飾符被覆蓋并且第二模塊被允許訪問該字段聲明。

      在本說明書中描述和/或在權(quán)利要求中描述的一個(gè)或多個(gè)實(shí)施例可以不包括在該總體概述部分中。

      2.體系架構(gòu)概述

      圖1示出了在其中可以實(shí)踐本文所描述的技術(shù)的示例體系架構(gòu)。關(guān)于示例體系架構(gòu)所描述的軟件和/或硬件組件可以被省略或與不同于本文所描述的功能的一組功能相關(guān)聯(lián)。根據(jù)一個(gè)或多個(gè)實(shí)施例,可以在環(huán)境內(nèi)使用本文中未描述的軟件和/或硬件組件。因此,示例環(huán)境不應(yīng)當(dāng)被認(rèn)為是限制任何權(quán)利要求的范圍。

      如圖1所示,計(jì)算體系架構(gòu)100包括源代碼文件101,源代碼文件101由編譯器102編譯成表示要被執(zhí)行的程序的類文件103。類文件103然后由執(zhí)行平臺(tái)112加載和執(zhí)行,執(zhí)行平臺(tái)112包括運(yùn)行時(shí)環(huán)境113、操作系統(tǒng)111以及使得能夠在運(yùn)行時(shí)環(huán)境113和操作系統(tǒng)之間通信的一個(gè)或多個(gè)應(yīng)用編程接口(api)110。運(yùn)行時(shí)環(huán)境112包括虛擬機(jī)104,虛擬機(jī)104包括各種組件,諸如存儲(chǔ)器管理器105(其可以包括垃圾收集器)、檢查類文件103的有效性的類文件驗(yàn)證器106、定位和構(gòu)建類的存儲(chǔ)器內(nèi)表示的類加載器107、用于執(zhí)行虛擬機(jī)104代碼的解釋器108以及用于產(chǎn)生經(jīng)優(yōu)化的機(jī)器級(jí)代碼的準(zhǔn)時(shí)(jit)編譯器109。

      在實(shí)施例中,計(jì)算體系架構(gòu)100包括源代碼文件101,源代碼文件101包含用特定編程語言(諸如java、c、c++、c#、ruby、perl等)編寫的代碼。因此,源代碼文件101遵循用于相關(guān)聯(lián)語言的一組特定語法和/或語義規(guī)則。例如,用java編寫的代碼遵循java語言規(guī)范。然而,由于規(guī)范隨時(shí)間被更新和修訂,因此源代碼文件101可以與指示源代碼文件101所遵循的規(guī)范的修訂版本的版本號(hào)相關(guān)聯(lián)。用來編寫源代碼文件101的確切編程語言通常不是關(guān)鍵的。

      在各種實(shí)施例中,編譯器102將根據(jù)針對(duì)程序員方便的規(guī)范編寫的源代碼轉(zhuǎn)換為可由特定機(jī)器環(huán)境直接執(zhí)行的機(jī)器代碼或目標(biāo)代碼,或者可由能夠在各種特定機(jī)器環(huán)境之上運(yùn)行的虛擬機(jī)104執(zhí)行的諸如字節(jié)碼之類的中間表示(“虛擬機(jī)代碼/指令”)。虛擬機(jī)指令可由虛擬機(jī)104以比源代碼更直接和高效的方式執(zhí)行。將源代碼轉(zhuǎn)換為虛擬機(jī)指令包括將源代碼功能從語言映射到利用底層資源(諸如數(shù)據(jù)結(jié)構(gòu))的虛擬機(jī)功能。通常,由程序員經(jīng)源代碼以簡(jiǎn)單術(shù)語呈現(xiàn)的功能被轉(zhuǎn)換成更復(fù)雜的步驟,這些步驟更直接地映射到由虛擬機(jī)104所駐留的底層硬件支持的指令集。

      一般而言,程序作為經(jīng)編譯的程序或經(jīng)解釋的程序來執(zhí)行。當(dāng)程序被編譯時(shí),代碼在執(zhí)行之前從第一語言全局變換為第二語言。由于變換代碼的工作是提前執(zhí)行的,因此經(jīng)編譯的代碼往往具有優(yōu)異的運(yùn)行時(shí)性能。此外,由于變換在執(zhí)行之前在全局發(fā)生,因此可以使用諸如常量合并(constantfolding)、死代碼消除(deadcodeelimination)、內(nèi)聯(lián)(inlining)等的技術(shù)來分析和優(yōu)化代碼。然而,取決于被執(zhí)行的程序,啟動(dòng)時(shí)間可能很長(zhǎng)。此外,插入新代碼將需要使程序下線、重新編譯和重新執(zhí)行。對(duì)于被設(shè)計(jì)為允許代碼在程序的執(zhí)行期間被插入的許多動(dòng)態(tài)語言(諸如java),純編譯的方法可能是不適當(dāng)?shù)?。?dāng)程序被解釋時(shí),程序的代碼在程序執(zhí)行時(shí)被逐行讀取并且被轉(zhuǎn)換為機(jī)器級(jí)指令。因此,程序具有短的啟動(dòng)時(shí)間(可以幾乎立即開始執(zhí)行),但是運(yùn)行時(shí)性能由于即時(shí)(onthefly)執(zhí)行變換而降低。此外,由于每條指令被單獨(dú)分析,因此依賴于程序的更全局地分析的許多優(yōu)化不能被執(zhí)行。

      在一些實(shí)施例中,虛擬機(jī)104包括解釋器108和jit編譯器109(或?qū)崿F(xiàn)這兩個(gè)方面的組件),并且使用解釋技術(shù)和編譯技術(shù)的組合來執(zhí)行程序。例如,虛擬機(jī)104可以初始地通過經(jīng)由解釋器108解釋表示程序的虛擬機(jī)指令來開始,同時(shí)跟蹤與程序行為相關(guān)的統(tǒng)計(jì)信息,這些統(tǒng)計(jì)信息諸如不同的代碼部分或代碼塊多頻繁地被虛擬機(jī)104執(zhí)行。一旦代碼塊超過閾值(變“熱”),虛擬機(jī)104就調(diào)取jit編譯器109來執(zhí)行對(duì)該塊的分析并且生成經(jīng)優(yōu)化的機(jī)器級(jí)指令,該經(jīng)優(yōu)化的機(jī)器級(jí)指令代替“熱”的代碼塊用于將來的執(zhí)行。由于程序往往花費(fèi)大部分時(shí)間執(zhí)行整個(gè)代碼的一小部分,所以只編譯程序的“熱”的部分可以提供與經(jīng)完全編譯的代碼相似的性能,但沒有啟動(dòng)懲罰。此外,盡管優(yōu)化分析被約束到被代替的“熱”塊,但是還存在比單獨(dú)轉(zhuǎn)換每個(gè)指令遠(yuǎn)遠(yuǎn)更大的優(yōu)化潛力。對(duì)于上述示例存在若干變體,諸如分層編譯。

      為了提供清楚的示例,源代碼文件101已被示為要由執(zhí)行平臺(tái)111執(zhí)行的程序的“頂層”表示。雖然計(jì)算體系架構(gòu)100將源代碼文件101繪為“頂層”程序表示,但是在其它實(shí)施例中,源代碼文件101可以是經(jīng)由將不同語言的代碼文件處理成源代碼文件101的語言的“更高級(jí)”編譯器接收到的中間表示。以下公開中的一些示例假設(shè)源代碼文件101遵循基于類的面向?qū)ο蟮木幊陶Z言。但是,這不是對(duì)利用本文所描述的特征的要求。

      在實(shí)施例中,編譯器102接收源代碼文件101作為輸入,并且將源代碼文件101轉(zhuǎn)換為以由虛擬機(jī)104所期望的格式的類文件103。例如,在jvm的上下文中,java虛擬機(jī)規(guī)范定義了期望類文件103遵循的特定類文件格式。在一些實(shí)施例中,類文件103包含已從源代碼文件101轉(zhuǎn)換的虛擬機(jī)指令。但是,在其它實(shí)施例中,類文件103也可以包含其它結(jié)構(gòu),諸如識(shí)別常量值的表和/或與各種結(jié)構(gòu)(類、字段、方法等)相關(guān)的元數(shù)據(jù)。

      以下討論假設(shè)類文件103中的每一個(gè)表示在源代碼文件101中定義的(或由編譯器102/虛擬機(jī)104動(dòng)態(tài)生成的)相應(yīng)的“類”。然而,上述假設(shè)不是嚴(yán)格的要求并且將取決于虛擬機(jī)104的實(shí)現(xiàn)。因此,無論類文件103的確切格式如何,本文所描述的技術(shù)仍然可以被執(zhí)行。在一些實(shí)施例中,類文件103被劃分為一個(gè)或多個(gè)“庫”或“包”,其中每一個(gè)包括提供相關(guān)功能的類的集合。例如,庫可以包含實(shí)現(xiàn)輸入/輸出(i/o)操作、數(shù)學(xué)工具、密碼技術(shù)、圖形實(shí)用工具等的一個(gè)或多個(gè)類文件。此外,一些類(或那些類中的字段/方法)可以包括將這些類(或那些類中的字段/方法)的使用限制在特定類/庫/包內(nèi)或限制到具有適當(dāng)許可的類的訪問限制。

      2.1示例類文件結(jié)構(gòu)

      圖2示出了根據(jù)實(shí)施例的以框圖形式的類文件200的示例結(jié)構(gòu)。為了提供清楚的示例,本公開的其余部分假設(shè)計(jì)算體系架構(gòu)100的類文件103遵循本部分中所描述的示例類文件200的結(jié)構(gòu)。然而,在實(shí)際環(huán)境中,類文件200的結(jié)構(gòu)將取決于虛擬機(jī)104的實(shí)現(xiàn)。此外,本文所討論的一個(gè)或多個(gè)特征可以修改類文件200的結(jié)構(gòu),以例如添加附加的結(jié)構(gòu)類型。因此,類文件200的確切結(jié)構(gòu)對(duì)于本文所描述的技術(shù)不是關(guān)鍵的。為了第2.1部分的目的,“類”或“當(dāng)前類”是指由類文件200表示的類。

      在圖2中,類文件200由類成員構(gòu)成,這些類成員包括但不限于常量表201、字段結(jié)構(gòu)208、類元數(shù)據(jù)204和方法結(jié)構(gòu)209。在實(shí)施例中,常量表201是除了其它功能之外還充當(dāng)類的符號(hào)表的數(shù)據(jù)結(jié)構(gòu)。例如,常量表201可以存儲(chǔ)與在源代碼文件101中使用的各種標(biāo)識(shí)符相關(guān)的數(shù)據(jù),諸如類型、范圍、內(nèi)容和/或位置。常量表201具有用于值結(jié)構(gòu)202(表示類型int、long、double、float、byte、string等的常量值)、類信息結(jié)構(gòu)203、名稱和類型信息結(jié)構(gòu)205、字段引用結(jié)構(gòu)206、以及由編譯器102從源代碼文件101導(dǎo)出的方法引用結(jié)構(gòu)207的條目。在實(shí)施例中,常量表201實(shí)現(xiàn)為將索引i映射到結(jié)構(gòu)j的數(shù)組。然而,常量表201的確切實(shí)現(xiàn)不是關(guān)鍵的。

      在一些實(shí)施例中,常量表201的條目包括對(duì)其它常量表201條目進(jìn)行索引的結(jié)構(gòu)。例如,用于表示串的值結(jié)構(gòu)202之一的條目可以保持識(shí)別其“類型”為串的標(biāo)簽,以及可以保持對(duì)常量表201的存儲(chǔ)表示該串的ascii字符的char、byte或int值的一個(gè)或多個(gè)其它值結(jié)構(gòu)202的索引。

      在實(shí)施例中,常量表201的字段引用結(jié)構(gòu)206將對(duì)表示定義字段的類信息結(jié)構(gòu)203之一的索引保持在常量表201中,并且將對(duì)提供該字段的名稱和描述符的名稱和類型信息結(jié)構(gòu)205之一的索引保持在常量表201中。常量表201的方法引用結(jié)構(gòu)207將對(duì)表示定義方法的類的類信息結(jié)構(gòu)203之一的索引保持在常量表201中,并且將對(duì)提供該方法的名稱和描述符的名稱和類型信息結(jié)構(gòu)205之一的索引保持在常量表201中。類信息結(jié)構(gòu)203將對(duì)保持相關(guān)聯(lián)的類的名稱的值結(jié)構(gòu)202之一的索引保持在常量表201中。

      名稱和類型信息結(jié)構(gòu)205將對(duì)存儲(chǔ)字段/方法的名稱的值結(jié)構(gòu)202之一的索引保持在常量表201中,并且將對(duì)存儲(chǔ)描述符的值結(jié)構(gòu)202之一的索引保持在常量表201中。

      在實(shí)施例中,類元數(shù)據(jù)204包括用于類的元數(shù)據(jù),諸如(一個(gè)或多個(gè))版本號(hào)、常量池中的條目數(shù)量、字段數(shù)量、方法數(shù)量、訪問標(biāo)志(類是否是公開的(public)、非公開的(non-public)、最終的(final)、抽象的(abstract)等)、常量表201中的對(duì)識(shí)別當(dāng)前類的類信息結(jié)構(gòu)203之一的索引、常量表201中的對(duì)識(shí)別超類(superclass)(如果有的話)的類信息結(jié)構(gòu)203之一的索引,等等。

      在實(shí)施例中,字段結(jié)構(gòu)208表示識(shí)別類的各個(gè)字段的一組結(jié)構(gòu)。字段結(jié)構(gòu)208為類的每個(gè)字段存儲(chǔ)字段的訪問者標(biāo)志(字段是否是靜態(tài)的(static)、公開的(public)、非公開的(non-public)、最終的(final)等)、對(duì)常量表201中保持字段的名稱的值結(jié)構(gòu)202之一的索引、以及對(duì)常量表201中保持字段的描述符的值結(jié)構(gòu)202之一的索引。

      在實(shí)施例中,方法結(jié)構(gòu)209表示識(shí)別類的各個(gè)方法的一組結(jié)構(gòu)。方法結(jié)構(gòu)209為類的每個(gè)方法存儲(chǔ)方法的訪問者標(biāo)志(例如,方法是否是靜態(tài)的(static)、公開的(public)、非公開的(non-public)、同步的(synchronized)等)、對(duì)常量表201中保持方法的名稱的值結(jié)構(gòu)202之一的索引、對(duì)常量表201中保持方法的描述符的值結(jié)構(gòu)202之一的索引、以及與如在源代碼文件101中定義的方法的主體對(duì)應(yīng)的虛擬機(jī)指令。

      在實(shí)施例中,描述符表示字段或方法的類型。例如,描述符可以實(shí)現(xiàn)為遵循特定語法的串。雖然確切的語法不是重要的,但以下將描述幾個(gè)示例。

      在描述符表示字段的類型的示例中,描述符識(shí)別由該字段保持的數(shù)據(jù)的類型。在實(shí)施例中,字段可以保持基本類型、對(duì)象或數(shù)組。當(dāng)字段保持基本類型時(shí),描述符是識(shí)別基本類型的串(例如,“b”=byte、“c”=char、“d”=double、“f”=float、“i”=int、“j”=longint等)。當(dāng)字段保持對(duì)象時(shí),描述符是識(shí)別對(duì)象的類名稱(例如,“l(fā)classname”)的串。在這種情況下,“l(fā)”指示引用,因此“l(fā)classname”表示對(duì)類classname的對(duì)象的引用。當(dāng)字段是數(shù)組時(shí),描述符識(shí)別由數(shù)組保持的類型。例如,“[b”指示字節(jié)數(shù)組,其中“[”指示數(shù)組并且“b”指示該數(shù)組保持基本類型字節(jié)。然而,由于數(shù)組可以嵌套,因此數(shù)組的描述符也可以指示嵌套。例如,“[[lclassname”指示數(shù)組,其中每個(gè)索引數(shù)組,該數(shù)組保持類classname的對(duì)象。在一些實(shí)施例中,classname是完全限定的,并且包括類的簡(jiǎn)單名稱以及類的路徑名。例如,classname可以指示文件存儲(chǔ)在包、庫或托管類文件200的文件系統(tǒng)中的什么地方。

      在方法的情況下,描述符識(shí)別方法的參量和方法的返回類型。例如,方法描述符可以按照一般形式“({parameterdescriptor})returndescriptor”(即“({參量描述符})返回描述符”),其中{parameterdescriptor}是表示參量的字段描述符的列表,并且returndescriptor是識(shí)別返回類型的字段描述符。例如,串“v”可以用來表示void返回類型。因此,在源代碼文件101中定義為“objectm(inti,doubled,threadt){...}”的方法與描述符“(idlthread)lobject”匹配。

      在實(shí)施例中,保持在方法結(jié)構(gòu)209中的虛擬機(jī)指令包括引用常量表201的條目的操作。使用java作為示例,考慮以下類:

      在以上示例中,java方法add12andl3在類a中定義,不帶參量,并且返回整數(shù)。方法add12and13的主體調(diào)用類b的靜態(tài)方法addtwo,靜態(tài)方法addtwo采用常整數(shù)值12和13作為參量,并且返回結(jié)果。因此,在常量表201中,編譯器102除其它條目之外還包括與對(duì)方法b.addtwo的調(diào)用對(duì)應(yīng)的方法引用結(jié)構(gòu)。在java中,對(duì)方法的調(diào)用向下編譯為jvm的字節(jié)碼中的invoke(調(diào)取)命令(在這種情況下為invokestatic,因?yàn)閍ddtwo是類b的靜態(tài)方法)。invoke命令被提供常量表201中的與方法引用結(jié)構(gòu)對(duì)應(yīng)的索引,該方法引用結(jié)構(gòu)識(shí)別定義addtwo的類“b”、addtwo的名稱“addtwo”、以及addtwo的描述符“(ii)i”。例如,假設(shè)上述方法引用存儲(chǔ)在索引4處,則字節(jié)碼指令可以表現(xiàn)為“invokestatic#4”。

      由于常量表201利用具有攜帶識(shí)別信息的結(jié)構(gòu)(而不是對(duì)存儲(chǔ)器位置的直接引用)來符號(hào)地引用類、方法和字段,因此常量表201的條目被稱為“符號(hào)引用”。符號(hào)引用被用于類文件103的一個(gè)原因是因?yàn)樵谝恍?shí)施例中編譯器102不知道類一旦被加載到運(yùn)行時(shí)環(huán)境112中將如何被存儲(chǔ)以及存儲(chǔ)在哪里。如將在2.3部分中所描述的,在所引用的類(及相關(guān)聯(lián)的結(jié)構(gòu))已被加載到運(yùn)行時(shí)環(huán)境中并且被分配具體存儲(chǔ)器位置之后,最終符號(hào)引用的運(yùn)行時(shí)表示被虛擬機(jī)104解析為實(shí)際的存儲(chǔ)器地址。

      2.2示例虛擬機(jī)體系架構(gòu)

      圖3示出了根據(jù)實(shí)施例的以框圖形式的示例虛擬機(jī)存儲(chǔ)器布局300。為了提供清楚的示例,剩余的討論將假設(shè)虛擬機(jī)104遵循圖3中繪出的虛擬機(jī)存儲(chǔ)器布局300。此外,雖然虛擬機(jī)存儲(chǔ)器布局300的組件可以被稱為存儲(chǔ)器“區(qū)域”,但是不要求這些存儲(chǔ)器區(qū)域是連續(xù)的。

      在圖3所示的示例中,虛擬機(jī)存儲(chǔ)器布局300被劃分為共享區(qū)域301和線程區(qū)域307。共享區(qū)域301表示存儲(chǔ)器中的、在其中存儲(chǔ)在虛擬機(jī)104上執(zhí)行的各個(gè)線程之間共享的結(jié)構(gòu)的區(qū)域。共享區(qū)域301包括堆302和按類(per-class)區(qū)域303。在實(shí)施例中,堆302表示從中分配用于類實(shí)例和數(shù)組的存儲(chǔ)器的運(yùn)行時(shí)數(shù)據(jù)區(qū)域。在實(shí)施例中,按類區(qū)域303表示在其中存儲(chǔ)與各個(gè)類有關(guān)的數(shù)據(jù)的存儲(chǔ)器區(qū)域。在實(shí)施例中,對(duì)于每個(gè)被加載的類,按類區(qū)域303包括表示來自類的常量表201的數(shù)據(jù)的運(yùn)行時(shí)常量池304、字段和方法數(shù)據(jù)306(例如,以保持類的靜態(tài)字段)以及表示用于類的方法的虛擬機(jī)指令的方法代碼305。

      線程區(qū)域307表示在其中存儲(chǔ)特定于各個(gè)線程的結(jié)構(gòu)的存儲(chǔ)器區(qū)域。在圖3中,線程區(qū)域307包括線程結(jié)構(gòu)308和線程結(jié)構(gòu)311,它們表示由不同線程利用的按線程(per-thread)結(jié)構(gòu)。為了提供清楚的示例,圖3中繪出的線程區(qū)域307假設(shè)兩個(gè)線程正在虛擬機(jī)104上執(zhí)行。但是,在實(shí)際環(huán)境中,虛擬機(jī)104可以執(zhí)行任何任意數(shù)量的線程,其中線程結(jié)構(gòu)的數(shù)量相應(yīng)地縮放。

      在實(shí)施例中,線程結(jié)構(gòu)308包括程序計(jì)數(shù)器309和虛擬機(jī)堆棧310。類似地,線程結(jié)構(gòu)311包括程序計(jì)數(shù)器312和虛擬機(jī)堆棧313。在實(shí)施例中,程序計(jì)數(shù)器309和程序計(jì)數(shù)器312存儲(chǔ)由虛擬機(jī)指令的相應(yīng)的線程執(zhí)行的該虛擬機(jī)指令的當(dāng)前地址。

      因此,當(dāng)線程逐步通過指令時(shí),程序計(jì)數(shù)器被更新以維護(hù)對(duì)當(dāng)前指令的索引。在實(shí)施例中,虛擬機(jī)堆棧310和虛擬機(jī)堆棧313各自存儲(chǔ)用于其相應(yīng)線程的、保持局部變量和部分結(jié)果并且還用于方法調(diào)取和返回的幀(frame)。

      在實(shí)施例中,幀是用來存儲(chǔ)數(shù)據(jù)和部分結(jié)果、返回方法的值、以及執(zhí)行動(dòng)態(tài)鏈接的數(shù)據(jù)結(jié)構(gòu)。每次調(diào)取方法時(shí),創(chuàng)建新的幀。當(dāng)使得幀生成的方法完成時(shí),幀被銷毀。因此,當(dāng)線程執(zhí)行方法調(diào)取時(shí),虛擬機(jī)104生成新幀并將該幀推送到與該線程相關(guān)聯(lián)的虛擬機(jī)堆棧上。

      當(dāng)方法調(diào)取完成時(shí),虛擬機(jī)104將方法調(diào)取的結(jié)果傳遞回到先前的幀,并將當(dāng)前幀從堆棧中彈出。在實(shí)施例中,對(duì)于給定的線程,在任意點(diǎn)處有一個(gè)幀是活動(dòng)的。這個(gè)活動(dòng)幀被稱為當(dāng)前幀,使得生成當(dāng)前幀的方法被稱為當(dāng)前方法,并且當(dāng)前方法所屬的類被稱為當(dāng)前類。

      2.3加載、鏈接和初始化

      在實(shí)施例中,虛擬機(jī)104動(dòng)態(tài)地加載、鏈接和初始化類。加載是找到具有特定名稱的類并在運(yùn)行時(shí)環(huán)境112的存儲(chǔ)器內(nèi)從那個(gè)類的相關(guān)聯(lián)類文件200創(chuàng)建表示的過程。例如,為類在虛擬機(jī)存儲(chǔ)器布局300的按類區(qū)域303內(nèi)創(chuàng)建運(yùn)行時(shí)常量池304、方法代碼305以及字段和方法數(shù)據(jù)306。鏈接是取得類的存儲(chǔ)器中表示并將其與虛擬機(jī)104的運(yùn)行時(shí)狀態(tài)組合,使得類的方法可以被執(zhí)行的過程。初始化是執(zhí)行類構(gòu)造函數(shù)(constructor)以設(shè)置字段和類的方法數(shù)據(jù)306的開始狀態(tài)和/或?yàn)榻?jīng)初始化的類在堆302上創(chuàng)建類實(shí)例的過程。

      以下是可以由虛擬機(jī)104實(shí)現(xiàn)的加載、鏈接和初始化技術(shù)的示例。然而,在許多實(shí)施例中,這些步驟可以被交錯(cuò),使得初始類被加載,然后在鏈接期間,第二個(gè)類被加載以解析在第一個(gè)類中找到的符號(hào)引用,這繼而導(dǎo)致第三個(gè)類被加載,等等。因此,通過加載、鏈接和初始化階段的進(jìn)展可以因類而異。此外,一些實(shí)施例可以延遲(“懶惰”執(zhí)行)加載、鏈接和初始化過程中的一個(gè)或多個(gè)功能,直到實(shí)際需要該類。例如,方法引用的解析可以被延遲,直到調(diào)取該方法的虛擬機(jī)指令被執(zhí)行。因此,對(duì)于各個(gè)類執(zhí)行步驟的確切時(shí)間在各種實(shí)現(xiàn)之間會(huì)非常不同。

      為了開始加載過程,虛擬機(jī)104通過調(diào)取加載初始類的類加載器107來啟動(dòng)。指定初始類的技術(shù)在實(shí)施例之間將是不同的。例如,一種技術(shù)可以使虛擬機(jī)104在啟動(dòng)時(shí)接受指定初始類的命令行參數(shù)。

      為了加載類,類加載器107剖析與該類對(duì)應(yīng)的類文件200,并且確定類文件200是否是良好構(gòu)造的(滿足虛擬機(jī)104的語法期望)。如果類文件200不是良好構(gòu)造的,則類加載器107生成錯(cuò)誤。例如,在java中,錯(cuò)誤可能以異常(exception)的形式生成,其中異常被拋出給異常處理器進(jìn)行處理。否則,類加載器107通過為類在按類區(qū)域303內(nèi)分配運(yùn)行時(shí)常量池304、方法代碼305以及字段和方法數(shù)據(jù)306來生成該類的存儲(chǔ)器中表示。

      在一些實(shí)施例中,當(dāng)類加載器107加載類時(shí),類加載器107還遞歸地加載被加載類的超類。例如,虛擬機(jī)104可以確保在繼續(xù)特定類的加載、鏈接和初始化過程之前,該特定類的超類被加載、鏈接和/或初始化。

      在鏈接期間,虛擬機(jī)104驗(yàn)證類、準(zhǔn)備類、并且執(zhí)行在類的運(yùn)行時(shí)常量池304中定義的符號(hào)引用的解析。

      為了驗(yàn)證類,虛擬機(jī)104檢查類的存儲(chǔ)器中表示在結(jié)構(gòu)上是否正確。例如,虛擬機(jī)104可以檢查除通用類object之外的每個(gè)類具有超類、檢查最終類沒有子類以及最終方法沒有被覆蓋、檢查常量池條目是否彼此一致、檢查當(dāng)前類是否具有對(duì)常量池304中引用的類/字段/結(jié)構(gòu)的正確訪問許可、檢查方法的虛擬機(jī)104代碼將不會(huì)引起意外行為(例如,確保跳轉(zhuǎn)指令不會(huì)將虛擬機(jī)104發(fā)送到超出該方法的結(jié)束),等等。在驗(yàn)證期間執(zhí)行的確切檢查取決于虛擬機(jī)104的實(shí)現(xiàn)。在一些情況下,驗(yàn)證會(huì)導(dǎo)致附加的類被加載,但不一定要求那些類在繼續(xù)之前也被鏈接。例如,假設(shè)類a包含對(duì)類b的靜態(tài)字段的引用。在驗(yàn)證期間,虛擬機(jī)104可以檢查類b,以確保被引用的靜態(tài)字段實(shí)際存在,這可能導(dǎo)致類b的加載,但不一定導(dǎo)致類b的鏈接或初始化。然而,在一些實(shí)施例中,某些驗(yàn)證檢查可以被延遲直到稍晚的階段,諸如在符號(hào)引用的解析期間被檢查。例如,一些實(shí)施例可以延遲檢查對(duì)符號(hào)引用的訪問許可,直到那些引用被解析。

      為了準(zhǔn)備類,虛擬機(jī)104將位于該類的字段和方法數(shù)據(jù)306內(nèi)的靜態(tài)字段初始化為默認(rèn)值。在某些情況下,將靜態(tài)字段設(shè)置為默認(rèn)值可能與運(yùn)行類的構(gòu)造函數(shù)不同。例如,驗(yàn)證過程可以將靜態(tài)字段清零或?qū)⑵湓O(shè)置為構(gòu)造函數(shù)期望那些字段在初始化期間具有的值。

      在解析期間,虛擬機(jī)104從包括在類的運(yùn)行時(shí)常量池304中的符號(hào)引用動(dòng)態(tài)地確定具體的存儲(chǔ)器地址。為了解析符號(hào)引用,虛擬機(jī)104利用類加載器107加載在符號(hào)引用中識(shí)別出的類(如果尚未加載)。一旦被加載,虛擬機(jī)104就知道所引用的類及其字段/方法在按類區(qū)域303內(nèi)的存儲(chǔ)器位置。然后,虛擬機(jī)104用對(duì)所引用的類、字段或方法的具體存儲(chǔ)器位置的引用替換符號(hào)引用。在實(shí)施例中,虛擬機(jī)104將解析進(jìn)行高速緩存,以在當(dāng)虛擬機(jī)104處理另一個(gè)類時(shí)遇到相同類/名稱/描述符的情況下進(jìn)行重用。例如,在一些情況下,類a和類b可能調(diào)取類c的相同方法。因此,當(dāng)對(duì)類a執(zhí)行解析時(shí),該結(jié)果可以被高速緩存并且在解析類b中的相同符號(hào)引用期間被重用以減少開銷。

      在一些實(shí)施例中,在鏈接期間解析符號(hào)引用的步驟是可選的。例如,實(shí)施例可以以“懶惰”的方式執(zhí)行符號(hào)解析,從而延遲解析的步驟直到需要所引用的類/方法/字段的虛擬機(jī)指令被執(zhí)行。

      在初始化期間,虛擬機(jī)104執(zhí)行類的構(gòu)造函數(shù)以設(shè)置該類的開始狀態(tài)。例如,初始化可以初始化類的字段和方法數(shù)據(jù)306并且生成/初始化由構(gòu)造函數(shù)創(chuàng)建的堆302上的任何類實(shí)例。例如,用于類的類文件200可以指定特定方法是用于設(shè)置開始狀態(tài)的構(gòu)造函數(shù)。因此,在初始化期間,虛擬機(jī)104執(zhí)行該構(gòu)造函數(shù)的指令。

      在一些實(shí)施例中,虛擬機(jī)104通過初始地檢查字段/方法是否在所引用的類中被定義來執(zhí)行對(duì)字段和方法引用的解析。否則,虛擬機(jī)104針對(duì)所引用的字段/方法遞歸地搜索所引用的類的超類,直到定位該字段/方法或者到達(dá)頂級(jí)超類,在到達(dá)頂級(jí)超類的情況下生成錯(cuò)誤。

      模塊系統(tǒng)中的模塊的模塊元素

      一個(gè)或多個(gè)實(shí)施例可應(yīng)用于模塊系統(tǒng)。模塊系統(tǒng)內(nèi)的每個(gè)模塊與相應(yīng)的一組代碼對(duì)應(yīng)(稱為“模塊代碼”)。每個(gè)模塊與一個(gè)或多個(gè)模塊元素相關(guān)聯(lián)。如本文所指的模塊元素與模塊代碼的一部分對(duì)應(yīng)。模塊元素(模塊代碼的部分)本身可以包括附加的模塊元素(模塊代碼的子部分)。

      用不同編程語言實(shí)現(xiàn)的模塊系統(tǒng)可以用不同類型的模塊元素來定義。為了解釋的目的,本文所述的一些示例指java模塊系統(tǒng)中的模塊的特定模塊元素。但是,實(shí)施例同樣可應(yīng)用于用其它編程語言實(shí)現(xiàn)的模塊系統(tǒng)中的不同類型的模塊元素。

      在java模塊系統(tǒng)中,每個(gè)模塊包括一個(gè)或多個(gè)包。每個(gè)包包括一個(gè)或多個(gè)類。每個(gè)類包括一個(gè)或多個(gè)類成員,諸如字段和方法。如本文所指的方法包括可以被調(diào)取用于通過實(shí)例化類來創(chuàng)建對(duì)象的構(gòu)造函數(shù)。如本文關(guān)于java模塊系統(tǒng)所提及的,模塊元素可以包括包、類或類成員。

      暴露模塊元素

      在實(shí)施例中,模塊的模塊元素可以暴露給另一個(gè)模塊或者可以不暴露給另一個(gè)模塊。在java模塊系統(tǒng)中,當(dāng)與模塊對(duì)應(yīng)的模塊描述符包括其中包被識(shí)別為參量的“exports”表達(dá)式時(shí),包可以由模塊暴露。包可以被輸出到一組指定的模塊(稱為“限定性輸出”)或被輸出到模塊系統(tǒng)中的所有其它模塊(稱為“非限定性輸出”)。

      如果一組條件中的任何條件被滿足,則提供者模塊的模塊元素可以由提供者模塊暴露給消費(fèi)者模塊。該組條件可以包括但不限于(a)在提供者模塊的描述符內(nèi)將模塊元素經(jīng)由限定性或非限定性輸出暴露給消費(fèi)者模塊的聲明,(b)經(jīng)由接口(例如,命令行接口)接收到的用戶指令,(c)由運(yùn)行時(shí)環(huán)境基于檢測(cè)到與暴露模塊元素的許可相關(guān)聯(lián)的觸發(fā)事件而做出的確定,或(d)指示模塊系統(tǒng)暴露模塊元素的任何其它指令。

      特定模塊元素可以通過暴露該特定模塊元素本身或通過暴露包括該特定模塊元素的另一個(gè)模塊元素來暴露。在一個(gè)示例中,可以通過暴露包括類的包來暴露類。類的類成員也通過暴露包括該類的包而被暴露。

      一個(gè)或多個(gè)實(shí)施例涉及訪問模塊系統(tǒng)中的模塊的模塊元素。嘗試訪問的模塊在本文被稱為消費(fèi)者模塊,并且被訪問的模塊在本文被稱為提供者模塊。針對(duì)不同的訪問操作,模塊可以用作消費(fèi)者模塊或者用作提供者模塊。

      在實(shí)施例中,確定提供者模塊的模塊元素是否可以由消費(fèi)者模塊訪問是至少部分地基于提供者模塊中的模塊元素是否已被暴露給消費(fèi)者模塊。確定提供者模塊的模塊元素是否可以由消費(fèi)者模塊訪問的訪問控制在第5部分“控制對(duì)模塊元素的訪問”中進(jìn)一步描述。

      用于模塊元素的訪問修飾符

      在實(shí)施例中,模塊元素利用訪問修飾符來聲明。訪問修飾符識(shí)別模塊元素的可訪問性配置??稍L問性配置聲明模塊元素是(a)可公開訪問的或(b)不可公開訪問的。在一個(gè)示例中,修飾符“public(公開)”指示模塊元素是可公開訪問的,并且修飾符“private(私有)”指示模塊元素不是可公開訪問的。但是,所聲明的訪問修飾符本身不控制模塊元素從模塊的外部是可訪問的還是不可訪問的。確定提供者模塊的模塊元素是否可以由消費(fèi)者模塊訪問的訪問控制在第5部分“控制對(duì)模塊元素的訪問”中進(jìn)一步描述。

      4.可能需要由消費(fèi)者模塊訪問提供者模塊的模塊元素的操作

      在實(shí)施例中,不同種類的操作需要由消費(fèi)者模塊訪問提供者模塊的模塊元素。

      可以對(duì)字節(jié)碼執(zhí)行操作以枚舉、分析和/或分類字節(jié)碼的部分。用于訪問模塊元素的操作的一些示例包括在java反射api中識(shí)別出的反射操作。

      在實(shí)施例中,操作包括獲取或設(shè)置模塊元素的值,其中(a)模塊元素表示字段,(b)獲取或設(shè)置相對(duì)于對(duì)象執(zhí)行,以及(c)該對(duì)象是另一個(gè)模塊元素(例如,包括該字段的類)的實(shí)例。一組示例操作包括但不限于:

      (a)getfield(stringname):返回field(字段)對(duì)象,該field對(duì)象反映class(類)對(duì)象(其中命令是針對(duì)該class對(duì)象執(zhí)行的)所表示的類或接口的指定字段。

      (b)getfields():返回包含field對(duì)象的數(shù)組,該field對(duì)象的數(shù)組反映class對(duì)象(其中命令是針對(duì)該class對(duì)象執(zhí)行的)所表示的類或接口的所有字段。

      (c)getdeclaredfields():返回field對(duì)象數(shù)組,該field對(duì)象的數(shù)組反映class對(duì)象(其中命令是針對(duì)該class對(duì)象執(zhí)行的)所表示的類或接口所聲明的所有字段。

      (d)getdeclaredmethods():返回method(方法)對(duì)象數(shù)組,該method對(duì)象數(shù)組反映class對(duì)象(其中命令是針對(duì)該class對(duì)象執(zhí)行的)所表示的類或接口所聲明的所有方法。

      (e)getsuperclass():返回表示類(其中命令是針對(duì)該類執(zhí)行的)所表示的實(shí)體(類、接口、原始類型或void)的超類的類。

      (f)set(objectobj,objectvalue):將指定的對(duì)象參數(shù)上的field對(duì)象(其中命令是針對(duì)該field對(duì)象執(zhí)行的)所表示的字段的值設(shè)置為指定的新值。

      (g)get(objectobj):返回指定的對(duì)象上的field(其中命令是針對(duì)該field執(zhí)行的)所表示的字段的值。

      在實(shí)施例中,操作包括消費(fèi)者模塊調(diào)取提供者模塊的模塊元素。作為方法的模塊元素可以利用反射技術(shù)或者不利用反射技術(shù)來調(diào)取。用于使用反射來調(diào)取方法的一個(gè)示例命令包括java.lang.reflect.method.invoke()。第一參數(shù)是要對(duì)其調(diào)取特定方法的對(duì)象實(shí)例。如果該方法是靜態(tài)的,則第一參數(shù)可以為空(null)。后續(xù)的參數(shù)是該方法的參數(shù)。

      在實(shí)施例中,操作包括消費(fèi)者模塊實(shí)例化提供者模塊的模塊元素。類(提供者模塊的第一模塊元素)可以由消費(fèi)者模塊通過調(diào)取該類的構(gòu)造函數(shù)(提供者模塊的第二模塊元素)來實(shí)例化。

      在示例中,類spaceship是提供者模塊中的第一模塊元素。類spaceship包括第二模塊元素,第二模塊元素是方法聲明firemissile()。單獨(dú)的類commandcenter是消費(fèi)者模塊中的模塊元素。類commandcenter(消費(fèi)者模塊的模塊元素)可以包括操作以:(a)實(shí)例化類型spaceship(提供者模塊的模塊元素)的對(duì)象和(b)在來自(a)的spaceship的實(shí)例上調(diào)取方法firemissile()。

      5.控制對(duì)模塊元素的訪問

      如上所述,一個(gè)或多個(gè)操作需要由消費(fèi)者模塊訪問提供者模塊的模塊元素。一個(gè)或多個(gè)實(shí)施例包括控制由消費(fèi)者模塊對(duì)提供者模塊的模塊元素的訪問??刂圃L問包括允許訪問或禁止訪問。如果由消費(fèi)者模塊對(duì)提供者模塊的模塊元素的訪問被允許,則操作被成功地編譯或執(zhí)行。如果由消費(fèi)者模塊對(duì)提供者模塊的模塊元素的訪問被禁止,則操作可以不被成功地編譯和/或可以不被成功地執(zhí)行。如本文所述,用于控制對(duì)特定類型的模塊元素的訪問的因素可應(yīng)用于控制對(duì)另一種類型的模塊元素的訪問。

      圖4示出了根據(jù)一個(gè)或多個(gè)實(shí)施例的在java模塊系統(tǒng)中的模塊的示例。(使用java模塊系統(tǒng)或其它模塊系統(tǒng)定義的)其它模塊可以包括比圖4中所示更多、更少和/或不同的模塊元素。模塊(例如,模塊402)可以包括任何數(shù)量的包。包(例如,包404)可以包括任何數(shù)量的類。類(例如,類406)可以包括任何數(shù)量的類成員(例如,類成員408)。

      一個(gè)或多個(gè)實(shí)施例包括控制由消費(fèi)者模塊(例如,模塊430)對(duì)提供者模塊(例如,模塊402)的模塊元素(即,包404、類406或類成員408)的訪問。為了使模塊430訪問模塊402的類成員408,模塊430可能需要訪問(a)類成員408本身,(b)包括類成員408的類406,以及(c)包括類406的包404的訪問許可。此外,可應(yīng)用于模塊元素(例如,類406)的訪問控制可以確定訪問通過實(shí)例化模塊元素創(chuàng)建的對(duì)象的操作是被允許還是被禁止。在示例中,訪問來獲得或修改對(duì)象的字段的值是基于對(duì)被實(shí)例化以創(chuàng)建該對(duì)象的特定類的訪問控制而被允許或禁止的。

      圖5示出了用于允許或禁止由消費(fèi)者模塊對(duì)提供者模塊的模塊元素的訪問的一組示例步驟。以下參考圖5描述的步驟可以在運(yùn)行時(shí)之前和/或在運(yùn)行時(shí)期間執(zhí)行。編譯器、解釋器和/或運(yùn)行時(shí)環(huán)境可以執(zhí)行以下描述的步驟中的一個(gè)或多個(gè)步驟。

      初始地,識(shí)別消費(fèi)者模塊嘗試訪問提供者模塊的模塊元素的操作(步驟502)。該操作可以由編譯器在編譯過程期間識(shí)別。該操作可以在請(qǐng)求執(zhí)行操作時(shí)由運(yùn)行時(shí)環(huán)境識(shí)別。需要訪問模塊元素的操作的種類的一些示例在以上標(biāo)題為“可能需要由消費(fèi)者模塊訪問提供者模塊的模塊元素的操作”的第4部分中指示。

      響應(yīng)于識(shí)別消費(fèi)者模塊嘗試訪問提供者模塊的模塊元素的操作,需要檢查以確定消費(fèi)者模塊是否具有訪問提供者模塊的模塊元素的必要許可。該檢查是如下所述的多步驟過程。

      在實(shí)施例中,做出提供者模塊的模塊元素是否已暴露給消費(fèi)者模塊的確定(步驟504)。如上面提及的,如果(a)特定模塊元素本身已暴露給消費(fèi)者模塊或(b)如果包括特定模塊元素的第二模塊元素已暴露給消費(fèi)者模塊,則提供者模塊的特定模塊元素可以暴露給消費(fèi)者模塊。在java模塊系統(tǒng)中,如果提供者模塊中的包已暴露給消費(fèi)者模塊,則包內(nèi)的所有類和類中的類成員都已暴露給消費(fèi)者模塊。在圖4所示的示例中,將模塊402的包404暴露給模塊430包括將類406和類408暴露給模塊430。模塊402的包404可以利用專門識(shí)別模塊430的限定性輸出暴露給模塊430。模塊402的包404可以利用針對(duì)模塊系統(tǒng)中所有模塊的非限定性輸出(不專門識(shí)別模塊430)暴露給模塊430。

      如果提供者模塊的模塊元素還沒有暴露給消費(fèi)者模塊,則消費(fèi)者模塊被嚴(yán)格禁止訪問提供者模塊的模塊元素(步驟506)。由消費(fèi)者模塊對(duì)提供者模塊的模塊元素的訪問被嚴(yán)格禁止,而不管(a)模塊元素聲明中的訪問修飾符,(b)為模塊元素表達(dá)的可訪問性覆蓋配置(在下面描述),或(c)與嘗試訪問模塊元素的操作相關(guān)聯(lián)的訪問級(jí)別(在下面描述)。嚴(yán)格禁止訪問可以包括生成編譯時(shí)錯(cuò)誤和/或運(yùn)行時(shí)錯(cuò)誤(例如,拋出異常),這阻止嘗試訪問模塊元素的操作的執(zhí)行。

      在圖4中所示的示例中,如果類成員408還沒有暴露給模塊430,則由模塊430對(duì)類成員408的訪問被嚴(yán)格禁止。對(duì)未暴露的類成員408的嚴(yán)格禁止是可應(yīng)用的,即使(a)類成員408和類406是用公開訪問修飾符聲明的,(b)可訪問性覆蓋配置被設(shè)置為覆蓋任何非公開訪問修飾符,以及(c)訪問類成員408的嘗試依賴于具有最高可能的訪問級(jí)別的操作。類似地,如果類406還沒有暴露給模塊430,則由模塊430對(duì)類406的訪問被嚴(yán)格禁止。

      如果在操作504中做出提供者模塊的模塊元素已暴露給消費(fèi)者模塊的確定,則可以允許訪問或可以不允許訪問。換句話說,將提供者模塊的模塊元素暴露給消費(fèi)者模塊不能保證消費(fèi)者模塊被允許訪問該模塊元素。允許或禁止由消費(fèi)者模塊對(duì)提供者模塊的已暴露的模塊元素的訪問取決于如下所述的一組因素。

      在實(shí)施例中,做出已暴露的模塊元素是否用公開訪問修飾符聲明的確定(步驟508)??梢詸z驗(yàn)?zāi)K元素聲明以確定為已暴露的模塊元素配置了公開訪問修飾符還是非公開訪問修飾符。此外,如果已暴露的模塊元素被包括在具有訪問修飾符的另一個(gè)父模塊元素內(nèi),則執(zhí)行檢查以確定父模塊元素的聲明是包括公開訪問修飾符還是包括非公開訪問修飾符。例如,如果已暴露的模塊元素是特定類的類成員,則檢驗(yàn)類成員聲明和類聲明中的每一個(gè)的訪問修飾符,以確定是否兩者都包括公開訪問修飾符。

      如果模塊元素(以及具有訪問修飾符的任何父模塊元素)是用公開訪問修飾符聲明的,則由消費(fèi)者模塊對(duì)提供者模塊的模塊元素的訪問被允許(步驟514)。允許由消費(fèi)者模塊訪問提供者模塊的模塊元素容許成功編譯和/或執(zhí)行嘗試訪問該模塊元素的操作。

      如果已暴露的模塊元素(或者如果該模塊元素的任何父模塊元素)是用非公開訪問修飾符聲明的,則需要進(jìn)行附加的分析以確定對(duì)已暴露的模塊元素的訪問是被允許還是被禁止。訪問具有非公開訪問修飾符的已暴露的模塊元素可以取決于與嘗試訪問的操作相關(guān)聯(lián)的訪問級(jí)別。圖5定義具有訪問具有非公開修飾符的暴露的模塊元素所需的最小訪問級(jí)別的操作,作為具有針對(duì)已暴露的模塊元素設(shè)置的可訪問性覆蓋配置的反射操作(以下詳細(xì)描述)。然而,其它實(shí)施例同樣可應(yīng)用于在其中不同操作與不同訪問級(jí)別相關(guān)聯(lián)的任何系統(tǒng)。例如,(消費(fèi)者模塊中的)具有第一訪問級(jí)別的第一操作被允許訪問在提供者模塊的已暴露的包中的公開類的非公開類成員。然而,具有第一訪問級(jí)別的第一操作被禁止訪問在提供者模塊的已暴露的包中的非公開類的非公開類成員。(相同消費(fèi)者模塊中的)具有第二訪問級(jí)別(高于第一訪問級(jí)別)的第二操作被允許訪問在提供者模塊的已暴露的包中的非公開類的非公開類成員。因此,以下描述的圖5的特定操作510和512應(yīng)當(dāng)被理解為用于確定對(duì)具有非公開修飾符的已暴露的模塊元素的訪問的一組示例規(guī)則。特定操作510和512不應(yīng)當(dāng)被解釋為限制在其中利用一組不同的訪問級(jí)別來定義操作的其它實(shí)施例的范圍。

      繼續(xù)圖5,在實(shí)施例中,如果(a)操作是反射操作(步驟510)并且(b)針對(duì)被訪問的已暴露的模塊元素設(shè)置了可訪問性覆蓋配置(步驟512),則具有非公開訪問修飾符的已暴露的模塊元素可以被訪問。因此,如果操作是具有針對(duì)被訪問的模塊元素設(shè)置的可訪問性覆蓋配置的反射操作,則對(duì)模塊元素的訪問被允許(步驟514)。在實(shí)施例中,可訪問性覆蓋配置對(duì)消費(fèi)者模塊可用,用于訪問提供者模塊的模塊元素。即使可訪問性覆蓋配置被設(shè)置為訪問提供者模塊的模塊元素,可訪問性覆蓋配置也可以獨(dú)立于用于提供者模塊的任何配置對(duì)消費(fèi)者模塊可用。

      在示例中,(來自java反射api的)反射操作包括get(objectobj),get(objectobj)返回由指定的對(duì)象上的field(其中命令是針對(duì)該field執(zhí)行的)表示的字段的值。反射操作還包括setaccessible(),setaccessible()為具有非公開修飾符的已暴露的模塊元素設(shè)置可訪問性覆蓋配置。具有可訪問性覆蓋配置的反射操作被允許訪問具有非公開修飾符的已暴露的模塊元素。已暴露的模塊元素是提供者模塊的正由消費(fèi)者模塊訪問的元素。

      6.示例實(shí)施例

      一個(gè)或多個(gè)實(shí)施例包括非臨時(shí)性計(jì)算機(jī)可讀介質(zhì),該介質(zhì)包括指令,該指令在由一個(gè)或多個(gè)硬件處理器執(zhí)行時(shí),使得執(zhí)行一組步驟。該組步驟包括:識(shí)別以第一組模塊代碼表達(dá)的、嘗試訪問第二組模塊代碼的模塊元素的操作;確定模塊元素是否已由第二組模塊代碼暴露給第一組模塊代碼;以及響應(yīng)于確定模塊元素還沒有由第二組模塊代碼暴露給第一組模塊代碼:即使當(dāng)操作使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素時(shí),也禁止嘗試訪問該模塊元素的該操作。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括反射操作,并且其中為模塊元素設(shè)置了可訪問性覆蓋配置。

      在一個(gè)或多個(gè)實(shí)施例中,確定模塊元素還沒有由第二組模塊代碼暴露給第一組模塊代碼包括確定該模塊元素不是已由第二組模塊代碼暴露給第一組模塊代碼的任何一組代碼的一部分。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括調(diào)取模塊元素。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括修改通過實(shí)例化模塊元素而創(chuàng)建的對(duì)象的值。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括獲得通過實(shí)例化模塊元素而創(chuàng)建的對(duì)象的值。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括實(shí)例化模塊元素。

      在一個(gè)或多個(gè)實(shí)施例中,禁止操作包括生成與該操作相關(guān)聯(lián)的運(yùn)行時(shí)錯(cuò)誤。

      在一個(gè)或多個(gè)實(shí)施例中,禁止操作包括生成與該操作相關(guān)聯(lián)的編譯時(shí)錯(cuò)誤。

      在一個(gè)或多個(gè)實(shí)施例中,該組步驟還包括:確定第一組模塊代碼表達(dá)需要訪問第三組模塊代碼的第二模塊元素的第二操作;確定第二模塊元素已由第三組模塊代碼暴露給第一組模塊代碼;確定第二模塊元素是用非公開修飾符聲明的;以及響應(yīng)于確定以下之一而禁止第二操作的編譯或執(zhí)行:(a)還沒有設(shè)置用于訪問第二模塊元素的第二可訪問性覆蓋配置或(b)第二操作不具有足以訪問具有非公開修飾符的任何模塊元素的訪問級(jí)別。

      在一個(gè)或多個(gè)實(shí)施例中,該組步驟還包括:確定第一組模塊代碼表達(dá)需要訪問第三組模塊代碼的第二模塊元素的第二操作;確定第二模塊元素已由第三組模塊代碼暴露給第一組模塊代碼;確定第二模塊元素是用非公開修飾符聲明的;以及響應(yīng)于確定以下兩者而允許第二操作的編譯或執(zhí)行:(a)已經(jīng)設(shè)置用于訪問第二模塊元素的第二可訪問性覆蓋配置,以及(b)第二操作與足以訪問具有非公開修飾符的模塊元素的訪問級(jí)別相關(guān)聯(lián)。

      一個(gè)或多個(gè)實(shí)施例包括由包括硬件處理器的至少一個(gè)設(shè)備執(zhí)行的方法。該方法包括:識(shí)別以第一組模塊代碼表達(dá)的、嘗試訪問第二組模塊代碼的模塊元素的操作;確定模塊元素是否已由第二組模塊代碼暴露給第一組模塊代碼;以及響應(yīng)于確定模塊元素還沒有由第二組模塊代碼暴露給第一組模塊代碼:即使當(dāng)操作使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素時(shí),也禁止嘗試訪問該模塊元素的該操作。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括反射操作,并且其中為模塊元素設(shè)置了可訪問性覆蓋配置。

      在一個(gè)或多個(gè)實(shí)施例中,確定模塊元素還沒有由第二組模塊代碼暴露給第一組模塊代碼包括確定該模塊元素不是已由第二組模塊代碼暴露給第一組模塊代碼的任何一組代碼的一部分。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括調(diào)取模塊元素。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括修改通過實(shí)例化模塊元素而創(chuàng)建的對(duì)象的值。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括獲得通過實(shí)例化模塊元素而創(chuàng)建的對(duì)象的值。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括實(shí)例化模塊元素。

      在一個(gè)或多個(gè)實(shí)施例中,禁止操作包括生成與該操作相關(guān)聯(lián)的運(yùn)行時(shí)錯(cuò)誤。

      在一個(gè)或多個(gè)實(shí)施例中,禁止操作包括生成與該操作相關(guān)聯(lián)的編譯時(shí)錯(cuò)誤。

      在一個(gè)或多個(gè)實(shí)施例中,該方法還包括:確定第一組模塊代碼表達(dá)需要訪問第三組模塊代碼的第二模塊元素的第二操作;確定第二模塊元素已由第三組模塊代碼暴露給第一組模塊代碼;確定第二模塊元素是用非公開修飾符聲明的;以及響應(yīng)于確定以下之一而禁止第二操作的編譯或執(zhí)行:(a)還沒有設(shè)置用于訪問第二模塊元素的第二可訪問性覆蓋配置或(b)第二操作不具有足以訪問具有非公開修飾符的任何模塊元素的訪問級(jí)別。

      在一個(gè)或多個(gè)實(shí)施例中,該方法還包括:確定第一組模塊代碼表達(dá)需要訪問第三組模塊代碼的第二模塊元素的第二操作;確定第二模塊元素已由第三組模塊代碼暴露給第一組模塊代碼;確定第二模塊元素是用非公開修飾符聲明的;以及響應(yīng)于確定以下兩者而允許第二操作的編譯或執(zhí)行:(a)已經(jīng)設(shè)置用于訪問第二模塊元素的第二可訪問性覆蓋配置,以及(b)第二操作與足以訪問具有非公開修飾符的模塊元素的訪問級(jí)別相關(guān)聯(lián)。

      一個(gè)或多個(gè)實(shí)施例包括一種系統(tǒng),該系統(tǒng)包括至少一個(gè)設(shè)備,該至少一個(gè)設(shè)備包括硬件處理器,該系統(tǒng)被配置為執(zhí)行一組步驟。該組步驟包括:識(shí)別以第一組模塊代碼表達(dá)的、嘗試訪問第二組模塊代碼的模塊元素的操作;確定模塊元素是否已由第二組模塊代碼暴露給第一組模塊代碼;以及響應(yīng)于確定模塊元素還沒有由第二組模塊代碼暴露給第一組模塊代碼:即使當(dāng)操作使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素時(shí),也禁止嘗試訪問該模塊元素的該操作。

      一個(gè)或多個(gè)實(shí)施例包括非臨時(shí)性計(jì)算機(jī)可讀介質(zhì),該介質(zhì)包括指令,該指令在由一個(gè)或多個(gè)硬件處理器執(zhí)行時(shí),使得執(zhí)行一組步驟。該組步驟包括:識(shí)別以第一組模塊代碼表達(dá)的、嘗試訪問第二組模塊代碼的模塊元素的操作,其中模塊元素是用非公開修飾符聲明的。該組步驟還包括:確定模塊元素是否已由第二組模塊代碼暴露給第一組模塊代碼;確定操作是否使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素;以及響應(yīng)于確定(a)模塊元素已由第二組模塊代碼暴露給第一組模塊代碼,以及(b)操作使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素,并且僅當(dāng)模塊元素已由第二組模塊代碼暴露給第一組模塊代碼時(shí):允許操作使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來訪問模塊元素。

      在一個(gè)或多個(gè)實(shí)施例中,確定操作是否使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素是響應(yīng)于確定該模塊元素已由第二組模塊代碼暴露給第一組模塊代碼而執(zhí)行的。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括反射操作。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括調(diào)取模塊元素。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括修改通過實(shí)例化模塊元素而創(chuàng)建的對(duì)象的值。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括獲得通過實(shí)例化模塊元素而創(chuàng)建的對(duì)象的值。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括實(shí)例化模塊元素。

      一個(gè)或多個(gè)實(shí)施例包括由包括硬件處理器的至少一個(gè)設(shè)備執(zhí)行的方法。該方法包括:識(shí)別以第一組模塊代碼表達(dá)的、嘗試訪問第二組模塊代碼的模塊元素的操作,其中該模塊元素是用非公開修飾符聲明的。該方法還包括:確定模塊元素是否已由第二組模塊代碼暴露給第一組模塊代碼;確定操作是否使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問所述模塊元素;以及響應(yīng)于確定(a)模塊元素已由第二組模塊代碼暴露給第一組模塊代碼,以及(b)操作使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素,并且僅當(dāng)模塊元素已由第二組模塊代碼暴露給第一組模塊代碼時(shí):允許操作使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來訪問模塊元素。

      在一個(gè)或多個(gè)實(shí)施例中,確定操作是否使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素是響應(yīng)于確定該模塊元素已由第二組模塊代碼暴露給第一組模塊代碼而執(zhí)行的。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括反射操作。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括調(diào)取所述模塊元素。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括修改通過實(shí)例化模塊元素而創(chuàng)建的對(duì)象的值。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括獲得通過實(shí)例化模塊元素而創(chuàng)建的對(duì)象的值。

      在一個(gè)或多個(gè)實(shí)施例中,所述操作包括實(shí)例化模塊元素。

      一個(gè)或多個(gè)實(shí)施例包括一種系統(tǒng),該系統(tǒng)包括至少一個(gè)設(shè)備,該至少一個(gè)設(shè)備包括硬件處理器,該系統(tǒng)被配置為執(zhí)行一組步驟。該組步驟包括:識(shí)別以第一組模塊代碼表達(dá)的、嘗試訪問第二組模塊代碼的模塊元素的操作,其中模塊元素是用非公開修飾符聲明的。該組步驟還包括:確定模塊元素是否已由第二組模塊代碼暴露給第一組模塊代碼;確定操作是否使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素;以及響應(yīng)于確定(a)模塊元素已由第二組模塊代碼暴露給第一組模塊代碼,以及(b)操作使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素,并且僅當(dāng)模塊元素已由第二組模塊代碼暴露給第一組模塊代碼時(shí):允許操作使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來訪問模塊元素。

      在一個(gè)或多個(gè)實(shí)施例中,確定操作是否使用對(duì)第一組模塊代碼可用的可訪問性覆蓋配置來嘗試訪問模塊元素是響應(yīng)于確定該模塊元素已由第二組模塊代碼暴露給第一組模塊代碼而執(zhí)行的。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括反射操作。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括調(diào)取模塊元素。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括修改通過實(shí)例化模塊元素而創(chuàng)建的對(duì)象的值。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括獲得通過實(shí)例化模塊元素而創(chuàng)建的對(duì)象的值。

      在一個(gè)或多個(gè)實(shí)施例中,操作包括實(shí)例化模塊元素。

      7.其它方面;擴(kuò)展

      實(shí)施例針對(duì)一種系統(tǒng),該系統(tǒng)具有包括硬件處理器并且被配置為執(zhí)行本文所述和/或以下權(quán)利要求中任何一項(xiàng)所記載的任何操作的一個(gè)或多個(gè)設(shè)備。

      在實(shí)施例中,非臨時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)包括指令,該指令在由一個(gè)或多個(gè)硬件處理器執(zhí)行時(shí),使得執(zhí)行本文所述和/或在權(quán)利要求中任何一項(xiàng)中所記載的任何操作。

      本文所述的特征和功能的任何組合可以根據(jù)一個(gè)或多個(gè)實(shí)施例來使用。在前面的說明書中,各種實(shí)施例已經(jīng)參考許多具體細(xì)節(jié)進(jìn)行了描述,這些具體細(xì)節(jié)可以從一種實(shí)現(xiàn)到另一種實(shí)現(xiàn)而不同。因此,說明書和附圖應(yīng)當(dāng)在說明性而不是限制性的意義上加以考慮。本發(fā)明范圍的唯一且排他指示,以及申請(qǐng)人預(yù)期要作為本發(fā)明范圍的是由本申請(qǐng)產(chǎn)生的一組權(quán)利要求的、以這種權(quán)利要求產(chǎn)生的具體形式的字面和等效范圍,包括任何后續(xù)的校正。

      8.硬件概述

      根據(jù)一個(gè)實(shí)施例,本文所描述的技術(shù)由一個(gè)或多個(gè)專用計(jì)算設(shè)備實(shí)現(xiàn)。專用計(jì)算設(shè)備可以是硬連線的以執(zhí)行這些技術(shù),或者可以包括諸如被永久性地編程以執(zhí)行這些技術(shù)的一個(gè)或多個(gè)專用集成電路(asic)或現(xiàn)場(chǎng)可編程門陣列(fpga)之類的數(shù)字電子設(shè)備,或者可以包括被編程為按照固件、存儲(chǔ)器、其它存儲(chǔ)裝置或者其組合中的程序指令來執(zhí)行這些技術(shù)的一個(gè)或多個(gè)通用硬件處理器。這種專用計(jì)算設(shè)備還可以將定制的硬連線邏輯、asic或fpga與定制的編程組合來實(shí)現(xiàn)這些技術(shù)。專用計(jì)算設(shè)備可以是臺(tái)式計(jì)算機(jī)系統(tǒng)、便攜式計(jì)算機(jī)系統(tǒng)、手持式設(shè)備、聯(lián)網(wǎng)設(shè)備或者結(jié)合硬連線和/或程序邏輯來實(shí)現(xiàn)這些技術(shù)的任何其它設(shè)備。

      例如,圖6是示出本發(fā)明的實(shí)施例可以在其上實(shí)現(xiàn)的計(jì)算機(jī)系統(tǒng)600的框圖。計(jì)算機(jī)系統(tǒng)600包括總線602或者用于傳達(dá)信息的其它通信機(jī)制,以及與總線602耦合用于處理信息的硬件處理器604。硬件處理器604可以是例如通用微處理器。

      計(jì)算機(jī)系統(tǒng)600還包括耦合到總線602用于存儲(chǔ)信息和要由處理器604執(zhí)行的指令的主存儲(chǔ)器606,諸如隨機(jī)存取存儲(chǔ)器(ram)或其它動(dòng)態(tài)存儲(chǔ)設(shè)備。主存儲(chǔ)器606還可以用于在要由處理器604執(zhí)行的指令執(zhí)行期間存儲(chǔ)臨時(shí)變量或其它中間信息。當(dāng)存儲(chǔ)在處理器604可訪問的非臨時(shí)性存儲(chǔ)介質(zhì)中時(shí),這種指令使計(jì)算機(jī)系統(tǒng)600變成為被定制以執(zhí)行指令中所指定的操作的專用機(jī)器。

      計(jì)算機(jī)系統(tǒng)600還包括只讀存儲(chǔ)器(rom)608或者耦合到總線602的其它靜態(tài)存儲(chǔ)設(shè)備,用于為處理器604存儲(chǔ)靜態(tài)信息和指令。提供了存儲(chǔ)設(shè)備610(諸如磁盤或光盤),并且存儲(chǔ)設(shè)備610耦合到總線602,用于存儲(chǔ)信息和指令。

      計(jì)算機(jī)系統(tǒng)600可以經(jīng)總線602耦合到諸如陰極射線管(crt)之類的顯示器612,用于向計(jì)算機(jī)用戶顯示信息。輸入設(shè)備614(包括字母數(shù)字鍵和其它鍵)耦合到總線602,用于向處理器604傳達(dá)信息和命令選擇。另一種類的用戶輸入設(shè)備是游標(biāo)控件616(諸如鼠標(biāo)、軌跡球或者游標(biāo)方向鍵),用于向處理器604傳達(dá)方向信息和命令選擇并且用于控制顯示器612上的游標(biāo)運(yùn)動(dòng)。這種輸入設(shè)備通常具有在兩個(gè)軸(第一個(gè)軸(例如,x)和第二個(gè)軸(例如,y))中的兩個(gè)自由度,這允許該設(shè)備在平面內(nèi)指定方位。

      計(jì)算機(jī)系統(tǒng)600可以利用定制的硬連線邏輯、一個(gè)或多個(gè)asic或fpga、固件和/或程序邏輯來實(shí)現(xiàn)本文所述的技術(shù),其中這些定制的硬連線邏輯、一個(gè)或多個(gè)asic或fpga、固件和/或程序邏輯與計(jì)算機(jī)系統(tǒng)相結(jié)合,使計(jì)算機(jī)系統(tǒng)600成為專用機(jī)器或者把計(jì)算機(jī)系統(tǒng)600編程為專用機(jī)器。根據(jù)一個(gè)實(shí)施例,本文的技術(shù)由計(jì)算機(jī)系統(tǒng)600響應(yīng)于執(zhí)行包含在主存儲(chǔ)器606中的一條或多條指令的一個(gè)或多個(gè)序列的處理器604而執(zhí)行。這種指令可以從另一存儲(chǔ)介質(zhì)(諸如存儲(chǔ)設(shè)備610)讀到主存儲(chǔ)器606中。包含在主存儲(chǔ)器606中的指令序列的執(zhí)行使處理器604執(zhí)行本文所述的過程步驟。在可替代的實(shí)施例中,硬連線的電路系統(tǒng)可以代替軟件指令或者與其結(jié)合使用。

      如在本文所使用的,術(shù)語“存儲(chǔ)介質(zhì)”指存儲(chǔ)使機(jī)器以具體方式操作的數(shù)據(jù)和/或指令的任何非臨時(shí)性介質(zhì)。這種存儲(chǔ)介質(zhì)可以包括非易失性介質(zhì)和/或易失性介質(zhì)。非易失性介質(zhì)包括例如光盤或磁盤,諸如存儲(chǔ)設(shè)備610。易失性介質(zhì)包括動(dòng)態(tài)存儲(chǔ)器,諸如主存儲(chǔ)器606。存儲(chǔ)介質(zhì)的常見形式包括例如軟盤、柔性盤、硬盤、固態(tài)驅(qū)動(dòng)器、磁帶或者任何其它磁性數(shù)據(jù)存儲(chǔ)介質(zhì)、cd-rom、任何其它光學(xué)數(shù)據(jù)存儲(chǔ)介質(zhì)、任何具有孔圖案的物理介質(zhì)、ram、prom和eprom、flash-eprom、nvram、任何其它存儲(chǔ)器芯片或盒帶。

      存儲(chǔ)介質(zhì)與傳輸介質(zhì)不同但是可以與其結(jié)合使用。傳輸介質(zhì)參與在存儲(chǔ)介質(zhì)之間傳送信息。例如,傳輸介質(zhì)包括同軸電纜、銅線和光纖,包括包含總線602的線纜。傳輸介質(zhì)還可以采取聲波或光波的形式,諸如在無線電波和紅外線數(shù)據(jù)通信中產(chǎn)生的那些。

      各種形式的介質(zhì)可以涉及把一個(gè)或多個(gè)指令的一個(gè)或多個(gè)序列攜帶到處理器604以用于執(zhí)行。例如,指令最初可以攜帶于遠(yuǎn)程計(jì)算機(jī)的磁盤或固態(tài)驅(qū)動(dòng)器上。遠(yuǎn)程計(jì)算機(jī)可以把指令加載到它的動(dòng)態(tài)存儲(chǔ)器中并且使用調(diào)制解調(diào)器經(jīng)電話線發(fā)送指令。位于計(jì)算機(jī)系統(tǒng)600本地的調(diào)制解調(diào)器可以接收電話線上的數(shù)據(jù)并且使用紅外線發(fā)射器把數(shù)據(jù)轉(zhuǎn)換成紅外線信號(hào)。紅外線檢測(cè)器可以接收攜帶在紅外線信號(hào)中的數(shù)據(jù)并且適當(dāng)?shù)碾娐废到y(tǒng)可以把數(shù)據(jù)放置在總線602上??偩€602把數(shù)據(jù)攜帶到主存儲(chǔ)器606,處理器604從主存儲(chǔ)器606檢索并執(zhí)行指令。由主存儲(chǔ)器606接收到的指令可以可選地在被處理器604執(zhí)行之前或之后存儲(chǔ)在存儲(chǔ)設(shè)備610上。

      計(jì)算機(jī)系統(tǒng)600還包括耦合到總線602的通信接口618。通信接口618提供耦合到網(wǎng)絡(luò)鏈路620的雙向數(shù)據(jù)通信,其中網(wǎng)絡(luò)鏈路620連接到本地網(wǎng)絡(luò)622。例如,通信接口618可以是綜合服務(wù)數(shù)字網(wǎng)絡(luò)(isdn)卡、電纜調(diào)制解調(diào)器、衛(wèi)星調(diào)制解調(diào)器,或者提供到對(duì)應(yīng)種類電話線的數(shù)據(jù)通信連接的調(diào)制解調(diào)器。作為另一個(gè)例子,通信接口618可以是提供到兼容的局域網(wǎng)(lan)的數(shù)據(jù)通信連接的lan卡。也可以實(shí)現(xiàn)無線鏈路。在任何此類實(shí)現(xiàn)中,通信接口618發(fā)送和接收攜帶表示各種類型的信息的數(shù)字?jǐn)?shù)據(jù)流的電信號(hào)、電磁信號(hào)或光信號(hào)。

      網(wǎng)絡(luò)鏈路620通常通過一個(gè)或多個(gè)網(wǎng)絡(luò)向其它數(shù)據(jù)設(shè)備提供數(shù)據(jù)通信。例如,網(wǎng)絡(luò)鏈路620可以通過本地網(wǎng)絡(luò)622提供到主機(jī)計(jì)算機(jī)624的連接或者到由互聯(lián)網(wǎng)服務(wù)提供商(isp)626操作的數(shù)據(jù)裝備的連接。isp626繼而通過現(xiàn)在通常稱為“互聯(lián)網(wǎng)”628的全球分組數(shù)據(jù)通信網(wǎng)絡(luò)提供數(shù)據(jù)通信服務(wù)。本地網(wǎng)絡(luò)622和互聯(lián)網(wǎng)628兩者都使用攜帶數(shù)字?jǐn)?shù)據(jù)流的電信號(hào)、電磁信號(hào)或光信號(hào)。通過各種網(wǎng)絡(luò)的信號(hào)以及在網(wǎng)絡(luò)鏈路620上并通過通信接口618的信號(hào)是傳輸介質(zhì)的示例形式,其中這些信號(hào)把數(shù)字?jǐn)?shù)據(jù)攜帶到計(jì)算機(jī)系統(tǒng)600或者攜帶來自計(jì)算機(jī)系統(tǒng)600的數(shù)字?jǐn)?shù)據(jù)。

      計(jì)算機(jī)系統(tǒng)600可以通過(一個(gè)或多個(gè))網(wǎng)絡(luò)、網(wǎng)絡(luò)鏈路620和通信接口618發(fā)送消息和接收數(shù)據(jù),包括程序代碼。在互聯(lián)網(wǎng)示例中,服務(wù)器630可以通過互聯(lián)網(wǎng)628、isp626、本地網(wǎng)絡(luò)622和通信接口618發(fā)射所請(qǐng)求的用于應(yīng)用程序的代碼。

      接收到的代碼可以在代碼被接收到時(shí)由處理器604執(zhí)行、和/或存儲(chǔ)在存儲(chǔ)設(shè)備610或其它非易失性存儲(chǔ)裝置中以用于稍晚執(zhí)行。

      在前面的說明書中,本發(fā)明的實(shí)施例已經(jīng)參考許多具體細(xì)節(jié)進(jìn)行了描述,這些具體細(xì)節(jié)可以從一種實(shí)現(xiàn)到另一種實(shí)現(xiàn)而不同。因此,說明書和附圖應(yīng)當(dāng)在說明性而不是限制性的意義上加以考慮。本發(fā)明范圍的唯一且排他指示,以及申請(qǐng)人預(yù)期要作為本發(fā)明范圍的是由本申請(qǐng)產(chǎn)生的一組權(quán)利要求的、以這種權(quán)利要求產(chǎn)生的具體形式的字面和等效范圍,包括任何后續(xù)的校正。

      當(dāng)前第1頁1 2 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1