View a markdown version of this page

什麼是大型主機 AWS Transform 中的資料簡化程式 - AWS 大型主機現代化

AWS Mainframe Modernization 自我管理體驗不再開放給新客戶。如需類似 AWS Mainframe Modernization 自我管理體驗的功能,請從廠商導向產品和來源探索功能 AWS Transform。現有客戶可以繼續正常使用該服務。如需詳細資訊,請參閱AWS 大型主機現代化可用性變更

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS Mainframe Modernization Service (受管執行期環境體驗) 不再向新客戶開放。對於與 AWS Mainframe Modernization Service (受管執行期環境體驗) 類似的功能,請探索 AWS Mainframe Modernization Service (自我管理體驗)。現有客戶可以繼續正常使用該服務。如需詳細資訊,請參閱AWS 大型主機現代化可用性變更

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

什麼是大型主機 AWS Transform 中的資料簡化程式

在大型主機和中階系統上 (在下列主題中稱為「舊版」系統),經常使用的程式設計語言,例如 COBOL、PL/I 或 RPG,可提供低層級的記憶體存取。此存取著重於透過原生類型存取的記憶體配置,例如區域化、封裝或英數字元,也可能透過群組或陣列彙總。

透過輸入欄位和直接存取位元組 (原始記憶體) 來混合存取給定的記憶體,在給定程式中共存。例如,COBOL 程式將以連續位元組集合 (LINKAGE) 的形式將引數傳遞給發起人,或以相同方式 (記錄) 從檔案讀取/寫入資料,同時以文案中整理的類型欄位來解譯此類記憶體範圍。

這類原始和結構化存取記憶體的組合、對精確位元組層級記憶體配置的依賴,以及舊版類型,例如分區或封裝,都是在 Java 程式設計環境中原生或輕鬆可用的功能。

作為將舊版程式現代化為 Java 的大型主機 AWS 轉換解決方案的一部分,Data Simplifier 程式庫為現代化 Java 程式提供此類建構,並以盡可能熟悉的方式向 Java 開發人員公開這些建構模組 (getters/setters、位元組陣列、類別型)。這是從此類程式產生的現代化 Java 程式碼的核心相依性。

為求簡化,下列大多數說明都是以 COBOL 建構為基礎,但您可以將相同的 API 用於 PL1 和 RPG 資料配置現代化,因為大多數概念都類似。

主要類別

為了方便閱讀,本文件使用適用於大型主機 API 介面和類別的 AWS Transform 的 Java 簡短名稱。如需詳細資訊,請參閱討論的 Java 類型的 FQN

低階記憶體表示

在最低層級, Record 界面代表記憶體 (以快速、隨機方式存取的連續位元組範圍)。此界面基本上是固定大小之位元組陣列的抽象。因此,它提供設定程式和取得程式能夠存取或修改基礎位元組。

結構化資料表示

若要表示結構式資料,例如 "01 data items" 或 "01 copybooks",如 COBOL DATA DIVISION 中所找到,會使用 RecordEntity 類別的子類別。這些通常不是手動撰寫,而是由對應舊版建構中的 AWS 大型主機現代化工具轉換所產生。了解其主要結構和 API 仍然很有用,因此您可以了解現代化程式中的程式碼如何使用它們。在 COBOL 的情況下,該程式碼是從 PROCEDURE DIVISION 產生的 Java。

產生的程式碼代表每個具有RecordEntity子類別的「01 資料項目」;每個基本欄位或彙總編寫以私有 Java 欄位表示,組織為樹狀目錄 (每個項目都有父項,但根欄位除外)。

基於說明目的,以下是 COBOL 資料項目範例,後面接著適用於大型主機產生之程式碼的對應 AWS 轉換,以將其現代化:

01 TST2. 02 FILLER PIC X(4). 02 F1 PIC 9(2) VALUE 42. 02 FILLER PIC X. 02 PIC 9(3) VALUE 123. 02 F2 PIC X VALUE 'A'.
public class Tst2 extends RecordEntity { private final Group root = new Group(getData()).named("TST2"); private final Filler filler = new Filler(root,new AlphanumericType(4)); private final Elementary f1 = new Elementary(root,new ZonedType(2, 0, false),new BigDecimal("42")).named("F1"); private final Filler filler1 = new Filler(root,new AlphanumericType(1)); private final Filler filler2 = new Filler(root,new ZonedType(3, 0, false),new BigDecimal("123")); private final Elementary f2 = new Elementary(root,new AlphanumericType(1),"A").named("F2"); /** * Instantiate a new Tst2 with a default record. * @param configuration the configuration */ public Tst2(Configuration configuration) { super(configuration); setupRoot(root); } /** * Instantiate a new Tst2 bound to the provided record. * @param configuration the configuration * @param record the existing record to bind */ public Tst2(Configuration configuration, RecordAdaptable record) { super(configuration); setupRoot(root, record); } /** * Gets the reference for attribute f1. * @return the f1 attribute reference */ public ElementaryRangeReference getF1Reference() { return f1.getReference(); } /* * * Getter for f1 attribute. * @return f1 attribute */ public int getF1() { return f1.getValue(); } /** * Setter for f1 attribute. * @param f1 the new value of f1 */ public void setF1(int f1) { this.f1.setValue(f1); } /** * Gets the reference for attribute f2. * @return the f2 attribute reference */ public ElementaryRangeReference getF2Reference() { return f2.getReference(); } /** * Getter for f2 attribute. * @return f2 attribute */ public String getF2() { return f2.getValue(); } /** * Setter for f2 attribute. * @param f2 the new value of f2 */ public void setF2(String f2) { this.f2.setValue(f2); } }

基本欄位

類別欄位 Elementary(或 Filler,當未命名時) 代表舊版資料結構的「分葉」。它們與基礎位元組 ("range") 的連續範圍相關聯,通常具有 類型 (可能參數化),表示如何解譯和修改這些位元組 (分別透過「解碼」和「編碼」從/到位元組陣列的值)。

所有基本類型都是 的子類別RangeType。常見類型為:

COBOL 類型 資料簡化器類型

PIC X(n)

AlphanumericType

PIC 9(n)

ZonedType

PIC 9(n) COMP-3

PackedType

PIC 9(n) COMP-5

BinaryType

彙總欄位

彙總欄位會組織其內容的記憶體配置 (其他彙總或基本欄位)。它們本身沒有基本類型。

Group 欄位代表記憶體中的連續欄位。每個包含的欄位在記憶體中以相同的順序排列,第一個欄位與記憶體中的群組欄位位置0處於偏移,第二個欄位位於偏移 0 + (size in bytes of first field)等。它們用於表示相同包含欄位下的 COBOL 欄位序列。

Union 欄位代表存取相同記憶體的多個欄位。每個包含的欄位都會0相對於記憶體中的聯集欄位位置以偏移方式配置。例如,它們用於代表 COBOL "REDEFINES" 建構 (第一個 Union 子系是重新定義的資料項目,第二個子系是其第一個重新定義等)。

陣列欄位 ( 的子類別Repetition) 代表其子欄位配置的重複 (無論是彙總本身或基本項目)。它們在記憶體中配置了一定數量的此類子配置,每個配置都處於位移 index * (size in bytes of child)。它們用於代表 COBOL "OCCURS" 建構。

基本概念

在某些現代化案例中,「主要」也可以用來呈現獨立的「根」資料項目。這些在使用 時非常類似,RecordEntity但不是來自它,也不是以產生的程式碼為基礎。相反地,它們是由大型主機執行時間的 AWS 轉換直接提供,作為Primitive界面的子類別。這類提供的類別範例為 AlphanumericZonedDecimal

資料繫結與存取

結構化資料與基礎資料之間的關聯可以透過多種方式完成。

此用途的重要界面是 RecordAdaptable,其用於取得RecordAdaptable基礎資料的Record「可寫入檢視」。如以下所示,多個類別實作 RecordAdaptable。互斥地, AWS 大型主機 APIs和程式碼處理低階記憶體 (例如程式引數、檔案 I/O 記錄、CICS 通訊區域、配置的記憶體...) 的轉換通常預期 RecordAdaptable會是該記憶體的控制代碼。

在 COBOL 現代化案例中,大多數資料項目都會與記憶體相關聯,該記憶體會在對應程式執行的生命週期內修正。為此,RecordEntity子類別會在產生的父物件 (程式內容) 中執行個體化一次Record,並根據RecordEntity位元組大小,負責執行個體化其基礎 。

在其他 COBOL 案例中,例如將 LINKAGE 元素與程式引數建立關聯,或現代化 SET ADDRESS OF 建構,RecordEntity執行個體必須與提供的 建立關聯RecordAdaptable。為此,存在兩種機制:

  • 如果RecordEntity執行個體已存在,則可以使用 RecordEntity.bind(RecordAdaptable)方法 (繼承自 Bindable) 將此執行個體設為「點」至此 RecordAdaptable。上呼叫的任何 getter 或 setter RecordEntity 都會由基礎位元組支援 (位元組讀取或寫入)RecordAdaptable

  • 如果要RecordEntity執行個體化 ,RecordAdaptable則可使用產生且接受 的建構函數。

相反地,可以存取Record目前繫結至結構化資料的 。因此, RecordEntity會實作 RecordAdaptable,因此getRecord()可以在任何此類執行個體上呼叫 。

最後,許多 COBOL 或 CICS 動詞需要存取單一欄位,以供讀取或寫入之用。RangeReference 類別用於表示此類存取。其執行個體可從RecordEntity產生的getXXXReference()方法 (XXX 為存取欄位) 取得,並傳遞至執行期方法。 RangeReference 通常用於存取整個 RecordEntityGroup,而其子類別ElementaryRangeReference代表對Elementary欄位的存取。

請注意,上述大多數觀察都適用於Primitive子類別,因為它們會努力實作類似的行為,RecordEntity如同由適用於大型主機執行時間的 AWS 轉換 (而非產生的程式碼) 所提供。為此, 的所有子類別都會Primitive實作 RecordAdaptableElementaryRangeReferenceBindable 介面,以用來取代RecordEntity子類別和基本欄位。

討論的 Java 類型的 FQN

下表顯示本節討論的 Java 類型的完整名稱。

短名稱 完整名稱

Alphanumeric

com.netfective.bluage.gapwalk.datasimplifier.elementary.Alphanumeric

AlphanumericType

com.netfective.bluage.gapwalk.datasimplifier.metadata.type.AlphanumericType

BinaryType

com.netfective.bluage.gapwalk.datasimplifier.metadata.type.BinaryType

Bindable

com.netfective.bluage.gapwalk.datasimplifier.data.Bindable

Elementary

com.netfective.bluage.gapwalk.datasimplifier.data.structure.Elementary

ElementaryRangeReference

com.netfective.bluage.gapwalk.datasimplifier.entity.ElementaryRangeReference

Filler

com.netfective.bluage.gapwalk.datasimplifier.data.structure.Filler

Group

com.netfective.bluage.gapwalk.datasimplifier.data.structure.Group

PackedType

com.netfective.bluage.gapwalk.datasimplifier.metadata.type.PackedType

Primitive

com.netfective.bluage.gapwalk.datasimplifier.elementary.Primitive

RangeReference

com.netfective.bluage.gapwalk.datasimplifier.entity.RangeReference

RangeType

com.netfective.bluage.gapwalk.datasimplifier.metadata.type.RangeType

Record

com.netfective.bluage.gapwalk.datasimplifier.data.Record

RecordAdaptable

com.netfective.bluage.gapwalk.datasimplifier.data.RecordAdaptable

RecordEntity

com.netfective.bluage.gapwalk.datasimplifier.entity.RecordEntity

Repetition

com.netfective.bluage.gapwalk.datasimplifier.data.structure.Repetition

Union

com.netfective.bluage.gapwalk.datasimplifier.data.structure.Union

ZonedDecimal

com.netfective.bluage.gapwalk.datasimplifier.elementary.ZonedDecimal

ZonedType

com.netfective.bluage.gapwalk.datasimplifier.metadata.type.ZonedType