2008-09-22 68 views

回答

8

如果代码生成器在没有正确的论证的情况下被广泛使用,那么代码就不那么容易理解,并且降低了可维护性(与动态SQL相同)。就我个人而言,我将它与一些ORM工具一起使用,因为它们在这里的用法大多很明显,有时用于像搜索器 - 解析器算法和语法分析器这样的事情,这些算法和语法分析器最近不是“手动”维护的。干杯。

7

我们使用代码生成器来生成数据实体类,数据库对象(如触发器,存储过程),服务代理等等。任何地方你都会看到很多复制代码遵循一个模式并涉及很多手动工作,所以代码生成器可以提供帮助。但是,你不应该使用它太多,可维护性是一个痛苦。如果您想重新生成它们,也会出现一些问题。

像Visual Studio,Codesmith这样的工具对于大多数常见任务都有自己的模板,并且使这个过程更容易。但是,您可以轻松地自行推出。

10

在硬件设计中,在'堆栈'的几个层次上执行此操作是相当普遍的做法。例如,我写了一个代码生成器来发出各种宽度,拓扑结构和DMA引擎和交叉开关结构的Verilog,因为表达这种参数化所需的结构在合成和仿真工具流程中尚不成熟。

将逻辑模型一直发布到布局数据,这对于可以用算法表示和生成的非常规的东西(如SRAM,高速缓存和寄存器文件结构)来说也是常规操作。

我也花了一段时间编写本质上的代码生成器,它将采用片上系统上所有寄存器的XML描述,并发布HTML(是的,是的,我知道XSLT,我只是发现它在编程上更具时间效率),Verilog,SystemVerilog,C,Assembly等等,为不同团队(前端和后端ASIC设计,固件,文档等)提供了这些数据的“视图”使用(并通过这个单一的XML“代码库”保持它们的一致性)。这算不算?

人们还喜欢为例如编写代码生成器。对有限状态机等常见事物进行简洁的描述,并机械地输出更详细的命令式语言代码来有效地实现它们(例如转换表和遍历代码)。

+4

您不是第一个说过编写代码比使用XSLT更容易的人。 – 2009-07-08 21:40:49

1

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

0

是我不得不保持几个。 CORBA或者其他一些对象通信风格的界面可能是我首先想到的一般东西。你有对象定义,这些对象定义是通过你要交谈的接口提供给你的,但你仍然需要用代码构建这些对象。构建和运行代码生成器是一种相当常规的方式。为了支持一些传统的通信渠道,这可能会变得相当冗长,而且由于围绕CORBA的包装使其变得更简单,所以事情变得更糟。一般来说,如果您有大量结构,或者只是需要使用快速变化的结构,但无法通过元数据处理构建对象的性能问题,那么您就需要编写代码生成器。

1

我们对所有新代码使用生成器来帮助确保遵循编码标准。

我们最近用CodeSmith取代了我们的内部C++生成器。我们仍然需要为该工具创建模板,但似乎不需要自己维护工具。

1

我最近需要一个生成器,它是一个从硬件读取数据并最终将其发布到“仪表板”UI的项目。中间是几个数据点的模型,属性,演示者,事件,接口,标志等。我研究了几个数据点的框架,直到我满意地接受设计。然后,在一些精心设计的评论的帮助下,我把“代”放在一个视觉工作室的宏中,调整并清理宏,将数据点添加到宏中的一个函数中以调用这一代 - 并且节省了几个繁琐的时间?) 到底。

不要小看宏 :)


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

+0

是的,emacs和on-the-fly-lisp代码非常适合推出重复性内容。 – Chris 2008-09-22 05:50:54

+0

同意。当我有严肃的重复代码重写的时候,没有什么能比得上可靠的旧Epsilon宏。 – 2009-01-26 14:06:33

2

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

1

我有我自己的代码生成器,我对SQL表运行。它生成SQL过程来访问数据,数据访问层和业务逻辑。它在标准化我的代码和命名约定方面做得很好。因为它期望数据库表中的某些字段(如id列和更新的datetime列),它也有助于标准化我的数据设计。

0

我想不出任何项目,我们需要从头开始创建自己的代码生成器,但有几个地方我们使用了先前存在的生成器。 (我已经使用Antlr和Eclipse建模框架在Java中为企业软件构建解析器和模型。)使用其他人编写的代码生成器的美妙之处在于作者倾向于成为该领域的专家并解决了问题我甚至不知道它是否存在。这为我节省了时间和挫折。

所以,尽管我可能能够编写解决手头问题的代码,但我可以更快地生成代码,并且很有可能它会比我写的任何东西都少。

2

代码生成器通常会在长期使用中生成更多难以管理的代码。然而,如果绝对必须使用代码生成器(eclipse VE for swing开发是我有时使用的),那么请确保您知道正在生成的代码。相信我,你不希望你的应用程序中的代码不熟悉。

6

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

0

如果你不打算编写代码,你会对其他人生成的代码感到满意吗?

从长远来看,它是否在时间和$$$方面都比较便宜以编写自己的代码或代码生成器?

我在DTD或模式合规的方式写了一个代码生成器,将建立的类(JAVA)100的是将输出XML数据从数据库中。代码生成通常是一次性的,然后代码将随着各种商业规则而变得更加智能化。输出是针对一个相当迂腐的银行。

20

在“语用程序员”亨特和托马斯区分被动和主动代码生成器。

无源发电机运行一次,然后编辑结果。

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

IMO,后者是更有价值,因为他们的做法DRY(不 - 重复自己动手)的原则。 (A)(如元数据或DSL)以及每次程序运行时不同的部分(B)((A))(如元数据或DSL)更改的部分可分为两部分实时输入),您可以编写一个只需要A作为输入的生成器程序,并写出一个仅以B作为输入的特设程序。 (另一个名字是部分评估)

生成器程序比较简单,因为它只需要通过输入A而不是A和B进行操作。而且,它不必经常运行,因为它并不经常运行,而且它不必关心内存泄漏。

的特设项目是更快,因为它没有通过输入几乎是始终不变的(A)涉水。这很简单,因为它只需要对输入B做出决定,而不是A和B.

对于生成的临时程序来说这是一个好主意,因此您可以更轻松地找到任何错误。一旦你从发生器中删除错误,它们就会永远消失。

在一个项目中我的工作,一个团队设计出来,设计规范两英寸厚和冗长的实施时间表,充满了对性能的担忧复杂的数据库应用程序。通过编写一个代码生成器,两个人在三个月内完成了这项工作,而源代码清单(C)的厚度大约是半英寸,并且生成的代码非常快以至于不成问题。特设计划每周重新生成,成本微不足道。

所以有源代码生成,时,你可以用它,是一个双赢。而且,我认为这正是编译器所做的并不是偶然的。

0

代码生成器可解决编程语言限制。我个人更喜欢反射而不是代码生成器,但我同意代码生成器更灵活,并且运行时的代码明显更快。我希望,未来的C#版本将包含某种DSL环境。

0

你在找几个?我创造了两个主要的和许多次要的。第一个主要的项目允许我生成程序1500个线程程序(给与或不带),这些程序具有强烈的家族相似性,但与数据库中的不同表格匹配 - 并且可以快速,可靠地执行。

代码生成器的缺点是,如果有一个在生成的代码中的错误(因为模板包含一个bug),然后有很多固定要做的。但是,对于需要完成大量近乎重复的编码的语言或系统来说,一个好的(足够的)代码生成器是一个好处(并且更多的是一个好处,而不是'doggle')。

0

我使用的唯一代码生成器是webservice解析器。我个人远离代码生成器,因为新员工或单独的团队在维护后出现问题。

0

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

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

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

0

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

由于我们切换到了实体框架我创建使用T4(Text Template Transformation Toolkit)在Visual Studio中的积极codegenerator。我用它为我们的实体创建基本的存储库部分类。工作非常好,并节省了一堆编码。我也使用T4来装饰具有特定属性的实体类。

3

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

这大大缩短了开发全径接口(如SH/CX/RO等)的时间。

0

代码生成器在许多情况下非常有用,特别是从一种格式映射到另一种格式时。我已经完成了IDL到C++的代码生成器,数据库表到OO类型,以及编组代码等等。

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

我曾经和一个坚持要手动做我们的IDL到C++映射的人一起工作。在项目开始的时候,他能够跟上,因为我们其他人试图弄清楚该怎么做,但最终他成了一个瓶颈。我在Perl中做了一个代码生成器,然后几分钟后我们几乎可以完成他的“工作”。

0

请参阅我们的"universal" code generator基于程序转换。

我是架构师和关键实施者。 值得注意的是,这个发生器的很大一部分是使用这个发生器产生的。

0

在嵌入式系统中,有时需要在闪存中有大块的二进制数据。例如,我有一个需要包含位图字体符号的文本文件,并将其转换为一个.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. 
0

我们使用Telosys工具代码生成器在我们的项目中:https://sites.google.com/site/telosystools/

我们已经创建它来减少像CRUD屏幕,文档等经常性任务的开发时间...

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

1

为项目编写自己的生成器效率不高。相反,请使用T4,CodeSmith和Zontroy等生成器。

T4更复杂,你需要知道.Net编程语言。您必须逐行编写模板,并且必须自行完成数据关系操作。您可以通过Visual Studio使用它。

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

Zontroy是一个新的工具,具有用户友好的用户界面。它有自己的模板语言,很容易学习。有一个在线模板市场,它正在发展。即使您可以提供模板并通过市场在线销售它们。 它有一个免费和商业版本。即使免费版本也足以完成一个中等规模的项目。

相关问题