人工智能自动代码生成1---前言

代码自动生成技术的历史非常长,人们采用过各种代码自动生成系统,取得了程度不同的成功。例如各种IDE中的Wizard,可以视为被动式代码生成的成功例子,目前还在各种IDE中广泛存在。在诸如PHP、Python的Web开发中,大量使用的模板技术,如Smarty和Mako,也可以视作主动代码生成的一个成功案例。目前在很多大公司内部,也都或多或少的应用了代码自动生成技术。

但是这些成功应用的实例,虽然在各自领域取得了不俗的成绩,但是距离人们希望利用代码自动生成,取代人工编程的希望相差甚远。

近年来,随着深度学习和人工智能的崛起,是不是能够利用这些最新的技术,实现自动代码生成呢?在这一点上,研究者们还真没闲着,推出了各种模型,多数是利用递归神经网络(RNN)或长短时记忆网络(LSTM),通过学习现有代码,然后生成新的代码段,有些模型甚至可以根据人工给出的核心代码,扩充成完整的代码。但是这里生成的代码只是像代码而已,是完全没有意义的代码,只是为生成代码而生成代码,对实际应用来说没有什么实际意义。最近比较流行的Neural Programmer似乎进了一步,可以通过RNN或LSTM来理解人们的需求,生成正确的SQL语句。再有就是前一段时间报道过的DeepCoder,利用梯度学习算法来做代码生成工作。

但是个人觉得,这些方法虽然在学术上很有价值,但是离实际应用还有很长的距离。以现在比较流行的利用深度学习算法进行代码生成为例,其还是将代码生成过程当成一个黑盒子,通过大量例子的学习,来使网络具有一定的“编码”能力,实际上是生成式网络的一种应用。

其实代码生成,以人类的程序员为例,基本是基于规则的创造性过程,目前这些基于连接主义的自动编程系统,由于将代码生成过程视为一个黑盒子,就忽视了编程过程中的各种规则,让网络去随机探索,在所有程序组成的空间中,找出适合的程序,效率太低了。

综上所述,代码自动生成,还是应该走与当前流行的连接主义不同的思路,我们应该大力借鉴的是早前曾经流行过的符号主义思维模式。当前在实际中得到广泛应用的代码生成技术,应该是基于模板的代码生成技术。

例如在Python中,代码生成用的最多的技术就是进jinja2,这是一种基于模板的代码生成技术,最主要的应用场景是在Web应用开发中,程序员通过Jinja2语法,将表达式、逻辑控制等嵌入到HTML文件中,形成模板文件,在程序运行时,系统会自动求出表达式的值,执行逻辑控制代码,从而动态生成HTML页面内容。

我在这个系列的博文中,就是想向大家展示一下,通过利用Jinja2技术,再辅以一定的人工智能技术,可以完整的生成一个管理信息系统。我们将以Java8为主要开发语言,采用PWA开发技术,做类似于单页面应用(SPA)。具体应用场景,我们选择的是急诊分诊系统。之所以选择急诊分诊系统,主要是由于医疗信息化项目,通常业务逻辑异常复杂,以这样的例子作为试金石,可以验证我们的代码生成技术是否具有实用价值。

下面来讨论一下我们的指导原则。首先,我们在这里不准备采用ORM映射技术,也不准备太强调分层技术。采用分层技术,一个重要原因就是让具有不同技能的人员,组成一个代码流水线形式来进行工作,提高工作效率,同时ORM映射是解决程序员只懂OO不懂关系型数据库的问题。而我们这里是自动生成代码,从表现层到业务逻辑层都由程序实现,因此没有必要按照技能的不同来分层,完全应该按照更加自然的方式来分层。其次,我们不会太强调设计模式和可维护性。因为我们是自动代码生成,生成过程往往以秒计,多数设计模式还是以人工写代码为指导思想,通过设计模式,模块间松籍合,来达到减轻代码不一致性和维护的难度,但是在代码自动生成中,如果有更改需要,重新生成一遍代码即可,即使有成千上万处同样的代码,也会准确无误地进行更新,因此代码简洁性的重要性将大大提高,而复杂的结构却往往处于不利的地位。最后,我们将非常重视单元和功能测试,尽量将其自动化,使得回归测试变得简单可行,这样我们如果对代码生成引擎进行了修改,我们可以运行一下回归测试,如果没有问题,则证明我们的修改是正确的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值