低代码核心:代码生成还是模型解释?

news2024/11/15 18:37:07

2020年第一届低代码研讨会上, Jordi Cabot发表了一篇文章(或者说观点),对比了低代码和模型驱动开发的关系,认为低代码等于模型驱动开发。但实际上,不少低代码系统并不是使用模型驱动的,而是采用另一个策略,即代码生成。那这两者区别是什么,各有什么优势, 本文会详细介绍。

关于代码生成和模型解释

在模型驱动开发中,代码生成用于从更高级别的模型生成代码,以创建可运行的应用程序。让我们考虑下面这个使用领域特定语言(Domain-Specific Language, DSL)创建的领域模型:

Customer {
    Name: String;
    Address: String;
}

如果我们想为这个小模型生成Java代码,我们可以使用模板引擎。模板包含Java代码和一些Token,这些Token将根据模型来填充。例如,我们可以为域模型中的每个实体使用模板。模板代表一个Java类,实体的名称作为类名(例如客户)。对于每个属性,将生成一个私有字段。

在模型解释的情况下,我们不会通过生成代码的方式来从模型中创建一个可运行软件应用程序。在模型解释中,我们会使用一个(比如)Java实现的通用引擎用,模型直接由这个引擎来解释。例如,这个通用的Java程序中包含一个带有属性name的类Entity和一个包含该实体属性(name-value对)的hashmap。在这种情况下,客户实体不是由Java类表示的,而是由一个带有属性名称的Entity对象表示的,该属性name的值是Customer。这些实体对象是根据模型中的信息创建的。

代码生成和模型解释都在实践中使用。让我们来看看这些方法相互比较的优势。

代码生成的优势

与模型解释相比,代码生成具有以下优点:

  • 它保护你的知识产权:通过代码生成,你可以为特定的客户端生成一个应用程序。当使用模型解释时,你必须给把整个运行时引擎给客户,这样才能实现整个应用。例如,如果要构建一个网站,你可以把运行网站所需的所有代码给到客户即可。而如果使用解释器,你必须给他们整个系统来解释任何可以用你的DSL描述的网络应用。当您的产品有大量客户的时候,这一点尤其重要。
  • 它可以适应您的客户架构:当使用模型解释时,您必须按照自己选择的架构实现解释器。在代码生成的情况下,您可以根据客户的要求来生成代码。
  • 生成的实现更容易理解:您可以查看生成的代码并直接理解应用程序的行为。在模型解释的情况下,您必须理解解释器的通用实现和模型的语义。
  • 容易上手:如果您已经手工构建了一个应用程序,您可以开始使用代码生成,方法是将现有代码转换为模板,并用token替换部分代码,token将被模型信息替换。如果您为同一个领域构建了多个应用程序(例如,为不同的客户),您可以开始分析这些应用程序。静态代码(即所有应用程序的代码都是相同的)可以放在域框架中,只需要生成可变代码即可(即您需要创建域特定语言来建模可变性)。
  • 它更容易迭代:正如前面所解释的,您可以通过将现有代码转换为代码生成模板来开始使用代码生成。当然,您可以通过迭代的方式做到这一点。首先,您只生成代码的一部分,其他部分将手动实现,稍后,您可以扩展代码生成器以生成代码的更多部分。您的DSL也是如此。起初,它可以是初级的,以反映将要生成的代码。以后,您可以通过提高抽象级别来提升领域专业能力。
  • 编译器为它提供了的附加的检查能力:当您生成代码时,需要编译该代码。这个编译步骤是一个附加的检查,因为编译器将检查生成的代码是否有错误。如果有解释器,您需要在模型解释期间自己进行这些检查,或者您需要在建模环境和解释器之间创建一个紧耦合。
  • 调试生成器本身比调试解释器更容易:如果您需要调试解释器,则始终需要条件断点,因为解释器代码是通用的。
  • 模板的变化更容易跟踪:代码生成模板只是文本文件,因此变化很容易跟踪(例如通过使用版本控制系统)。解释器代码的变化也是如此,但是,这段代码是通用的不容易搞清楚到底发生了什么变化。

模型解释的优点

与代码生成相比,模型解释具有以下优点:

  • 它支持快速变更:模型中的更改不需要再次代码生成、编译、测试和重新部署。这将缩短上线时间。
  • 它支持在运行时进行更改:因为模型在运行时可用,所以甚至可以在不停止运行应用程序的情况下更改模型。
  • 更容易移植:解释器原则上创建一个独立于平台的目标来执行模型。创建一个运行在多个平台(例如多个操作系统、多个云平台)上的解释器很容易。在代码生成的情况下,您需要确保您生成的代码符合平台要求。在模型解释的情况下,解释器是一个黑匣子,只要它能在目标平台上运行,如何实现并不重要。
  • 更容易部署:当使用代码生成时,您经常会看到您需要在Eclipse或Visual Studio中打开生成的代码,并构建它来创建最终的应用程序。在模型解释的情况下,您只需启动解释器并将模型放入其中。代码不再是必要的了。因此,对领域专家来说, 部署和运行应用程序比仅仅建模要容易得多。
  • 更容易升级和缩放:更改解释器并用相同的模型重新启动它更容易。您不必使用更新的生成器再次生成代码。缩放也是如此:缩放应用程序意味着初始化解释器的更多实例,执行相同的模型。尤其是在云环境中,这可以给你带来优势。
  • 它更安全:例如,在云平台上,你只需要上传你的模型,就不需要访问文件系统或其他系统资源。只有解释器中的代码可以访问系统库。解释器在基础设施之上提供了一个额外的层,下面的一切都被抽象掉了。这本质上是平台即服务(PaaS)的想法。
  • 它比代码生成更灵活:基于模板的代码生成是有限制的。在这种情况下,您将需要帮助文件来扩展基于模板的代码生成的可能性。在这种情况下,解释器可能不那么复杂,通常需要更少的代码来完成相同的结果。
  • 在运行时调试模型:虽然模型在运行时可用,但可以通过在运行时遍历模型来调试模型(也就是说,您可以在模型上添加断点)。这仅适用于操作语言,而不适用于声明性语言(在那里您需要静态分析)。当可以在模型级别调试时,域专家可以调试自己的模型,并根据此调试调整应用程序的功能行为。这在使用复杂的过程或状态模型时非常有帮助。

结论

比较这两种方法的优势,我们可以得出结论,最终这完全取决于构建和/或使用模型驱动软件工厂的人员的领域、用例和技能集(或舒适性)。

当我们讨论代码生成和模型解释之间的区别时,很快就会带来更多的问题:代码生成和模型解释之间有什么区别?这两种方法之间的界限是什么?如果我们在生成代码时有一个内存文件系统呢?如果我们通过编译模型的一部分来优化我们的解释器呢?如果解释器为浏览器生成数据库结构和网络内容呢?

好了,今天的文章分享到这就结束了,要是喜欢的朋友,请点个关注哦!--我是简搭(jabdp),我为自己“带盐”,感谢大家关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node的express模块

express的概述: express是一个提供web服务的框架(内置http模块),他简化了http的相关内容,将对应的内容封装为了特定的方法 安装: npm i express -S 导入以及代码: //导入express 是一个函数 const expressrequire(express) //cre…

做机器人开发,你一定绕不开的模块!

Allspark 机载电脑 Allspark 是阿木实验室为广大AI智能硬件开发者打造的一款微型边缘计算机。在设计之初就定义了尺寸小巧、重量轻、算力强、可靠、扩展性高的特点。Allspark机身采用铝合金新材料外壳设计,内置静音散热风扇,尺寸94mm*59mm*37mm&#xff…

[附源码]java毕业设计警院学生学习交流系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Linux进程常见通信方式

文章目录1、管道<1>匿名管道<2> 命名管道2、共享内存3、信号量为什么要进程要进行通信呢&#xff1f; 进程间可能存在特定的协同工作的场景&#xff0c;这个时候就需要一个进程把自己的数据交付给另一个进程&#xff0c;让其进行处理。 进程通信的本质 因为进程具有…

OAuth2.o的授权码模式为什么要用code获取token?

授权码模式&#xff08;Authorization Code&#xff09;是 OAuth 功能最齐全、流程最严谨&#xff0c;也是最常用的授权模式。 假设我们要用微信账号登录网易云音乐&#xff0c;需要以下五步&#xff1a; 访问网易云音乐客户端&#xff0c;客户端跳转到微信授权页面&#xff…

神经网络初体验

文章目录前言相关概念BP神经网络具体过程正馈反向传播总结前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联系后即刻更改 科普&#xff1a; 参考博客:《老饼讲解神经网络》 相关概念 神经网络 模仿人的神经网络构建出来的数学模型 是人工智能的一个主力算法 神经…

STM32 BSRR BRR ODR 寄存器解析(F4系列已经去掉BRR寄存器了)

STM32 BSRR BRR ODR 寄存器解析&#xff08;F4系列已经去掉BRR寄存器了&#xff09;一、用法二、解释三、BSRR、BRR、 ODR 之间的关系G0x0系列GPIO寄存器 F4系列GPIO寄存器&#xff08;没有BRR寄存器了&#xff09; 一、用法 经常会看到类似如下的宏定义语句&#xff0c;用…

tomcat出现中文乱码原因和解决办法(简单快捷易懂)

一、遇到问题 双击打开tomcat中的bin目录下的startup.bat会出现乱码问题 或者cmd里面打开也是乱码的问题 二、出现这个问题的原因 这是因为windows下的默认编码是GBK编码&#xff0c;tomcat默认编码是UTF-8编码 解决思路&#xff1a;那就把tomacat的默认编码改为和windows下…

HTML5-框架-计算机应用2115-2022年11月17日13:57:13

目录 HTML栅格化布局框架 2、demo演示 栅格化理论&#xff1a; 栅格化系统&#xff1a; 网页栅格化&#xff1a; 重点掌握内容&#xff1a; 练习目标: HTML栅格化布局框架 1、将整个HTML浏览器的宽度设为单位1&#xff0c;那么为了操作栅格化方便&#xff0c;我们拆分…

最简单的java工具(JDK+IDEA)安装教程

一、安装包的准备 安装 java 开发者工具的话&#xff0c;分为 JDK IDEA 的安装&#xff0c;网上有很多版本是需要手动配置环境变量的&#xff0c;对大多数新手朋友来说&#xff0c;并不是很友好,下面我分享一种最快捷的安装方法&#xff1a; JDK 官网下载地址&#xff1a;htt…

服务器——SSL/TLS协议信息泄露漏洞(CVE-2016-2183)修复办法

前言&#xff1a;近期某台Windows Server服务器的远程连接端口(3389)被扫出了SSL/TLS协议信息泄露漏洞(CVE-2016-2183),尝试了网上很多复制来复制去的"解决方法",直接导致堡垒机连不上服务器,每次连不上服务器又得去找服务器提供方,真的非常麻烦,在此不得不吐槽一下某…

anaconda+pytorch安装+pycharm环境配置

首先安装anaconda 网址&#xff1a;Anaconda Installers and Packages 我根据需要选择最新的windows-x86版&#xff0c;其他根据需要选择windows和linux,mac系统版本 安装正常安装&#xff0c;安装路径要记住&#xff0c;没有没配置环境变量要用到&#xff0c;安装后运行如果…

字节三面“凉凉”了,面试题与细节回顾,Java程序员的我太难了

面试字节&#xff0c;目前还记得一些细节&#xff0c;暂时先写一篇面经回顾一下吧~文末会有面试资料分享 字节跳动一面 HashTable、Hashmap. Hashtree的区别线程池相关,线程池的流程&#xff0c;参数线程池alivetime存活时间怎么控制cas讲一下redis讲-下,项目里怎么用redis的分…

Linux实用操作-----软件的安装

教程推荐&#xff1a;Linux零基础快速入门到精通 1、Linux系统的应用商店 操作系统安装软件有许多种方式&#xff0c;一般分为&#xff1a; •下载安装包自行安装 •如win系统使用exe文件、msi文件等 •如mac系统使用dmg文件、pkg文件等 •系统的应用商店内安装 •如win…

图算法介绍

为什么要用图算法 图算法有助于我们理解关联数据。理解网络及其内部联系可以为洞察和创新提供不可思议的潜力。 图算法特别适用于理解结构和揭示高度关联的数据集中模式。目前&#xff0c;大数据汇集、混合和动态更新的需求非常强烈&#xff0c;图算法有助于体现数据的关联性…

树结构的实际应用

堆排序 堆排序的介绍 堆排序利用堆这中数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它是不稳定排序堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其它左右孩子节点的值,称为大顶堆,注意:没有要求节点的左孩子和右…

苹果电脑的文件怎么复制到移动硬盘,macbook文件怎么拷贝到移动硬盘

如果我们使用的是Mac电脑&#xff0c;刚好需要将一些文件从Mac复制到NTFS外置硬盘&#xff0c;那么&#xff0c;苹果电脑的文件怎么复制到移动硬盘&#xff1f; 一、如何将文件从Mac电脑上复制到NTFS外置硬盘&#xff1f; 我可以在Mac上正常使用NTFS外置硬盘吗&#xff1f;很多…

Linux【搭建环境与基本指令】

Linux【搭建环境与基本指令】&#x1f34e;一.Linux搭建环境&#x1f352;1.1什么是Linux&#x1f349;1.1.1Linux介绍&#x1f349;1.1.2CentOS 和 RedHat 的关系&#x1f349;1.1.3在Java中应用到Linux的方面&#x1f352;1.2XShell的安装与使用&#x1f349;1.2.1XShell的安…

定时器的使用和线程安全

在linux下如果对定时要求不太精确的话&#xff0c;使用alarm()和signal()就行了&#xff1b; 但是如果想要实现精度较高的定时功能的话&#xff0c;就要使用setitimer函数。 核心api&#xff1a; int setitimer(int which, const struct itimerval *value, struct itimerval *…

【李宏毅】机器学习-RNN

RNN(Recurrent Neural Network) 为什么需要RNN呢&#xff1f; 举例来说&#xff0c;有一个任务需要识别每个单词代表的含义。在下面的句子中&#xff0c;taipei分别表示目的地和出发地&#xff0c;我们希望神经网络能够在不同的句子中&#xff0c;识别出不同的语义&#xff0c;…