网站制作价目表,青岛建设厅官方网站,网站建设 海南,外贸自建站平台哪个好在Keyhole Software#xff0c;我们在很大程度上是一家现代化公司。 我们拥有一些顾问#xff0c;他们专门研究将旧的代码迁移到新的#xff0c;翻新的残旧代码库#xff0c;并为大多数已经被供应商锁定的企业设计更光明的未来。 作为这些经验的有趣的副作用#xff0c;我… 在Keyhole Software我们在很大程度上是一家现代化公司。 我们拥有一些顾问他们专门研究将旧的代码迁移到新的翻新的残旧代码库并为大多数已经被供应商锁定的企业设计更光明的未来。 作为这些经验的有趣的副作用我们遇到了一些重复的模式和策略以了解如何实现遗留系统的现代化。 在此博客中我们将介绍一种看起来非常流行的策略Re-Platforming 并将用我们开发的Keyhole Labs产品进行演示。 这篇文章的基本流程是 现代化概论 重新平台战略的高层定义 使用Keyhole语法树变压器进行重新平台化的示例 结束语 摘要 “我要进行一次现代化……不等也许要两个……” 当我们第一次围绕现代化主题吸引客户时我们会看到他们在此过程中实际想要完成的工作的定义各不相同。 这些范围包括从大型机应用程序退出从ESB /经典SOA架构过渡到基于云的PaaS实施再到从供应商锁定/分层架构迁移到DevOps /微服务架构。 随着十年前最近更新其技术堆栈的公司遇到成功运营或成长的一些关键问题所有这些情况的发生频率越来越高 部署问题所有内容都必须作为一个单元进行部署这是一个痛苦的过程并且/或者与其所有基础架构紧密耦合 可伸缩性问题可伸缩性的垂直极限受到了打击–这意味着机器无法足够快地变大以应对容量的增加 性能问题系统中消息/事务的数量正在增加延迟在某些情况下会导致级联故障 资源问题使用此系统的工程师和计算机科学家本来就不在或即将退休并且不再在学校教授编程语言 因此请进入现代化计划。 让我们首先回顾一下Re-Platforming策略及其优缺点。 这就像修理我的靴子吗” 重新平台有时也称为升降机。 从根本上讲重新平台是将一种代码语言转换为另一种代码语言即进行翻译。 作为现代化策略这意味着将较旧的代码语言转换为较新的代码语言。 由于各种原因大型机在一些大型企业中仍然很普遍因此像COBOL这样的旧代码库也仍然存在。 摆脱这些较旧的代码库和大型机的原因通常是以下之一 资源问题如上所述大型机程序员正变得稀缺并且这些语言集在任何现代课程中都没有涉及。 招聘新开发人员比较困难尤其是在快速变化和技术选择日趋广泛的情况下。 更少的员工愿意研究某些被淘汰的技术。 对于任何规模的企业而言大型机都是一笔巨额费用而垂直增长则是唯一的增长选择有时这是昂贵的。 大多数现代体系结构中常见的灾难恢复和高可用性策略可能会对大型机造成成本上的限制。 程序语言构造OOP函数式编程反应式编程等中不能轻易利用更新的编程模式-因此限制了选择的范围。 SDLC的变化–即从瀑布过渡到敏捷过程以保持竞争力。 因此长话短说-说“重新平台化”实际上是什么意思 在此过程中将分析较旧的代码库以确定代码库中的语法或模式。 一旦定义了语法树或一组代码模式便会通过某些单步或多步编译器软件运行原始代码库即COBOL以将旧代码转换为所需的最终状态-通常是Java C或更高版本的等效语言。 从业务角度来看这可能非常有吸引力。 无需让产品所有者和开发人员组成团队来逐步用新语言重新编写每个旧代码位此方法有望通过几次按钮操作来完成所有繁重的工作。 听起来不错 好吧教授请稍等片刻–在继续之前这种方法存在一些固有的问题需要提到。 最难的事情是 代码翻译不一定能解决技术问题 在某些情况下这些旧代码库可能已经存在了20多年。 这可能是20多年的错误决定或者是特定于大型机的决策被纳入您的代码中。 所有的翻译过程都将为您提供那些潜在的代码地雷这些地雷现在正在使用新的语言它们可能无法从大型机的慷慨和能力中受益。 代码看起来可能比大型机差 在此过程中运行代码有时可能最终看起来像是被削木机扔掉了。 一些大型机和遗留代码构造/行为无法很好地转换或根本无法转换成较新的代码库。 例如在一个最近的客户处我们找到了一个示例其中在一个代码库中x / 0的数学运算返回0 即使代码可以转换并看起来不错这也不意味着它将始终运行 仅仅翻译成另一种语言并不能保证执行成功–一次成功的翻译通常并不意味着语法错误。 可能需要一些调整其他基础结构来帮助代码工作和构建。 运行中执行中 同样如果我们让它运行并构建起来那么在我们的试点转换中一切似乎都很棒。 一旦我们处理了数百万笔交易并进行了记录您就会发现存储桶中的所有漏洞。 这个过程很可能不会降低复杂性 在此过程中您很可能会从处理其所有复杂性的过程在某些情况下几乎没有或没有I / O损失过渡到对资源的慷慨解囊。 将这些代码库转移到较新的语言中通常涉及一些关注点分离 数据访问层与嵌入式SQL语句相对 与基于文件的数据存储相反的潜在新关系数据存储 与UI代码相反的表示层 服务/业务逻辑层作为其自己的层 可能需要一些其他基础架构来处理大型机免费提供的功能 像消息传递容器或虚拟机编排队列和AD / LDAP / OAuth集成等。 因此现在您可能会感觉就像您刚走进一家医药商业广告我在那儿说道 “这种小药丸可以解决您所有的背痛和黄色的趾甲问题。 潜在的副作用可能包括呕吐眼睛和/或耳朵出血暂时性视力丧失自发性脱发以及对字母“ A”的痛苦敏感性。” 但是如果您专注于以下方面这可能是一个成功的旅程 如果您有使用旧版/大型机语言编写的大型代码库则此过程可以将您的代码库很快地转变为更现代的代码库。 从这时起您的开发团队就可以通过自己现在可以读取代码的简单事实来以所需的最终状态更新应用程序。 如果您选择一个可以将语法树用于初始转换的过程则…… 您只需调整语法并重新运行即可快速调整和调整更新后的输出。 有时基于模式的转换是唯一的选择。 但是在许多情况下可以生成语法树–然后您只需调整语法即可而不是一次性调整输出或单个模式。 Keyhole的Syntax Tree Transformer及其专有的COBOL语法分析器基于语法并且可以做到这一点 这是使您分阶段实施的可行选择。 特别是如果您的组织没有人员来处理可能将数千个程序转换为新堆栈的工作。 通过在短时间内转换所有旧代码您可以更快地淘汰旧技术。 然后您可以重新分配这些资源以分析和重新编写或清理具有最大业务价值和ROI的代码部分。 这使组织可以对业务真正重要的方面做出更有目的的决策。 提供对您的代码库中应用的业务逻辑的宝贵见解和分析。 在某些情况下业务逻辑可能与代码库一样古老并且不再适用。 大多数客户从中发现了很多价值最终仅通过分析活动就将他们的代码库减少了10-25。 有机会引入DevOps作为转换的一部分。 根据所需的代码最终状态在转换过程之外有机会引入DevOps作为转换的一部分可能会有所帮助。 有时“有能力”站起来使用一些工具或实施新流程最终会成为注入最佳实践的机会而无需经历过多繁琐的工作或走闸。 这些新的流程和工具可以被业务的其他领域所利用并通过提高敏捷性和引起某些文化转变来增加价值。 这个过程可以是短期预算双赢。 由于可以快速转换和淘汰大型机和较旧的技术因此可以收回资本支出和维护成本。 使代码进入转换后状态的总开发成本通常比手动团队重写要小。 需要注意的是从长远来看这可能是一项更昂贵的工作因为现在新语言和基础架构中的代码量很大–可能需要新的/额外的资源来维护和扩展代码库。 –但是至少您应该能够找到它们 该策略的要旨是 如果您确定自己意识到该流程实际上可以做什么并且选择了一个强大的基于语法的工具例如Keyhole语法树变形器和我们的Parser –只是说出来那么您将获得非常可预测的结果从而可以节省预算和时间胜。 既然我们已经了解了实施此策略的定义和利弊那么实际上让我们轻描淡写吧。 本文的用例将使用Keyhole语法树转换器从COBOL转换为JAVA。 “让我们已经重新平台” 为了开始这个示例我们将从COBOL的样本位开始该样本已被我们的专有语法解析器转换为JSON语法树。 COBOL程序仅读取DB2数据存储并返回员工列表。 我们将不会显示COBOL到JSON的实际转换-而是从已经转换的COBOL程序开始。 对不起这是博客文章的秘诀–因此我们将以这种烹饪表演的方式从昨晚已经准备好的火鸡开始如果您对组织的流程感兴趣或想要演示–请与我们联系 。 首先我们需要介绍几个设置项目 对于此示例您将需要克隆此存储库 https : //github.com/in-the-keyhole/khs-syntax-tree-transformer 您将需要使用支持Docker的机器Windows 10各种版本的LinuxMac。 这是针对DB2示例的如果您不想弄混Docker则在回购中有一个简单的COBOL示例。 这是一个人为的例子 它并不意味着可以治愈任何疾病或在任何生产环境中使用 它旨在演示该机制并说明如何从语法树到Java应用程序。 好的让我们开始吧 步骤1 克隆存储库后将其作为Maven项目导入EclipseSTS或Intellij。 第二步 使用JSON输入文件的命令行参数和发出的Java包名称执行main方法。 像这样 这将在项目目录中生成一个发出的Program.java program package khs.res.example.Programpublic class Program {private Double CONST-PI null; private Double WORK-1 0; private Double WORK-2 0; private Double PRINT-LINE null; public void static main(String[] args) {Program job new Program ();job.A-PARA ();} public void A-PARA () {WORK-1 123.46WORK-2 WORK-22WORK-2 WORK-3*3C-PARA()}public void B-PARA () {CONST-PI Math.PI;EDT-ID ZERO}public void C-PARA () {B-PARA()}} 以下是程序将使用的秘密酱汁分析器创建的输入demo.json {name : Program,typeName : CLASS,variables : [ {name : CONST-PI,typeName : VARIABLE,value : null,isLocal : false,isWorking : true,isArray : false,fileLevel : null,variables : [ ]}, {name : WORK-1,typeName : VARIABLE,value : ZERO,isLocal : false,isWorking : true,isArray : false,fileLevel : null,variables : [ ]}, {name : WORK-2,typeName : VARIABLE,value : ZERO,isLocal : false,isWorking : true,isArray : false,fileLevel : null,variables : [ ]}, {name : PRINT-LINE,typeName : VARIABLE,value : null,isLocal : false,isWorking : true,isArray : true,fileLevel : null,variables : [ {name : EDT-ID,typeName : VARIABLE,value : SPACES,isLocal : false,isWorking : true,isArray : false,fileLevel : null,variables : [ ]}, {name : FILLER,typeName : VARIABLE,value : Perimeter ,isLocal : false,isWorking : true,isArray : false,fileLevel : null,variables : [ ]}, {name : EDT-3-15-CIR,typeName : VARIABLE,value : null,isLocal : false,isWorking : true,isArray : false,fileLevel : null,variables : [ ]}, {name : FILLER,typeName : VARIABLE,value : Radius ,isLocal : false,isWorking : true,isArray : false,fileLevel : null,variables : [ ]}, {name : EDT-3-15-RAD,typeName : VARIABLE,value : null,isLocal : false,isWorking : true,isArray : false,fileLevel : null,variables : [ ]}, {name : FILLER,typeName : VARIABLE,value : Pi ,isLocal : false,isWorking : true,isArray : false,fileLevel : null,variables : [ ]}, {name : EDT-1-15-PI,typeName : VARIABLE,value : null,isLocal : false,isWorking : true,isArray : false,fileLevel : null,variables : [ ]} ]} ],functions : [ {name : A-PARA,typeName : FUNCTION,methods : [ {name : 123.46TOWORK-1,typeName : METHOD,type : {name : null,typeName : MOVE,varName : WORK-1,value : 123.46}}, {name : 2TOWORK-2,typeName : METHOD,type : {typeName : ADD,value : 2,var1 : WORK-2,var2 : null}}, {name : 3GIVINGWORK-3,typeName : METHOD,type : {typeName : MULTI,value : 3,var1 : WORK-2,var2 : WORK-3}}, {name : C-PARA,typeName : METHOD,type : {name : C-PARA,typeName : CALL}} ]}, {name : B-PARA,typeName : FUNCTION,methods : [ {name : PITOCONST-PI,typeName : METHOD,type : {name : null,typeName : MOVE,varName : CONST-PI,value : PI}}, {name : ZEROTOEDT-ID,typeName : METHOD,type : {name : null,typeName : MOVE,varName : EDT-ID,value : ZERO}} ]}, {name : C-PARA,typeName : FUNCTION,methods : [ {name : B-PARA,typeName : METHOD,type : {name : B-PARA,typeName : CALL}} ]} ]
}DB2示例 现在在持久性方面迈出了一步我们将转换简单的DB2程序以演示使用DB2 Express的Java代码。 这是示例DB2 Cobol应用程序 * --------------------------------------------------------------
* Selects a single employee into a records detail fields, and
* then displays them by displaying the record.
*
* Demonstrates Cobol-to-Java translation of a DB2 SELECT INTO
* the detail fields of a parent record.
*
* Java has no native notion of a record aggregate. A SQL
* SELECT INTO similarly lacks a record construct.
*
* Lou Mauget, January 31, 2017
* --------------------------------------------------------------IDENTIFICATION DIVISION.PROGRAM-ID. COBOLDB2.DATA DIVISION.WORKING-STORAGE SECTION.EXEC SQLINCLUDE SQLCAEND-EXEC.EXEC SQLINCLUDE EMPLOYEEEND-EXEC.EXEC SQL BEGIN DECLARE SECTIONEND-EXEC.01 WS-EMPLOYEE-RECORD.05 WS-EMPNO PIC XXXXXX.05 WS-LAST-NAME PIC XXXXXXXXXXXXXXX.05 WS-FIRST-NAME PIC XXXXXXXXXXXX.EXEC SQL END DECLARE SECTIONEND-EXEC.PROCEDURE DIVISION.EXEC SQLSELECT EMPNO, LASTNAME, FIRSTNMEINTO :WS-EMPNO, :WS-LAST-NAME, :WS-FIRST-NAME FROM EMPLOYEEWHERE EMPNO200310END-EXEC.IF SQLCODE 0DISPLAY WS-EMPLOYEE-RECORDELSEDISPLAY ErrorEND-IF.STOP RUN. 使用我们的Antlr解析器已将其转换为JSON语法树。 使用khs.transformer.CommandLine.java对象将语法树JSON转换为以下Java应用程序。 /*** Java source, file COBOLDB2.java generated from Cobol source, COBOLDB2.cbl** version 0.0.3* author Keyhole Software LLC*/
public class COBOLDB2 {private static Logger Log LoggerFactory.getLogger(COBOLDB2);// SQLCAprivate int sqlcode;// Level 05private String v_ws_empno;// Level 05private String v_ws_last_name;// Level 05private String v_ws_first_name;// Level 01private InItem[] v_ws_employee_record new InItem[]{ () - v_ws_empno, () - v_ws_last_name, () - v_ws_first_name };// Procedure division entry:public static void main(String[] args) {try {COBOLDB2 instance new COBOLDB2();instance.m_procdiv();} catch (Exception e) {e.printStackTrace();}}private void m_procdiv () throws Exception {final String sql SELECT EMPNO, LASTNAME, FIRSTNME FROM EMPLOYEE WHERE EMPNO200310;final OutItem[] into new OutItem[]{s - v_ws_empno (String)s,s - v_ws_last_name (String)s,s - v_ws_first_name (String)s};sqlcode Database.getInstance().selectInto( sql, into );if ( sqlcode 0 ) {Display.display( v_ws_employee_record );} else {Display.display( Error );}// EXIT ...System.exit(0);}} 以下步骤描述了如何设置DB2以执行该应用程序。 DB2 Express在Docker容器中运行。 没有池连接。 这只是一个演示。 ☺ Docker DB2 Express容器 确保您有权访问Docker 。 使用此Docker映像进行初始DB2绑定 https : //hub.docker.com/r/ibmcom/db2express-c/ docker run --name db2 -d -it -p 50000:50000 -e DB2INST1_PASSWORDdb2inst1-pwd -e LICENSEaccept -v $(pwd)/dbstore:/dbstore ibmcom/db2express-c:latest db2start
docker exec -it db2 bash 创建运行中的Docker DB2 Express容器守护程序并登录到bash会话如上所示。 发行su db2inst1 发出db2sampl 花一些时间来创建数据库“ SAMPLE”。 [db2inst16f44040637fc /]$ db2samplCreating database SAMPLE...Connecting to database SAMPLE...Creating tables and data in schema DB2INST1...Creating tables with XML columns and XML data in schema DB2INST1...db2sampl processing complete. 完成烟雾测试安装后 以Java运行 khs.transformer.CheckDb2Connection 控制台上显示以下内容 一旦在Docker容器上安装并验证了数据库就可以执行转换后的Cobol / DB2到Java程序khs.res.db2demo.COBOLDB2.java 。 一旦执行该程序我们将得到以下输出 基本上是魔术 同样这是人为的但是我们采用了一个COBOL程序该程序被转换为JSON语法树然后最终得到了一个Java应用程序该程序从DB2数据库返回了我们的数据–正是COBOL程序所做的 结论 希望在本文和上面的示例之后我们都对重新平台战略有了更好的了解。 此策略是否适合您的组织是另一个话题顺便提一下我们很乐意与您联系。 我要打动的重点是即使听起来很酷代码转译也不是遗留代码狼的灵丹妙药 我还想告诉您虽然充满了危险但是如果正确使用正确的方法并使用可靠的工具ahem – 锁Kong语法树变压器和解析这可能是一个非常可行的策略。 “那么我们在这里完成了什么” 总而言之我们涵盖了以下内容 现代化简介 回顾现代化的重平台战略 使用Keyhole语法树变压器的重新平台示例 关于此策略的价值/风险的其他总结想法 我们肯定希望您能像我们一样喜欢它。 请如果您有任何问题或反馈请在下面发布或直接与我们联系。 谢谢记得负责任地现代化 资源/参考该演示也可以在这里找到 https : //github.com/in-the-keyhole/khs-syntax-tree-transformer 翻译自: https://www.javacodegeeks.com/2017/02/adventures-modernization-strategy-example-converting-cobol-java.html