你创建你自己的代码生成器?(Do you create your own code generato

2019-06-26 01:15发布

程序员修炼提倡使用的代码生成器。 你对你的项目创建代码生成器? 如果是的话,你怎么使用它们?

Answer 1:

如果没有正确的论证广泛使用的代码生成使代码难以理解和降低可维护性(顺便说一下使用动态SQL一样)。 就个人而言,我使用它的一些ORM工具,因为在这里他们的使用主要是明显的,有时对于像搜索解析器算法和没有设计grammatic分析仪维持“用手”最近。 干杯。



Answer 2:

在“程序员修炼”亨特和托马斯无源和有源代码生成器区分。

被动式发电机运行一次,之后您编辑的结果。

主动发电机任意经常地运行,因为它会被替换,你永远不应该修改的结果。

IMO,后者是更有价值,因为他们的做法DRY(不 - 重复自己动手)的原则。

如果输入信息到您的程序可以被分成两个部分,即改变很少(A)(象元数据或DSL)的一部分,并且在每次程序运行时间(B)(实时输入),其是不同的部,你可以写一个生成程序,只需要输入,并写出一个特设的程序,只需要B中的输入。 (对于此的另一个名称是部分评价。)

生成器程序是简单,因为它只有通过输入A涉水,而不是A和B.此外,它并不一定要快,因为它是不经常运行,并且它不必在乎内存泄漏。

特设程序比较快,因为它没有通过输入几乎是始终不变的(A)涉水。 这是简单,因为它只有做出关于输入B,不是A和B的决定

这对生成的临时方案是相当可读的一个好主意,这样你就可以更容易地找到它的任何错误。 一旦你从发电机删除这些错误,他们已经一去不复返了。

在一个项目中我的工作,一个团队设计出来,设计规范两英寸厚和冗长的实施时间表,充满了对性能的担忧复杂的数据库应用程序。 通过编写代码生成器,两个人做的工作在三个月内,源代码清单(在C)大约半英寸厚,而生成的代码是如此之快,不再是一个问题。 特设程序每周再生,在琐碎的成本。

如此活跃的代码生成你可以使用它 ,是一个双赢的 。 而且,我认为这不是偶然的,这正是编译器做的。



Answer 3:

在硬件设计上,这是相当普遍的做法在“堆”的几个层次来做到这一点。 例如,我写了一个码发生器发出的Verilog为各种宽度,拓扑和DMA引擎和交叉开关的结构中,因为表达这种参数化所需的构建体尚未在合成成熟和仿真工具流动。

这也是常规发出逻辑模型一路下跌到布局数据可以表示和算法生成的,如SRAM,高速缓存非常规律性的东西,并注册文件结构。

我还花时间写,基本上,一个代码生成的公平位,将采取一个系统级芯片所有寄存器的XML描述,并发出HTML(是的,是的,我知道XSLT,我刚发现发射它编程为多个时有效),Verilog的,SystemVerilog的,C,组装等,其数据不同的团队(前端和后端ASIC设计,固件,文档等)的使用的“视图”(和让他们凭借这个单一XML“代码库”)是一致的。 这是否算?

人们还喜欢写代码生成器如采取简洁的描述很常见的事情,比如有限状态机和机械输出更详细的命令式语言代码有效地实现它们(如转换表和遍历代码)。



Answer 4:

我们使用代码生成器生成的数据实体类,数据库对象(如触发器,存储的特效),服务代理等任何你看到很多repititive代码以下涉及手工工作模式和很多,代码生成器可以提供帮助。 但是,你不应该用太多的延长该可维护性是一种痛苦。 如果你想重新生成它们的一些问题也会出现。

像Visual Studio工具,CodeSmith中有大部分的共同任务自己的模板,使这个过程更容易。 但是,很容易推出你自己。



Answer 5:

它往往是创建一个代码生成器,从规范生成代码有用的 - 通常是一个有规则的表格的规则。 它减少了经由一个错字或遗漏引入错误的机会。



Answer 6:

是的,我发展我自己的代码生成器,AAA协议的直径(RFC 3588)。 它可以产生直径的消息与所描述的直径应用程序的语法的XML文件中读取结构和API。

这大大降低开发完整的直径接口(如SH / CX / RO等)的时间。



Answer 7:

在我看来,一个良好的编程语言,不需要代码生成器,因为反省和运行时代码生成是语言如Python中的元类和新模块等的一部分



Answer 8:

代码生成器通常会产生在长期使用更难以管理的代码。

但是,如果它是绝对必要使用一个代码生成器(日食VE挥杆发展是我有时使用),然后确保你知道正在发生什么样的代码。 相信我,你不会想代码在你的应用程序,你不熟悉。



Answer 9:

写自己的发电机项目效率不高。 相反,使用一台发电机,如T4,CodeSmith中和Zontroy。

T4是比较复杂的,你需要知道.NET编程语言。 你必须写一行模板线,你必须对自己完成数据的关系操作。 你可以用它在Visual Studio中。

CodeSmith的是一种功能性的工具,并有大量的模板就可以使用。 它是基于T4和编写自己的temlate需要,因为它是在T4太多时间。 有一个试验和商业版本。

Zontroy是一个用户友好的用户界面的新工具。 它有自己的模板语言,简单易学。 有一个在线模板市场,它正在开发。 甚至你可以提供的模板,并在网上销售他们交给市场。 它有一个免费版和商业版。 即使是免费版本就足以完成一个中等规模的项目。



Answer 10:

可能有很多的代码生成在那里,但我总是创造我自己的,使代码更易于理解和适应,我们正在使用的框架和准则



Answer 11:

我们用发电机为所有新的代码,以帮助确保编码标准得到遵守。

我们最近更换公司内部的C ++发生器CodeSmith中 。 我们还是要创建工具模板,但似乎理想不必维护工具自己。



Answer 12:

我最近的一个发电机需要的是,读取硬盘数据,并最终它发布到“仪表盘” UI的项目。 在中间的是车型,性能,主持人,事件,接口,旗帜等几个数据点。 我整理了一下框架,一对夫妇的数据点,直到我感到满意的是我可以设计生活。 然后,用一些精心放置的意见的帮助下,我把“一代”在Visual Studio中的宏,调整和清理宏,增加了数据点的功能,在宏调用代 - 并保存着几个乏味小时(天?) 到底。

不要小看宏的力量 :)


我现在还想把我的头周围的CodeRush定制功能,以帮助我做一些更多的本地发电的要求。 有一个在那里,如果你生成一个代码块时,需要在即时决策强大的东西。



Answer 13:

我有我自己的代码生成器,我运行针对SQL表。 它生成的SQL程序,以访问数据,数据访问层和业务逻辑。 它在规范我的代码和命名约定了奇迹。 因为它需要在数据库表(如id列和更新的日期时间列)某些领域,也有助于我的标准化数据设计。



Answer 14:

有多少人,你找什么? 我创建了两个主要的和众多次要的。 第一个主要的的让我产生程序1500个程序(给予或采取),其有强烈的家族相似性,但都尝出不同数据库中的表 - 要做到这一点快速,可靠地。

代码生成器的缺点是,如果有一个在生成的代码中的错误(因为模板包含一个bug),然后有很多固定要做的。

然而,对于语言或系统中有很多近乎重复编码的工作要做,一个良好的(足够的)代码生成器是一个福音(更是一个福音的比“加密狗”)。



Answer 15:

是的,我已经不得不维持几个。 CORBA或接口的其他对象的沟通风格可能是我首先想到的一般事情。 你必须通过接口提供给您的对象定义你要谈论过去,但你还是要建立这些对象了代码。 建立和运行一个代码生成器是这样做的相当常规的方式。 这可以成为一个相当漫长的编译只是为了支持一些传统的通信信道,并且因为是把包装器CORBA,使其更简单一个大趋势,以及事情就变得更糟。

一般来说,如果你有大量的结构,或只是你需要使用快速变化的结构,但是建筑对象通过元数据,那么你进入编写代码生成器,你不能处理的性能损失。



Answer 16:

我不认为我们需要从头开始创建我们自己的代码生成的任何项目,但在这里我们使用已有的发电机有以下几种。 (我在Java中使用两个ANTLR的和Eclipse建模框架建筑解析器和模式的企业软件。)使用一个代码生成别人写的美妙之处在于,作者往往是在这方面的专家,并已解决的问题我不知道还存在。 这为我节省了时间和挫折。

所以,即使我也许可以写在手解决问题的代码,我可以快了很多生成代码,并有一个很好的机会,这将是比任何我写的马车少。



Answer 17:

如果你不打算写的代码,你会很舒服别人的生成代码?

它是在这两个时间更便宜,在$$$从长远来看,编写自己的代码或代码生成?

我在DTD或模式合规的方式写了一个代码生成器,将建立的类(JAVA)100的是将输出XML数据从数据库中。 代码生成通常是一次性的事情,该代码然后将各种业务规则等的输出是一个相当迂腐银行smartened起来。



Answer 18:

代码生成器的工作,周围的编程语言的限制。 我个人比较喜欢思考,而不是代码生成器,但我同意,代码生成更加灵活,运行时明显快生成的代码。 我希望,C#的未来版本将包括某种形式的DSL环境。



Answer 19:

我使用的唯一的代码生成器是Web服务的解析器。 我个人从,因为新员工或手离开后,一个单独的团队维护问题的代码生成望而却步。



Answer 20:

我写我自己的代码生成器,主要是在T-SQL,这是在生成过程中调用。

基于元数据模型,它们所产生的触发器,日志记录,C#const声明,INSERT / UPDATE语句,数据模型信息,检查应用程序是否在预期的数据库架构上运行。

我仍然需要编写提高生产力,更规范,少一个编码形式产生;)



Answer 21:

我已经创建了一些代码生成器。 我对其中使用的模板SQL存储过程的被动的代码生成器。 这产生产生90%的我们的存储过程。

由于我们切换到了实体框架我创建使用T4(主动codegenerator 文本模板转换工具包 )在Visual Studio中。 我用它来为我们的实体创建基本的仓库部分类。 作品非常漂亮,节省了一堆编码。 我也使用T4为具有特定属性的装饰实体类。



Answer 22:

我使用所提供的代码生成功能EMF - Eclipse建模框架 。



Answer 23:

从一种格式映射到另一个时,代码生成器在很多情况下非常有用,尤其是。 我已经做了代码生成IDL到C ++,数据库表OO类型和编组代码只是仅举几例。

我认为,作者试图让一点是,如果你是一个开发人员,你应该能够使计算机为您工作。 生成代码只是一个显而易见的任务实现自动化。

我曾经与谁坚持认为他会做手工我们的IDL到C ++映射一个人的工作。 在项目的开始阶段,他能够跟上,因为我们其余的人试图找出该怎么做,但他最终成为了一个瓶颈。 我做在Perl代码生成器,然后我们就可以非常做自己的“作品”,在几分钟的时间。



Answer 24:

请参见我们的“通用”代码生成基于程序变换。

我是建筑师,一个关键的执行者。 值得注意的是,这种发生器的显著分数,使用该发生器产生。



Answer 25:

在嵌入式系统中,有时你需要在闪存二进制数据的大块。 例如,我有一个取的文本文件包含位图字体的字形并将其变为一个.CC / h文件对声明有趣常数(如第一个字符,最后一个字符,字符宽度和高度),然后将实际数据作为一个大的static const uint8_t[]

试图做这样的事情在C ++本身,所以在编译的字体数据会自动生成一个没有第一遍,将是一个痛苦和最有可能难以辨认。 手写.o文件是出了问题。 所以打破了方格纸,手工编码的二进制,并键入一切英寸

恕我直言,这种事情是什么代码生成器对。 永远不要忘记,电脑为你工作,而不是周围的其他方式。

顺便说一句,如果你使用一台发电机, 始终始终始终包括一些线路如这在开始和每个生成的文件的末尾两个:

// This code was automatically generated from Font_foo.txt. DO NOT EDIT THIS FILE.
// If there's a bug, fix the font text file or the generator program, not this file.


Answer 26:

我们使用Telosys代码生成器在我们的项目: http://www.telosys.org/

我们已经创造了它,以减少类似CRUD屏幕,文档等任务复发开发时间...

对我们来说,最重要的是要能够自定义生成的模板,以便在必要时创建新一代的目标和定制现有的模板。 这就是为什么我们还创建了一个模板编辑器(速度.vm文件)。 它工作正常的Java /春/ AngularJS代码生成器,并且可以适应于其他目标(PHP,C#,Python和等)



文章来源: Do you create your own code generators?