Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Code generation tools Galit Keret Moti Zviling Contents Why is code generation technology required? What is it and what kind of a solution it offers? CGN – Code generation network Features of a good code generation tool Related terminology Active and passive code generation RAD and CASE Code generation products How to find the right tool for your needs? Code generation models Code samples for each model Partial Products list for each model So why is it not vastly used? Demo code generation tools 2 Sometimes it’s a bummer to be a software engineer… Ever felt like this? Writing thousands and thousands of tedious code, your deadline is impossible to reach (as always), and in the end you found yourself facing dozens of bugs and worse than that you discover your application’s performance is poor… code generation tools 3 Some scary facts about software world (from OOD course) 84% of software projects are not on time 31% of software projects never complete ~60% of completed code is never used ~200 Billion $ a year lost to software bugs Let’s say this in words: Most software is buggy, unstable and insecure A lot of software is totally unusable Introducing a new concept: Code generation tools. code generation tools 4 What is “Code generation”? Strictly speaking: Code generation is the technique of building code not manually but using other programs. You simply need to define a specification of abstract requirements to the tool. Using templates, it will then build one or more output files based on your requirements . Saves you the need to write the tedious parts or parts that are not in the areas of your expertise. code generation tools 5 CGN – Code generation network Covers all aspects of code generation: Includes interviews with engineers using and building code generators as well as articles, tutorials and example code. Holds an alphabetically database of generators and a list of books about code generation. code generation tools 6 Features of a good code generation tool Quality - Generated code always increases in quality over time because as bugs or shortcomings are found they can be fixed in the code templates and applied across the code base. Consistency - Generated APIs are consistent in class structure, variable naming and signatures. Productivity – Generators build code in a fraction of the time that it takes an engineer to produce the equivalent amount of code. Generators allow the engineer to offload grunt-work so that they can concentrate on tasks that require more creative solutions. Save testing time – don’t need to test the generated code. Abstraction - Generators provide a layer of abstraction between the design and the code base. The definition files used by these generators hold the schema and business rules for your application in a declarative form. code generation tools 7 Related terminology: Active and passive code generators There are two types of code generators: Active generators - intended to be run multiple times on the same output code as the design of the input or generator changes. Passive generators - create the initial code, and then it is the responsibility of the developer to maintain it (example: a wizard). Although both types will provide an initial boost to productivity, active generation is superior , because in this type of code generation the code is maintained and bugs in the templates can be rolled out across the whole code base. code generation tools 8 Active and passive code generation workflow The standard workflow in software engineering: edit-compile-test. The workflow cycle of a passive generator: run the generator, then follow the edit-compile-test cycle repeatedly on the code created by the generator. The workflow cycle of an active generator: run the generator, then compile, edit and test the output. Found a problem in the generated code? alter the templates or input of the generator and regenerate. Found a problem in the hand-written code portion? follow the standard edit-compile-test workflow. code generation tools 9 Related terminology: RAD and CASE CASE - computer assisted software engineering Similar to code generation tools. The analyst could define the business logic using visual tools and a generator would build all of the application code. RAD – Rapid application development An approach to building computer systems which combines CG/CASE tools and techniques, userdriven prototyping, and stringent project delivery time limits. The typical RAD project delivers a fully functional computer system in just a few days! code generation tools 10 CASE v. Code generation tools In both methods a generator build an application from an abstract description. The difference is in the approach: CASE tools attempt to replace trained engineers with tools that do the same work. CG tools are built by engineers for themselves – to make their life easier. Both tools can end up in the same place! code generation tools 11 Some facts about code generation products There are almost 200 code generation tools in the code generation network, and this list is far from being complete. Yet only few engineers know about code generators and fewer still have used them. CGT claims that the reason for this is lack of advertisement and clear information about it. The most common uses of code generators are database access and UI generators. There are more generators written for Java users than all of the other technologies combined. code generation tools 12 Finding the right code generator for your needs The code generation decision tree will help you look for the right generation tool for your project. If none of the generators listed address your needs you can use one of the ‘custom code generators’ which supports scripting in a variety of languages. Failing that, you can always write your own generator…(just be sure to first read the DO IT YOURSELF section at the Code generation network) code generation tools 13 Code generation models 1. 2. 3. 4. 5. 6. Code munger Inline code expander Mixed code generator Partial class generator Tier generator Domain language code generation tools 14 Code Munger Model The most common form of code generators The code munger reads the source file, analyzes it, and creates one or more output files. Processing Flow: code generation tools 15 A code munger model example – a translator A translator takes a code written in some programming language and translates it to a code written in some other language. The input and output of a ‘C to Java’ translator will look like this: output Input class Wrapper { char c; int x; char c; int foo(int y, char d) int x; { int foo(int y, char d) { int i; for (i=0; i<3; i=i+1) int i; { x=3; y=5; } for (i = 0; i < 3; i = i + 1) { x = 3; y = 5; } } } } code generation tools 16 Some Code Munger Model products JavaDoc: reads and parses the comments within a Java source code file, then creates HTML documentation. very easy to learn and use. ANTLR: helps to build programming language translator. Generates recognizers in Java, C++, C#, and soon Python. C2J: a C/C++ to Java translator. The generated code is not understandable! Jazillian: a C to Java translator. The generated code is natural (as if it was written by hand), but there are some minor translation bugs. (presented in demo) code generation tools 17 Inline Code Expander Model - overview It starts with designing a new language. Usually this new language is an existing language with some syntax extensions. The inline code expander is then used to turn this language into production code in a high level language. Processing Flow: The input is a source file for a new language. The output is a source file in a high level language suitable for compilation. code generation tools 18 An Inline Code Expander example: C with embedded SQL Embedded SQL is a method of combining the computing power of a high-level language like Java or C/C++ and the database manipulation capabilities of SQL. It allows you to execute any SQL statement from an application program. In the example code, SQL is embedded into C source code files using special markup. These hybrid C files are given their own extension, such as '.sqlc‘: // main.sqlc int main( int argc, char *argv[] ) { < SQL select * from users > return 0; } code generation tools 19 An Inline Code Expander example - continued After running the generator the corresponding created C file will look like this: #include "db.h“ int main( int argc, char *argv[] ) { DBHandle *db_handle = db_connect(); DBQueryDara *db_data = db_db_query( db_handle, "select * from users" ); for( int record = 0; record < db_data->length; record++ ) { // fetch and process data } return 0; } code generation tools 20 Some Inline Code Expander products Pro*C (Oracle) - Allows embedding of SQL into C source code. It takes some time to learn the Pro*C syntax, which is not intuitive, and it’s difficult to use in complex operations and also the generated code is not object oriented. Only 2 links in Google refer to this technology which means it’s not a success story. SQLJ (Oracle) - Allows embedding of SQL into Java source code. a more intuitive syntax and some what more object-oriented approach to the Pro*C way of embedding SQL statements in programs, but still the recommendation is to use it only when the data being mapped is quite simple (don’t use it in case of multiple mappings of Java objects to tables and vice versa) code generation tools 21 Mixed Code Generator Model The same processing flow as the Inline Code Expander, except that the input file is a real source file that can be compiled and run. This technique can be used for a variety of purposes: Building the user interface glue code to attach variables to user interface controls. Building test case code from test case data stored in comments. Creating database access code from access specification stored in comments. code generation tools 22 Mixed Code Generator : example an example input file for the SQL handling mixed code generator: #include "db.h" int main( int argc, char *argv[] ) Mixed Code Generator { // SQL: select * from users // SQL end return 0; } After running the generator it will fill the space between the comments with an implementation of the requested SQL statement (it will look like the output showed in the previous example). The comments are preserved so that if the generator is run again, the same replacement can be done. code generation tools 23 Mixed Code Generators v. Inline Code Expanders a major disadvantage of an Inline Code Expander is that the debugging is done against the output file. This means that you need to integrate any changes you make to the output code back into the input file after debugging is finished. In mixed code generation model the source code can be debugged directly (the input and output files are the same). They can also integrate nicely into IDEs as external tools. code generation tools 24 Mixed code generators v. Other generators Most generators build or manage entire files or even generate a whole application tier. This creates a barrier to entry of using code generators on existing products which don't take well the fact of having large sections of code replaced completely. Mixed code generation tools provide genuine aid in developing both new and existing applications, by enabling code generation for multiple small code fragments within a single file or distributed throughout multiple files. code generation tools 25 Some Mixed Code Generator products Codify - A code generator that integrates into the Visual Studio .NET framework which can generate multiple code fragments within a single file. For example: can generate the code for get/set methods of class properties. code generation tools 26 Partial Class Generator Model A partial class generator builds a set of base classes that are used as a platform to build the production classes. The base classes are designed to do the majority of the low level work of the completed class, leaving the derived class free to override specific behaviors on a case-by-case basis. code generation tools 27 Partial Class Generator – processing flow The generator reads a definition file, then using a set of templates, builds one or more base classes. These base classes are then augmented with derived classes All of the classes are then compiled together to build the final product. code generation tools 28 Partial class generator – database access classes An typical use of a partial class generator is to build database access classes. The generator builds the basic persistence code for each class and its fields. The derived classes are responsible for any custom behavior . code generation tools 29 Some Partial Class Generator products Coder – a toolkit that supports the creation of code generators Codegen - an open source (LGPL), UML Class Diagram to C#, Java and VB.NET code generation framework. Expert code generation tools 30 Tier Generator Model A tier generator builds and maintains an entire tier within an application. Processing flow: The tier generator takes an abstract definition file and using a set of templates builds one or more output files that constitute all of the functionality for an entire tier of the application. code generation tools 31 Example of a tier generation tool a good database/web application is built as a n-tiers application (e.g., database access, business logic and user interface). Most of the tier generators builds the database access tier or the user interface tier of such applications. There are so many CG tools that generate the database access tier for database applications that they even got a special name: O/R mapping tools (“Object to Relational mapping”) code generation tools 32 Tier generation example (continued) O/R mapping tool - a code generation tool that connects to your database and reads its schema, then lets you map objects to database tables and views, specify insert, update, load, and delete operations, queries and stored procedure calls, as methods to these objects. It also lets you define the relationships between objects (one-to-one, one-to-many, etc.) based on relationships between tables in the database. It then generates fully working persistence objects code for you. code generation tools 33 Tier generation example (continued) An O/R mapping tool processing flow: code generation tools 34 Tier generation example (continued) Below is an example of code a user will write, using an O/R mapping tool: try { Employees objInfo = new Employees(); EmployeesFactory objFactory = new EmployeesFactory(); objInfo.EmployeeID = EmployeeID; objFactory.Load(objInfo); // code here to use the “objInfo” object } catch(Exception ex) { // code here to handle the exception return; } code generation tools 35 Some Tier generation products Tier developper – an O/R mapping tool that runs on .NET platform. Very easy to learn and use. Excellent demos are available on site. XLInesoft ASPRunner Professional – Creates a set of ASP pages to access and modify MS Access, MS SQL, Oracle and other databases. Also very easy to learn and use but has less configuration options and generates less languages than ‘Tier developper’. (presented in demo) BrightSword™ Designer – build database-driven web applications in ASP, ASP.NET, JSP and PHP. Not user friendly as ASPRunner and the trial version crashes. code generation tools 36 Tier generators Vs. Partial class generators Tier generators are harder to write: But tier generators are better: Tier generator maintains all of the tier’s code, including all edge cases. Partial class generator follows the 80/20 rule: it handles 80% of the standard cases, and the rest 20% is handled by customized derived classes. Better business rules abstraction Easy to port the application to other platforms The result: generators often start as partial class generators. As the code solidifies and the problem domain becomes better understood the 20% become smaller and smaller until the whole tier is auto-generated. code generation tools 37 A domain specific language model The tool provides the user with a new language that has types, syntax and operations that map directly to the concepts of the user’s domain. Examples: Mathematica and Matlab These languages make it easy for the scientist to represent constructs that are difficult to code in general purpose languages, such as multi-dimensional matrix math. Another example, although not as clean as the pervious example because it obligates the user to describe her domain in terms of classes and relationships between classes is MDA. code generation tools 38 MDA - Model-Driven Architecture MDA is a set of related standards specified by the Object Management Group (OMG). These standards: UML, XMI, MOF, OCL, CWM are used to turn a model written in Unified Modeling Language [UML] to engineering artifacts in the form of source code, or documentation. MDA is targeted mainly at the professional production languages: Java, C#, and C++. code generation tools 39 MDA : the 3 tiers model The MDA 3-tiers model for code generation: Platform independent model (PIM) Platform specific model (PSM) Templates Code How is it done? Using XMI XMI is an XML based export standard for UML models. The platform-independent UML model is maintained in the Meta Object Facility (MOF) repository and exported via XMI to the generator. The generator then reads the XMI and applies transformations to it to create the platform-specific model. This model is then used as input to a set of templates which build the output code. code generation tools 40 MDA processing flow code generation tools 41 MDA processing flow and the 3 tiers model code generation tools 42 Some MDA products IBM Rational Rose - a popular UML to C/C++ generator. Undo/redo operations on the UML diagrams are not supported. BridgePoint – a UML to C/C++ generator. A good product but no free trial version. BridgePoint UModel by Altova – a UML to Java and vice versa generator. Very easy to learn and use, supports undo/redo operations (presented in demo) code generation tools 43 If it’s so great than why aren’t we using it? 8 traditional arguments against using code generation: Why not just use cut and paste? Code generation doesn’t work on existing code bases. The quality of the output code is bad. Generators are too complex. Generators are great in the beginning, but they are never maintained (Engineers will ignore the 'do not edit' comments). My application isn't complex enough for generation. My application is too complex for generation. Code generation will eat my job . code generation tools 44 Summary of tested products Product Link Model Application Type Target Language Bottom Line Jazillian Code Munger a C to Java translator Java Some minor translation bugs C2J Code Munger a C to Java translator Java JavaDoc Code Munger creates HTML documentation for Java APIs Java Inline Code Expander DB access code: embedding of SQL into C Pro*C (Oracle) Legend: Recommended C Worth trying code generation tools Generates strange code! The syntax is not intuitive (much difficult to learn than SQLJ) don’t try 45 Products summary (continued) Product Link Model Application Type SQLJ (Oracle) Inline Code Expander DB access code: Embedding of SQL into Java Codify Mixed Code Generator Codegen Partial class generator Tier developper Tier generator Any code. Integrates into Visual Studio .NET Target Language Bottom Line Java good only when the data being mapped is quite simple C++ C# Java Built in templates are for get/set methods only. Write other templates you’ll need by using the templates editor C# Java VB.NET An open source so worth trying but was not tested by us Any code. UML to C#, Java and VB.NET source code DB access + UI code: an O/R mapping tool that runs on .NET platform. code generation tools VB.NET SQL A SP.NET Visual Basic C# C++ 46 Products summary (continued) Product Link ASPRunner Professional Model Tier generator BrightSword™ Designer Tier generator IBM Rational Rose MDA generator UModel by Altova MDA generator Application Type Target Language Bottom Line DB access + UI code: build database-driven web applications ASP ASP.NET Supports only ASP output DB access + UI code: build database-driven web applications VB.NET PHP ASP.NET ASP JSP C# Trial version crashes Any code: UML to C/C++ generator C/C++ No undo/ redo operations Any code: UML to Java generator code generation tools Java 47 Demo Part code generation tools 48 Types of code generation A reminder: Code generators are programs that automatically generate high level code (e.g. C, C++, C#, Java, Perl, Python, Ruby, etc.). List of code generation applications: http://www.codegeneration.net/generators.php code generation tools 49 Code generation – decision tree code generation tools 50 ASPRunnerPro code generation tools 51 ASPRunnerPro - description ASPrunnerPro is a database management tool that provides easy access and manipulation possibilities for any database on the Web. Designed to suit all users from beginners to experienced developers, ASPRunnerPro creates Active Server Pages (ASP) enabling users to search, edit, delete and add data to the Oracle, SQL Server, MS Access, DB2, or MySQL databases. Sample generated ASP pages: http://www.xlinesoft.com/asprunnerpro/screenshots.htm Download a trial version from: http://www.xlinesoft.com/asprunnerpro/download.htm code generation tools 52 ASPRunnerPro - features Product Features: Easy to use wizard-like interface. Generates 100% pure ASP code. Numerous search modes. Add, view, edit, copy and delete pages. The ASPRunner wizard Built-in FTP Client to upload ASP pages to the Web server. User self-register page, password reminder, change password pages. Multilingual templates. Ability to choose language while logging in. Creates password protected ASP pages. A very simple installation. code generation tools 53 Jazillian – C to java translator http://www.jazillian.com/trial.html code generation tools 54 Jazillian – Description Jazillian takes the C source files that you provide and applies a series of transformation rules to convert various C constructs and patterns into their Java equivalents. code generation tools 55 Jazillian – Example1 Example 1: "Hello, World" The classic C program: main(char *argv[], int argc) { printf("Hello, world!\n"); } Becomes the classic Java program: public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); } } In this case, Jazillian applied the following "rules": Assuming the file was called "hello.c", The Java file "Hello.java" was created. The signature of the main() function was changed. The printf() call was changed to a System.out.println() call. The function was enclosed inside a new "Hello" class. The key to Jazillian is that it produces not just correct, but reasonable Java code. Each of the three "rules" applied here illustrates this. code generation tools 56 UModel-Altova - description UModel™ 2005 is an affordable UML modeling application with a rich visual interface and superior usability features to help level the UML learning curve, and includes many high-end functions to empower users with the most practical aspects of the UML 2.0 specification. code generation tools 57 UModel-Altova - features UModel™ 2005 supports: ·context sensitive entry helpers ·syntax coloring in diagrams ·customizable design elements ·unlimited Undo and Redo ·sophisticated Java code generation from models ·reverse engineering of existing Java source code ·complete round-trip processing allowing code, and model merging These capabilities allow developers, including those new to software modeling, to quickly leverage UML to enhance productivity and maximize their results. code generation tools 58 Elevator Problem demo Problem description: control elevators in a building with m floors. Constrains: Each elevator has a set of m buttons Each button is illuminated when pressed (moving to the desired floor) Illumination is canceled when elevator visits the corresponding floor. code generation tools 59 Elevator Problem (continued) Each floor (except first and top) has 2 buttons: request up-elevator, request down-elevator Buttons are illuminated when pressed Illumination is canceled when elevator visits the floor and then moves in the desired direction. When elevator has no request, it remains at its current floor with its doors closed. code generation tools 60 Elevator Problem (continued) Analysis in UML (unified modeling language) UML: specifies semantics and notation but no process is currently defined. We will show: Use case diagrams Class diagrams Collaboration diagrams (sequence and state diagrams will not be shown) Generating code from the above diagrams code generation tools 61 Use Case Diagrams Generalized description of how a system will be used Provided an overview of the intended functionality of the system Understandable by beginners and professionals Elevator scenario is extracted as follows: 1. Passenger pressed floor button 2. Elevator system detects floor button pressed 3. Elevator moves to the floor 4. Elevator doors open 5. Passenger gets in and presses elevator button 6. Elevator doors closes 7. Elevator moves to required floor 8. Elevator doors open 9. Passenger gets out 10. Elevator doors closes code generation tools 62 Class diagrams Static structure of the object Internal structure Relationships among objects code generation tools 63 More Tools in a Nutshell code generation tools 64 Camino – Tier generation code generation tools 65 Camino – Tier generation Integrated Support for Struts-Tiles Camino allows you to manage multiple Tiles definition XML files for multiple Struts sub-apps/modules. Document Generation Wizard With a push of button, you can easily create design documents of your web-application in HTML. Based on the configurations of the applications and the annotations you added, Camino automatically generates the index pages, hyperlinks for all the cross-references, storyboard images and description pages. Application Model Verifier Catch hard-to-find mistakes and verify referential integrity of the configurations of your applications as early as possible. Camino Pro verifies all of your code artifacts and notifies you errors and potential errors. code generation tools 66 Camino – Integrated Support for Struts-Tiles code generation tools 67 Camino – Document Generation Wizard code generation tools 68 Camino – Application Model Verifier code generation tools 69 AndroMDA – Tier generation Target – any code Targets – JAVA Description: reads a UML model (exported as XML) and creates Java code. Home page: http://www.andromda.org/ code generation tools 70 Albatross – Tier generation Target – any code Targets – Asp.net, C#, SQL, VB.net Description: Build wizards to generate the code. Albatross has a script language to generate code. Input formats: Source Code, XML, Custom Allowed customization: Code Generation templates, Type of files generated, Input format, Output format, Input processing. Home page: Http://www.thecodegenerator.com code generation tools 71 Bridge Point – Tier generation Target – Full web application Implementation language - C Targets: C & C++ Description: An MDA model compiler that builds C and C++ from UML models. Home page: http://www.projtech.com code generation tools 72 Modelisoft – Tier generation Target – Full web application Implementation language - C Targets: Database,C# Description: Able to make design decisions controlled by UML stereotypes. In conjunction with the Modelisoft AutoGUI library, it can produce a Windows application allowing browsing the model Home page: http://www.modelisoft.com code generation tools 73 JavaDoc – a code munger example The most common form of code generators. A code munger processes one or more source code files and generates some number of corresponding output files. JavaDoc is an example of a code munger. JavaDoc reads and parses the comments within a Java source code file, then creates HTML documentation from the comments using a set of templates. code generation tools 74 The processing flow of JavaDoc Code munging: The Java files come into the generator, the comments are parsed and the output HTML files are created using a set of templates code generation tools 75 Article links Many ideas and phrases included in this presentation and in the web site link were originated in the following articles/links: Code Generator Models FAQs about code generations One page guide to code generators MDA generation Generating Java and XML Using StringTemplate Language Translation Using ANTLR and StringTemplate Tool libraries for a code generation tool developer Top 10 Must Have Features in O/R Mapping Tools code generation tools 76 Thank You The END! Questions ? code generation tools 77