CN113950664A - 超堆积器 - Google Patents
超堆积器 Download PDFInfo
- Publication number
- CN113950664A CN113950664A CN202080041963.XA CN202080041963A CN113950664A CN 113950664 A CN113950664 A CN 113950664A CN 202080041963 A CN202080041963 A CN 202080041963A CN 113950664 A CN113950664 A CN 113950664A
- Authority
- CN
- China
- Prior art keywords
- segment
- entities
- document
- entity
- segments
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 claims abstract description 63
- 238000004590 computer program Methods 0.000 claims abstract description 56
- 238000003780 insertion Methods 0.000 claims description 22
- 238000012545 processing Methods 0.000 claims description 20
- 230000037431 insertion Effects 0.000 claims description 19
- 238000004891 communication Methods 0.000 abstract description 7
- 230000004888 barrier function Effects 0.000 abstract description 3
- 230000006870 function Effects 0.000 description 22
- 230000008569 process Effects 0.000 description 21
- 230000018109 developmental process Effects 0.000 description 12
- 230000009471 action Effects 0.000 description 11
- 238000012546 transfer Methods 0.000 description 11
- 238000011161 development Methods 0.000 description 10
- 230000008901 benefit Effects 0.000 description 9
- 238000012986 modification Methods 0.000 description 9
- 230000004048 modification Effects 0.000 description 9
- 230000004044 response Effects 0.000 description 8
- 238000013475 authorization Methods 0.000 description 7
- 238000006243 chemical reaction Methods 0.000 description 7
- 238000005457 optimization Methods 0.000 description 7
- 238000013515 script Methods 0.000 description 7
- 238000003491 array Methods 0.000 description 6
- 238000013459 approach Methods 0.000 description 5
- 239000012634 fragment Substances 0.000 description 5
- 230000008859 change Effects 0.000 description 4
- 238000010276 construction Methods 0.000 description 4
- 230000003287 optical effect Effects 0.000 description 4
- 241001465754 Metazoa Species 0.000 description 3
- 230000003213 activating effect Effects 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 3
- 238000004364 calculation method Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 238000011068 loading method Methods 0.000 description 3
- 238000007726 management method Methods 0.000 description 3
- 239000007787 solid Substances 0.000 description 3
- RTZKZFJDLAIYFH-UHFFFAOYSA-N Diethyl ether Chemical compound CCOCC RTZKZFJDLAIYFH-UHFFFAOYSA-N 0.000 description 2
- 238000013500 data storage Methods 0.000 description 2
- 230000001419 dependent effect Effects 0.000 description 2
- 230000007613 environmental effect Effects 0.000 description 2
- 239000000835 fiber Substances 0.000 description 2
- 238000007667 floating Methods 0.000 description 2
- 238000010606 normalization Methods 0.000 description 2
- 238000000926 separation method Methods 0.000 description 2
- 230000000007 visual effect Effects 0.000 description 2
- 102100021662 Baculoviral IAP repeat-containing protein 3 Human genes 0.000 description 1
- VYZAMTAEIAYCRO-UHFFFAOYSA-N Chromium Chemical compound [Cr] VYZAMTAEIAYCRO-UHFFFAOYSA-N 0.000 description 1
- 241000282412 Homo Species 0.000 description 1
- 101000896224 Homo sapiens Baculoviral IAP repeat-containing protein 3 Proteins 0.000 description 1
- 239000008186 active pharmaceutical agent Substances 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 238000013528 artificial neural network Methods 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 238000003339 best practice Methods 0.000 description 1
- 230000015572 biosynthetic process Effects 0.000 description 1
- 230000036772 blood pressure Effects 0.000 description 1
- 238000004883 computer application Methods 0.000 description 1
- 235000014510 cooky Nutrition 0.000 description 1
- 238000013523 data management Methods 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000003745 diagnosis Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000009977 dual effect Effects 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 238000011049 filling Methods 0.000 description 1
- 238000001914 filtration Methods 0.000 description 1
- PCHJSUWPFVWCPO-UHFFFAOYSA-N gold Chemical compound [Au] PCHJSUWPFVWCPO-UHFFFAOYSA-N 0.000 description 1
- 239000010931 gold Substances 0.000 description 1
- 229910052737 gold Inorganic materials 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000007373 indentation Methods 0.000 description 1
- 230000002452 interceptive effect Effects 0.000 description 1
- 230000001788 irregular Effects 0.000 description 1
- 239000003550 marker Substances 0.000 description 1
- 230000001404 mediated effect Effects 0.000 description 1
- 238000002156 mixing Methods 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- 239000003607 modifier Substances 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 238000013439 planning Methods 0.000 description 1
- 108090000623 proteins and genes Proteins 0.000 description 1
- 230000008929 regeneration Effects 0.000 description 1
- 238000011069 regeneration method Methods 0.000 description 1
- 239000000126 substance Substances 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 239000013598 vector Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/10—Requirements analysis; Specification techniques
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Stored Programmes (AREA)
Abstract
一种用于从简单输入值生成复杂正式语言文档的改进方法,减少了对正式交流的障碍。所描述的技术可以应用于不同领域以生成需要正式语言的不同类型的文档。为了说明,本公开集中于生成计算机程序文档,因为编程语言是最正式语言中的一种语言。
Description
相关申请的交叉引用
本申请是于2020年2月5日提交的题为“Hyperpiler(超堆积器)”的美国专利申请号16/782,378的部分继续申请。本申请还要求于2019年7月2日提交的题为“Method forCodeless Development Of Client-Server Computer Applications(针对客户端-服务器计算机应用的无代码开发方法)”的美国临时专利申请号62/870,031;于2019年7月28日提交的题为“Hypercompiler(超编译器)”的美国临时专利申请号62/879,497;和于2020年3月31日提交的题为“Methods For Architecting A Computer Program Using Low-CodeConstruction(针对使用低代码构造来构建计算机程序的方法)”的美国临时专利申请号63/003,153的优先权。上述申请中的每个申请通过引用整体并入本文。
技术领域
本发明总体上涉及文档(包括例如,计算机程序)的模板化和编译。
背景技术
很多领域需要从业者学习正式语言以便适当地交流。在计算领域,从业者必须学习正式编程语言。在法律上,从业者必须学习正式法律术语。这样的正式语言允许巧妙的交流,但也造成了障碍,使得外行必须聘请正式的语言专家来巧妙地交流想法。
对这个障碍的一种方法是模板。在计算领域,已经构建了模板引擎来生成相对简单的计算机程序。在法律中,很多具有空白的模板法律文档在互联网上可用以供外行填写其细节。然而,这些先前的模板化方法已经被证明在其范围和实用性方面是有限的。虽然这些先前的模板可以产生简单文档,但它们通常无法产生满足很多复杂的真实世界需求所需要的复杂文档。
发明内容
本发明通过从简单输入值生成复杂正式语言文档来减少对正式交流的障碍。所描述的技术可以应用于不同领域以生成需要正式语言的不同类型的文档。为了说明,本公开集中于生成计算机程序文档,因为编程语言是最正式语言中的一种语言。
在一个方面,一种计算机实现的方法从用于文档的规范在目标域内自动生成文档。规范包括多个规范实体,该多个规范实体包括要被包括在文档中的值。应用域规则集以将多个规范实体转换为多个段实体,该多个段实体包括来自规范实体的值。域规则集包括:用于处理用于目标域内的文档的规范实体的预定义规则。然后,处理多个段实体,以通过将来自段实体的值插入预定义段中来填充来自段集合的对应预定义段。预定义段包括:目标域内的文档的片段,并且还包括用于值到预定义段中的插入的值插入点。根据规则集组装该段,从而生成文档。
本发明的另一方面是将声明性语言处理成命令性语言的计算机方法和设备。
本发明的另一方面是将图灵不完备(Turing-incomplete)语言处理成图灵完备语言的计算机方法和设备。
本发明的另一方面是从宏命令生成文档的计算机方法和设备。
本发明的另一方面是用于代码生成的改进架构,包括从数据库列关系中推导功能。
本发明的其他方面是在编译、软件域工程、软件重用、可视化编程、模型驱动架构(MDA)、模型驱动开发(MDD)、低代码编程、无代码编程、无码编程、模板化、嵌入、文档建模、文档处理、程序合成和相关文档生成领域。
其他方面包括组件、设备、系统、改进、方法、过程、应用、计算机可读介质、和与上述中的任何相关的其他技术,包括单独或组合采取的步骤。
附图说明
已经对本发明进行了简要描述,相关领域的技术人员将从以下结合附图对本发明的详细描述中认识到本发明的上述和其他目的、特征和优点。
图1示出了针对一个实施例的开发循环。
图2示出了生成PHP程序文档的一个实施例。
图3示出了在一个实施例中被处理的一个规范实体的值。
图4示出了在一个实施例中被处理成多个文档段的一个规范实体。
图5示出了SLAD架构流程图。
图6示出了用于所生成的HTML文档的示例性编辑循环。
图7是生成器的一个实施例的流程图。
图8示出了链接两个子例程的挂钩实体。
图9示出了子表、父表和祖父表中的列。
图10示出了子父API授权请求。
图11示出了用于HTML文档的WYSIWYG编辑循环。
具体实施方式
图1示出了构造器1001在其中创建文档1005的示例性开发循环。构造器1001(例如,人或计算机)针对目标域中的期望文档创建规范1002并且将规范输入生成器程序1003中。规范1002描述特定于最终文档的信息,但是可能会省略隐含的、固有的或由域以其他方式限定的信息。这种隐含信息由用于域的对应的规则集1004和段集合1005以及还由生成器程序1003捕获。段1005是用于在感兴趣域内构建文档的域特定通用组件。生成器程序1003将来自规范实体1002的值插入到段1005中。规则1004也是域特定的并且限定如何从规范中提取信息并且将其组装成可以用于将值插入到段中的形式,包括将所填充的段组装成用于感兴趣域的最终文档1006。生成器程序1003加载与文档的目标域相关的规则集1004和段集合1005。所生成的程序1003将规则集应用于规范实体,以将规范值插入段中并且将段组装成所生成的文档1006。生成器程序1003将所生成的文档1006输出到构造器。
图2示出了用于生成PHP程序的一个实施例。生成器在第一列2001中加载规范实体。规范实体可能不适合直接与PHP程序的预定义段一起使用,因此生成器将规则集应用于规范实体以修改现有实体,从而在第二列2002中生成更适合与预定义PHP段一起使用的新实体。这些被称为段实体2002。生成器将这些段实体嵌套在第三列2003中。生成器加载与段实体相对应的PHP段2004。生成器将段与实体配对,并且将段变量插入点替换为实体值,如框2005所示。生成器将段的子插入点替换为嵌套的子段,如框2006所示。
图3示出了由生成器的一个实施例如何处理来自一个规范实体的值。描述字段的规范实体3001被输入生成器中。生成器应用规则集以将规范实体3001转换为对应段实体3002。实体3002基于其类型值与段3003配对。段实体3002中的值替换段3003中的变量插入点以形成将被合并到文档中的字符串3004。
图4示出了在所生成的程序中被处理成多个段的单个规范实体(或为方便起见的“specity”)。字段specity 4001包括name属性、key属性和required属性。字段specity由规则集4002处理以生成程序文档4003。字段specity生成SQL代码段4004以创建对应数据库列。字段specity生成PHP代码段4005以捕获和验证对应用户输入。字段specity生成HTML代码段4006以显示对应输入框。这些段4004至段4006中的每个段是使用同一过程来生成的。规则集402被应用于specity 4001,以将specity 4001转换成三个实体(段实体),实体中的每个实体包含某些值。每个段实体具有对应预定义段,该预定义段具有针对值的占位符,并且来自段实体的值用于填充对应预定义段,从而产生段4004至段4006。
图5示出了SLAD(存储、逻辑、访问、显示)架构流程图。每行表示SLAD中的层。用户在显示层处请求5001数据。程序在访问层处授权5002请求。程序在逻辑层处应用业务逻辑以验证5003输入数据。存储层向数据库读取/写入5004数据,并且通过堆栈来发送回输出数据。业务逻辑层解析5005输出数据。访问层对输出数据(例如,针对API的JSON)进行格式化5006。程序在显示层处向用户显示5007输出数据。
图6示出了用于所生成的web文档的示例性编辑循环。在6001处,构造器在编辑器程序中构建规范。编辑器程序可选地是在构造器的计算机上运行的网站或应用。在6002处,编辑器使用规范以生成代码,例如使用本文中所描述的过程来将规范转换成所生成的文档。用于web文档的代码通常是HTML或输出HTML的脚本语言(例如,PHP或Python)。在6003处,编辑器程序将代码上传到web服务器以显示为网站。在6004处,构造器点击网页上的元素,以发起对与该元素相关联的规范的部分的编辑。点击可选地涉及alt点击或Ctrl点击,或者可选地涉及浏览器插件或JavaScript以启用这样的编辑点击。在6005处,构造器被引导到编辑器程序,在编辑器程序处,构造器编辑与该元素相关联的一个或多个实体6006。可以实时更新网页。
图7示出了超堆积器循环的一个实施例。第一阶段7001接收规范实体集,并且然后将这些规范实体处理成用于在第二阶段7013使用的段实体集。生成器用于目标域和规范实体7012来加载规则集7002。生成器在循环7003中的每个规则上迭代。在规则循环内,生成器在循环7004中的每个实体上迭代。生成器评估所选择的实体是否满足所选择的规则的条件7005。如果不满足,则生成器迭代到下一实体7008。如果是,则生成器执行规则命令7007。该规则具有三个可能的指令7009:修改满足实体的值7026、修改一个或多个其他现有实体的值7010、或生成新实体7011。生成器可选地可以执行这些指令的组合。所生成的实体被推送到实体循环的结尾用于规则处理。如果规则指示修改一个或多个其他现有实体7010,则生成器开始新的循环以在每个实体7020上迭代以评估哪些其他实体满足规则的修改条件7021。如果实体不满足修改条件,则循环随后迭代7023。如果实体确实满足修改条件7024,则根据规则的命令来修改该实体的值7025。在该过程7001结束时,规范中所限定的实体集(即,规范实体)已经转换为可以与预定义文档段使用实体集(即,段实体)。
第二阶段7013处理段。生成器针对目标域来加载段集合7014(即,预定义段集合)。生成器采用已处理的实体数组(段实体)并且在循环7015中在每个实体上迭代。生成器将每个适用段实体与段7016配对。生成器将来自段实体的值插入对应段7017中。生成器根据与段配对的实体的值来将子段嵌套在父段7018内。生成器从嵌套的段7019来形成文档。
图8示出了表示通过挂钩连接到计算机程序文档中的两个子例程的处理实体。框8001表示描述程序的规范。框8002表示描述第一子例程的第一规范实体。框8003表示描述第二子例程的第二规范实体。框8004表示描述第一子例程与第二子例程之间的挂钩的第三规范实体。
框8005表示从第一规范实体8002生成的子例程代码段。框8006表示从第二规范实体8003生成的子例程代码段。框8007表示从第三规范实体8004生成的挂钩代码段。在框8009处,组合代码段。挂钩代码段8007嵌套在第一子例程代码段8005内,使得执行第一子例程也将执行第二代码子例程。
图9示出了用于包含子表、父表和祖父表的数据库的示例性规范。框9001至框9009中的每个框表示该数据库规范内的规范实体。框9001表示子数据库表。框9002表示针对子表的唯一标识符列。框9003表示子表中存储父唯一标识符的列。框9004表示子表中存储祖父唯一标识符的列。框9005表示父数据库表。框9006表示存储针对父表的唯一标识符的列。框9007表示父表中存储祖父唯一标识符的列。框9008表示祖父数据库表。框9009表示存储针对祖父表的唯一标识符的列。子表的祖父标识符列9004的值从其中子表的父标识符9003与父表的标识符9006匹配的行、从父表的祖父标识符列9007来被填充。
图10示出了子父API授权的示例性规范。框10001至框10015中的每个框表示本规范内的规范实体。框10001表示经由API请求所发送的数据。API请求包含子ID值10004、会话ID值10005和API端点值10006。API子ID 10004与子表10002中的子ID列10007相关。API会话ID 10005与会话表10015中的会话ID 10013相关。程序使用相关父ID列值10008和相关用户ID列值10014值以在与这两个值相关的权限表10003中查找权限列10011。API程序然后使用权限值10011以允许或拒绝10012用户访问给定API端点10006的请求。
图11示出了用于HTML文档的WYSIWYG编辑循环的一个实施例。构造器11001打开web浏览器窗口以操纵生成器网站11002中的规范实体。生成器网站在所生成的网站中生成HTML文档11003。构造器打开浏览器窗口以查看所生成的网站。构造器alt点击所生成的HTML文档中的图像元素,这会引导构造器的浏览器将生成器网站打开到用于编辑与该HTML图像元素相关联的规范实体的网页。构造器操作这些规范实体并且开始新的循环。优选地,该循环包括三个计算设备:一个用于构造器,一个用于生成器网站,一个用于所生成的网站。备选地,该循环包括两个计算设备:构造器的浏览器和所生成的网站共享计算设备,并且生成器网站驻留在第二计算设备上。备选地,该循环包括不同配置的两个计算设备:构造器的计算设备,并且生成器网站和所生成的网站两者共享第二计算设备。备选地,所有三个程序都在开发人员的计算设备上运行。
一般定义
应用程序编程接口(API)是计算机软件代码的集合,通常是类定义集,其可以执行相关复杂任务集,但具有有限控件集,该有限控件集可以由其他软件代码实体操纵。为了清晰和易于使用,这组控件被故意限制,使得程序员就不必处理给定API本身内所包含的细节。
在本发明中,架构师是开发生成器的组件的人。
属性提供关于实体的附加信息。每个属性都是键,并且对应于值,键和值两者通常都是字符串。
代码片段是一个或多个程序指令的块。
列是特定简单类型的数据值集,一个值针对数据库的一行。
逗号分隔值(CSV)文件是使用逗号来分隔值的分隔文本文件。文件的每行是数据行。
编译器是将用一种编程语言编写的一系列指令转换成不同编程语言的计算机程序。解释器是一种特殊情况编译器,它在执行时或“动态地”编译代码。转译器是一种特殊情况编译器,它通常将针对一个计算系统而设计的代码转换为针对不同计算系统而设计的代码。
在本发明中,构造器是使用生成器的人或计算机。
CRUD是创建、读取、更新、删除的常见计算机数据操纵任务的首字母缩写词。
数据库是有组织的数据集合,其通常以电子方式从计算机系统存储和访问。
开发人员是手动或通过生成器来创建计算机程序的人。
在本发明中,文档是由生成器程序生成的字符串。该文档可选地是计算机程序、法律文档、另一计算机可读文档或另一人类可读文档。文档可以是一个文件或多个文件。
文档存储库是被设计用于存储、检索和管理面向文档的信息的计算机数据存储库系统。示例包括CouchDB、Elasticsearch和MongoDB。
实体是与概念对象相关的值组。在计算机编程中,实体也可以称为元组、数组、对象或行。
字段是单个变量,通常是字符串,其用于计算机程序的输入或输出。数据库中一行的一个单元构成字段。多个字段通常用于API程序的输入。
如本文所述,生成器是生成文档的计算机程序。
超文本标记语言(HTML)是一种将文本和其他内容与文本文件中的布局和外观命令混合在一起的方法,使得浏览器可以从文件生成所显示的图像。
超文本传输协议(HTTP)是约定集,其用于控制经由互联网从web服务器计算机到客户端计算机以及从客户端计算机到web服务器的信息传输。
互联网是服务器计算机和数据传输路径的全球性的分散整体,它可以向所连接的和配备有浏览器的客户端计算机提供信息,并且可以接收和转发来自客户端计算机输入的信息。
JavaScript是基于对象的编程语言。JavaScript是解释型语言,而不是编译型语言。JavaScript通常被设计用于编写通过互联网在客户端计算机内操作的软件例程。通常,如果软件例程尚未高速缓存在客户端计算机上,则在交互会话开始时将它们下载到客户端计算机。下面将更详细地讨论JavaScript。
JavaScript对象表示法(JSON)是开放的标准文档格式和数据交换格式,它使用人类可读的文本来存储和传输由属性值对和数组数据类型组成的数据对象。
键值存储是被设计用于存储、检索和管理关联数组的计算机数据存储库系统。示例包括Redis、Riak、AWS Dynamo和Memcached。
低代码、或“无码”或“无代码”描述了一系列技术,该技术用于在对底层计算机命令具有很少的知识或一无所知的情况下创建计算机程序。
建模语言是人工语言,其可以用于在由一致的规则集限定的结构中表达信息或知识或系统。该规则用于解释结构中组件的含义。建模语言通常是不受控制的。
Mustache是在mustache github.io上可用的开源模板引擎组。
Nunjucks是由Mozilla基金会维护的开源模板引擎,在mozilla.github.io/nunjucks/可获取的。
PHP是脚本语言,其允许开发人员创建动态生成的网页,并且用于服务器侧编程。
平台是计算机的架构、操作系统、编程语言、运行时库和GUI的组合。
程序指令是用于计算设备执行某个任务的指令。
数据库中的行表示表中的单个隐式结构化数据项。在各种编程上下文中,行也可以称为数组、数据对象、元组、实体、元素或哈希。
存储逻辑访问显示(SLAD)是程序架构风格,其通常用在web服务应用中。
在本发明中,段是要合并到所生成的文档中的字符串(或相关联的字符串组)。
规范是对包括多个实体的文档的正式描述。通常,规范是用声明性语言编写的,并且缺少控制结构或编程语句。
结构化查询语言(SQL)是一种用于管理关系数据库管理系统中所保存的数据的语言。
字符串是字符序列。
子例程是执行特定任务的一个或多个程序指令,其被封装为单元。
制表符分隔值(TSV)文件是使用制表符来分隔值的定界文本文件。文件的每行是数据行。
表是在数据库内以表格式所保存的相关数据的集合,其由列和行组成。
Velocity是一种由阿帕奇基金会维护的开源模板引擎,其在velocity.apache.org可获取。
web浏览器是驻留在客户端计算机中的复杂的软件程序,其能够加载和显示文本和图像,并且展示来自互联网以及客户端计算机的存储器的以HTML(超文本标记语言)编码的行为。主要浏览器包括Microsoft Internet Explorer、Microsoft Edge、Apple Safari、Mozilla Firefox和Google Chrome。
web服务器是一种通过网络向客户端计算机发送所请求的数据的计算机。
超堆积器
本发明的一个方面是分离规范、循环、条件和字符串的引擎和架构。与通常被设计为混合循环、条件和字符串的常规模板语言相比,这在生成大型复杂文档(诸如,计算机程序)方面更具可扩展性。
优选地,本发明在生成器程序中包含循环。优选地,生成器同时加载线性规则集。优选地,生成器同时加载单独的线性段集合,每个段被视为字符串并且不被评估。优选地,结合实体的规则布置段。这种分离具有很多优点。
例如,再现上述常规模板脚本示例的本发明的一个实施例将包括以下规则集、段集合和生成器程序:
示例规则集:
/////////////////////////////////////////
if(firstcycle)true
do add entity
set id ull
set segment ul
set where output.html
////////////////////////////////////////
if type blog
if blog_public l
do add entity
set segment li
set where ull
set title BLOG_TITLE
set order l
////////////////////////////////////////////
if type blog
if blog_public 1
do add entity
set segment bloghtml
set where ull
set order 2
示例段集合:
生成器程序的示例部分:
在该实施例中,所组合的三个不同组件比一个常规模板脚本更复杂。然而,单独地,不同规则集和不同段集合都各自比常规模板脚本更集中。这有效地将复杂性从两个自定义组件卸载到标准化生成器组件,以允许自定义组件更轻松地针对复杂文档来扩展。对于所有域的所有文档,生成器组件优选地保持相同。
本发明允许规范中的线性(非嵌套)实体。优选地,规范实体以指定值彼此引用。
本发明允许规则集中的线性(非嵌套)规则。优选地,生成器包含循环,其中每个规则被迭代地应用于每个实体。
本发明允许段的线性(非嵌套)列表。优选地,段不引用其他段。规则以及与实体值结合的规则优选地确定段布置(包括排序和嵌套)并且以任何期望布置来放置段。这允许架构师通过改变规则来重新布置段将如何嵌套,而无需修改段本身。这还允许构造器通过改变规范实体值来改变段如何被布置,而无需修改规则或段。
本发明允许纯段,以仅包含将被并入所生成的文档中的字符串(除了valpoint和childpoint,稍后讨论)。优选地,段不包含模板语言。这为架构师节省了学习和调试模板语言的负担。
本发明允许两方半独立地构建规则集和段集合。
本发明允许容易的转换。具有一个规范和一个规则集的一个生成器可选地使用多个段集合来生成不同语言(人类或程序)的多个等效文档。
本发明优选地具有预定的、有限数目的实体循环,这与常规模板的无限数目的实体循环相反。这允许某些规则循环优化。同样,这克服了影响常规模板引擎的停机问题的版本。
规范实体(specity)
生成器加载描述要被生成的文档的方面的规范。规范包括实体,或简称“specity”。
优选地,这些实体是实体属性值形式,使得每个实体包括多个属性值对。如果实体和对应值描述某个方面,则每个属性都会命名该方面。每个实体包括通常为字符串、整数或十进制数的值。换言之,specity优选地是关联数组中的编号数组。
每个specity表示要被生成的文档的方面。API计算机程序的示例方面是端点的名称。法律文档的示例方面是签署方的名称。实体、属性和值的类型是“域特定的”,因为它们将反映它们所针对的文档的域。
规范优选地是“不受控制的”并且不需要针对诸如if、else、for、foreach和while的条件或循环命令进行评估。循环优选地驻留在生成器程序中。条件优选地驻留在域规则集中。specity满足(或不满足)域规则集中的规则条件。
规范实体语法优选地包括用于区分多个实体中的每个实体的方法;用于区分每个属性的方法;用于为每个属性分配值的方法;以及用于将每个属性值分配给多个实体中的一个或多个实体的方法。specity可选地具化在很多不同语法中。
在一个实施例中,规则集采用线性的类似XML的语法:
<specityTypel name=″Hello″size=″100″>
<specityType2 name=″Goodbye″order=″2″color=″blue″>
在一个实施例中,规则集采用嵌套的类似XML的语法:
<specityTypel>
<name>Hello</name>
<size>100</size>
</specityTypel>
<specityType2><name>Goodbye</name>
<order>2</order>
<color>blue</color>
</specityTypel>
在一个实施例中,规则集采用类似JSON的语法:
在一个实施例中,规则集采用程序变量语法(例如,PHP):
在一个实施例中,规则集采用变量语法列表:
$specity1=′specityTypel′;
$specitylname=′Hello′;
$specitylsize=′100′;
$specity2=′specityType2′;
$specity2name=′Goodbye′;
$specity2order=′2′;
$specity2color=′blue′;
在一个实施例中,规则集采用类似自然语言的语法:
specityl is a specityType1.
The name of specity1 is Hello.
The size of specity1 is 100.
specity2 is a specityType2.
The name of specity2 is Goodbye.
The order of specity2 is 2.
The color of specity2 is blue.
在一个实施例中,规则集采用类似CSV的语法(优选地,对于每种类型的实体具有指定的属性顺序):
apecityType1,Hello,100
specityType2,Goodbye,2,blue
在优选实施例中,规则集采用专用语法,其具有分隔实体的第一分隔符串(例如,正斜杠)、用于分隔属性值对的第二分隔符串(例如,换行符)和用于分隔对中的属性和值的第三分隔符串(例如,空格):
////////////////////
type apecityTypel
name Hello
size 100
////////////////////
type specityType2
name Goodbye
order 2
color blue
在一个实施例中,规则集采用类似SQL的语法(例如,来自SHOW CREATE TABLE命令):
注意,SQL是具有不规则实体属性值语法的很多实施例中的一个实施例。在这种情况下,生成器优选地解析和归一化实体。例如,上面的bllog_title列是语法不一致的属性和值的混合。该列实体转换为更一致的格式将是:
<column name=″blog_title″table=″blog″datatype=″char″minLength=″1″
maxLength=″255″allowNull=″false″>
规范可选地以UML或DDL进行编码。
优选地,在类似XML的语法中,“标签”被认为是隐式类型属性。
specity的简单性允许它们容易地存储在数据库中。优选地,specity存储在关系数据库中,其中每个specity是数据库行,每种类型的specity是数据库表,每个允许属性是数据库列,每个属性值是单元。在实践中,存储多个程序的数据库将具有附加列来标识每个specity属于哪个程序。SQL中的示例是:
INSERT INTO`specityTypel`SET`id`=1,`name`=″Hello″,`size`=″100″;INSERT INTO`specityType2`SET`id`=2,`name`=″Goodbye″,`order″=″2″,`color`=″blue″;
备选地,specity被存储在键值数据库、实体属性值数据库、文档数据库、非SQL数据库或其他类似存储系统中。
通过将specity存储在数据库中,开发人员可以利用多种工具来操纵specity,包括连接到数据库的图形用户界面和网站。从数据库中取回的数据对象可选地被直接输入本发明中,或者可选地数据对象在输入之前被转换为文本表示。
在一个实施例中,specity包含与所生成的程序中的期望控制结构相关的值。这样的specity不应当被解释为使规范受到控制。例如,specity可以表示在所生成的程序中被处理为if(){}代码语句的if概念。所生成的程序评估if语句并且有条件地执行对应指令。然而,生成器程序优选地将if specity与任何其他specity一样对待。
specity包含要被合并到所生成的文档中的字符串值。通常,这些字符串是短名称或数字。对于计算机程序文档,某些specity值字符串可选地是给定编程语言的程序指令。这种编程语言优选地不由生成器执行,仅合并到生成的程序中。
备选地,specity被编码为变量、对象、元组、数组或编程语言内的类似实体。备选地,specity在要被合并到所生成的程序文档中的通用代码旁边具化。通用编程语言的specity的编码和/或通用代码的添加不应当被解释为否定specity的不受控制的性质。
备选地,specity值是数组。
备选地,specity值是包括值列表的字符串,每个值由分隔符串分隔。
在备选实施例中,实体的属性和值在语法上没有被包含在规范中的实体串内,相反,属性和值通过标识符被链接。
在先前的专利申请中,规范实体被称为“初始实体”或“codecept”。这里,术语“规范”取代了术语“初始”,以更好地传达实体的功能。此处使用术语“specity”而不是“codecept”以适应规范描述非计算机程序文档的实施例。可选地,规范实体被称为“规范元素”。
域规则集
域规则集包含用于处理规范实体的规则列表。该规则执行两个主要功能:修改针对现有实体的值和使用现有实体值以生成新实体。规则集特别关注实体的标识值、实体的父值、实体的顺序值和实体的段类型值。
域规则集是“域特定的”,因为它限于生成以某种预定方式运行的程序。通常,域中的程序将被设计为在相同类型的计算设备上运行,以相同格式接收输入,并且以相同格式推送输出。示例域包括平台游戏、读取评估循环(REPL)命令行界面(CLI)脚本、网络服务应用程序编程接口(API)和移动应用。
可选地,域规则集生成多个相关计算机程序文档。可选地,所生成的程序在不同设备上执行。例如,域规则集生成服务器程序和客户端程序两者。在一个实施例中,为了生成客户端服务器域,域规则集构造要在web服务器上运行的PHP程序、HTML文档、要在iOS设备上运行的程序、以及要在安卓设备上运行的程序。在本实施例中,PHP、HTML、iOS和Android程序共享反映服务器程序的功能的相似特征,因此将所有这些程序分组在一个域下是可行的。
可选地,生成器将多个规则集应用于规范以生成多个相关文档。例如,从一个规则集生成服务器程序,并且从另一规则集生成对应客户端程序。
在优选实施例中,生成器可以访问多个域规则集。期望域规则集(或多个规则集)优选地被单独输入生成器中。备选地,生成器通过分析针对特定特性的规范实体和属性来自动确定期望域规则集。备选地,通过显式规范实体来选择期望域规则集。备选地,生成器只能访问一个域规则集,并且无需选择。
通常,构造器将针对目标规则集创建规范。构造器通常知道规则集接受的实体和值的类型、以及它们通常如何影响所生成的文档。例如,构建针对医疗报告规范的构造器通常必须知道报告需要患者的血压、体重和身高信息,并且构造器通常必须知道如何将这些数据形成适当规范实体。优选地,构造器使用编辑器程序来生成规范,编辑器程序帮助构造器创建针对规则集的适当实体。可选地,编辑器程序内置有规则集的部分,使得在创建规范实体时自动生成相关实体。
被编程到生成器程序本身中的规则、逻辑和条件也被认为是所选择的域规则集的部分。
每个规则具有至少两个组件:条件和命令。通过首先评估实体是否满足规则条件来将规则应用于实体。如果条件不满足,则规则应用停止。如果条件满足,则执行规则的命令。
条件通常涉及实体值的字符串比较。例如,条件可以是“如果实体的类型值等于action”或“如果实体的action_type值不是以add开始”。条件可选地被复合,使得实体必须满足多个条件。
命令通常涉及生成包括来自应用实体的值的新实体、修改针对应用实体的值、或使用应用实体值来修改其他实体的值。例如,规则命令可以是“将该实体的maxlength值设置为等于255”或“从该实体创建新实体,将新实体的类型值设置为等于hook;并且将新实体的父值设置为等于该实体的id值。”
对于旨在修改另一实体的值的规则,该规则通常包括第二“修改条件”集以找到第二实体(或多个实体)。例如,这样的第二条件可以是“如果第二实体的id值等于该实体的父值”或“如果第二实体的类型值以mod结尾”。根据规则命令来修改满足第二条件的实体。
规则优选地不包含诸如foreach或while等循环命令。循环优选地被包含在生成器程序中。
规则优选地不包含要被合并到文档中的编程语言或其他技术语言的字符串。优选地,所有技术语言都存储在段中。可选地,规则包含要被合并的简单字符串或数字。例如,规则可以包含将默认最大字符串长度255分配给数据库列的值。
规则优选地不引用其他规则。
规则到实体的“应用”包括评估实体是否满足规则条件,包括当不满足条件的情况。
被称为“修改”实体的值的规则命令包括:添加新值、编辑现有值和删除现有值。备选地,规则命令向实体添加新的属性和值。
可选地,按照规则列出的顺序应用规则。可选地,生成器分阶段执行规则。例如,在一个实施例中,生成器首先应用一系列修改规则,然后是一系列生成规则,然后是另一系列修改规则。
域规则集可选地具化在通用代码中。
域规则集可选地具化在神经网络中。
规则集语法
通常,用于处理规范的模板条件是用通用编程语言或通常反映通用编程语言的模板语言来编写的。
本发明允许更集中的专用的规则集语法。这种语法有很多优点。首先,新架构师只需要学习这种重点语法,而不是第二GPL或准GPL。其次,生成器程序可以运行由不受信任的第三方开发的规则集,而不会危及计算机的安全性,就像使用通用代码一样。第三,在这种语法中,错误跟踪、错误检查和一般调试要容易得多。以下部分描述优选规则集语法。
优选实施例中的示例性规则:
规则集优选地包括一个或多个文件。每个文件包含多个规则。文件中的每个规则都由分隔符串来分隔,优选地是一系列正斜杠后跟换桁符。
每个规则包括条件和命令,至少一个条件和至少一个命令,每个由分隔符串、优选地由回车换行符分隔。
每行(条件或命令)由分隔符串、优选地由空格字符分隔成三个部分。第一部分是运算符,第二部分是键,第三部分是值。多余的分隔符和字符串被视为值的部分。
对于规则条件,运算符以if开始,后跟包括预期实体属性的名称的键,后跟某个字符串值。这可以理解为,“如果实体的键等于值,则继续。”
多行条件用AND运算符连接,使得“如果条件1AND如果条件2,则继续”。
条件可选地将某些字符附加到if运算符的结尾,以评估非等式运算符。例如,ifstart key value行被评估为“如果实体的键以值开始,则继续”。其他运算符包括:ifin,用于匹配字符串的任何部分;ifmatch,用于对字符串执行正则表达式匹配;ifend,用于匹配字符串的结尾。对于任何条件运算符,if可以替换为ifnot(例如,ifnotstart titleHeiio)以在条件评估为假时继续。
每个规则包含以do运算符开始的命令行,称为“指令”。该命令向生成器通知规则在条件满足时要执行什么类型的任务。do命令的可能键是add和mod。
add键以信号通知规则命令将生成附加实体。在add之后的值是要生成的实体的类型。在这方面,do add blog是针对do add/set type blog的简写。可选地,段实体具有通用type=segity(或类似的,其中segity是针对段实体的简写)。通常,这些通用类型段旨在表示一个位置中的一个段的一个实例。
mod键以信号通知规则命令将修改一个或多个现有实体。
do mod命令具有特殊seif值,该seif值以信号通知要被修改的唯一实体是满足规则的实体。生成器在一个满足实体上执行规则命令,然后迭代实体循环。
在do mod之后的任何其他值都被解释为type,并且开始新实体子循环,以寻找type属性与type值匹配的实体(其中type是普遍存在的实体分组属性)。生成器在具有匹配type的所有实体上执行规则的命令。
对于其中架构师希望仅修改具有匹配type的实体的子集的情况,使用具有modif运算符的单独条件行。modif运算符的操作与if运算符一样,但是它的条件被应用于子循环中的其他实体。例如,行modifnotstart title Hello匹配标题不以Hello开始的任何其他实体。在这方面,行do mod blog是针对do mod和modif type blog的简写。
可选地,在已知属性值是唯一的情况下,规则集优化修改子循环。例如,如果生成器知道每个实体的id值是唯一的,则modif id 100会被优化以找到具有id=100的一个实体,而不是迭代完整的子循环。
规则集具有多个命令运算符来实际操纵满足实体的属性值集,set将属性值设置为给定规则值,append将规则值追加到属性值的结尾,prepend将规则值附加到属性值的开始,del删除属性和值,以此类推。通常,do add命令与set命令配对,因为每个新实体属性都以空白开始。
规则集的重要方面是将值从满足实体转移到新的/修改后的实体的能力。这是使用变量语法完成的。优选地,满足实体值会替换规则值中它们的属性名称的大写字符串。例如,满足实体具有属性值title=Hello并且被满足的规则具有命令set title re:TITLE,则另一实体的值将被设置为re:Hello。这允许规则实体组合以布置其布置由实体值设置的段,因此规则架构师和实体构造器两者都可以重新布置段。
规则集具有用于相关实体的特殊命令运算符chain。通常,两种不同实体类型将具有相关属性值。通常,由一个实体满足的规则想要使用来自相关实体的值。例如,博客(“blog”)实体具有与帖子(“post”)实体的post_biog_id值相关的biog_id值。以下chain命令将每个帖子实体与其对应博客实体进行匹配,并且将每个博客值推送到帖子实体。
////////////////////////////////////////
if type blog
do mod post
modif post_blog_id BLOG_ID
chain post_blog_id~
第一行是满足针对博客实体的条件。在找到博客实体之后,第二行指示生成器启动新实体子循环以查找帖子实体。第三行过滤post_blog_id值对应于博客实体的blog_id值的帖子实体(大写的BLOG ID被替换为博客实体的blog_id值)。在找到匹配项之后,最后一行指示生成器将每个博客属性值推送到帖子实体。例如:
//这些specity
<blog blog_title=″My Blog″blog_public=″1″blog_id=″1″/>
<post post_id=″2″post_blog_id=″l″post_title=″First Post″/>
//被链接成
<blog blog_title=″Hello″blog_public=″1″blog_id=″1″/>
<post post_id=″2″post_blog_id=″1″post_title=″First post″
post_blog_id~blog_title=″My Blog″post_blog_id~blog_public=″1″/>
优选地,chain post_blog_id~行指示生成器将来自博客的每个属性名称追加post_blog_id~。例如,如果博客实体的blog_title是我的博客,则生成器会将帖子post_blog_id~blog_title=我的博客推送到帖子实体。当一个实体被链接到相同类型的两个其他实体时,以这种方式追加属性名称可以防止命名冲突。波浪号字符是任意的,它可以是属性名称中不允许的任何字符。
链接是本发明处理实体当中的继承的方式。
可选地,规则包含用于转换实体值的form命令。例如,form password md5对实体的密码值执行md5哈希。转换包括转换为整数、浮点、小写、大写、哈希、条带化字符、替换字符等。
可选地,规则包括段串,诸如set segment<a href=″HREF″>vALUE</a>。在该实施例中,代替标识单独加载的单独段串的规则,段是规则内的指定串。规则和段通过硬编码而不是引用被配对。该实施例不是优选的,因为它降低了灵活性、创建了冗余并且混合了语法从而导致不必要的复杂化。下面是示例。在该实施例中,规则被包含在HTML注释中并且成对的段串跟随。
<l-----
if type obj
set id OBJ_ID
----->
<form action=″obj_edit/ID″>
CHILDPOINT
</form>
<!-----
if type field
if field_display true
set where FIELD_OBJ_ID
set order FIELD_ORDER
set idFIELD_ID
----->
<input type=″FEELD_TYpE″placeholder=″FIELD_PLACEHOLDER″/>
可选地,指令键附加包含用于阶段指令执行的修饰符。例如,具有do mod指令的所有规则都会被执行,然后是do mod2规则的后期阶段。do mod2规则以相同方式执行,但在不同阶段执行。备选地,规则具有指定阶段命令,诸如阶段i。
可选地,该规则集语法被转换成通用代码或其他计算机代码用于更快地执行。
在备选实施例中,规则集用典型编程语言进行编码。
在备选实施例中,规则集用模板语言进行编码。这不是优选的,因为这样的语言通常执行起来很慢并且在语法上不合适。
在备选实施例中,规则集用XML或XSLT进行编码。
循环优化
本发明在规范实体上迭代循环。循环通常由foreach、for、while或模板或编程语言的类似命令发起。本公开在示例中使用foreach循环。
常规模板引擎包含潜在的无限实体循环,因为每个模板脚本可以包含任何数目的实体循环并且每个文档可以调用任何数目的模板脚本。
优选地,本发明仅包含两个实体循环:一个实体循环将规则应用于实体;第二实体循环针对具有修改指令的规则,以在另一实体循环中将满足的规则实体组合应用于每个实体。第一实体循环每个规则执行一次。一旦每个满足规则实体组合,第二循环被执行,其中规则具有修改指令。简化示例:
本发明的创造性循环结构允许某些规则循环优化(否则这可能是不切实际的)。循环的优化与其执行的迭代数目成反比。
其他方法可以在模板内嵌套循环、在循环内嵌套规则以及在规则内嵌套模板。例如,模板可以包含foreach循环,在该循环中是if条件,如果条件满足,则加载和评估子模板。这排除了分析规则,因为它们没有列在一个位置。此外,嵌套对其他模板的条件引用使预测应用规则的顺序和数目变得不可能。
本发明优选地将循环、规则和段分离。生成器程序优选地一次加载所有规则,然后跨规则来运行foreach循环。在规则foreach循环中,生成器跨实体来运行另一foreach循环。如果未经优化,则生成器程序将每个规则的条件应用于每个实体。如果实体不满足规则条件,则生成器将迭代到下一实体。如果实体满足规则条件,则规则命令被执行。
一次加载所有规则允许生成器容易地分析所有规则并且执行优化。例如,生成器接收新的规则集。生成器标识两个规则,每个规则包含两个条件。两个规则的第一条件相同,“如果实体类型等于动物,则继续。”两个规则的第二条件相似,但针对X的值不同,“如果实体animal_type等于X,则继续。”
/////////////////////////////////////////
//规则#1
iftype animal
if animal_type unicorn
do mod self
set about I can fly.
///////////////////////////////////////////
//规则#2
if type animal
if animal_type leprechaun
do mod self
set about I have a pot of gold.
本发明可选地对这些规则进行分组,y确定未通过第一规则的第一条件的实体将始终无法通过第二规则。通过不对第一规则的第一条件失败的所有实体应用第二规则,生成器减少了每个循环的规则实体迭代数目。
可选地,生成器对与规则组相对应的实体进行分组。如果很多规则具有针对实体类型的条件过滤,则本发明在应用之前可选地按类型对实体进行分组,以仅将类型组中的规则应用于类型组中的实体。本发明可选地通过根据其他实体属性将每个实体(或对它的引用)放入多个组来进一步优化实体。分组还减少了要执行的迭代数目。
可选地,生成器推断规则组内的if/else规则关系。满足上述第一规则的任何实体必然固有地不满足第二规则,因此生成器会跳过针对该实体应用第二规则,从而减少所执行的迭代数目。
优选地,在加载规范之前执行规则集优化。优选地,优化规则集以在规则实体循环中运行比实体数目乘以规则数目更少的迭代。
备选地,本发明中的规则被手动分组并且被给出if/else模式。这种方法不是优选的,因为计算机通常比人类更好地优化规则。
本发明克服了影响其他方法的停止问题的版本。在可计算性理论中,停机问题是根据对任意计算机程序和输入的描述来确定程序是完成运行还是永远继续运行的问题。在常规模板引擎中,很难或不可能预先确定循环条件模板嵌套是否会导致针对给定规范的无限递归循环。例如,模板A有条件地调用模板B,模板B有条件地调用模板C,模板C有条件地调用模板A。本发明克服了线性规则集的这个问题。无限段循环是不可能的,因为段优选地不调用其他段。然而,本发明的规则集通过生成满足用于生成另一实体的规则的实体等而导致无限循环。优选地,本发明通过分析针对这样的规则的线性规则集来防止这种情况。优选地,本发明拒绝允许无限规则实体循环的任何规则集。
本发明还可选地按父项将其线性规范实体优化成组。
本发明不需要在每个实施例的每个方面都进行优化。可选地,本发明对循环应用附加优化。
段实体
本发明的另一方面在于,给定规范和域,其可以从关于针对该域的文档应当如何形成的假定来自动生成附加实体。这为构造器节省了手工指定每个方面的单调性,同时仍然让构造器可以很好地控制文档。
与段配对的实体是段实体。可选地,生成器生成表示两个规范实体之间的链接的实体。可选地,域规则集始终生成针对域必要的某些实体。
域规则集中的示例规则可以如下工作:(a)如果specity的类型属性等于字段并且其required属性等于真,则创建新实体;(b)将新实体的类型属性设置为等于required;(c)将实体的field_key属性设置为等于specity的键属性值;(d)将实体的id属性设置为等于specity的id属性值,并且与字符串req串联;(d)将实体的父属性设置为等于specity的父属性值。该示例演示了规则可以将属性值从规范实体转换为段实体的一些不同方式。
在规范的开发期间可选地应用域规则集,以在创建规范实体时生成附加实体。这种方法提供了相同的开发简易性(构造器不必在其中手动创建段实体),同时为构造器提供修改段实体的能力。例如,如果构造器创建具有required=true属性值的字段实体,则域规则集也可以生成包含文本错误消息的实体,以在最终用户向所生成的程序提交具有空白字段的请求时进行显示。通过在规范实体之后立即生成段实体,并且通过以与规范实体相同的形式来存储段实体,构造器具有使用用于创建字段规范实体的相同工具(GUI等)来编辑错误消息的文本的能力。
在先前的公开中,段实体被不同地称为“codem”。该术语在此处终止。一旦创建,除实体值之外,规范实体与段实体之间优选地存在最小区别。
可选地,段实体具有某些共同的属性和/或值。可选地,specity修改为段。
段
段包含要合并到所生成的文档中的字符(字符串)序列。段优选地是预先编写的,存储在文件中,并且被视为字符串。生成器加载段集合并且根据域规则集到specity的应用来修改/布置它们。
段内容反映了它被设计以生成的文档类型。例如,被设计以生成计算机程序的集中的段将包含期望编程语言的程序指令。被设计以生成英语语言文档的集中的段将包含英语单词、短语和标点符号。被设计以生成美国法律文档的集合中的段将包含与该法律主体相关的单词和短语。
段与架构师希望的一样长或短。段可以像单词或数字或单个程序命令一样短。或者,段可以具有数千个字或程序指令长。
可选地,段是空白的。可选地,段只包含子插入点。可选地,段只包含值插入点。可选地,段包括数字、二进制、机器代码、汇编代码、整数、浮点、或在生成期间没有被评估为程序指令的其他非字符串值。
每个段优选地与元数据相关联。段优选地具有由实体引用的标识符以形成实体段对。对于存储在一个文本文件中的一个段,优选地使用文件的名称以标识该段。对于存储在程序变量中的段,优选地使用变量的名称(或数组值的键)来标识该段。对于存储在数据库中的段,指定的列优选地标识该段。
可选地,一个文件保存多个段。多段文件优选地由生成器用来分割文档内容的分隔符串来描述(例如,PHP的str_split()函数)。此外,描述字符串优选地包括多个子字符串或匹配正则表达式模式,以便将元数据或评论与段相关联。例如,段可以利用包含段标识符的类似HTML注释等字符串来分隔:
优选地,生成器一次加载所有段。
优选地,生成器不评估段内的任何指令或逻辑。优选地,段不引用任何其他段或任何规则集规则。这通过消除针对任何不同模板脚本语言的需要而降低了构建本发明的复杂性。
被设计以生成计算机程序的段可选地包含多种编程语言的程序指令——例如示例性PHPweb应用中的PHP、HTML和SQL。
一个段可选地属于多个集合。
可选地,来自集的一个或多个段未被包括在所生成的文档中。
优选地,实体与段的实例配对,使得每个段可用于多个配对。不应当假定每个段在所生成的程序中仅限于一个配对或一次使用。
布置段包括合并一个段的多个实例,如域规则集所指示的。
优选地,一个生成器可以访问多个段集合。可选地,生成器将具有一个规则集的一个规范应用于多个段集合以产生多个文档。
段集合可选地被设计用于期望编程语言、语言内的期望编程范式、程序的期望层(例如,用户接口或业务逻辑)或其组合。
优选地,计算机程序段包含用于所生成的程序的流程控制,包括诸如if、else、for、while等指令。这样的段可选地将其子插入点放置在有条件执行的子例程(或类似程序)中,使得子段将被有条件地执行。这样的段的嵌套允许域规则集强加规范中不明确的控制结构。
在先前专利申请中,“段”被不同地称为“模板”或“代码模板”或“小码(codelet)”或“代码集”或“代码片段”。术语“段”和派生词在此用于包括非程序文档生成并且将本发明中的类似字符串的模板与模板脚本(诸如Velocity的那些)区分开来。段更好地封装本发明的这个组件的字符串性质。
实体段对
在优选实施例中,生成器将多个段实体中的每个与段的实例配对。
优选地,通过将实体值与对应段元数据值匹配来将这两者配对。在优选实施例中,实体的段值与段的标识符相匹配。例如,具有segment=action的实体与存储在action.txt中的段配对。
优选地,每个段与一个实体配对,该实体包含替换段的valpoint(见下文)必要的所有值,并且该实体包含相对于文档中的其他段来布置段所需要的信息。布置属性优选地是用于嵌套的id和parent、以及用于兄弟排序的order。
可选地,实体不与段配对。
可选地,实体与空白段配对。
在备选实施例中,一个段与多个实体配对。可选地,这些实体是相关的,例如,祖父、父和子实体。
可选地,一个段与包含值的一个实体配对以布置该段,并且一个或多个相关联的实体包含值以替换该段中的valpoint。可选地,布置实体具有与valpoint实体相关的一个或多个值。
在备选实施例中,一个实体与多个段配对。在该实施例中,实体的每个配对都应当被算作一个实体,并且因此每个配对都应当为一对一的实体段对。
值插入点(Valpoint)
优选地,集中的一些段包含值插入点,或简称为“valpoint”。Valpoint标记其中来自配对实体的对应字符串值将被插入到段字符串中的位置。优选地,valpoint由与实体属性相关的独特字符串来标记。使用上面的段示例,全大写的PARAM valpoint将被替换为实体属性param的值。
生成器程序优选地在实体属性上运行循环以替换段中的所有可能的valpoint。
对于计算机程序文档,valpoint优选地以如下方式与典型的底层编程语言变量区分开来:该方式使得包含valpoint的段仍然被认为是底层编程语言的有效代码。这允许段架构师在开发段时使用所有可用的编程语言语法解析工具。
备选地,对于计算机程序文档,valpoint被形成为底层编程语言的变量。在该实施例中,valpoint在生成之前替换它们的字符串,因此valpoint字符串本身永远不会作为代码被执行。
备选地,valpoint由特殊字符指定。
备选地,valpoint由数字指定。
优选地,为了降低复杂性,一个valpoint被替换为恰好一个实体串值。
优选地,为了降低复杂性,valpoint不包含任何逻辑、任何转换指令或任何其他可执行函数。
备选地,在实体值是数组的情况下,valpoint被替换为串联成字符串的数组值。这不是优选的,因为它增加了不必要的复杂性。处理数组的优选方式是规则集将每个数组值处理为不同实体,将该实体与段配对,并且将该对指定为原始实体的子实体。
优选地,valpoint插入在配对之后和嵌套之前完成。实体段对在配对之后不需要从父实体继承任何值。实体段对不需要知道它在嵌套层次结构中的位置来完成值插入。
在一个实施例中,段包括多个子串。生成器可选地将子串之间的点解释为valpoint或子点。例如,段包括第一半串和第二半串,并且生成器将两个半部之间的点解释为子点,以插入子段串。
在先前专利申请中,valpoint被称为“variablet”。
子插入点(子点,“childpoint”)
通常,集中的一些段将包含子插入点,或简称为“子点”。子点标记生成器将插入子段字符串的位置。优选地,子点由不同字符串标记,该字符串的值使用生成器程序命令(诸如PHP的str_replace())来替换所布置的子字符串。在上面的示例中,子点由字符串/*CHILDPOINT*/标记。
可选地,段允许针对子点的多种变化。在上面的示例中,/*CHILDPOINT*/和简单的CHILDPOINT都标记了子点。
优选地,段具有一个子点,因为这是最简单的实施例。
备选地,段具有多个子点。可选地,具有多个子点的段具有子点的标准化放置,诸如每个段具有前、中和后子点。可选地,标准化子点具有标准化名称,诸如CHILDPOINT BEF、CHILDPOINT MID、CHILDPOINT AFT。可选地,假定前后子点位于段字符串的开始和结尾,不需要占位符字符串。
段嵌套
在优选实施例中,生成器将每个实体段对的字符串内容递归地插入其在父的子点处所指定的父段的字符串内容中。
实体段对中的实体优选地包含id属性和父属性。“父”的“子”是通过将子的父属性与父的id属性匹配来标识的。这个过程首先通过针对最低孩子来生成段,将它们嵌套在其父段中,将那些嵌套在其父段中,以此类推。这优选地以布置成连续字符串的所有相关段作为所生成的文档结束。
可选地,生成器基于指定实体属性(例如,顺序属性)来附加地对兄弟实体段对进行排序。
可选地,实体具有多个父级。可选地,实体具有针对每个父级的一个顺序值。可选地,父和顺序属性各自包含多个值。
所生成的文档
本发明生成文档。该文档包括任何期望字符序列(字符串)。文档可选地包括多个文档。文档可选地被保存到一个或多个文件。
期望的父实体可选地被赋予将它们指定为单独文件的值。文件名可选地在规则集中固定或基于规范值。
所生成的文档可选地被输出到人机界面。
所生成的文档可选地包括人类语言。示例包括手册和支持文档。所生成的人类语言文档可选地被转换成另一人类语言。
所生成的文档可选地是法律文档。示例包括合同、公司章程、服务条款和专利申请。
所生成的文档可选地是医学文档,例如诊断。
所生成的文档可选地是工程文档。示例包括施工计划和环境影响报告。
所生成的文档可选地是科学文档。示例科学领域包括生物学、化学、物理学和环境科学。
所生成的文档可选地是计算机程序。
所生成的文档可选地是在生成时被执行的计算机程序。
所生成的文档可选地是包括多个程序的计算机程序,该多个程序在一个或多个计算设备上单独或同时执行。
所生成的文档可选地是当前或将来被发送到不同计算设备用于执行的计算机程序。
所生成的文档可选地是当前或将来要在与生成器相同的计算设备上执行的计算机程序。
所生成文档可选地是包括汇编语言、目标代码、机器代码或其他代码的计算机程序。
所生成的文档可选地是附加地被编译成另一种编程语言、汇编语言、目标代码、机器代码或其他代码的计算机程序。
所生成的文档可选地是描述另一生成文档的计算机可读文档。示例包括API规范和其他标准化规范。
所生成的文档可选地是iOS应用、Android应用、Windows应用、其他桌面应用、其他移动电话应用或其他操作系统特定应用。
所生成的文档可选地是在诸如数据库等持久数据存储库上执行CRUD功能的API计算机程序。
所生成的文档可选地是网站应用的前端、后端或两端。
所生成的文档可选地根据语言和域被另外格式化。例如,在手动PHP编程中,为了可读性,在开大括号字符(“{”)之后开始换行并且更深一层缩进被认为是最佳实践(但不是计算所必需的)。在这种情况下,本发明可选地通过PHP格式化器运行所生成的PHP程序以格式化代码以提高可读性。
所生成的文档可选地是HTML、XML、XSL、Markdown、Adobe PDF或微软Word文档。
所生成的人类语言文档
本发明可选地生成人类语言(诸如英语)的文档。所生成的文档可选地是法律文档。所生成的文档可选地是关于联邦、州和/或地方法律的美国法律文档。
人类语言文档通常具有最少程序指令。格式化指令应当被视为所生成的文档中的“程序指令”。这些程序指令包括HTML、XML、Markdown、Adobe PDF、微软Word和所有标记语言的格式。
人类语言文档通常包括标题、节标题和用于布置段落的指令。段落或部分可选地被编号。
在一个实施例中,所生成的文档是合伙协议、经营协议、公司章程、股东协议、投资者协议、合资协议或与诸如公司、LLC或LP等商业实体有关的其他文档。在另一实施例中,所生成的文档是租赁协议、购买协议、抵押协议、契约、留置权、许可协议或与财产所有权有关的其他文档。在另一实施例中,所生成的文档是婚前协议、离婚协议、监护协议、授权书、遗嘱或其他与遗产或家庭有关的文档。在另一实施例中,所生成的文档是保密协议、竞业禁止协议、雇佣协议、承包商协议或其他与雇佣相关的文档。在另一实施例中,所生成的文档是服务条款(TOS)、隐私政策或与商业服务相关的其他文档。
示例性法律英语术语包括:协议、终止、继承人、授权书、破产、合伙人、财产、资产、责任、披露、复数、至少、一个或多个、不超过、不少于和一方。其他法律英语术语包括法律名称和法庭案件。
WYSIWYG编辑器
在本发明的一个实施例中,构造器操纵所见即所得(WYSIWYG)编辑器来操纵specity。WYSIWYG编辑器显示所形成的文档并且允许构造器使用GUI来操纵生成文档的规范实体。可选地,WYSIWYG编辑器在编辑期间显示所形成的文档的近似表示。可选地,WYSIWYG编辑器仅定期或根据构造器指令来更新显示;这尤其用于其中重新生成文档花费不可忽略的时间量的实施例中。
在一个实施例中,本发明生成HTML文档。在相关的备选实施例中,本发明生成输出HTML网页的程序(例如,PHP或Python)。在两个实施例中,生成器程序将所生成的文档中的HTML元素与生成该元素的规范实体相关联。点击HTML元素(或类似元素)会激活编辑器界面,其中构造器在该编辑器界面中操纵相关联的specity。在该实施例中,HTML页面本身充当WYSIWYG编辑器系统的部分。
优选地,编辑器程序是单独的网站并且激活编辑器包括在构造器的浏览器中打开编辑器网站。备选地,编辑器程序是HTML文档中的JavaScript模式窗口。备选地,编辑器程序内置于构造器的浏览器中,无论是本机还是通过浏览器插件。
可选地,激活编辑器涉及第二动作,例如alt点击、shift点击、双击或Ctrl点击。可选地,构造器的浏览器向HTML文档发送指定的web cookie、指定的请求报头、指定的POST字段、指定的查询字符串或其他信号以启用编辑器。备选地,构造器使用专门的浏览器或浏览器插件来启用编辑器。可选地,HTML文档(或相关文档)包括JavaScript以启用编辑器。
优选地,HTML元素包含标识编辑器程序中的相关联specity的指定属性。元素本身(诸如HTML标记名称)可选地提供用于激活编辑器的信息。例如:
<img src=″/logo.png″id=″logo″hyper-id=″1234″onclick=″if(event.altKey)return hyperpilerEdit(this)″\/>
可选地,HTML元素包含链接到网页以操纵相关联specity的指定属性。例如:
<img src=″\/logo.png″id=″\logo″hyper-edit=″http://hyperpiler.com/img_edit/1234″\onclick=″if(event.altkey)document.location.href=this.getAttribute(′hyper-edit′)″/>
可选地,HTML元素被包装在另一元素中以用于编辑目的。例如:
备选地,HTML文档采用另一种标记语言,诸如Markdown。备选地,HTML文档是Word、PDF或具有超链接(或类似超链接)能力的类似显示文档。
在WYSIWYG编辑器程序中可选地编辑针对人类语言文档的规范实体。编辑器程序显示文档。点击文档的某个部分会指示构造器编辑与该部分相关联的实体(或多个实体)。备选地,构造器通过选择位置并且输入期望文本来将文本直接添加到文档中。在一个实施例中,WYSIWYG编辑器创建针对自定义文本而指定的实体,以存储文本和放置文本的位置。
在生成可执行计算机程序的实施例中,生成器可选地包括将代码的部分与specity相关联的代码注释。在一个实施例中,生成器放置包括链接到网页以操纵与附近代码部分相关联的specity的URL的代码注释。可选地,代码被显示在标识这些注释的编辑器程序中。可选地,编辑器程序使这些注释或代码部分可点击以发起specity编辑。可选地,编辑器程序是web浏览器。可选地,编辑器程序是IDE。
作为框架的实现
本发明备选地实现为框架程序。这里的“框架程序”描述程序,该程序包含预先编写的代码体,该代码体与可变设置相结合以改变该代码的条件执行。在这个实现中,specity、域规则集和段都被包含在框架程序的代码中,以框架程序的给定编程语言进行编码。
specity被编码为框架程序内的变量。
域规则集被编码到框架程序的控制结构中。
段被编码为框架程序的条件表达式中所包含的子例程和/或指令。
超堆积(“hyperpiling”)发生在框架程序的常规编译(或解释)时。
在该实施例中,常规编译器使用specity变量来转换框架程序以选择性地布置和执行期望的段子例程的代码,同时选择性地忽略不期望的段子例程。尽管优选实施例采用有限的规范实体并且添加功能,但框架程序具有无限可能的功能组合并且在编译时根据规范实体选择性地限制最终功能。代码框架实现目前不太受欢迎,因为结果代码的计算机执行通常比优选实施例的计算机执行慢,然而这可能随着相关技术的进步而改变。
计算机程序文档编译
本发明的另一方面是一种将域特定语言处理成通用编程语言的计算机方法和设备。
本发明的另一方面是一种将不受流程控制的计算机程序处理成受流程控制的计算机程序的计算机方法和设备。
按照惯例,程序员将通过手动键入以给定编程语言的语法编码的指令来创建计算机程序。通常,程序员将使用通用语言(GPL),开发人员用该GPL指定控制结构,该控制结构描述要有条件执行的一系列计算。很多编程语言中常见的控制结构语句包括:if、else、for和while。这些语句控制指令如何随时间被排序,从而使编程语言“被控制”。编程语言必须具有一些控制结构才能“图灵完备”或“计算通用”。
按照惯例,一旦开发人员完成了他的GPL程序,他就将其输入编译器中,该编译器将人类可读代码转换成计算机可执行代码。备选地,开发人员可以用GPL脚本语言来编写代码,该语言由称为“解释器”的特殊编译器来编译,该编译器在执行时编译程序。编译器通常会执行调节以优化输入代码,但不会改变功能或向输出代码添加功能。编译器通常执行所控制的输入代码到所控制的输出代码的一对一功能转换。
常规地,开发人员将使用建模语言来描述给定概念框架中的概念实体。例如,开发人员将使用超文本标记语言(HTML)来描述网页上元素的布局。这里,我们可以将标记语言视为特殊情况的建模语言。建模语言本质上不适合一般编程目的。建模语言通常缺乏控制结构并且图灵不完备,因此它们是“不被控制的”。因此,建模语言通常不会编译为GPL。
建模语言的缺点是它们的能力不如通用语言,但它们的优点是,它们的简单语法使人们更容易学习和编写它们。
开发人员长期以来一直在寻求一种经由图形用户界面(GUI)或简化语法来开发GPL计算机程序的方法,但先前的尝试已经被证明是不切实际的。不切实际的原因是代码能力与开发复杂性之间的权衡。以前的方法功能强大,但开发起来非常困难,因此手动编码被证明更实用。或者,以前的方法很容易开发,但它们的功能非常有限,以至于它们被降级为利基(niche)任务。
在本发明的一个实施例中,规范实体以不受控制的域特定语言编码。这允许手动和通过GUI工具两者来轻松操纵specity。
在本发明的一个实施例中,所生成的文档是以通用语言编码的受控计算机程序。
本发明提供改进的方法以提供更大的能力和降低的复杂性两者。通过自动生成附加实体,特别是在开发过程中,使得构造器可以操纵它们,本发明允许高度定制,而不需要具有构造器手动创建每个实体的单调性。
本发明在很多方面不同于常规的编译器。
常规编译器忠实地将计算任务集从一种编程语言转换为另一编程语言,执行尽可能接近一对一的功能转换。因此,常规编译器不会向所生成的程序添加功能。常规编译器也不会在输出程序中注入输入程序中不存在的控制结构。
相反地,本发明优选地执行一对多转换,以将一种specity转换为所生成的程序中的多个不同程序指令段。这种区别允许本发明向所生成的程序添加规范实体没有明确描述的功能和控制结构。所生成的程序代码不需要与规范实体线性对应。规范实体中的两个独立的specity可选地在所生成的程序中相互手动地修改彼此的代码段,或者它们可选地在所生成的程序中生成多个代码段。
本发明的附加能力是以灵活性为代价而得到的。因为功能和控制在规范实体中通常不是明确的,所以本发明必须从有限数目的域规则集中的一个域规则集中导出这些,每个域规则集包含有限数目的规则。有限的域规则集和每个域规则集内的规则表示本发明对通用编译的使用是有限的。
本发明生成与文档编程语言或编程范例无关的计算机程序文档。可以用任何编程语言生成文档。可以使用面向对象编程(OOP)范式或过程范式来生成文档。
低代码架构
本发明的另一方面是低代码编程。
新兴领的“低代码”或“无代码”软件开发域试图通过简化计算机编程的过程来缓解程序员瓶颈,以允许更广泛的工作方组构建计算机程序。然而,目前,低代码解决方案未能取代任何大量的手动编码。
当前的低代码解决方案被困在简单性与能力之间的权衡中。允许简单程序构建的解决方案缺乏执行复杂或定制任务的能力。允许复杂程序的解决方案太复杂和单调而无法实际构建。
这种权衡尚未得到令人满意的解决,因为低代码解决方案被视为手动编码的延续。迄今为止,编程方面的进步主要集中在改进编写程序代码的过程上,诸如用于web开发的新应用特定语言(如PHP)或利用更少的手动代码行(如jQuery)来实现常见任务的代码框架。通过扩展,低代码解决方案通常被视为编写程序代码的更快或更容易的过程,允许外行人在不知道分号、括号、句点和大括号的复杂语法的情况下形成计算机指令。
虽然当前的低代码解决方案解决了这种编程的程序负担,但它们未能解决编程的架构负担。复杂编程语法的目的是形式化程序的架构。架构描述了计算机程序的很多子例程如何交互以执行期望任务。给定程序可以具有数千个子例程,每个子例程都需要在正确的条件下以正确的顺序执行。将计算机程序中子例程之间的指数关系概念化的负担比编写代码语法的过程负担要大得多。
处理架构的常规低代码解决方案在其能力方面受到限制。通常,这样的解决方案是基于云的,并且不生成文档。通常,这样的解决方案具有非常狭窄的能力并且不能定制到本发明允许的程度。
本发明引入了该创新:低代码构造器的主要用途不是在子例程内形成代码语法,而是在构建子例程本身。本发明通过将布置段的规则集和控制段中的程序流程的程序指令相结合来构建程序。
SLAP架构
构建API程序向开发人员展示了两个概念上的权衡。
第一权衡是简单性与速度。web服务API的好处在于,它允许第三方开发人员以简单安全的方式与服务器交互。缺点是,这种API调用的网络开销使其比在程序内部运行相同代码要慢得多。程序员可能仅开发API程序,缓慢但简单地通过API运行所有操纵。或者,程序员可以开发API加上通道,以让程序在内部执行这些相同操纵。虽然以前的单通道架构的开发可能更快和更容易;在扩展时,这些程序被迫进入更有效的双通道架构。
第二权衡是冗余与复杂性。在接受双通道架构之后,开发人员必须选择将这些通道作为两个半冗余代码库还是作为具有两种访问方法的一个更复杂的代码库来维护。这两种选择都会引入新的误差向量。两个半冗余代码库要求双重更新和双重测试,从而增加了出错的可能性。具有两种访问方法的一个代码库通过将错误隐藏在更大的复杂性下面而增加了出错的可能性。
在手动编程中,冗余与复杂性的权衡在很大程度上仍未解决。在低代码编程中,权衡在很大程度上没有意义,因为构建引擎很少用于开发如此复杂的程序。本发明为这种权衡提供了一种新颖的解决方案,它特别适用于低代码生成器。
API架构权衡的优选解决方案被称为存储逻辑访问显示(SLAD)架构。SLAD适用于手动和低代码编程两者,但是当应用于使用本发明的低代码生成器时提供主要优点。
SLAD中的每个字表示堆栈顺序中的子例程。
存储层处理数据对象的读取和写入。这通常通过与API程序接口的单独存储引擎程序(诸如数据库)进行管理。优选存储层是关系数据库,诸如MySQL、PostgreSQL或Oracle数据库。备选地,存储层可以是键值存储库,诸如Redis、Riak、AWS Dynamo或Memcached。备选地,存储引擎可以是文档存储库,诸如CouchDB、Elasticsearch或MongoDB。备选地,存储引擎可以只是API程序中读取/写入文档的子例程。一些实施例可以使用存储引擎的组合,特别是在高速缓存时。优选地,存在所有存储请求被发送到的单个存储抽象。
逻辑层在将数据传递到存储层之前处理操纵对象的业务逻辑。在成功时,逻辑子例程调用存储子例程以读取/写入数据。在失败时,逻辑子例程返回错误。示例操作包括创建新对象、读取一个或多个现有对象、更新现有对象、删除现有对象和复制现有对象。示例业务逻辑规则可能是某个字段不能为空,或者某个字段只能包含09位数字,或者一个字段的值必须与另一字段的值匹配。该逻辑的规则和操作高度依赖于程序的预期用途。优选地,每个对象操作具有单个子例程,通过该子例程发生所有这样的动作,使得相同的规则一致地应用于该类型的所有对象。在优选实施例中,逻辑子例程被放置到被命名为layer_object_manipuation()的函数中。例如,用于更新小部件对象的逻辑函数将被命名为lgc_widget_update()。
访问层接收来自用户的输入,对其进行授权,将输入传递给相关的逻辑函数,并且以适当的格式返回结果。SLAD旨在具有多个并行访问通道。示例访问层是API和命令行界面(CLI)。一种类型的用户可能希望从CLI执行lgc_widget_update(),另一种从API执行。尽管针对CLI和API的业务逻辑相同,但返回数据的授权和格式会有所不同,因此需要两条并行访问通道。优选地,访问函数遵循与逻辑函数相同的命名约定,但以通道的三个字母缩写进行,诸如cli_widget_update()和api_widget_update()。如果程序提供两个API通道,第二API通道可以命名为api2,并且它的访问函数可以是api2_widget_update()。
显示器将数据传入和传出访问层,以人类可读的格式显示它。SLAD旨在具有多个并行显示层,例如网站HTML、iOS app和Android app。
API
本发明生成的典型计算机程序文档是应用程序编程接口(API)。API的目的是允许一个程序以规定方式将输入和输出数据传递给另一程序。通常,API程序在服务器计算设备上运行并且处理来自客户端计算设备的网络请求。
API使其可用的离散任务称为端点。通常,一个端点将主要对一个数据库表中的一行执行一项操作。常见操作是创建、读取、更新和删除(CRUD)。
请求通常包含用于标识发出请求的用户的API密钥或会话令牌。
在优选实施例中,API是web服务,其以超文本传输协议(HTTP)或安全超文本传输协议(HTTPS)包装请求和响应并且以XML或JSON编码响应数据。
备选地,API请求/响应被包装在任何应用层协议中。示例包括HTTP、HTTPS、FTP、SFTP、POP、SMTP、Telnet、XMPP、ONC、RPC、AMQP、DDS、STOMP和SSH。
备选地,API请求/响应用任何传输层协议传输。示例包括TCP和UDP。
备选地,API请求/响应使用定制协议或标准和定制协议的组合。
备选地,API请求/响应使用本地管线或套接字。
备选地,API请求/响应由中间件程序作为中介。示例包括ZeroMQ、RabbitMQ、IBMMQ和AWS SES。
备选地,API响应数据以任何结构化数据格式编码。
备选地,API使用规定的系统,诸如具象状态转移(REST)或GraphQL。
数据库
以下是在本公开中通过示例引用的表的SQL规范。在这些示例中,列名以表名开始,后跟下划线,后跟描述符。在该实施例中,如果描述符的形式为something_id,则假定列值链接到something表中的something_id列。在备选实施例中,列可以具有链接到其他列的显式值。
示例博客表规范。该SQL规范包含表示表的实体,包括针对表名的值。该规范还包括针对每个列的实体,包含名称值和数据类型值。
CREATE TABLE blog(
blog_id BIGINT,
user_id BIGINT,
blog_title VARCHRR(255),
);
示例后表规范。由于post_blog_id列包含来自博客表的blog_id,因此该表是博客表的子表。
CREATE TABLE post(
post_id BIGINT,
post_blog_id BIGINT,
post_title VARCEAR(255),
post_likes BIGINT,
post_text LONGTEXT
);
示例喜欢(“like”)表规范的用于记录用户何时“喜欢”帖子。由于like_post_id列保存帖子表中的post_id,该表是帖子表的子表。由于like_blog_id列保存帖子表中的blog_id,该表也是博客表的孙子。在单独的家族树中,由于like user id列保存用户表中的user id,这个表是用户表的子表。
CREATE TABLE like(
like_blog_id BIGINT,
like_post_id BIGINT,
like_user_id BIGINT,
);
在优选实施例中,数据库行的唯一标识符包括自动递增的整数。备选地,行的唯一标识符包括随机整数。备选地,行的唯一标识符包括随机字符串。备选地,行的唯一标识符包括用户输入的值,针对其他用户输入的值检查用户输入的值的唯一性。备选地,行的唯一标识符是列的组合。
在优选实施例中,数据库列的唯一标识符是其名称。备选地,列的唯一标识符是其顺序。可选地,列的唯一标识符与程序变量相关联。
在优选实施例中,数据库表的唯一标识符是其名称。可选地,表的唯一标识符与程序变量相关联。
可选地,表、行和列的唯一标识符被转换成不同、但仍唯一地标识程序中各个点处的值。例如,名为博客的表在某个点可以被标识为table1。在这种情况下,table1应当被视为表的唯一标识符。
这里被称为“相关”的数据库列、API输入字段和其他值优选地相等。使用术语“相关”是因为存在两个值不同的一些实施例,但是一个值可以通过计算转换为另一值。
本公开主要使用关系数据库术语是为了清楚和一致性。这不应当被解释为将本发明限于关系数据库。本文中描述的方法也旨在用于其他计算机数据存储库系统。对关系数据库和相关术语的引用备选了非关系数据库、图形数据库、文档存储、键值存储、实体属性值存储、时间序列数据库、CSV文件、JSON文件或其他计算机可读结构化数据存储库系统和该系统的对应术语。
在一个实施例中,本发明被应用于实体属性值类存储系统。在本实施例中,以实体代替行,以属性代替列,以实体类型代替表。通常,实体具有指定的唯一标识符,该标识符用作存储唯一标识符的列的等效项。
业务逻辑
执行CRUD操作的计算机程序通常包含被称为业务逻辑的子例程,这些子例程对确定如何创建、存储和改变数据的真实世界业务规则进行编码。例如,程序可能要求某个列必须是2个字符长或该列仅包含数字。如果用户尝试创建违反业务逻辑规则的新行,则程序通常会返回错误消息。
在常规的低代码生成器中构建业务逻辑子例程是单调的。构造器通常必须:
(a)创建数据库表
(b)创建多个列
(c)创建子例程
(d)将正确的输入变量链接到子例程中
(e)将每个输入变量链接到数据库列
(f)将期望规则函数应用于每个变量
随着数据库列数的增加,这个过程变得越来越复杂。
本发明提供了更简单的解决方案。构造器必须仅创建具有期望列的数据库表(上面的步骤a和b),并且生成器将导出所有程序指令并且自动正确链接所有变量、列和函数。
通过使用代码段,本发明消除了排序程序指令的复杂性。并且本发明通过一致地使用来自规范的值来消除链接变量的复杂性。
通常,业务逻辑子例程特别需要表和列标识符来起作用。
子父API授权
当用户通过程序的API请求对给定行采取行动时,典型并且直接的授权方法是基于用户的唯一标识符(“UID”)和行的唯一标识符(“CRID”)来在权限数据库中查找针对该行的用户所授予的权限。
然而,在很多情况下,API程序可以受益于基于不同相关行的UID和ID来存储权限。在这种情况下,被操作的行在“子表”中被称为“子行”,相关行在“父表”中被称为“父行”。父和子的区别仅在两个表之间是相对的。父表/行独立于任何子表/行而存在。而子表/行包含保存父行标识符(“PRID”)的值的列,从而使子表/行依赖于父表/行。父子关系是一对多。
通过PRID存储权限具有实际益处。它减少了需要存储的权限数目,为每个用户存储一个父权限,而不是每个用户存储多个子权限。这使得高速缓存权限更有效,因为权限更少,每个权限的访问更频繁。并且添加到父权限的用户会被自动授予所有子项的这些权限,而不必被个体地授予每个子项的权限。
例如,允许用户编辑博客平台上的帖子的程序可以受益于基于blogid而不是postid来存储权限。在这种情况下,博客表/行是父项,而帖子表/行是子项。
然而,在手动编码和低代码构造两者中,该授权方案在架构上是复杂的并且易于出错。使用典型方法,在低代码生成器上构建这样的子例程的概念步骤是:
(a)创建父表。
(b)创建父标识符列。
(c)创建父用户权限表。
(d)创建子表。
(e)创建父标识符列。
(f)创建在子表中保存父标识符的列。
(g)创建API子例程。
(h)添加基于API输入来查找子行的语句。
(i)添加从标识符子行中选择父标识符值的语句。
(j)添加在权限表中查找与CRID和UID相关联的行的语句。
(k)添加根据API请求检查用户的权限的语句。
该过程中最困难的步骤是在后半部分,其中程序必须在交换变量时执行一系列任务。即使使用低代码构造器来消除语法负担,将适当变量正确连接到适当函数也很困难。
本发明极大地简化了该过程的后半部分。在本发明的一个实施例中,等效步骤为:
(a)创建父表。
(b)创建父标识符列。
(d)创建子表。
(e)创建子标识符列
(f)在子表中创建用于保存父标识符的列
(g)创建被指定以授权作用于子表的API请求的子例程。
从那里,生成器推断子节点与父节点的链接,将其链接到假定的权限表和假定的UID,在API子例程中自动添加查找和权限语句。
祖父填充
很多时候,构造器可能想要用来自父行的值和来自该父的父(祖父)行的值填充子行。为此,为了数据的完整性和安全性,祖父值必须与正确的父值相对应。然而,在手动编程和常规的低代码构造中,链接列值链以实现这一点可能很困难。
本发明使用自动填充有相关列名称的预写代码段来解决该问题。这消除了在构造或键入这样的子例程时可能发生的任何人为错误。
在优选实施例中,从列关系中推导作为祖父表、父表或子表的状态。具有独立列的表是祖父表。具有一阶依赖列的表是父表。具有二阶依赖列的表是子表。表代是相对的——给定表可以是另一表的子表、另一表的孙子、以及另一表的父表。
备选地,所指定的规范值分配子表、父表或祖父表。
挂钩
复杂的程序通常需要在作用于给定行时,还必须对附加行执行相关动作。在程序中将一个子例程链接到另一子例程的链接称为挂钩。例如,如果用户在博客文章上点击“like”,则程序可以在喜欢表中创建新行,然后是挂钩以增加帖子表中的post_like列。
通常,规范中的挂钩实体需要针对第一子例程的标识符和针对第二子例程的标识符。
备选地,挂钩实体可以嵌入在第一子例程实体内,隐式地将父实体标识为第一子例程。
优选地,子例程体现为函数。
优选地,挂钩片段具化为函数调用,以调用第二子例程。挂钩可以将一个或多个变量传递给第二子例程。
API格式
客户端程序的常见任务是请求从API服务器程序读取给定数据库表中的给定行。从一个数据库表中输出一行是一项相当简单的任务,以允许以多种方式构建输出数据。
通常,API输出数据在程序中形成为数组,并且然后编码为用于输出的字符串。常见的编码包括JSON和XML。
通常,API数组由顶层的元数据形成,其中数组在更深层保存所返回的行数据。
当客户端程序需要所请求的行和多个相关行时,该过程变得更加复杂。例如,客户端程序希望显示与给定like_user_id相关联的每个喜欢相关联的post_title和blog_title。
最简单的解决方案是客户端进行多个API调用,每个表一个调用。问题是每个请求都会产生开销,使得多API调用程序比单API调用程序慢。
另一解决方案是简单地将like行与具有相关帖子行的相关blog行合并。这可以利用JOIN语句以SQL完成,或者也可以通过合并行数组在程序中完成。该解决方案有两个主要缺点。首先,它要求所有相关行都存储在一个服务器上的一个表中——这限制了数据库的水平可伸缩性。其次,它可能是高度冗余的——如果用户喜欢一个博客上的100个帖子,则API将输出相同的blog行100次——这会不必要地减慢程序的速度。
本发明通过将每个表的行分组到它们自己的数组中来提供更有效的解决方案。这以易于关联的格式返回所有需要的数据,同时只发送每行的数据一次。所请求的行被赋予指向其他表中相关行的标识符的值。相关行只需要输出一次。
JSON格式的示例API输出:
在该示例中,包含@的like行键以column@table2=order的形式标识相关行,其中table2是相关表并且order是该表的数组中相关行在API数据中的顺序(从零开始)。@字符是任意的,并且可以是列名中不允许的任何字符(或字符串)。
将API中的实体与at符号组合类似于使用波浪号链接规则集中的实体。这两个阶段有目的地使用不同的分隔符,使得API分隔符在生成过程中不会被误解为链接分隔符。
每个like行可以在客户端使用相关行的唯一标识符与其相关行相关联。注意,每个喜欢行都与同一博客行相关,但博客行仅被转移一次。
请求行通常需要三条信息来标识相关行:表标识符、相关行标识符属性和相关行标识符值。取决于实施例,该信息中的一些可以是显式的或隐式的。
优选地,该表由其名称标识并且指向数据数组中的对应键名称。表名称可以隐含在一个或多个请求行的列名称中,假定使用相关表名称(诸如,tablel_table2_descriptor)的一致的列命名。备选地,请求行指向数据数组中表的顺序。
优选地,相关行标识符属性是相关行在其表的数组中的顺序。备选地,相关行标识符属性是相关列名称。相关列行名称也可以隐含在一个或多个请求的行列名称中,假定列命名一致,诸如tablel_table2_descriptor。
相关行标识值对应于相关行标识属性:用于顺序的order、用于列名称的column值等。
API可选地包含另一数组,该数组包含针对每个返回行的许可数据。权限数组反映数据数组,使得针对每一行的权限具有与行数据本身相似的索引。在上面的示例中,在PHP中作为$api[′data′][′like′][0]访问的喜欢具有存储在$api[′perm′][′like′][O]处的权限。客户端应用可选地使用该权限数据来示出/隐藏显示元素。
API中的数组可选地是关联的或枚举的。
这种API输出结构在所有形式的程序开发中都是有用的,但是当在用本发明生成的程序中使用时它特别有用。生成器会自动合并代码片段以在API输出中包含相关行。此外,生成器可选地将代码片段合并到API的对应用户界面程序中,以根据构造器的需要显示这样的相关行。
示例
下面的示例说明了本发明的一个实施例。
具化在类似HTML的语法中的两个specity被加载到生成器中:
<object name=″employee″title=″Employee″id=″1″>
<field name=″firstname″title=″First Name″id=″2″parent=″1″type=″text″>
生成器加载被设计为输出数据库驱动的网站的域规则集。
生成器加载包含PHP、HTML和SQL代码的段集合。
域规则集被应用于两个specity以生成若干附加实体。某些实体默认由规则集生成。为了说明起见,本文的基因以类似HTML的语法表示。为说明起见,从specity结转的属性值以粗体显示。
默认情况下,域规则集生成segity以创建文档来保存SQL命令以形成相关数据库:
<segity type=″file_sql″filename=″create.sql″id=″100″>
根据<object>specity,域规则集生成segity以创建数据库表。注意,“name”属性从specity调换为segity。
<segity type=″sql_table_add″name=″employee″id=″101″parent=″100″>
根据<field>specity,域规则集生成段以在该数据库表中添加列。注意,segity的父值等于前一segity的id值,以表示该列属于哪个表。这里,specity中的type值被转换为适当的对应的SQL类型。
<segity type=″sql_row_add″name=″firstname″type=″varchar(255)″id=″102″parent=″101″>
根据<object>specity,域规则集生成specity以创建用于向该表添加新行的PHP文件。该文件包含两部分,一部分用于可执行PHP,另一部分用于显示HTML代码。注意,域规则集自动将可执行部分的顺序设为1,将显示部分的顺序设为2。注意,域规则集通过使用<object>的名称并且然后附加_add.php来选择filename属性。
<segity type=″file_php″filename=″employee_add.php″id=″200″>
<segity type=″php_exec″id=″201″parent=″200″order=″1″>
<segity type=″html″id=″202″parent=″200″order=″2″>
根据<object>segify,域规则集生成用于将输入值保存为数据库中的新行的段。这个segify的父值是employee_add.php的PHP可执行部分,它将位于该部分。
<segity type=″php_row_add″table=″employee″id=″300″parent=″201″>
根据<field>segify,域规则集生成segify以接受firstname字段作为新数据库行中的列:
<segitytype=″php_col_input″table=″employee″column=″firstname″id=″400″parent=″3O0″>
根据<object>segify,域规则集为将提交的HTML表单生成segify:
<segity type=″html_form″title=″Add Employee″action=″employee_add.php″parent=″202″id=″500″>
由于<field>对象以类似HTML的格式加载,并且具有用于HTML规范实体的类似HTML的属性,因此它被转换为类似的segify:
<segity type=″html_input″type=″text″name=″firstname″id=″600″parent=″500″>
specity和specity现在包括:
<segity type=″file_sql″filename=″create.sql″id=″100″>
<segity type=″sql_table_add″name=″employee″id=″101″parent=″100″>
<segity type=″sql_row_add″name=″firstname″type=″varchar(255)″id=″102″
parent=″101″>
<segity type=″file_php″filename=″employee_add.php″id=″200″>
<segity type=″php_exec″id=″201″parent=″200″order=″1″>
<segity type=″html″id=″202″parent=″200″order=″2″>
<segity type=″php_row_add″table=″employee″\id=″300″\psrent=″201″>
<segity type=″php_col_input″table=″employee″column=″firstname″id=″400″
parent=″300″>
<segity type=″html_form″title=″Add Employee″action=″employee_add.php″
parent=″202″id=″500″>
<segity type=″html_input″type=″text″name=″firstname″id=″600″parent=″500″>
现在每个segify类型对应于段。每个segify都与其对应段的副本配对。每个段中的valpoint被替换为其成对segify中的对应属性值。所得到的代码段根据segity父值被嵌套,并且然后根据它们的顺序值进行排序。
下面针对用于SQL数据库创建的所列出的前三个segity——segify100、segify101和segify101——来描述这个过程。
用于segify100的段是file_sql,该段仅包含子插入点。该段类型的目的是表示该segify应当在所生成的程序中作为其自己的名为create.sql的文档输出。段内容最初为:
CHILDPOINT
针对segity 101的段为sql_table_add,其包含SQL代码:
create table`NAME`(CHILDPOINT)engine=innodb;
segity 102的段是sql_row_add,其包含SQL片段:
`NAME`(TYpE),
当valpoint被替换并且子片段被嵌套时,这三个组合的segity输出包含以下内容的文件。注意,生成器通过移除尾随逗号来执行格式化segity102的附加步骤。
create table`employee`(`firstname`varchar(255))engine=innodb;
生成器然后遵循类似的过程以利用相关代码填充其他文件。在完成时,生成器将文件输出给开发人员。
生成器程序
所附接的计算机程序列表附录包含用PHP编写的本发明的生成器程序的一个实施例。该实施例包含用于生成PHP计算机程序文档的specity。
其他注意事项
相关领域的技术人员将认识到,可以改变本公开中的属性、变量和函数的名称。
本发明可选地包括在一个或多个计算设备上单独或同时执行的一个或多个程序。本发明可选地体现在计算机软件、计算机硬件或这两者的组合中。
本发明可选地与Git、Mercurial或其他版本控制系统集成。
本发明可选地与SDK、IDE、文字处理器或其他文本编辑器集成。
本发明可选地体现为用于构建规则集和段集合的开发和调试工具。该实施例可选地可视化实体、规则和段之间的关系。
本发明可选地以针对本发明的一个或多个方面而优化的未来编程语言生成程序文档。
规范实体可选地构建在网站、移动应用、桌面应用或其他GUI界面上。
本发明可选地与常规模板引擎结合。
本发明可选地接受表示要在所生成的程序文档中的给定位置处并入的自定义函数调用(或类似的)的规范实体。
本发明可选地包括包含将第三方服务和API集成到所生成的计算机程序文档中的程序指令的段。示例集成第三方服务包括电子邮件、文本消息、即时消息、群组协作工具、社交网络、身份、Active Directory、OAuth、支付处理、云软件、云数据和云托管。
本发明可选地生成与比特币、以太坊或其他区块链技术相关的计算机程序。
本发明可选地与代码库结合。
本发明可选地验证规范实体。可以不同程度地实现验证。本发明必须根据给定语法来验证规范实体的语法。本发明优选地根据其编程语言来验证所生成的程序的语法。然而,本发明可能不必然验证规范实体将产生有用的或功能性的程序。本发明可以生成语法正确但无用的程序。在某些情况下,本发明可能无法验证所生成的程序的有用性或功能性。
本发明中的重构通常通过用新的规则集或段集合或这两者处理相同的规范来完成。
在一个实施例中,本发明的方法被颠倒。该实施例访问文档,将其分解为组件段,从段中提取值串,并且从这些值形成规范实体。
可选地,生成具有针对自定义代码或文本的指定占位符的文档。在重新生成时,将先前生成的自定义文档附加输入生成器程序中,以提取自定义代码,并且将其插入新生成文档的对应位置。
字符串可选地以ASCII、Unicode、UTF-8、UTF-16、UTF-32或其他字符编码进行编码。
常见的计算机可读介质包括闪存、ROM存储器、EPROM存储器、EEPROM存储器、RAM存储器、注册器、硬盘、硬盘驱动器、可移动盘、CD、DVD、蓝光、光盘、软盘、磁盘、磁带和固态驱动器(SSD)等。
常见的编程语言包括ActionScript、Ada、Arc、AWK、Bash、BASIC、C、C++、C#、CShell、Clojure、COBOL、ColdFusion、Elm、Erlang、Fortran、Go、Haskell、HTML、Java、JavaScript、Julia、Lisp、Objective-C、OCaml、Opal、Perl、PHP、Pico、PowerShell、Prolog、Python、Qbasic、Ruby、Rust、SQL、Swift、TypeScript、Visual Basic、WebAssembly、Wolfram、XML和XQuery等。
本发明可选地具化在任何有能力的编程语言中。本公开给出了PHP代码的示例。PHP本身可以被认为是模板语言,因为它被设计为在HTML标记中执行命令。然而,本发明不依赖于PHP内的任何模板特征。本公开中的任何内容均不应当被解释为暗示本发明依赖于PHP模板或限于PHP中的实施例。
可选地,本发明具化在JavaScript中并且在构造器的网络浏览器中执行。
为了语法简化,本公开将短语“多个X”视为复数名词,而不是单数名词。因此,本公开使用措辞“多个X都是(the plurality of Xs are)”而不是“多个X是(the plurality ofXs is)”
操作系统控制其他计算机程序的执行、PSO平台的运行,并且提供调度、输入输出控制、文档和数据管理、存储器管理以及通信控制和相关服务。操作系统可以是例如Windows(从华盛顿州雷德蒙德的微软公司可获取)、LINUX或其他UNIX变体(从北卡罗来纳州罗利的红帽公司(Red Hat)和各种其他供应商可获取)、Android及其变体(从加利福尼亚州山景城的谷歌公司可获取)、苹果OS X、iOS及其变体(从加利福尼亚州库比蒂诺的苹果公司可获取)等。
结合本文中公开的实施例而描述的方法优选地直接体现为硬件、处理器执行的软件模块、或这两者的组合。软件模块优选地驻留在闪存、ROM存储器、EPROM存储器、EEPROM存储器、RAM存储器、寄存器、硬盘、可移动磁盘、CD-ROM、固态驱动器或本领域已知的任何其他形式的存储介质中。示例性存储介质优选地耦合到处理器,使得处理器从存储介质读取信息并且将信息写入存储介质。备选地,存储介质与处理器集成。在附加的实施例中,处理器和存储介质驻留在专用集成电路(ASIC)中。在附加的实施例中,处理器和存储介质作为计算设备中的分立组件存在。在附加的实施例中,方法的事件和/或动作作为一个或任何组合或代码集和/或指令集存在于机器可读介质和/或计算机可读介质上,该介质被合并到计算机软件程序中。
在附加的实施例中,所描述的功能以硬件、软件、固件或其任何组合来实现。如果以软件实现,则功能作为一个或多个指令或代码在计算机可读介质上存储或传输。计算机可读介质包括计算机存储介质和通信介质两者,包括便于将计算机程序从一个地方传输到另一地方的任何介质。存储介质是计算机可访问的任何可用介质。作为示例而非限制,这样的计算机可读介质可以包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备、或者可以用于以指令或数据结构的形式携带或存储期望程序代码并且可以由计算机访问的任何其他介质。此外,任何连接都称为计算机可读介质。例如,如果使用同轴电缆、光纤电缆、双绞线、数字用户线(DSL)或无线技术(诸如,红外线、无线电和微波)从网站、服务器或其他远程源传输软件,则同轴电缆、光纤电缆、双绞线、DSL或无线技术(诸如,红外线、无线电和微波)都被包含在介质的定义中。如本文中使用的,“磁盘”和“光盘”包括压缩盘(CD)、激光盘、光盘、数字多功能盘(DVD)、软盘和蓝光光盘,其中磁盘通常以磁性方式再现数据,而光盘通常用激光以光学方式再现数据。上述的组合也应当被包括在计算机可读介质的范围内。
接口中的每个接口描述优选地公开了使用至少一种通信协议来建立握手或双向通信。这些协议优选地包括但不限于XML、HTTP、TCP/IP、串行、UDP、FTP、网络服务、WAP、SMTP、SMPP、DTS、存储过程、导入/导出、全球定位三角测量、IM、SMS、MMS、GPRS和闪存。与系统一起使用的数据库优选地包括但不限于MS SQL、Access、MySQL、Oracle、DB2、开源数据库等。系统使用的操作系统优选地包括Microsoft 2010、XP、Vista、2000Server、2003Server、2008Server、Windows Mobile、Linux、Android、Unix、I系列、AS 400和Apple OS。
服务器处的底层协议优选地是互联网协议套件(传输控制协议/互联网协议(“TCP/IP”)),并且用于接收文档的传输协议优选地是文档传输协议(“FTP”)、超文本传输协议(“HTTP”)、安全超文本传输协议(“HTTPS”)或其他类似协议。服务器处的协议优选地是HTTPS。
服务器的组件包括CPU组件、图形组件、存储器、不可移动存储、可移动存储、网络接口(包括到固定网络的一个或多个连接)、以及(多个)SQL数据库。存储器中包括操作系统、SQL服务器或其他数据库引擎以及计算机程序/软件。
从上文中可以相信,相关领域的技术人员将认识到本发明的重要进步,并且将容易理解,虽然已经结合其优选实施例描述了本发明,并且在附图中示出了其他实施例,但是在不脱离本发明的精神和范围的情况下,可以在其中进行许多变化的修改和等效替换,本发明旨在不受前述限制,除非可能出现在以下所附权利要求中。因此,要求专有财产或特权的本发明的实施例在以下所附权利要求中定义。
申请专利“超堆积器(Hyperpiler)”的生成器程序的计算机程序清单附录
<?php
////变量
$SET_KEY=$argv[1];
$PROJ_KEY=$argv[2];
define(′QQ′,′`′);
global$ruleset,$PROJVAR;
$ruleset=array();
$PROJVAR=array();
Claims (10)
1.一种用于在目标域内生成文档的计算机实现的方法,所述方法包括:
访问用于所述文档的规范,所述规范包括多个规范实体,所述多个规范实体包括要被包括在所述文档中的值;
应用域规则集,以将所述多个规范实体转换为多个段实体,所述多个段实体包括来自所述规范实体的所述值,其中所述域规则集包括用于处理用于所述目标域内的文档的规范实体的预定义规则;
处理所述多个段实体,以通过将来自所述段实体的值插入预定义段中来填充来自段集合的对应所述预定义段;其中所述段集合中的所述预定义段包括所述目标域内的文档的片段,并且还包括用于值到所述预定义段中的所述插入的值插入点;以及
根据所述规则集来组装所述段,从而生成所述文档。
2.根据权利要求1所述的计算机实现的方法,其中所述段实体中的至少一些段实体各自包括:来自两个不同规范实体的值。
3.根据权利要求1所述的计算机实现的方法,其中组装所述段包括:根据对应段实体中的值来布置所述段中的至少一些段。
4.根据权利要求3所述的计算机实现的方法,其中用于布置所述段的所述对应段实体中的至少一些值是至少部分地由所述规范实体中的值来确定的。
5.根据权利要求3所述的计算机实现的方法,其中所述段实体中的至少一些段实体包括:在所述段实体之间分配父子关系的值;并且组装所述段包括:根据所述对应段实体中的所述父子关系来将子段递归地嵌套到父段中的值插入点中。
6.根据权利要求1所述的计算机实现的方法,其中所述目标域是以计算机编程语言的计算机程序,所述预定义段包括以所述计算机编程语言的程序指令,并且所生成的所述文档是以所述计算机编程语言的计算机程序。
7.根据权利要求6所述的计算机实现的方法,还包括:
编译所生成的所述计算机程序。
8.根据权利要求1所述的计算机实现的方法,其中所述目标域是法律文档,所述预定义段包括法律语言,并且所生成的所述文档是法律文档。
9.一种用于在目标域内生成文档的计算机系统,所述计算机系统包括:
数据存储库,存储:
用于所述文档的规范,所述规范包括多个规范实体,所述多个规范实体包括要被包括在所述文档中的值;
域规则集,包括用于处理用于所述目标域内的文档的规范实体的预定义规则;以及
段集合,包括预定义段,所述预定义段包括所述目标域内的文档的片段并且还包括用于值到所述段中的插入的值插入点;以及
生成器系统,包括执行生成器程序指令的处理器,所述处理器被配置为:
应用所述域规则集,以将所述多个规范实体转换为多个段实体,所述多个段实体包括来自所述规范实体的所述值;
处理所述多个段实体,以通过插入来自所述段实体的值来填充所述段;以及
根据所述规则集来组装所述段,从而生成所述文档。
10.一种非暂态计算机可读存储介质,存储用于在目标域内生成文档的可执行计算机程序指令,所述指令由计算机系统可执行并且使所述计算机系统执行方法,所述方法包括:
访问用于所述文档的规范,所述规范包括多个规范实体,所述多个规范实体包括要被包括在所述文档中的值;
应用域规则集,以将所述多个规范实体转换为多个段实体,所述多个段实体包括来自所述规范实体的所述值,其中所述域规则集包括用于处理用于所述目标域内的文档的规范实体的预定义规则;
处理所述多个段实体,以通过插入来自所述段实体的值来填充段;其中域的段集合中的预定义段包括所述目标域内的文档的片段,并且还包括用于值到所述段中的所述插入的值插入点;以及
根据所述规则集来组装所述段,从而生成所述文档。
Applications Claiming Priority (11)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201962870031P | 2019-07-02 | 2019-07-02 | |
US62/870,031 | 2019-07-02 | ||
US201962879497P | 2019-07-28 | 2019-07-28 | |
US62/879,497 | 2019-07-28 | ||
US16/782,378 US10853062B1 (en) | 2019-07-02 | 2020-02-05 | Hyperpiler |
US16/782,378 | 2020-02-05 | ||
US202063003153P | 2020-03-31 | 2020-03-31 | |
US63/003,153 | 2020-03-31 | ||
US16/914,193 US10942709B2 (en) | 2019-07-02 | 2020-06-26 | Hyperpiler |
US16/914,193 | 2020-06-26 | ||
PCT/US2020/040297 WO2021003155A1 (en) | 2019-07-02 | 2020-06-30 | Hyperpiler |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113950664A true CN113950664A (zh) | 2022-01-18 |
Family
ID=74066117
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202080041963.XA Pending CN113950664A (zh) | 2019-07-02 | 2020-06-30 | 超堆积器 |
Country Status (7)
Country | Link |
---|---|
US (3) | US10942709B2 (zh) |
EP (1) | EP3867745A4 (zh) |
JP (1) | JP2022537868A (zh) |
CN (1) | CN113950664A (zh) |
AU (1) | AU2020298459A1 (zh) |
CA (1) | CA3128237A1 (zh) |
WO (1) | WO2021003155A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115567302A (zh) * | 2022-09-28 | 2023-01-03 | 建信金融科技有限责任公司 | Ssh数据传输装置、方法、设备及存储介质 |
Families Citing this family (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11093220B2 (en) * | 2019-02-26 | 2021-08-17 | Sap Se | Generating interfaces from data and service definitions for developing applications |
US11526350B2 (en) * | 2020-03-18 | 2022-12-13 | Red Hat, Inc. | Providing code editor documentation pages using a lightweight text formatting language and platform-agnostic command links |
US11609932B2 (en) * | 2020-03-27 | 2023-03-21 | Adp, Inc. | Web services having live data updates |
US11442703B2 (en) | 2020-09-22 | 2022-09-13 | Cisco Technology, Inc. | Domain-specific language for serverless network functions |
US11126415B1 (en) * | 2020-09-22 | 2021-09-21 | Cisco Technology, Inc. | Combining domain-specific language with general-purpose language for serverless network functions |
US11625230B2 (en) | 2020-09-22 | 2023-04-11 | Cisco Technology, Inc. | Identifying execution environments for deploying network functions |
US11914575B2 (en) * | 2021-04-26 | 2024-02-27 | Sap Se | Data persistency models for software applications |
EP4342212A1 (en) * | 2021-05-18 | 2024-03-27 | Microsoft Technology Licensing, LLC | Real-time radio access network analytics |
US11972255B2 (en) * | 2021-06-25 | 2024-04-30 | International Business Machines Corporation | Compliance content generation |
US20230015697A1 (en) * | 2021-07-13 | 2023-01-19 | Citrix Systems, Inc. | Application programming interface (api) authorization |
CN113792531B (zh) * | 2021-08-17 | 2024-02-27 | 罗普特科技集团股份有限公司 | 一种基于markdown语法扩展的文本编辑方法与系统 |
CN113791791B (zh) * | 2021-09-01 | 2023-07-25 | 中国船舶重工集团公司第七一六研究所 | 基于自然语言理解与转化的业务逻辑无代码开发方法 |
US11997178B2 (en) * | 2022-05-25 | 2024-05-28 | Microsoft Technology Licensing, Llc | Fine-grained real-time pre-emption of codelets based on runtime threshold |
WO2024097964A1 (en) * | 2022-11-04 | 2024-05-10 | Delany Group, Llc | System and methods for automated api determination, generation, and integration |
Family Cites Families (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6742175B1 (en) * | 1998-10-13 | 2004-05-25 | Codagen Technologies Corp. | Component-based source code generator |
US8161081B2 (en) | 2001-03-16 | 2012-04-17 | Michael Philip Kaufman | System and method for generating automatic user interface for arbitrarily complex or large databases |
US7392504B2 (en) * | 2002-06-06 | 2008-06-24 | International Business Machines Corporation | System and method for automated source code generation |
US7725460B2 (en) * | 2003-12-08 | 2010-05-25 | Ebay Inc. | Method and system for a transparent application of multiple queries across multiple data sources |
US20050160104A1 (en) * | 2004-01-20 | 2005-07-21 | Datasource, Inc. | System and method for generating and deploying a software application |
US7974825B2 (en) | 2004-09-20 | 2011-07-05 | The Mathworks, Inc. | Generation of code from a graphical model |
WO2006043012A1 (en) | 2004-10-22 | 2006-04-27 | New Technology/Enterprise Limited | Data processing system and method |
US8983823B1 (en) | 2005-12-29 | 2015-03-17 | The Mathworks, Inc. | Verification harness for automatically generating a text-based representation of a graphical model |
US7934193B2 (en) * | 2006-04-11 | 2011-04-26 | Rojer Alan S | Processing a module specification to produce a module definition |
US8448132B2 (en) * | 2009-05-07 | 2013-05-21 | Sap Ag | Systems and methods for modifying code generation templates |
US8756489B2 (en) | 2009-09-17 | 2014-06-17 | Adobe Systems Incorporated | Method and system for dynamic assembly of form fragments |
US20110088011A1 (en) | 2009-10-14 | 2011-04-14 | Vermeg Sarl | Automated Enterprise Software Development |
EP2383684A1 (en) * | 2010-04-30 | 2011-11-02 | Fujitsu Limited | Method and device for generating an ontology document |
US9535663B2 (en) * | 2010-09-17 | 2017-01-03 | Oracle International Corporation | Pattern-based construction and extension of enterprise applications in a cloud computing environment |
US8515999B2 (en) * | 2011-09-29 | 2013-08-20 | International Business Machines Corporation | Method and system providing document semantic validation and reporting of schema violations |
US20130271476A1 (en) * | 2012-04-17 | 2013-10-17 | Gamesalad, Inc. | Methods and Systems Related to Template Code Generator |
US9043750B2 (en) * | 2012-10-09 | 2015-05-26 | Sap Se | Automated generation of two-tier mobile applications |
US9880817B2 (en) * | 2013-03-19 | 2018-01-30 | Brooks Automation, Inc. | Tool compiler |
US9940104B2 (en) * | 2013-06-11 | 2018-04-10 | Microsoft Technology Licensing, Llc. | Automatic source code generation |
US10078501B2 (en) | 2015-03-16 | 2018-09-18 | Microsoft Technology Licensing, Llc | Domain specific language modeling framework in a development environment |
US10318251B1 (en) | 2016-01-11 | 2019-06-11 | Altair Engineering, Inc. | Code generation and simulation for graphical programming |
US10048946B2 (en) | 2016-03-24 | 2018-08-14 | Microsoft Technology Licensing, Llc | Converting visual diagrams into code |
US10216494B2 (en) * | 2016-12-03 | 2019-02-26 | Thomas STACHURA | Spreadsheet-based software application development |
US10540153B2 (en) * | 2016-12-03 | 2020-01-21 | Thomas STACHURA | Spreadsheet-based software application development |
-
2020
- 2020-06-26 US US16/914,193 patent/US10942709B2/en active Active
- 2020-06-30 CN CN202080041963.XA patent/CN113950664A/zh active Pending
- 2020-06-30 AU AU2020298459A patent/AU2020298459A1/en not_active Abandoned
- 2020-06-30 EP EP20835423.3A patent/EP3867745A4/en not_active Withdrawn
- 2020-06-30 CA CA3128237A patent/CA3128237A1/en active Pending
- 2020-06-30 JP JP2021550124A patent/JP2022537868A/ja active Pending
- 2020-06-30 WO PCT/US2020/040297 patent/WO2021003155A1/en active Application Filing
-
2021
- 2021-02-24 US US17/184,581 patent/US11693629B2/en active Active
- 2021-08-06 US US17/396,300 patent/US20210365243A1/en not_active Abandoned
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115567302A (zh) * | 2022-09-28 | 2023-01-03 | 建信金融科技有限责任公司 | Ssh数据传输装置、方法、设备及存储介质 |
CN115567302B (zh) * | 2022-09-28 | 2024-07-12 | 建信金融科技有限责任公司 | Ssh数据传输装置、方法、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
JP2022537868A (ja) | 2022-08-31 |
WO2021003155A1 (en) | 2021-01-07 |
US11693629B2 (en) | 2023-07-04 |
EP3867745A4 (en) | 2022-08-03 |
AU2020298459A1 (en) | 2021-03-11 |
CA3128237A1 (en) | 2021-01-07 |
US10942709B2 (en) | 2021-03-09 |
EP3867745A1 (en) | 2021-08-25 |
US20210365243A1 (en) | 2021-11-25 |
US20210182029A1 (en) | 2021-06-17 |
US20210004209A1 (en) | 2021-01-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11693629B2 (en) | Hyperpiler | |
Marketakis et al. | X3ML mapping framework for information integration in cultural heritage and beyond | |
US7185317B2 (en) | Logical data modeling and integrated application framework | |
US11409521B2 (en) | Hyperpiler | |
CN113157723B (zh) | 一种面向Hyperledger Fabric的SQL访问方法 | |
US20150261507A1 (en) | Validating sql queries in a report | |
US20240370452A1 (en) | Architecture for data map converters | |
US11301243B2 (en) | Bidirectional evaluation for general—purpose programming | |
Gaspar et al. | Mastering Flask Web Development: Build Enterprise-grade, Scalable Python Web Applications | |
Lyon | Full stack GraphQL applications: with React, Node. js, and Neo4j | |
Roldán | React Design Patterns and Best Practices: Design, build and deploy production-ready web applications using standard industry practices | |
Roldan | React 17 Design Patterns and Best Practices: Design, build, and deploy production-ready web applications using industry-standard practices | |
Crichton et al. | A core calculus for documents: Or, lambda: The ultimate document | |
Shatnawi et al. | Encoding feature models using mainstream json technologies | |
Gupta | Building web applications with Python and Neo4j | |
Zdun et al. | Content conversion and generation on the web: A pattern language | |
Joshi | Beginning XML with C# 7: XML Processing and Data Access for C# Developers | |
US12079216B2 (en) | Systems and methods for querying and performing operations on data using predicate logic extended to include quotation | |
Sommerfeld | Unlock PHP 8: From Basic to Advanced: The next-level PHP 8 guide for dynamic web development (English Edition) | |
Lewis | Rails Crash Course: A No-nonsense Guide to Rails Development | |
Singh | Creating Adaptive GraphQL Client for Github Repo Analysis Using Scala Macros | |
Shatnawi | Constructing and Validating Feature Models Using Relational, Document, and Graph Databases | |
Bressoud et al. | File Systems and File Processing | |
Valerhaugen | Working with Generic GML through Schema Analysis | |
Tribolet | Development of CMS-based Web Applications with a Multi-Language Model-Driven Approach |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |