Code generation is a well-established technique of software development. Modern development tools are using code generation whenever there is a need to create a chunk of source code of a well-known structure. For example, plumbing code to interact with a web service or a business object layer library for a database are both good candidates to be outsourced to a code generator.
How difficult is it to create a code generator?
Consider Microsoft.NET Framework. A dedicated namespace System.CodeDom is provided to allow easy programmatic creation of source code trees with additional classes capable to convert a code tree into actual source code in the .NET language of your choice. You can even compile the code directly from the tree and have it executed! So the answer to the question is that it is not that difficult if you are relying on a toolset such as Microsoft.NET.
Why would you want to build a code generator?
The reality of software development is that it is not enough anymore to have a great hierarchy of classes that can be reused by many projects. To be productive you need an initial set of source code files that are linked to a great class library and shaped to solve a specific business problem. This is especially true if you are interacting with the databases, invoking external web services, or building user interface screens. Most of these tasks can be done with automatic code generation tools.
Take a look at the great example below. The ASP.NET 3.5 web application with Ajax Control Toolkit and JSON web service is running right in the middle of the page and was created with Code OnTime Generator.
This shows that very sophisticated applications can be instantly created given the right set of tools. The development process is considerably shorter - in seconds you are ready to start tackling the real business problems instead of figuring how to write client AJAX calls to your JSON web service.
How do you build a great code generator?
A code generation project requires some sort of database to store project requirements specified by the user. The most lightweight, flexible and universally supported medium is XML. Another popular choice is to store project settings in the database. Database does make it more difficult to alter project structure and creates sometimes additional level of complexity, which might not be needed.
XML naturally suggests three other technologies - XSD, XPath, and XSLT.
Use XSD schemas to ensure that users are not making mistakes when populating project files. Tools, such as Visual Web Developer, will automatically recognize the schemas and assist with intelli-sense when users are working with the XML source.
XPath is great if you need to create a project builder for your code generator. You can easily inspect the content of the project XML files and allow the code generator to make decisions about the steps that need to be executed.
Transform and shape the project data with XSLT stylesheets. For example, you can come up with an intermediate form of source code that will be naturally produced by applying XSLT transformations to the project XML files and have them later converted into the source code. Don't reinvent the wheel, go with System.CodeDom or any other comparable technology available in other programming platforms, to do such conversion.
A great code generator will provide capability to write user interface forms to help user in configuring the projects. The best bet is to use HTML and AJAX techniques to create a project browser. The scripts running in the pages can interact with the XML files and provide user input to the code generator.