新四季網

增量連接系統的製作方法

2023-05-14 12:47:21 2

專利名稱:增量連接系統的製作方法
技術領域:
本發明涉及計算機輔助軟體工程(CASE),尤其涉及面向人的目標編程系統(HOOPS),該系統為電腦程式建立提供了交互和動態環境。面向人的目標編程系統(HOOPS)使程式設計師得以由優化增量編譯程序而對電腦程式中的微小的顆粒源碼進行編輯。本發明的主題是一增量連接程序,它在HOOPS中操作以生成由一個輸入程序所用的文件。本發明是以使用通用的面向目標編程的(OOP)語言、C++作為最佳實施例的,但其原理也適用於面向目標的以及過程計算機程式語言,本發明亦可用於建立使用常規的和OOP語言的程序。
OOP是建立用戶使用方便的以及智能計算機軟體的最佳環境。OOP的要素是數據密封性(data encapsulation),繼承性(inheritance)以及多形性(Polymorphism)。這些元素可以用於產生圖形用戶接口(GUI),尤其是產生具有圖符、滑鼠光標以及選項單視窗環境的為特徵的。所構成的GUI。雖然這三種要素屬OOP語言所共有,但在實施方式上大部分OOP語言彼此間有很大的區別。
OOP語言的例子包括Smalltalk、目標Pascal和C++。Smalltalk實際上不止是一種語言,更準確地講,它應該被認為一種編程環境。該語言是在70年代早期施樂普拉阿圖研究中心(PARC)的研究部開發的。在該語言中,一個信息被送到一個目標以對其進本身行評價。信息完成的任務類似於在常規程式語言中的功能調用。程式設計師無需關心數據類型而只須關心生成正確順序的信息及使用正確的信息。Object Pas-cal是用於蘋果公司的Machintesh 計算機上的語言,蘋果公司在Pascal語言的設計者一尼古拉斯·沃斯(Niklaus.With)—的合作下開發出了Object Paseal語言。C++語言則是由斯託斯特拉普(Bjarne Stroustrup)在1983年在ATT貝爾實驗室開發而成的,它出C語言的擴展。C++的主要概念是分類,它是用戶定義型的。分類提供了面向目標的編程特性。C++模型與C模型相兼容而且可隨意聯接,從而現有的C程序庫可由C++程序所用。最廣泛使用的基於目標和面向目標的程式語言源於60年代由挪威的戴沃(O-J.Dah1)梅·阿漢(B.Myhrhaug)以及耐·培得(K.Nygard)所開發的Simula語言。有關OOP的信息可參見布克(Grady Booch)所著的「Object Oriented Design with Applications」(Benjimin/Cum-mings Publishing Co.,Inc.,Readwood city,California,1991)。
運行一個電腦程式的完整過程涉及把程式設計師寫出的源碼譯為機器可執行的格式,通常稱為目標碼,然後再執行該目標碼。翻譯的過程是由編譯程序或解釋程序完成。在解釋程序中,翻譯是隨程序的運行而進行的;而在編譯程序中,則是在運行該程序之前就進行翻譯並將結果作為目標碼存貯起來。也就是說,在一般的編譯和執行系統中,翻譯和執行是分開進行的,即編譯只進行一次。而在解釋系統中,例如Smalltalk解釋程序,兩者是順序進行。因為直到一個目標被實現之前,編程環境的性質不允許指定專用寄存器或地址空間,所以,Smalltalk需要解釋程序。
一個編譯程序包括三部分;詞法分析程序,語法分析程序,以及代碼生成程序。詞法分析程序的輸入是代表高級語言程序的一序列字符。詞法分析程序將該序列分為一個標記序列以輸入到語法分析程序。語法分析程序進而將該序列標記分為指令並利用語法規則的資料庫來確定是否每條指令的語法正確與否。若不正確,則產生錯誤信息。若正確,則指令被分解為一基本指令系列。這些基本指令被送至代碼生成程序以產生低級語言。代碼生成程序本身通常又分為三部分;中間代碼生成,代碼優化,以及代碼生成。基本而言,代碼生成程序接收來自語法分析程序的輸出並生成機器語言碼。
為有助於軟體開發而開發出了增量編譯程序,其中,編譯程序在批處理操作中生成用於接收的一條語句或一組語句的代碼,而與稍後生成的用於其他語句的代碼無關。增量編譯的優點在於只有被一轉變所影響的代碼才被編譯。這一行為導致了極快的編譯和調試代碼的周期。
優化編譯程序產生高度優化的目標碼。從而在許多情況下使得在源級進行調試比一個非優化編譯程序更困難。這一問題源於這一事實,即雖然一個例行程序將被編譯以給出適當的答案,但計算該答案的確切方式可能與源碼中描述的大相逕庭。優化編譯程序可以實現的一些事情,包括刪除被確認屬不會影響最終結果的代碼或變量,將非變量代碼移出循環,合成公用碼,在變量不再需要時重新使用分配給這些變量的寄存器等等。如此,源碼到目標碼或目標碼到源碼的映射在給定某些優化時可能會有困難。由於變量的值可能並非在例行程序中任意位置處總是可用的,所以可能難於校驗變量的值。在優化代碼中修改變量值既使不是完全不可能,也是尤為困難。除非專門說明為易失的,否則編譯程序會「記住」分配給變量的值並可能在以後的代碼中不再讀該變量而使用「已知」的值。因此,在該值中的改變產生了錯誤的程序結果。
雖然在先有技術的電腦程式設置、測試以及開發中有許多優點,但已知的軟體開發工具仍給程式設計師帶來極大負擔,從而通常要求有直覺的洞悉力。其次,常規的面向批處理的編程系統需要很長的編輯——編譯——測試周期,這對編程的創造性行為帶來的極大的不利影響。
一旦在常規編程系統中完成了編譯,稱為裝入程序的程序將執行裝入和連接編輯這樣兩個功能。該裝入處理包括獲取可重新定位的機器碼,修改可重新定位的地址,並把存儲器中修改後的數據和指令放入適當的位置。而連接編輯程序則從幾個有可能重新定位的機器碼的文件中生成一個程序。這些文件可以是幾個不同編譯的結果。
因此,本發明的一個目的是提供一種增量連接程序,該增量連接程序在用於建立電腦程式的面向人的交互動態處理中操作。
在交互動態的建立過程中,程序建立可由增量程序模式(稱為項目Project)和三個主要功能性交互而成。一個程序被成型為語義單元,該語義單元被稱之為成分並由稱為特性的命名數據項目表構成。不是象常規系統那樣把程序作為一個鬆散的文件集合存儲起來。本發明的面向人的目標編程系統把項目中有關程序的所有信息存起來。本發明的電腦程式的建立有助於使程式設計師的生產力大為提高。
根據本發明,提供了一種增量連接程序,它在HOOPS運行並且其功能連到現有的執行程序,從而避免對一組完整的目標文件進行再處理。在本發明的實施中,電腦程式被成型為一個部件集,為電腦程式提供模型的部件被存儲以便在建立處理中被存取。存儲的部件被依序存取,而且用一個編譯程序計算與每個部件關聯的相關性以開發一個相關性表。然後,根據相關性表編譯部件以產生一個更新過的目標模型。最後,更新的目標模型通過對現有可執行文件的更新而被連接。
本發明的最佳實施例以C++完成的並用C++C以及彙編語言進行的程序建立,這些語言是當前最流行使用的。本發明的程序的建立一般可用這三種語言完成。雖然本發明本身是以面向目標的程式語言寫成的面向目標的程序,但其並不僅限於以面向目標的程序語言建立程序。本發明可同樣用於以過程語言建立程序。進而,本發明不限於C++語言,它也可由其他程式語言實現。而且本發明不限於只用於這三種語言;也就是說,本發明的原理可用於更為一般應用的面向人的目標編程系統。
上述的以及其它目的,所涉及的方面及其優點可從下面參考附圖對本發明的最佳實施例的詳細敘述有更好的理解。其中,

圖1展示了一種可以支持高解析度圖形顯示設備和光標指示設備(例如滑鼠器)的常規計算機系統,本發明即可在該系統上實施;圖2是圖1所示計算機系統的主要部件框圖;圖3是構成一個程序的部件集的概念形式框圖;圖4是本發明的原理功能框圖;圖5A到圖5D為通過建立狀態(BuildState)寄存編輯變化的邏輯流程圖;圖6是根據本發明在建立處理操作的第一階段確定可能的部件的邏輯流程圖;圖7是根據本發明在建立處理操作的第二階段對界面進行處理的邏輯流程圖;圖8是根據本發明在建立處理操作的第三階段對實施進行處理的邏輯流程圖;圖9是根據本發明由編譯程序調用的獲取說明(GetDedaration)功能的邏輯流程圖;圖10A和10B展示了有條件地編譯功能(CorditionallyCompile function)的邏輯流程圖;圖11是使用本發明時表示一個通常數目的窺視窗口的計算機屏幕的圖示表示;圖12展示了根據本發明的計算機屏幕的圖示表示,該表示展示了一個瀏覽窗(Browser)接通時的情況;圖13展示了圖12中瀏覽窗線路接通時計算機屏幕的圖示表示;圖14展示了樹狀窺視窗中部分擴展的項目的計算機屏幕圖示表示;圖15至圖18展示了在編譯一個部件的處理過程中顯示的一些屏幕;圖19展示了根據一個最佳實施例的內部和交叉庫調用;圖20展示了根據一個最佳實施例的一組安排分類(fix-up dasses);圖21展示根據一個最佳實施例的一個連接區;圖22展示根據一個最佳實施例的目標碼存儲;圖23展示根據一個最佳實施例的裝入庫;圖24展示根據一個最佳實施的裝入模塊的存儲器映射;圖25展示根據一個最佳實施例的不同類型的基準以及這些基準的連接程序的修改;以及圖26,27,28和29是流程圖,示明了根據一個最佳實施例的與連接關聯的邏輯。
參照圖1,示出了一個常規計算機10。該計算機10包括一系統單元12,一個高解析度顯示設備14,例如一個陰極射線管(CRT)或者一個液晶顯示器(LCD)。除去要求用於顯示視窗系統通常是圖形用戶界面需要高解析度這一點十分重要以外,這種顯示類型並不重要。用戶對計算機的輸入由鍵盤16以及光標指示設備,例如滑鼠器18完成。滑鼠器18與鍵盤16相連並進而與系統依次相連。而且滑鼠器18可連到系統單元12的一個專用或串行口。圖1所示的計算機是Ap-ple Machintosh(蘋果計算機的註冊商標)以IBM PS/2。其他機型可包括各種工作站,例如IBM RISC System/6000以及Sun Microsystems計算機。
圖2更為詳細地展示了圖1所示計算機的基本部件。系統單元12包括一個連到總線24上的中央處理單元(CPU)21,隨機存取存儲器(RAM)22,以及只讀存儲器(ROM)23。CPU21可以是任何商業化的微處理器,例如Motorpla 68030和68040(它們通常用於Apple Maethintosh 計算機中)或In-tel 80386及80486(它們通常用在IBM PS/2計算機中)。其他微處理器,例如RISC(用於減少指令集計算機)微處理器(通常用於工作站)也可使用。ROM24存儲用於CPU的基本微碼,包括基本輸入/輸出系統(BIOS)。計算機系統10的作業系統(OS)也可存在ROM24中,或者把OS作為初始程序裝入(IPL)的一部分存入RAM22中。RAM22也用於存儲部分應用程式以及執行該程序過程中生成的臨時數據總線24可以是Apple NuBus,IBM MicroChannel或工業標準之一的總線。例如ISA(工業標準適配器)或EISA(擴展的工業標準適配器)。
與總線24相連的還有多個輸入/輸出(I/O)適配器,包括一個用戶接口適配器25以及一個I/O適配器26。鍵盤16與用戶接口適配器25相連,而I/O適配器26與軟盤驅動器27和硬碟驅動器28相連。軟盤驅動器27允許把數據和程序讀寫到可擦除介質,而硬碟驅動器28通常存儲頁入頁出RAM22的數據和程序。顯示設備14通過顯示適配器29而與總線24相連。通訊適配器30為網絡提供接口。其他支持電路(未示出)為集成電路晶片,它們被連到總線24和/或CPU21。這些晶片包括例如控制總線24上的信息量的總線主控晶片。總線24在某些計算機中可以是雙總線;一個數據總線和一個允許在圖形用戶界面中需要的高速顯示操作的顯示總線。
定義程序如在本發明中所敘述的,一個HOOPS程序包括一個叫做「項目」的不可建立的部件以及一個「可建立的部件」的集合。不可建立的組成,部分亦可被存儲,但在本敘述中,只要到不合格的部件,就是指一個「可建立的部件」,不可建立的部件在建立操作中將不被編譯。
部件一個部件有一個唯一的標識並被命名。不同的部件由稱為ID的不同形式的唯一標識符加以區分。有一個稱為空ID(NullID),它不屬於任何部件。該ID在一個部件生成時被賦予而且在該部件存在期間不會改變。若一個部件被刪除了,它的ID不會再被使用。實際中,ID通常是數字的。
一個部件也有一個「名字」,它包括一串沒有白空格的文本。不同部件不必須要求有不同名字。可以獲得包括所有部件的表(可能是空的),其中所有部件的名字與某些給定文本串相吻合。一個部件的名字可以在該部件存在期間被改變任意次。
每個可建立的部件件都與特定的計算機語言相關。實踐中,計算機語言通常由一串文本標識。每一計算機語言有一個與其相關的編譯程序以供當以該語言編譯任何部件所用,實際上,可能使一種給定的計算機語言與不止一個編譯程序相關聯。在本例中,部件必須記錄語言以及標識該特定編譯程序的某些方式。
一種特定的語言有一與之相關的特定的部件種類集合以及一特定的特性實施集,通常可能每一種類都不同。如此,在一特定語言中的區別語義元素可以根據需要以不同方式進行組合。
部件有「建立狀態(Build States)」。「建立狀態」是來自「不要編譯」(Never Compile)、「已編譯的」(Compiled)、「需要編譯」(NeedTo Compile),「不確定」(Uncertain),「被編譯」(Be-ing Compiled),「編譯錯誤」(CompileError),以及「不確定錯誤」(UncertainError)的表中的一個取值。實際中,這些值通常是數碼,每個部件有稱為「界面建立狀態(Interface BuildState)」和「實施建立狀態(Implementation Build State)」的一對。「建立狀態」無論是可建立的或不可建立的,每個部件都有這兩個建立狀態。對不可建立的部件而言,這些建立狀態都是「不可編譯」的。
「建立狀態」可被存取和改變。可以把一個部件的」建立狀態」再次設置到同一值並且不會導致任何影響。改變一個「建立狀態」可能完好地定義邊界效應,便如改變有同樣或不同部件的一特性的「建立狀態」,或者例如從一個有改變的表或一個有錯誤的表中加入或刪除等此參考項。
部件用於表達語義語言元素。表達的方式取決於將被模塊化的特定計算機語言。例如在C++中,由部件表達的語言元素表格包括全局數據,全局功能,分類,數據成員,成員功能,typedef,Rnums,仿真程序,宏指令,「或」運算以及結構。通常,每個語義元素將有一相關聯的區別種類。
特性一個部件包括一個命名的「特性」(Property)集合。一個特性表示與該部件有關的一些數據。在給定部件的ID和特性名之後,可以存取和檢索這些數據。特性名字通常由標識名字的數字(有時稱為記號)在內部表示。也有不屬於特性的區別特性名,叫做「空特性」(NullProperty)。
與一給定特性相關的數據對不同的的部件而言是不是的。改變一個部件給定特性的數據並不意味著改變用於任何其他部件的同一特性的數據。但是,有可能在一個部件的一個特性中的改變會導致同一或另一部件的另一特性的改變。
「引用(reference)」包括一個ID和一個特性名。一個引用唯一地標識特定的部分的特性數據。一個引用通常被鬆散地使用,就象它是部件和/或與之相關的特性。實際上,一個引用通常包含不在程序建立過程中直接使用的其他信息,從而標識該特性中的哪種數據版本及哪種數據子節將被引用。
所有部件必須有特性「名(Name)」和「貯存器(Container)」,該特性「名」存有部件的名字。「貯存器」特性則包含了其中的特性名為「空特性」的一個單一引用。從任一部件開始並相繼由貯存器ID引用的部件取代前一部件將總是最終導致「項目部件」(Projeet Component)。該項目的「貯存器ID」是「空ID(NullID)」。如此,所有部件在項目中被描述。
建立特性(亦稱為部件建立表)以建立順序記錄最後建立中被正確編譯的特性表。相同的特性應該在該表中最多出現一次。建立特性用於測試和調試。
項目部件一個項目是一個附帶有特性「變化表(Changalist)」和「錯誤表(ErrorList)」的部件。特性變化表是一個引用用。這些引用描述部件以及最後一次建立以來發生了改變的特性。實際上,「變化表」可以由某種可以有效建立一個程序的過程中有效地存儲的多個表來表示。特性「錯誤表」也是一個引用表。這些引用描述在最後程序建立過程中列為有錯誤的部件。這些引用都有「錯誤」特性。與每個引用相關的是一個數碼鍵,它用於關聯特定的「錯誤」特性以確定一個專用消息的位置以及部件特定特性的一個特定子範圍。
可建立部件一個可建立部件必須有這些特性。「說明(Declaration)「目標碼(ObjectCode)」、「客戶(Clients)」、「源引用(Source Ref-erence)」、「錯誤」,並可有這些特性「界面(Interface)」、「實施(Implementation)」以及「成員(members)」。
「說明」特性表示用於編譯程序的一個數據高速緩衝存儲器。它可能在部件已被編譯之前是空的。實際上,它可被認為是編譯程序符號表的入口,儘管存儲的狀況可能與編譯程序的內部情況不同。
「目標碼」特性表示了用於該部件的可執行碼,它可能在部件被編譯前是空的,或者由於沒有目標碼與該部件相關而是空的。實際上,它通常提供一個手段指向實際碼所存之處。
「客戶」和「源引用」特性是一對集合。它們包括一個引用和一個「相關性(dependency)」。一個相關性是一個變化表。變化可以表示為從一個區別的有限表串中選取的一個文本串。一個稱為「公開(Pubpic)」的區別的變化用來區分只在實施特性性中對部件的引用,這與界面特性中的應用相反。一個相關性可表示為一個位向量,其中若第n位的變化在表中表示,則該位向量的第n位為「1」,否則為「0」。
錯誤特性包括一個三個一組的表。每一組包括一個「鍵」,一個特性名,以及一個信息,一個鍵即為一個數碼標識。一個給定鍵在特定的「錯誤」特性中在一個時刻只出現一次,該特性名通常是「界面」或「實施」。該信息則是文本或/和圖形的某些部分。
「界面」和「實施」特性表示部件的源文本。該源文本可作為記號而不是作為文本存起來並在需要時以不同形式訪問。由這些特性表示的文本可通過編程環境中的人工編輯而予改變。一種可能性是把界面數據作為結構區存起來,而從結構區中,源文本可按需要重新構造。
「成員」特性是引用集合(可能空的),每一引用用於「項目」中的每個部件,而「項目」將該部件作為其貯存器。
屬性一個部件有多個「屬性」。一個屬性為「真」或「假」。實際上,一個屬性通常是由存儲器的單比特值所表示的,由數字「1」和「0」表示的一個該屬性的真或假。所有部件都有「是可建立的(IsBuildable)」屬性。若該屬性為「真」,則該部件是可建立的;否則便為不可建立的。一個部件可能總是不可建立的或暫時不可建立的(因為某些暫時條件的作用)。
可建立的部件也有「在內部(Isinline)」屬性。當該屬性為「真」時,該部件的「實施」是公開的,這意味著另外的部件可以依賴於實施的改變。若其為「假」,則實施改變將不會導致其他部件改變。
可建立的部件還有「合成(IsSynthetic)」屬性。這一屬性對於在編譯程序在建立處理過程中生成的部件來說為「真」。而對程式設計師人工生成的部件為「假」。提供合成部件是使編譯程序生成與系統設定語言元素對應的部件,系統需要設置語言元素,但其不必由程式設計師直接生成,實際上有可能將「合成」屬性從「真」改為「假」,例如當一個合成的部件被人工編輯時,但從「假」到「真」的反向改變是絕不允許的。合成部件通常沒有「界面」或「實施」特性,但無論在何種情況下,合成部件都使「界面」和「實施建立狀態」被編譯。
類別每一部件都有一「類別」(Kind)」。一個類別是指把部件劃分為例如共有同樣特性或同樣語言特定行為的各個組的一個文本串。大部分類別是專用於一種特定的計算機語言並用於指定語義區別語言元素。
然而,有一些是由系統定義的類別,它們分別為「項目」,「庫」,以及「貯存器」。這些類別只用於不可建立的部件。「項目」類別是「項目」部件的類別。「庫」類別則是用於連接到目標碼的一個外部塊(例如一個共同庫或應用程式)的部件的集合。類別「貯存器」則應用於把其他部件分組歸類以便組織的部件。實際上,類別通常在內部由數碼表示。
圖3提供了包括一個系列的部件31的程序的概念性的圖示。每個部件由一組特性組成,這組特性分為兩部分,即稱為界面的外部可見(公開)部分311以及實施(專用)部分312。如圖3所示,部件只依賴於另一個部件的界面。在一個項目中的所有部件被組織成樹狀結構,其底部為根的部件32(稱為項目部件)。如同本技術領域的一般技術人員可知的那樣,部件本身不必包含實體,但可以包括指向實際碼的存儲位置的指針。然而,這一樹結構表達方式在展示一個程序的構成上是有用的,因此,類似的樹結構表示被用於其後所述的用戶屏幕之一。
圖4是一框圖,示出了本發明的三個主要功能性。它們是資料庫41,編譯程序42,以及建立處理43。資料庫41包括一組構成部分,圖中所示為一個項目部件411和一個可建立的部件集412。該可建立的部件集合412成型為將被建立的一個程序。編譯程序42計算資料庫41的部件的相關性。建立處理43利用部件特性和編譯程序生成的相關性來建立該程序。
程式設計師可用編輯程序44改變該程序。編輯程序必須能夠生成及刪除這些部件,尤其是能夠進行剪切、複製、粘貼和移動這些部件。編輯程序必須可以改變「界面」和「實施」特性中的數據,其方式通常是由對文本直接地進行修改。然而,其他更為結構化的途經(例如從選項屏進行選擇)亦可採用。實際上,編輯程序44通常可以包括多個編輯程序,每個用於每種「界面」或「實施」特性,或甚至可能為特性中的數據的子區配置編輯程序。
寄存編輯改變的方法參見圖5A到圖5D,其中示出了與增量建立有關的編輯程序44所執行的邏輯功能流程圖。對於可建立的非合成部件,「建立狀態」限於在建立處理之外的「編譯的值」和「需要編譯」值。若「界面」特性未出現,則「界面建立狀態」是「編譯的」。若「實施」特性未出現,則「實施建立狀態」是「編譯的」。圖5A中展示了各種編輯狀態變化。在500處,當系統標識了一個「生成部件」、「再命名部件」、「粘貼部件」、或』編輯界面」命令之時,控制則進到功能框510對界面變化進行處理。該變化的詳細邏輯示於圖5B中。
圖5B中,處理始於判別框511,在該處,進行測試以確定界面建立狀態是否為「需要編譯」。若是,則控制通過514進行繼續編輯。這些動作發生在編輯過程中而不是在建立過程中,下一動作很可能是另一編輯動作。若否,則在功能框512處把界面建立狀態設置成「需要編譯」並因此更新界面變化表。然後,在功能框5B處完成實施被改變和貯存器被改變的處理。實施被改變操作的細節示於圖5C中而貯存器被改變的操作細節示於圖5D中。
圖5C示出了與實施被改變有關的詳細過程。判別框571進行測試以確定是否實施建立狀態已設定為「需要編譯」。若是,控制通過572進行繼續編輯。若否,則在功能框573處把實施建立狀態設為等於「需要編譯」且實施變化表被因此而更新。然後,控制通過574返回。
圖5D示出了與貯存器改變操作有關的詳細邏輯。功能框542處將進行測試以確定該變量是否為可建立。若是,則在功能框543處由部件的貯存器按圖5B討論的細節調用被改變的界面,然後,控制通過544返回。
若「編輯實施」命令在圖5A的560處被檢測到,則處理按照功能框570所示和圖5C的討論執行實施被改變的動作。
若在圖5A和530處檢測到「刪除部件」的命令,則用於部件A的貯存器被改變處理起始於功能框540,其細節示於圖5D中,然後,貯存器A被刪除且控制由550返回。
若在圖5A的580處檢測到一個「移動」部件命令,則部件A的貯存器被改變處理起始於功能框590並詳細示於圖5D中。然後,部件的貯存器被設定於等於新的貯存器,且對於部件A的界面已改變的處理詳細示於圖5B中。最後,處理由595返回。
確定一個建立的組成部的方法在建立一個程序的過程中,「項目」組成部維持著稱之為編譯表的專用引用表。有一個「界面編譯表」和一個「實施編譯表」。「項目」還維持一個叫做「內部錯誤表」的專用引用表。實際上,這些表的每一個可由不止一個表實際地表示,以提高效率。
圖6展示的處理中,對於「項目」的「改變表」中的每個引用(如功能框601所示)從該表的前部選中一個引用。若在表上有多上引用,處理由框602所示完成。若引用是一個界面,如在框603所制定的,則將該引用的複製放在「界面編譯表」中並且在601繼續處理之前,在功能框604處把「加客戶(AddClients)」功能調用到該引用。若其特性名不是「界面」,則其特性名為「實施」,如框605所示,此時,由判別框606進行測試以確定是否為「在內部」(IsInLine)屬性為真。若是,則將引用的複製放入「界面編譯表」並在框601的處理繼續之前在功能框607「界面編譯表」並在框601的處理繼續之前在功能框607處從該引用中調用「加客戶」功能。否則,其特性名肯定是「實施」且其「在內部」屬性肯定為「假」,而且在框601的處理繼續之前,該引用的複製功能框608放在「實施編譯表」中。
「生成編譯表」功能的偽代碼如下
「加客戶」功能負責參數中每個引用,適當地引客戶並檢查引用,並在其「建立狀態」被編譯時,把該引參的「建立狀態」設為「不確定」,把該引用的複製加到適當的「編譯表」,並在該引用中調用「加客戶」。這一處理稱為生成「改變表」的「客戶封閉(dient Closure)」。該「客戶封閉」表示需要作為一個建立的結果而被再次編譯的那些部件的子集。實際上,由建立過程的編譯程序生成的相關性及變化用於避免在「客戶封閉」中編譯過多的部件。
以下是「加客戶」的偽碼功能
處理「界面」的方法這是「建立」處理的第二階段。在「界面編譯表」用於項的可能的「建立狀態」是「已編譯」、「正被編譯」、「需要編譯」、「不確定」、「編譯錯誤」或「不確定錯誤」。「界面編譯表」被處理直到空了為止,如圖7的流程圖所示。處理始於701處,在該處,從「界面編譯表」的前部選中一個引用。如果在表上沒有更多的引用,便在框702處完成處理。如框703所示,若與該引用相關聯的構成部分的界面「建立狀態」是已編譯的,「編譯錯誤」或「不確定錯誤」的,則從表的前部去除該引用並且在框701中繼續處理。若與該引用相關的構成部分的界面「建立狀態」是「已被編譯」或「需要編譯」,如框704所示,則部件的「建立狀態」在框705中被設置為「已被編譯」。然後,在部件的「界面」調用「編譯」功能(它調用編譯程序42)。該功能將返回到「異常中止」值,「完成」值和「錯誤」值之一。若在框706處返回「異常中止」值,則處理在框701處繼續。若返回框707的「完成」值,則部件的「界面建立狀態」被設為「編譯的」且在處理在框701處繼續之前,在框708處將把引用從表的前部去除掉。若返回的值是框709處的「錯誤」,則該部件的「界面建立狀態」設定為「編譯錯誤」,從表的前部去掉該引用,並在701處繼續處理之前,在功能框710中的部件調用「傳播錯誤」功能。若與該引用相關聯的「界面建立狀態」為「不確定」,如框711所示,則該部件的「建立狀態」在功能框712處設為「已被編譯」。然後在該部件的「界面」上調用「有條件地編譯」功能(可以調用也可以不調用編譯程序42)。該功能也返回到「異常中止」值,「完成」值和「錯誤」值之一。若返回到「異常中止」值,則在步驟701處的處理繼續進行。若返回到框713處的「完成」值,則在功能框708中從表的前部去掉該引用並繼續進行框701處的處理。若返回框714處的「錯誤」值,則從表的前部去掉該引用並在框701的處理繼續進行之前,在功能框715中的部件裡調用該「傳播錯誤」功能。
用於「處理界面」功能的偽碼如下
「傳播錯誤」功能是把一個與部件對應的引用加到「項目」的「內部錯誤表」中並對部件的「客戶」表中的每個引用執行如下若該引用的「建立狀態」是「編譯錯誤」或「不確定錯誤」,處理繼續下一個引用。若該引用的「建立狀態」是「需要編譯」,處理把它的「建立狀態」設為「編譯錯誤」,並將引用把加到「內部錯誤表」,並在繼續下一引用之前為引用調用「傳播錯誤」。若引用的「建立狀態」為「不確定」,則處理把其「建立狀態」設到「不確定錯誤」,把引用加到「內部錯誤表」,並在繼續下一引用之前在引用上調用「傳播錯誤」。
「傳播錯誤」功能的偽碼如下處理「實施」的方法這是「建立」處理的第三階段,如圖8的流程圖所示,在「實施編譯」表中的每個引用都被處理。該處理始於801處,在該處,從實施編譯表的前部選中一個引用。若無更多的引用,在框802處完成處理。若該引用的「建立狀態」為「不確定」,如框803所示,則在框801繼續處理之前在功能框804中把「建立狀態」設置為「已編譯的」。若該引用的「建立狀態」是「需要編譯」,如框805所示,則在功能框806處編譯該部件。從編譯程序42返回的值可能是「完成」和「錯誤」。若在框807處返回值是「完成,則在框801繼續處理之前,在功能框804中把該引用的「建立狀態」設為「已編譯的」。若把框808中返回的值為「錯誤」,則將該引用的「建立狀態」設定為「編輯錯誤」並在框801繼續處理之前,在功能框809的部件中調用「傳播錯誤」功能。若該引用的』建立狀態」是「編譯錯誤」或「不確定錯誤」,將不作任何事。應注意,「實施」的處理在這一階段順序獨立的,因為相關性只可以在其內部屬性是「真」而且已被處理過的「界面」或「實施」中。
「處理實施」的偽碼如下

支持建立處理的編譯程序編譯程序42通過「編譯」功能而被調用,兩者亦可作為替代命令使用。編譯程序42處理源文本並標識可能的外部部件的名字。編輯程序42下一步獲取所有部件的引用表。該編輯程序可用語言專用知識(例如部件類別)從該表中刪除這些引用。編譯程序然後為文本標識的每個外部部件調用「獲得說明(GetDealaration)」功能。在調用編譯程序之前,該「編譯」功能清除一切現存的錯誤。這也將清除任何來自「錯誤」特性的錯誤消息並從「項目」的的「錯誤表」特性中去除任何引用。
編譯程序首先調用「獲得說明」功能,如圖9的流程圖所示。「獲得說明」功能返回到「異常中止」值、「完成」值、「循環相關性」值或「錯誤」值的其中之一,並可返回「說明」的數據。處理起始於框901,在該處,每個引用的「建立狀態」被檢查。若沒有更多的引用要處理,便在框920處完成處理並返回。若該部件的「建立狀態」在框903處為「編譯的」,則功能返回到「完成」,如框904所示,而且在框901繼續處理之前,存儲的「說明」數據也被返回。若部件的「建立狀態」在框905處示為「需要編輯」或「不確定」,則相應於該部件的引用在功能框906中被加到「界面編譯表」的前部,並在框901繼續其處理之前,該功能返回到功能框907的「異常中止」。「說明」數據在這一情況下不返回,若部件的「建立狀態」為框908所示的「被編輯」,則在框901繼續處理之前,功能將去往功能框909處的「循環相關性」。「說明」數據在這一情況下亦不返回。若部件的「建立狀態」是框910所示的「編輯錯誤」或「不確定錯誤」,則在框901繼續其處理之前,功能返回到功能框911的「錯誤」。在這種情況下亦無「說明」數據返回。
「獲得說明」功能的偽碼如下
在調用「獲得說明」功能之後,編譯程序繼續進行如下的過程。若返回值為「異常中止」,則編輯程序必須中止處理並返回到「異常中止」值。一個替代實施方案是要編譯程序在編譯該返回的部件之後,中止編譯,放棄或重新啟動編輯程序。這會要求編譯程序再次進入。但若不是這樣的話,就不會有上述的重大變化。若返回的值是「編譯的」,則編譯程序可繼續其處理。若採用「說明」,則將構成「源引用相關性」,而且編譯程序會保持追蹤相關性及其性質。若返回值是「循環相關性」或「錯誤」,則編譯程序必須中止處理。在部件上調用「設置錯誤(Set Error)」功能,並返回「錯誤」值。編譯程序可以選擇繼續處理以便在結束之前發現更多可能的錯誤。
若對「獲得說明」的調用返回到「編譯的」,則編譯程序將以常規方式繼續處理源文本。若在處理過程中遇到任何錯誤,編輯程序將調用部件的「設置錯誤」功能並返回「錯誤」值,若沒有遇到錯誤,則編譯程序返回「完成」值。若編譯程序已經在對一個界面進行處理,則它將存貯該「說明」特性的新值。
處理「錯誤」的方法在編譯程序被調用以編譯一個「界面」或「實施」之前,清除所有現有的「錯誤」。這將保證所有的錯誤消息被更新。由於「界面」和「實施」之前的內部相關性以及這樣的事實,即錯誤是可傳播的,所以將不可能在同一建立上在「界面」和「實施」上同時得到編譯程序錯誤。
當編譯程序遇到錯誤時,它調用傳送與錯誤有關的信息的功能「設置錯誤」,該信息包括錯誤的位置,以及描述錯誤的消息和返回到的錯誤組成部。該信息存儲在「錯誤」特性和部件的正確源特性(「界面」或「實施」)之中。一個引用也存在允許對所有錯誤進行方便地存取的「項目」所維護的總錯誤表中。
錯誤將傳播到任意相關部件以便這些部件無需在其後被編譯。因為這些編譯已知將會失敗。進而,遇到錯誤後將繼續建立並儘可能多正確建立那些本身並無明顯錯誤的部件或與錯誤部件有關聯的部件。
「設置錯誤」功能獲取由編輯程序42傳給它的錯誤消息並在相應於適當特性(「界面」或「實施)的部件的「錯誤」特性中生成一個入口,它還在與該錯誤對應的「項目」的「錯誤表特性」中生成一個入口。以這一方式生成的兩個入口共享同一鍵,以致它們保持「連接」。這一功能通常還用一個「粘性標誌」把錯誤的位置記錄在程序源之中。該「粘性標誌」在稍後的用戶編輯過程中一直附屬到字符的相同範圍。
若編譯程序成功地完成了源文本的處理,則其將產生目標碼並將其通過「連接程序」功能進行增量連接。而且,目標碼可存到建立處理結束並以常規方式連接。
編譯程序現在將更新部件的「源引用(SourceRefRerence)1特性以及每個「源引用」的「客戶」特性。對每一個引用,例如部件A的「源引用」特性中的部件B,將必須有一與部件B的「客戶」特性中的部件A相對應的引用(它具有同樣的相關性信息)。
編輯程序將生成一個「變化」以描述「說明」如何從其當前值改變的,編輯程序將在部件上調用傳播改變(PropagateChange)功能並把計算出來的改變傳播給該部件。該編譯程序然後將設定「說明」的新值。「傳播改變」的功能與針對部件的「客戶」表中的每個引用的相關性的變化吻合。若該吻合指示引用的部件已為改變所影響,且其「建立狀態」不是「編譯錯誤」或「不確定錯誤」,則其「建立狀態」設為「需要編譯」。
有可能要編譯程序使用「設置錯誤」功能以發布告警信息或不同格式的建議。在這種情況下,若只有告警信息返回,則「編譯」功能應返回到「完成」。告警信息將被加到「錯誤」特性且引用將被加到「項目錯誤表」特性。否則編譯將被認為是成功的。適當的「建立狀態」將被設置為「編輯的」,而且將無錯誤被傳播。若只發布了告警或建議,則程序將被完全地及正確地建立。
「有條件地編譯」一個部件的處理圖10A和10B示出了「有條件編譯」功能的流程圖,其中進行了引用,在部件的「源引用用」中的每個部件B在框1001處進行處理。則對部件B的處理結束而處理去往圖10B以編譯組成部件A。部件B的「建立狀態」是「被編譯」或「需要編譯」,如框1003所示,則該部件的「建立狀態」被設定為「被編譯」且該部件在功能框1004中被編譯。該編譯功能可以返回到「完成」值,「異常中止」值和「錯誤」值其中之一。若返回框1005的「完成」值,處理將繼續在框1001處進行。
若返回值是框1006的「異常中止」,則功能中止且「異常中止」返回到框1007。若返回值是框1008中的「錯誤」,則原始部件的「建立狀態」被設置為「不確定錯誤」,功能被停止且「錯誤」返回到功能框1009中。若部件B的「建立狀態」是「不確定」,如框1010所示,則「建立狀態」被設定為「被編譯」且該部件在功能框1011中被有條件地編譯。再一次,「有條件地編譯」功能可以返到「完成」,「異常中止」或』錯誤」值之一。若「完成」值返回框1005,處理在框1001處繼續。若「錯誤」返回到框1012,則部件的「建立狀態」被設為「不確定錯誤」,從「界面編譯表」中去除部件A,並在功能結束之前在功能框1014中調用「傳播錯誤」功能。若返回框1015的「異常中止」,則在功能結束之前「異常中止」返回框1007。
現在再來看圖10B,若所有引用已被處理過,則它們的「建立狀態」都是「編譯的」。但是,「源引用」之一可能在對這一點的處理過程中已經把一個變化傳播到部件,所以它的「建立狀態」可以是「被編譯」或「需要編譯」。因此,部件A的「建立狀態」在框1016中決定。若框1017處指出該「建立狀態」是「需要編譯」,則該「編譯狀態」被設定為「被編輯」且部件A在功能框1018中被編譯。編譯程序可返回到「錯誤」或「完成」。注意「異常中止」不會發生,因為所有的』源引用」都在這一階段被編譯了。若「錯誤」去往框1019,則「建立狀態」設為「編譯錯誤」而且「錯誤」返回到功能框1020。若「完成」去往框1021,則「建立狀態」設為「編譯的」且「完成」去往功能框1023。若部件A的「建立狀態」是「被編譯」,如框1024所示,則「建立狀態」被設為「編譯的」而且「完成」去往功能框1023。
「有條件地編譯」功能的偽碼如下後處理錯誤的方法後處理錯誤的方法是「建立」處理的第四階段。若在建立過程中發生了任何錯誤,則「後處理錯誤」(PostPro-cessingErrors)功能便在建立結束時被調用。對每個在「內部錯誤表」中的引用而言,若引用的「建立狀態」是「編譯錯誤」,則「建立狀態」改變成「需要編譯」,若引用的「建立狀態」是「不確定錯誤」,則「建立狀態」被改變為「已編譯的」。
當所有在「內部錯誤表」上的引用已處理完畢後,該表的所有入口被消除。為便於程式設計師,若「項目」的錯誤表包含任何入口,則將在「項目」的「錯誤表」上開一個視窗或瀏覽窗。
「後處理錯誤」功能的偽碼如下使用面向人的目標編程系統(HOOPS)根據本發明的面向人的目標編程系統(HOOPS)可通過進入一個項目名或現有的項目名來從計算機開始,這要取決於是否要建立新的程序或建立現存的程序。當HOOPS開始時,視窗被打開並顯示一個與圖11所示屏幕類似的初始屏面。該HOOPS打開的初始視窗顯示了「項目」部件的「成員」特性以及其直接成員。雖然它初始只顯示了直接成員,但同樣的視窗用於顯示始於項目部件處的每個部件。在圖11的示例中,一個叫做「工資單(Pagroll)」的「項目」已被輸入。
窺視窗窺視窗是用於顯示一個部件特定特性的圖形展示。但是,在顯示該特性的處理過程中,可能會要求窺視窗顯示輔助信息,它們包括從其他特性而來的數據。一個窺視窗有一輸入和輸出。該輸入指至少一個部件和特性,也可以指定該特性的信息的子範圍。該輸出至少指一個部件。它亦可指定一個特性以及該特性數據的一個子範圍。該輸出可響應於用戶操作及系統中的狀態變化而隨時改變。
窺視窗表是一個窺視窗說明的命名表,其中,每個說明定義一個窺視窗名字及實施分類。有一個叫做空窺視窗表的區別窺視窗表,它不包含窺視窗說明。窺視窗表名字與每個特性關聯。特性可以被表中指定的任意窺視窗顯示。若一個特性與空窺視窗表關聯,則不會有該特性的窺視窗,而且該特性被認為是不可顯示的。一個最佳窺視窗將與每個特性關聯該最佳窺視窗必須在與特性相關聯的窺視窗表中指定的窺視窗之中。一個最佳特性與要被窺視的部件關聯。
窗格(Paue)一個窺視窗顯示在一窗格中。窗格有一輸入和輸出。該輸入指定至少一個部件。它亦可指定部件的一個特性和特性的數據的一個子範圍。其輸出指定至少一個部件並可指定一個特性和該特性數據的一個子範圍。該輸出可響應用戶動作及系統內的狀態改變而隨時改變。
一個窗格確定了它的窺視窗輸入,該輸入一般是從該窗格的輸入中導出而來的。它可動態地根據系統狀態或靜態地改變窗格的實施而從窗格到窗格進行變化。在最簡導出中,窺視窗的輸入與窗格的輸入相等。類似地窗格的輸出來自於對窺視窗格輸出的導出。該求導出的性質從窗格到窗格不同,它或者動態地取決於系統狀態,或者靜態地由窗格實施的變化而定。在最簡導出中,一個窗格的輸出等於其窺視窗的輸出。
視窗窗格顯示於視窗之中。視窗被細分為一個或多個窗格。在一個視窗中的窗格數量及大小可由用戶動態地控制。一個最佳實施例在每個窗格中提供窗格劃分程序控制以簡化多窗格的生成和管理。該控制用於把一個單個的窗格分為一個或多個窗格。
圖12示出了根據本發明的一個瀏覽窗。在HOOPS中的每個視窗都是瀏覽窗。瀏覽窗是暫時可見的和編輯工具,用於查看「項目」中的信息。只要在視窗中的關閉圖符1210上按一下,即可在任意時刻刪除瀏覽窗。任何在測覽窗中對「項目」所做的改變都被自動保存起來。一個瀏覽窗有一個項目根部件1200,它在打開時被指定。一個存貯器部件的實例展示於1202處,一個選擇的部件示於1203處,一個窗格特性上託選擇屏控制1220以及一個擴展或壓縮控制示於1204。該控制可使用戶把一個窗格導向一個特定的特性。輸入部件的特性2130在窗格1260中顯示。而且每個窗格1260顯示一個特性窺視窗1205或是空白的,如1260所示。新窗格由在一個窗格右上角中選擇一個劃分圖符1250的方式而加到一個瀏覽窗中。窗格劃分控制1250允許用戶將一個窗格分為兩個並控制其幾何尺寸。也有一個窗格和測覽窗放大/縮小框1242和1243,它們使得用戶可以動態地放大/縮小一個窗格以使完全充滿視窗,並使得用戶將窗格恢復至其原有尺寸。水平和垂直捲動控制1252被提供以便捲動位於一個窗格中的窺視窗。窗格標題框1241顯示部件的名字及由該窗格顯示的特性。窺視窗選項屏1251提供用於使用戶選擇用於顯示選定特性的窺視窗。
綜合考慮三個因素,以使確定由一個窗格顯示的專用窺視窗。它們是部件,該部分的特性,以及該特性的窺視窗。部件由窗格的輸入導出而來。特性亦來自對窗格的導出,或來自一個用戶的替換。若該窗格輸入指定了輸入部件的一個專用特性,則該特性按該特性關聯的窺視窗表所定義的來確定一組合格的窺視窗。若該窗格輸入未指定一個特性,則將被顯示的特性是部件的系統設定特性。
用戶可以通過選擇用於觀察或把一個窗格固定到一專用特性的另一輸入部件特性的方式而替換選定的特性。當固定後,該窗格顯示固定的特性而與輸入部件無關。當一個窗格的部件或特性變化時,一個新窺視窗在該窗格中顯示。該窺視窗是特性的系統設定窺視窗;然而,用戶可以順序改變該窺視窗成為在與顯示特性關聯的窺視窗表中列出任何項。
當生成一個新窗格時,系統設置的「連線(Wiring)」從分裂成新方格的方格中生成。「連線」是在一個窗格之間的邏輯關係。一個窗格可以有零個或一個連線輸入及零個或多個連線作為輸出,但連線不可以形成迴路。當在一個窗格中選擇了一個部件時,該選擇被轉換成對項目中部件的一個引用並成為一個對來自該窗格的任何連線的目的的新輸入。通過從選項屏條選擇的瀏覽窗選項屏中的「Turn on Wiring」(接通連線)可接通連線,從而產生圖13的疊加圖形連線的顯示。採用這一顯示,可能通過在新輸入位置按下滑鼠器並將其拉至目標窗格的方式改變兩個窗格之間的連線。
在許多窺視窗中(例如「成員」,「客戶」以及「引用」),部件可由它們的名字以及圖符(它們由部件類別區分)所區別,在其他窺視窗中,一個部件的名字只出現在本文中,例如在「源」或「資料」中部件層次可由擴展和縮滅在「成員」特性窺視窗中的貯存器部件從而產生一個「樹」視圖的方式進行測覽,圖14便展示了該例子。一個部件的子樹的一級可通過按一下部件的循環雙態開關的方式加以擴散或縮滅。當通過按一下圖符或在文本顯示中選擇其名字的方式在一個窺視窗中選擇一個部件時,在總選項屏條中的「特性」選擇屏被調整以列出部件的類型。任何部件的任何特性可以通過在一個窺視窗中選擇該部件並然後從「特性(Property)」選項屏中選中一個特性的方式進行視查。這會打開一個包括一個窺視窗的新瀏覽窗,該窺視窗顯示選定部件的選中特性。
通過指定任何處生成新部件以及該部件類別,可在一個「成員」或「界面」窺視窗中生成部件。該新部件的位置由選擇一個現有的部件或在部件之間放入一插入點的方式而予指定。生成的部件的類別通過從「New」窺視窗選項屏中選擇選項屏項所決定。所有編輯都自動存儲。只有已改變的部件以及受改變所影響的客戶才被編譯。重新編譯的部件可通過從「Build」選項屏中選中的「Show Components Build」選項屏項進行觀看。為了觀看從最後建立以來的改變的部件,要從「Build」選項屏中選擇「Sleow Compenents Changed」。通過從「Build」選項屏中選擇「Build」,可對一個程序進行編譯和連接。「Build Run」選項屏也運行該程序。
圖15至18展示了在編輯一個部件的處理過程中顯示的一些屏面。圖15示了一個「main」功能的「實施」的源碼顯示。在圖16中,功能「main」已由把「numberDisks」從「7」改變「9」的方式進行了編輯。若程式設計師現在從圖17中示出的「Build」選項屏中選擇「Show Components Changed」則圖18所示的瀏覽窗便會出現。在「Implementation Changes」窺視窗中(在右側),功能「main」被顯示,指示改變已發生。
面向目標連接本敘述列出了HOOPS連接程序的重要特性,它提供了一個最佳實施例的運行時間環境的背景以及提供連接出現的上下文的HOOPS資料庫。最後,有關HOOPS編譯程序HOOPS資料庫,以及系統裝入程序的連接和交互的討論將參照一個最佳實施例進行。
連接程序特性·連接發生在編譯處理過程中,沒有其它的連接通路。
·在建立過程中,只有最新被編譯的功能和數據才被再次連接。
·在增量發展過程中,某些共享的庫空間被用於換取速度。
·編譯程序與部件和特性交互以產生全部目標碼和其他連接信息。
·當一個程序可交付使用時,一個「出版」步驟將去除增量發展過程中用過的多餘的空間和信息,並程序與HOOPS分離開。
·一個「快速出版(QuickPublish)」步驟將從用於與其他程序共享的HOOPS中把該程序快速地分離出來,或移至另一機器。
·連接程序可是擴充的,因為該編譯程序可以指定該連接程序通常不處理的新安排。
·一個中止的程序可被修改然後再恢復執行而無須被再次裝入(有些變化將要求裝入)。
連接程序在HOOPS內操作並生成由裝入程序使用的文件。為了理解連接程序技巧,重要的是要理解運行時間系統和HOOPS的獨特之處。
一個可執行的文件與運行時間的交互在其他運行時間系統中大不相同。通常,一個裝入程序必須理解可執行文件格式。該可執行文件已知描述該程序各個方面(例如所需存儲器量,主地址,任何在裝入時刻需要的再定位信息,以及任何在可執行文件中組裝的調試信息)的欄位。在一個最佳實施例的運行時間中,裝入程序通過一個抽象「T裝入模塊(TLaodModule)」分類界面與該可執行文件交互。該「T裝入模塊」為所有裝入操作提供協議,例如,象指定存儲器要求,建立元數據信息以及連接其他共用庫的操作都由「T裝入模塊」的方法提供。藉助這一方式,一個裝入模塊可以有許多方式響應裝入請求。
運行時間定義提供了共用庫,並允許在裝入時刻解決交叉庫調用。由於庫可以在任何存儲位置裝入,所有碼必須是位置獨立的,或必須在裝入時刻被修補。除了位置獨立碼之外,必須在裝入時刻解決對其他庫的調用。這是由於靜態連接程序不知道存儲器中的外部庫的定位或相對位移是什麼。
雖然每個「T裝入模塊」分類可以許多不同方式實施交叉庫調用,標準方式則是要通過在裝入時刻修補過的連接區轉移,該連接區作為在兩個庫之間的間接轉移表。一個外部調用將轉移子程序返回(JSR)到該連接區,然後該連接區將轉移(JMP)到調用的功能。內部調用可以直接轉移並程序返回到該調用的功能。一個內部和交叉庫調用的實例示於圖19中並說明如下。
對f1( )1900的調用是一個內部調用,所以JSR直接去往f1( )1910。對f2( )1920的調用是一個交叉庫調用,因此調用去往裝入時刻修補的外部連接區1930。
HOOPS環境還提供了連接程序的唯一的上下文聯繫。一個程序被展示為一個部件集合。每個部件有一組相關的特性。在每個部件的編譯過程中,編譯程序將生成和存儲用於該部件的特性。HOOPS建立處理對部件的建立排序,以致於所有界面說明在實施(定義)之前便被編譯。
一個HOOPS項目可以包括幾個庫部件。所有源部件都是這些庫部件之一的成員。每個庫部件表示一個共用庫建立。
綜觀為了支持增量連接並使最終應用程式成為最小最快,生成了兩種不同的裝入模塊。在開發過程中,HOOPS生成和修改了一個「T增量裝入模塊(T incremental Load Module)」。有一個第二文件,「T標準裝入模塊(TStfandardLoadModule)在出版應用程式之前生成。
一個最佳實施例公開了在開發過程中建立和更新代碼的途徑。把一個「T增量裝入模塊」轉換成「T標準裝入模塊」涉及一個多餘的「出版」步驟。該步驟與一個常規的連接步驟很類似,其中,每個功能或數據項將被再定位和修補。但是,直到裝入時刻才解決外部引用。
編譯程序交互隨著編譯程序生成一個部件的代碼,該碼由用於修補目標碼的一組安排傳到目標碼特性。每個編譯的部件使其目標碼特性裝滿。編譯程序使用一個「目標組」模塊。即一個部件可以由多種類型的目標碼組成。例如,一個功能可能也有一個與其相關的專用靜態數據區以及用於該靜態數據區的解除程序順序。一個靜態數據項可能有一個構成程序以及與之相關的解除程序順序以便在運行時刻將其初始化。
例如,假設下列部件被編譯TFoo∷Print( )Static int times Called=0cout「Hello world」timesCalled「\n」;timesCalled++;}該編譯程序將生成兩部分目標碼並將它們與部件TFoo∷Print相關。將有用於功能的目標碼,以及4位元組的專用數據用於靜態變量timesCalled。
有些看起來就象下文Object code property of TFoo∷Print-code0x0000 LINK A6,#00x0004 MOVE.LA5,--(A7)0x0006 PEA L10x000A MOVE.LtimesCalled,--(A7)0x000E PEA L20x0012 MOVE.Lcout,--(A7)0x0016 BSR operator(char*)
0x001C ADDQ.L#8,A70x001E MOVE.LD0,--(A7)0x0020 BSR operator(int)
0x0026 ADDQ.L#8,A70x0028 MOVE.LD0,--(A7)0x002A BSR operator(char*)0x0030 ADDQ.L #8,A70x0032 ADDQ.L #1,timesCalled0x0034 UNLK A60x0036 RTSL1DB "\n"L2DB "Hello world"Object code property of TFoo∷Print-data00000000 00000000與目標碼一起,編譯程序將說明由於該碼被重新定位而必須採用的不同安排。這些可能看起來象refererce to times CalledOffset 0x0creference to CoutOffset 0x14reference to ostream∷Operator(Coust char*)Offset 0x18referenee to Ostream∷Operator(int)Offset 0x22refereace to Ostream∷Operator(Const Char*)Off-set 0x2creference to times Called Offset 0x34注意安排可以指定對與同一部件(專用靜態變量timesCalled)的目標的其他部分的引用,或者對其他部件(例如Cout0的引用。
當編輯程序已經完全指定了完整的數據集和與一個部件相關安排時,目標碼特性重新對所有部分定位並在同樣時刻將其連接起來。在所有部件被編譯後沒有第二個連接通路。隨著每個部分新編譯,它也被完全連接。
安排表連接實質上是一個通過安排表反覆進行並以適當方式修補代碼的過程。通過一個分類層級指定不同類型的安排(fixup),每種安排都知道如何計算修補值。例如,一個PC相關安排知道其必須計算其定位地址和引用的部件之間的差值。一個絕對安排知道必須延遲計算直到裝入時刻。雖然連接程序指定了一組安排分類,但新的編譯程序可以指定新型安排。圖20示出了根據最佳實施例的一組安排分類。
地址計算當每個部件被編譯時進行連接的主要問題是其引用的一些部件可能未經編譯。
每個源部件正好是一個庫部件的一個成員。與每個庫部件相關的是一個裝入模塊特性。該裝入模塊特性清除屬於該共用庫的所有部件的空間。由於一個安排準備計算一個修補值,它詢問一個部件的地址的裝入模塊特性。該裝入模塊特性檢查是否該模塊已為編譯。若是,則返回該部件的地址。若否,則裝入模塊特性根據該部件的類型執行兩個動作。
若該部件的類型是數據部件,則返回到恆定地址。若其為一功能部件則為該功能生成一個連接區,並返回到該連接區的地址。
目標布局如前所述,當每個部件被編譯時,它分配一個在共享庫中的位置。隨著其完成,某些多餘的工作必須完成以便所有引用是一致的。
若該部件是一數據部件,所有它的客戶都被告知它所處的位置。某些客戶可能開始已與假設地連接,所以這一處理必須清除所有客戶並為其提供正確地址。若該部件為一功能部件,則該功能的連接區為新地址所更析。應當注意,這兩種途經提供了對功能的間接存取和對數據的直接存取。
此外,分配有多餘空間,以便目標碼未來的更新尤其可能使用同樣區域。多出12%提供給功能而多出25%供給大數據目標。
連接區如上所述,當為了一個功能的地址而請求裝入模塊特性的時候,該特性將給出該連接區的地址。這意味著每個功能引用都是間接的,圖21展示了根據一個最佳實施例的連接區。
應當注意,不僅內部庫間接通過內部連接區調用,而且交叉庫也通過庫的內部連接區對功能進行間接調用9即對庫B中f2的調用(2100,2110,2115及2120)這必須完成以便f2可以在無需更新其內部和外部客戶的情況下改變位置,並保持一致性從而使功能指針之類的項正確地工作。此外,所有虛擬表功能指針也將指向內部連接區。
任何被引用的但未定義的功能將指向一個通用「未實施( )(Unimplemented( ))」功能。由於所有未編譯的功能指向「未實施( )」。因而程式設計師不必生成存根模塊功能從而簡化了裝入和運行部分應用程式。
具有內部連接區的另一好處是提供了一個對所有功能的渠道。在開發過程中,內部連接區可用於需要功能追蹤的活動(例如調試或性能監測)。
增量連接前述討論已對增量連接的詳細討論奠定了基礎,當一個部件被再編譯時,新部件的尺寸將與舊部件的尺寸進行比較以確定是否新部件符合現有定位。若符合,則存在諸位置,並通過它的安排表將語新部件造代,隨即完成聯接。
若新部件的目標碼必須被重新定位,則以前的空間被注以廢棄標記,而新目標碼被定位到一個新區域。然後安排表被迭代。若該部件是一功能,則更新連接入口。連接然後完成。但是,若部件是一數據項,則該部件必須在客戶表上迭代並更新該部件的引用。然後該數據的連接才告完成。
應注意起始連接和增量連接按照同樣步驟進行。在增量更新中唯一多出的步驟是處理何時一個數據項必須改變定位。
目標碼存儲目標碼和裝入模塊特性是通常的部件特性。它們象所有其他特性一樣,存在HOOPS的資料庫中。但是,目標碼特性描述目標碼但不包含實際位。實際位存在由裝入模塊特性所有的段中。該裝入模塊特性有四個不同的段,它們包括碼、未初始化碼、初始化碼以及連接區。
圖22展示了根據最佳實施例的目標碼存儲。每個圖形目標220有一個關聯的裝入模塊特性2250,它包括與圖形目標2210,2220,2230和2240相關聯的單獨的目標碼。由於所有碼在編譯時都被連接,並且提供了對於改變和增量建立的支持,因而裝入模塊特性維護了位於每個段中心所有目標的映射。它還償試保持用於增長的多餘空間。該多作空間會浪費一些虛擬存儲空間,但並不佔用後備存儲器或實際存儲器。若在反覆改變和建立一個應用程式的處理過程中,該多餘空間被消耗的情況,則將分配其他空間,受到影響的段必須被重新定位而且所有對於該段的出入引用必須被更新。
圖23示出了根據最佳實施例的裝入庫。空白區段2300,2100,2320和2330代表自由空間。該庫為未初始化數據2340,初始化數據2350,代碼2360和連接區2370提供了四個段。在HOOPS中,這些段沒有空間關係。連接使用將被裝入的關係的內容而非可能在HOOPS本身內具有的關係。
裝入為了運行一個程序,裝入程序必須有一個數據流式「T裝入模塊」分類。在建立程序過程中,生成一個數據流式「T裝入模塊」,當裝入時,把生成的段裝入HOOPS,沒被裝入的應用程式和HOOPS共用。這提供了兩個好處首先,它大大減少了必須複製的工作量,其次,它使程序在裝入時進行增量更新。
由於裝入程序需要一個數據流式「T裝入模塊」分類,而且「T增量裝入模塊(Tincremental Load Module)要減少流入的信息量,因此,必須寫出從開始到結束數據流。這意味著對於一個程序中心大部分改變,「T增量裝入模塊」將不必是再被數據流化的。通過使用共享堆陳該「T增量裝入模塊」從HOOPS中得到所有映射信息,否則,任何數據定位中心的改變或功能尺寸的改變都需要建立一個新的「T增量裝入模塊」並被數據流化。圖24是一個根據一個最佳實施例的裝入模塊的存儲映射。
增量更新增量連接簡化了對一個裝入庫的修改且無需從執行中將其去除。這要求在HOOPS中所做的改變在運行應用程式的地址空間中反映出來,這是通過把庫作為共用段的方式處理的。在HOOPS一例進行的任何修改將在運行程序側反映出來。應記住,在HOOPS一側,段被解釋為HOOPS資料庫的一部分,而在應用程式一側,它只是包含目標碼的一個段。
進行程序修改的模式如下調試程序首先停止執行;然後編譯修改後的功能,並把修改後的功能裝入不同位置,雖然它們也符合其現有位置;再對內部連接區進行更新;然後繼續該程序。若一個修改的功能在棧上有效,則舊版本將執行直到該功能的下一調用。一個替代方案是在有效功能被修改時取消該程序。
出版一個程序當一個應用程式發行時,連接程序將把所有目標碼複製到資料庫外面的一個文件中,隨著段被複製到一個外部文件,連接程序對所有功能進行再定位及修補。此外,所有內部調用將成為直接調用,且內部連接區將被去除。除了連接和重新對目標碼定位之外,連接程序必須包括虛擬表生成所需的元數據。應注意,這一步驟基本是一個連接而不涉及編譯程序。
還需要第二種出版方式,該方式叫做快速出版。一個快速出版把需要的段從資料庫複製到一個外部文件。第二出版的目的是支持交叉開發或共享工作的快速換向。
實施細節分類定義<![CDATA[  enum EObjectKind {kCode,kData,  kStaticCtor,kStaticDtor};  class TObjectPropertypublic TProperty{  public   TObjectProperty( );   virtual   ~TObjectProperty( );  //Compiler Interface   virtual void WriteBits(EObjectKind   whichOne,LinkSize length,  void*theBits,unsigned shortalignment);   virtualvoidAdoptFixup(EObjectKindwhichOne,TFixup*theFixup);// Getting/Setting   void*   CopyBits(EObijectKind whichOne)const;   LinkOffset GetOffset(EObjectKindwhichOne)const;   LinkSize   GetLength(EObjectKind whichOne)const;   ELinkSegment   GetLinkSegment(EObjectKind whichOne)const;   Boolean   Contains(EObjectKind whichOne)const;   virtual EObjectKind GetPublicKind( )const=0;// Linking   virtual void GetLocation(EObjectKindwhichOne,TLocationfillInLocation)const;   TIterator*CreateFixupIterator( )const;};   The object code property delegates the fixup work toindividual fixup objects.   class TFixup {   public   void DoFixup(void*moduleBase)=0;   private   TComponent*fReference;   longfOffset;   };]]>
從T Fixup衍生出來的分類為TPcRelative Fixup,Tabso-luteFixup以及TDataRelativeFixup,每一安排分類都清楚如何對其類型進行適當的修補,這與常規的編譯程序/連接程序交互全然不同,在常規編程程序/連接程序交互時,連接程序必須對不同的位進行解釋以決定要採取何種行動。這一方式另一優點在於用於一個新結構的新編譯程序不必擔心一個安排類型不為連接程序所支持。
引用類別連接程序必須處理4類引用。它們是碼對碼,碼對數據,數據對碼,以及數據對數據。每類引用被處理(對68K而言)的方式敘述如下碼對碼例如Foo( );編譯程序根據文本以兩種不同方式處理這一情況。它可go pc-relative to Foo( ),或可把Foo( )的地址裝入,並直接去往一個寄存器。任何內部調用都可選用其中一種方式,連接程序將總是報告連接區的地址,交叉庫調用必須使用裝入地址的方式,這些將用絕對地址,這些絕對地址則在裝入時刻被修補。
碼對數據例如gValue=1;編譯程序產生一個對於gValue的Pc-relative存取,但是,其gValue在一個不同的共用庫中時,編譯程序將自動生成一個間接引用。連接程序將捕獲該間接引用並提供一個在裝入時刻由外部地址修補過的本地地址。
數據對碼和數據對數據例如(數據對數據)Void(*pfn)( )=Foo;例如(數據對數據)intpi=i;由於這兩種引用都需要絕對地址,它們將在裝入時被處理。在裝入時刻修補數據引用就象修補外部引用一樣。
圖25表示了在每類引用中發生的情況。若一個外部庫要引用同樣的部件,該庫將在裝入時刻接收幾個GetExpor-tadres( )調用。響應於GetExportaddress( )調用,一個庫將返回到功能的內部連接區地址以及數據的實地址。這使得當庫在被裝載時,功能在附近移動。
圖26,27,28和29是示明與一最佳實施例相關的邏輯的流程圖。圖26展示了控制的「整個流程,處理起始於2602,該處,建立操作按前述那樣被初始化且處理去往功能框2610以供編譯。這一處理始於功能框2630,在那裡,目標碼被接受且收集部件的安排,然後,在功能框2640處存儲目標碼並在功能框2650處為新改變的目標模型進行安排,與功能框2640關聯的處理詳細示於圖27中,而與功能框2650的細節示於圖28和29中。
圖27是一流程圖,示出了與根據本發明的目標碼存儲關聯的邏輯。處理始於2700並立即去往判別框2710以確定是否這是一個起始存儲操作。若是,則存儲按功能框2740所示分配,一個入口在功能框2744中示出的映射中生成或更新,其細節示於圖29中,然後該目標在功能框2750處存儲。若另一分量在該目標被編譯之前已引用了該目標,則發生更新。判別框2710將決定是否這是一個更新操作。然後在判別框2720處進行測試以確定是否該碼與現有位置吻合。若是,則在功能框2750處存儲該目標,若否,則在功能框2730處消除現有的存儲,並在判別框2760處進行另一測試以確定是否該數據為目標數據。若是,則在功能框2762處分配存儲,並在功能框2770中在所示的映射中生成入口或更新入口,其細節示於圖29中,並且在功能框2750處存儲該目標。
圖28展示了安排處理以及與獲取一個引用目標的地址關聯的處理的詳細邏輯。執行安排的處理始於2800並馬上去往功能框2810獲取一個引用目標的地址。然後,在判別框2820處,進行測試以確定是否需要絕對安排。若是,則在功能框2830處為一個裝入操作注釋該絕對安排,若否,則用功能框2840所示的相關位置修補該碼。獲取引用目標地址的處理始於功能框2850,在判別框2860處立即進行測試以確定是否一個目標已在映射之中。若是,則地址返回到功能框2880,若否,則在功能框2744所示的映射中行成或更新一個入口,其細節示於圖29,然後地址返回到功能框2880。
圖29是根據本發明在一個映射中生成或更新一個入口的邏輯。處理始於2900並立即去往判別框2910以確定是否一個目標已在該映射之中,若目標存在,則在判別框2930處進行測試以確定目標是否為數據。若是數據,則映射為功能框2940所示之新地址所更新。否則,由功能框2920中所示之新地址更新轉移位置。若目標不在映射中,則在判別框2950處進行另一測試以確定是否該目標是數據,若是,則由功能框2960所示之適當地址生成一個映射,若否,則由功能框2980所示之連接區生成一個對於以後定義的位置的轉移位置,並由連接區地址將一入口收入該映射中。
雖然本發明以實施例方式敘述了本發明,但本發明領域的一般技術人員可了解本發明的基本原理並可據其進行修改和變型,本發明的範圍受權利要求保護。
權利要求
1一種連接電腦程式的方法,其特徵在於包括以下步驟(a)將一個電腦程式模式成一個部件的集合;(b)在一存儲器中存儲這些部件;(c)訪問所存儲的部件並計算與每個部件關聯的相關性以生成一個相關性表;(d)根據該相關性表編譯部件以生成一個更新的目標模塊;以及(e)通過更新一個現有的可執行文件來連接該更新的目標模塊。
2權利要求1所述的方法,其中,連接該更新的目標模塊的步驟與編譯部件的步驟並行發生。
3權利要求1所述的方法,其中,只有更新的目標模塊被連接。
4權利要求1所述的方法,包括在存儲器中把目標碼作為部件特性存儲的步驟。
5權利要求1所述的方法,包括存儲一個包括連接信息的資料庫的步驟。
6權利要求1所述的方法,包括在連接操作完成時釋放存儲的步驟。
7權利要求1所述的方法,還包括以下步驟(a)在存儲器中存儲一個外部連接區;以及(b)由外部調用信息在裝入時刻修補該外部連接區。
8一種用於連接電腦程式的裝置,特徵在於包括(a)用於將電腦程式成型為一個部件集合的裝置;(b)用於在存儲器中存儲部件的裝置;(c)用於訪問存儲的部件並計算與每個部件關聯的相關性以生成一個相關性表的裝置;(d)用於根據該相關性表的編譯部件以生成一個更新的目標模塊的裝置;以及(e)用於通過更新一個現有的可執行文件來連接該更新的目標模塊的裝置。
9權利要求8所述裝置,其中所述用於連接更新的目標模塊的裝置與用於編譯部件的裝置並行工作。
10權利要求8所述裝置,其中所述用於連接的裝置只連接更新的目標模塊。
11權利要求8所述裝置,還包括用於把目標碼作為部件特性存在存儲器中的裝置。
12權利要求8所述裝置,還包括用於存儲包括連接信息的資料庫的裝置。
13權利要求8所述裝置,還包括在連接操作結束時釋放存儲的裝置。
14權利要求8所述的裝置,還包括(a)用於在存儲器中存儲外部連接區的裝置;以及(b)用於在裝入時刻由外部調用信息修補該外部連接區的裝置。
15一種用於連接電腦程式的方法,其特徵在於包括(a)將電腦程式模式成為一個部件的一個集合;(b)在存儲器中存儲部件;(c)訪問所存儲的部件並計算每個部件的相關性以生成一個相關性表;(d)根據該相關性表編譯部件以生成一個更新的目標模塊;(e)通過更新一個現有的可執行文件來連接更新的目標模塊;以及(f)更新一個裝入的可執行文件。
16權利要求15所述的方法,還包括存儲目標模塊以簡化可執行文件的自連接的步驟。
17權利要求16所述的方法,還包括在存儲目標模塊時進行目標自連接的步驟。
全文摘要
一個面向人的目標編程系統提供了一個交互和動態的處理以助於電腦程式的增量建立,該增量建立簡化了諸如作業系統以及有圖形用戶界面的大的應用程式之類的複雜電腦程式的開發。一個程序被成型為一個稱為部件的單元集。一個部件表示一個象分類或功能性之類的可編譯語言成分。三個主要的功能性是資料庫,編譯程序和建立處理。一個增量連接程序在建立處理中操作以生成由裝入程序所用的文件。
文檔編號G06F9/445GK1102934SQ94190010
公開日1995年5月24日 申請日期1994年1月6日 優先權日1993年6月28日
發明者羅傑·P·勞倫斯, 約翰·R·丹斯 申請人:塔裡根特公司

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀