什麼是大型主機 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