4 List of Figures 1 Main stages of the Katja system Conceptual Blocks of the Katja System The Build Process of the Katja System Excerpt of the old Generator Hierarchy The Type System Model of the Java Backend Generation Aspects of the Java Backend An Example Switch Class Hierarchy An Example Visitor Type Hierarchy The Operations of the Katja List Interface The Term Type Variable in Variant Positions The katja.common Type Hierarchy Position Structure Sorts and their Hierarchy Return type conflicts in Java interface hierarchies

5 1 Introduction Katja is a tool generating order-sorted recursive data types as well as position types for Java, from specifications using an enhanced ML like notation. Katja s main features are its conciseness of specifications, the rich interface provided by the generated code and the Java atypical immutability of types. After several stages of extending and maintaining the Katja project, it became apparent many changes had to be done. The original design of Katja [11] wasn t prepared for the introduction of several backends [4], the introduction of position sorts [7] and constant feature enhancements and bug fixes. The Java backend in particular was growing more complex with each feature added, necessary changes resulting in tremendous efforts. In anticipation of the introduction of attributes to Katja, a cleanup had to be done and a proper design had to be found. With all those difficulties in the implementations, Katja never reached a closed and stable feature set. While core features were working in principal, aspects like imports combined with the use of position sorts had to be used with caution and the support of a Katja developer only. So with the ongoing redesign of the Katja system, the feature set, including the interface of the generated code, was redesigned and stabilized as well. By supplying this report Katja reaches release status for the first time. Section 2 describes the changes made to the structure of the Katja system and the global architecture. Section 3 explains the Java backend in more detail and focuses on the ideas and considerations which lead to the new code generator design. Section 4 summarizes the features of the Katja system apparent to the user and gives an account of the long process of designing the interface of Katja. This section should also serve as a documentation to the interested Katja user. The report finishes with future work on Katja. 2 Redesigning the Katja System The Katja system basically is a compiler, taking Katja source files as input and creating several formats as output. The general architecture therefore resembles the one of a compiler, going through steps like scanning input files parsing token streams constructing abstract syntax trees 5

6 semantic analysis generating output data writing files On an abstract level all these steps are done in fixed order and can be separated quite well. Unfortunately the Katja system did not make these separations visible in any way, neither in code structure nor in the architecture. Code fragments, packages and other logical units had a high coupling while maintaining low cohesion. Again this was not the result of a bad design right from the start, but from the constant evolution of the system. The following sections will analyze parts of the system in detail and document how things are done now. 2.1 Architecture and Control Flow Logical Structure The systems inherent separation into frontend and backends was already revealed in [4] and as the notion is both useful and necessary it will remain. However, I will elaborate a kind of production line view on the system. Like usual for a compiler, one Katja run is a logical sequence of different stages, which are each completely done and taken care of before the next. Defining fixed stages for one Katja execution will have the following benefits: Each stage has an assigned tasks and each task is done in exactly one stage, rather than being distributed over the runtime of the system. On completion each stage constitutes a toolset to the next stage, guaranteeing certain properties. Stages communicate with well defined interfaces and can be developed without full knowledge of the others. Code realizing functionality is separated from data, which in turn is passed between stages. The idea of such a production line is inspired by the well-understood scanner and parser technologies. Together they solve a greater problem by splitting it up into parts which they solve independently and conceptually in a fixed order. The realization, however, is tightly coupled and interactive, though maintaining loose coupling and high cohesion. 6

7 I need to achieve the same separation of concerns, which is essential to breaking up larger systems into manageable parts. The Katja system therefore splits up into several artifacts, which work together on a low coupled basis to realize a number of tasks in fixed order. This allows them to interact and benefit from guarantees other parts provide and ultimately enables them to be implemented separately. Figure 1 shows the stages of the Katja system. start-up frontend Stage Main class creation Main class execution parameter parsing file acquisition and transformation sort structure creation semantic checks backend logic Tasks done - IOHandler, ErrorCollection and basic configuration are present - Katja can be executed in parallel, using different configurations - it is no longer important if Katja was executed from shell, a Katja Ant-task or from within another program - command line is completely processed, configuration is done - most basic usage errors are found - backend is selected - next stages can use the configuration object only - "include" statements and file handling in general are done - syntactic sugar is eliminated, path names are made canonical - next stages can use a set of abstract syntax trees only - basic checks are done - all known sorts and their corresponding information is present - next stages can use the sort structure only - the sort structure is consistent, complete and free of errors - next stages can use all the sort information they need the control is given to the backend, as no more general tasks need to be done Figure 1: Main stages of the Katja system It is vital to notice at this point, that a backend appears in several different roles. Concerning the logical structure of the system, the backend is only one final stage in which the logic of the backend is the main problem. The backend therefore only appears in the last stage of Figure 1, where it is the center of attention. Another role of the backend, however, is the addition of the complete logic necessary to produce one product of a specific application domain. The backend therefore is and has to be supplied as one separated source artifact, e.g. one Java package. Regarding the control flow, this does not mean the backend is only executed last, but the backend has to aid several stages by supplying domain specific logic. The next section describes this in more detail. 7

8 Stages are in general separated into more detailed tasks, giving guarantees to other subtasks. Those guarantees most often belong to one of the two categories: problem solved: By finishing the task a specific problem was solved, like reading a file from the disk or treating syntactic sugar elements in an input language. Once the abstract syntax is normalized, for example, the latter problem is solved. Subsequent tasks need and must not include operations belonging to the solved problem, thereby achieving a separation of concerns. toolset: By finishing the task a new or updated set of tools or information, together with operations on this information, is supplied. Following tasks must not use low-level or deprecated toolsets and should profit from getting a cleaned up view in many cases. Ultimately this leads to code artifacts, which have a well defined purpose and can work with a small set of interfaces. Tasks solved by code artifacts are guaranteed to be of manageable size and can work with convenient sets of tools. A complete Katja run is therefore divided into small, understandable parts, which run one after each other Physical Structure For the implementation of such an architecture it is vital that stages are implemented in a set of language artifacts which is as small as possible. However, there are other concerns which influence the development of such artifacts and the code structure therefore can t resemble the listed set of stages in detail. Katja is capable of having several different backends, which can be dynamically switched between different executions. By design the developer of such a backend and the developer of the frontend need not work together. The Katja system is therefore split in three conceptual blocks, which supervise a set of stages but cannot implement them in completion. Figure 2 shows the conceptual blocks which make up the Katja system. Block Main is the entry point for all applications using Katja and supervises the start-up functionality and all associated stages. Its implementation consists mainly of technical details. However, this block already needs to run backend code, as it has, for example, to be able to parse all user supplied options and get information whether all given parameters are correct. The Katja block is the heart of the Katja frontend, supervising the main frontend functionality and all its stages. It is no longer concerned with many 8

9 Backend Main Katja control flow Figure 2: Conceptual Blocks of the Katja System technical details and can work on a given configuration, input/output handler and error collection only. This block follows a straight forward protocol to solve the tasks of the different stages together with the selected backend. The Katja execution is finished by the Backend block, which is no longer subject to any protocol and may finish the task of the backend. Note that at this stage of execution the backend is freed from all common concerns and has access to a concise representation of all specified data from the specification file. The backend is, however, involved in getting to this point, as many stages require backend specific interaction. Each block is governed by one Java class, residing in a separate package. The class Main, realizing the start-up, is situated in the katja package, outside of the Katja package hierarchy and governs the Main block. The method Main.run() realizes the control flow and has to be called explicitly whenever Katja is to be started from within another Java program. The class Katja, realizing the frontend, is situated in the katja.frontend package and governs the Katja block. The method Katja.execute() realizes the control flow and represents one Katja execution with a given file, configuration, input/output handler and error collection. The interface Backend describes a backend specific block and is situated in the katja.backend package. It is implemented by each Katja backend, which should be situated in an equally named subpackage of katja.backend. The reader should note that such an architecture might sound straightforward and simple at first, but is by no means the obvious and only choice when designing a system. The former Katja system, for example, used some kind of recursive object structure to handle imports of Katja specifications. 9

10 For each specification a Katja object was instantiated which shared some attributes with others while creating some new ones. So each imported specification was interpreted separately while some information was calculated together. This resulted in non-trivial system states, where the control flow was implicit and information was distributed in complex object structures. This is but one example of possible design differences which resulted in tremendous efforts in implementing, understanding and enhancing Katja. 2.2 Sort Structures and Information Flow For the implementation of system fragments we already achieved a separation of concerns, which in general leads to manageable code size and clearly defined tasks to be implemented. To keep implementations even more straightforward and maintain aspects like low coupling between stages and high cohesion within a fragment, we need a clear view on how information is obtained in different stages. The most obvious starting point for information retrieval is the result of the parser step, which yields all the plain information given in a specification file as abstract syntax tree. This syntax strictly follows the construction of the concrete syntax, to avoid overloading the parsing step with domain specific knowledge and to keep it simple in general. The transformation stage therefore works directly on the abstract syntax and eliminates all syntactic sugar elements, without changing the grammar. The result is again an abstract syntax tree, but with certain guarantees, like all sort declarations are on the top level of the specification and never nested in others. With the introduction of position sorts, it became more and more apparent, that the abstract syntax was ill-suited to work with in following stages, like it was done in the former Katja system. Information about sorts was either directly taken from the syntax or from one of the various Attribute classes or from the katja.helper package, which implemented functionality to calculate non-trivial data specified in a specification file. There was no single toolset stages could work with and the mentioned functionality distributed over the system was neither coherent nor complete. My intention is to cut off the access of later stages to the abstract syntax and present a well designed toolset instead. One important property of such a toolset is the representation of a sort, which is obviously needed for all functionality working on sorts and to talk about sorts in general. In the former Katja system these runtime tokens for sorts were their defining production or the SortId of the defining production. One advantage was that most commonly needed information about the 10

11 sort was present in the token itself, like the number and names of selectors or the list element sort. With the introduction of syntactic sugar elements, positions and external sorts, however, it became apparent that the presence of this information was coincidental and was actually causing the dichotomy of information retrieval in Katja. With positions alone the situation got worse, as there was no trivial runtime token for position sorts. In fact a simple root declaration in the abstract syntax causes the introduction of an arbitrary number of sorts and therefore can t be used as token. These problems lead to the introduction of sort structures, which are collections of sort tokens, together with a variety of methods giving convenient access to all needed properties of sorts. The tokens are modeled and constructed in another abstract syntax, so the process of creating those tokens from a set of abstract syntax trees can be understood as transition from one syntax to another. The basic sort structure is the TermSortStructure as it is unaware of positions and imports, it resembles the old Attribute functionality as close as possible. It is extended by the SortStructure to add position sorts as well as transparent imports. This structure is the starting point for the backend and is constructed in the sort structure creation stage. The key features of a sort structure are: Each specified sort, whether created explicitly with a term production or implicitly with a root statement has one unique runtime token used to represent the sort in the Katja system. All properties of sorts, whether explicitly or implicitly defined by the specification, can be accessed in a convenient way. The sort structure gives an abstract and complete view on sets of specifications, without the need to handle syntactic sugar elements or implicit information retrieval. Access to the abstract syntax is neither necessary nor intended for later stages of a Katja execution. These stages can focus on their own task and need not help with the interpretation of Katja specifications, in fact it is considered harmful if they use other means to get specification information. Each stage of execution is therefore part of the information flow and supporting it by either extending the quality of information for the next stage or presenting it in a more convenient and specialized manner. 11

12 A specification can also contain backend blocks, which wrap all backend specific parts of a specification. As backends may also interpret parts of the specification in different ways, it is recommended that they define their own sort structure, by extending SortStructure. The Java backend, for example, defines a specific JavaSortStructure to offer information like package names or Java super types of sorts to the later stages. All sort and specification related information should be calculated in such a structure, so the generate method of the backend can focus solely on the creation of the backend specific product, like a Java package or an Isabelle theory. 2.3 Sort Descriptors The SortDescriptors, which are modeled with Katja, are used as runtime tokens in all sort structures. All sorts specified by a user at any time are modelled by a SortDescriptor, i.e. imported sorts are also modelled, as well as declared external sorts. At the current state of the Katja System, a user can only use sorts in specifications, which he has either declared or imported. Common Katja sorts, like KatjaList cannot be used in specifications directly, as the existence of such sorts is backend specific. So the core features of a sort in Katja are: The name of the sort. The file name and line number it was defined in. Whether it is defined in the root specification or was imported. This is the only information available for all Katja sorts. In fact it would have been sufficient for a sort to only consist of a single name, to fulfill the task of being a runtime token, as no other information is needed for sort identity. Adding information like file name or line helps in differentiating conflicting sorts of specifications and makes error messages more expressive. A valid Katja specification, however, will have at most one sort for each possible name. Given a sort descriptor, all other information has to be requested from the sort structure, which offers a variety of methods yielding basic as well as complex information. To offer a certain degree of static feedback to the developer, there are several subtypes of the class SortDescriptor defined: SortDescriptor = TermSortDescriptor 12

13 PosSortDescriptor ( String name, String filename, Integer line, Boolean imported, TermSortDescriptor basesort, PosStructDescriptor struct) TermSortDescriptor = TupleTermSortDescriptor ( String name, String filename, Integer line, Boolean imported ) ListTermSortDescriptor ( String name, String filename, Integer line, Boolean imported ) VariantTermSortDescriptor ( String name, String filename, Integer line, Boolean imported ) ExternTermSortDescriptor ( String name, String filename, Integer line, Boolean imported ) Position sorts have two additional arguments, as they are derived from a base sort and belong to a position structure. There can be various position sort descriptors for one base sort, as well as for one position structure. Again the name of position sorts would suffice, but this information is considered essential for positions and is therefore integrated in the identity. There are only two other sorts needed to give all artifacts of a specification an identity: SelectorDescriptor ( SortDescriptor parentsort, Integer count, String name, SortDescriptor paramsort ) PosStructDescriptor ( TermSortDescriptor rootsort, String suffix ) A selector descriptor completely describes one selector specified in the specification or generated by Katja. The latter is done for variants, if a selector can be lifted to it, and for tuple components which did not have a selector specified, so a default selector is created. Position sort descriptors serve as runtime tokens for complete position structures, which are created by the root keyword. 2.4 Backends Katja allows the definition of arbitrary many backends. solved by a backend are: The tasks to be The backend has to supply a name. 13

14 The backend helps with the interpretation of command line parameters, by taking them away from a supplied list of arguments and returning a backend specific configuration containing the data. It also has to be able to print usage information for the user. The backend helps with the creation and checking of the sort structure, by supplying a specialized version. In addition to the checks supplied with the sort structure it helps checking the names of specified sorts by supplying a namespace. The backend gets the control flow to generate whatever product the backend wants to create. So to implement a backend the user should supply at least: An implementation of the Backend interface. An extended SortStructure. If no extensions are needed in a specific backend, the class SortStructure can just be instantiated. An extended Configuration class, containing all backend specific configuration options. If no additional options are needed the backend can return an instance of Configuration. An implementation of the Namespace interface. The backend can return a trivial anonymous implementation of Namespace, if no constraints are needed. Backends conceptually contain only static methods and should not have any internal state. All necessary data for each method call will be supplied by adequate parameters. Especially the created configuration and sort structure will be returned to the backend on each method invocation where it is needed. A backend needs to be statically registered in the Katja frontend. The frontend therefore contains an enumeration of all backends, holding a singleton of the backend. All interaction of front- and backend is done through this instance, using the Backend interface. The enumeration supplies methods to identify a backend by name, which is supplied by the singleton. 2.5 Error Handling and Error Checking Katja uses the exception mechanism to abort an execution and to report fatal errors. There is, however, a class of exceptions and errors which allows the execution to proceed, eventually reporting additional errors or finishing the execution. 14

15 Errors can arise in different situations for very different reasons and there are several kind of people involved. The users of Katja, the Katja developer and the backend developer can all be responsible for generating errors and have to handle errors generated elsewhere as well. This section covers how Katja and backend developers handle errors they detect, most important usage errors or errors in specifications. The general error handling concept is as follows: Exceptions in the Katja system itself, caused by bugs, simply yield exceptions and don t use the error collection system. All usage errors or warnings are put into the error collection. If the execution should be aborted at this point, where the error was detected, an empty runtime exception is thrown. This results in the execution falling back to a given save point, where execution can either continue or the exception is translated into one defined in the interface. If the caller of a method (Katja or backend developer) does not want to proceed with the execution after an error occurred he has to check the error collection for errors. The main control flow aborts with a katja.executionfailed exception or terminates the JVM if Katja was called from the command line. The backend control flow aborts with a KatjaGenerationFailed exception, which is therefore declared to be thrown in the various methods of the Backend interface. Besides the usage errors, the start-up part of the frontend deals with, like wrong command-line arguments or syntax errors in the specification, there are those errors found in the semantics of a specification file. A specification can be checked for such errors at several stages. If all checks are done in an early phase they are tedious to implement. Checks involving position sort names, for example, are much easier done after all position sort names have been calculated, instead of calculating them again for the checks only. On the other hand we can t check all conditions in the end, where all information is already present, since many calculations depend on the absence of some errors. Errors to be checked in general are the following: Syntactic sugar is eliminated without error checking. Errors resulting from the use of syntactic sugar will be found on the normalized input. 15

16 (1) Duplicate or interfering sorts. This includes: Duplicate term sorts, even if they are not in the same specification. Interference of position sort names with term sort names. Interference of position sort names with other sort names, due to the construction of the sort name by appending a suffix (11) Conflicts of sort names with specification names or between specification names. (12) Conflicts of position structure suffix names. The same suffix cannot be used in the same specification, due to the types introduced in Section 4.12 and it is very unlikely that using the same suffix for two position structures does not lead to conflicting sorts. Note that those conflicts arise between all sorts known to the Katja system, no matter if imported or not, since Katja does not support namespaces at the moment. (2) Missing sorts, i.e. sorts which are referenced but not defined. This includes: Sorts appearing in lists, tuples and variants. Sorts appearing in root declarations. (13) Duplicate selector names of sorts. Katja limits, including: (3) External, imported or position sort appearing in variants. external A B = A CPos D All cases of a variant need to be subtypes of the variant, which cannot be defined in all backends for sorts Katja does not create itself. (4) Recursive definition of variants. A = B C B = A D Such a definition immediately results in cyclic subtype relations. (5) Directly recursive lists. 16

17 A * A This is no error in general, but can lead to problems in a backend. If a list is its own element sort it is also a subtype of its element sort and vice versa. (6) Recursive dependency of terms, so no finite term can be constructed for some sorts. A ( B, C ) B ( A, D ) Both sorts A and B need a term of the other sort to be created. Such problems can easily be avoided in practical applications by using either variants or lists in one of the tuple definitions, as lists can be empty and variants may have other cases, which are independent of the sort to be created. (7) No higher order positions are allowed, i.e. position sorts mustn t appear in tuples or lists appearing in terms reachable from a root sort. root A Pos root B Occ A ( D, E ) C ( DPos ) B * C Though higher order positions have interesting applications, Katja does not support them at the moment. (8) Katja identifier interference with backend identifiers. This includes: Interference with identifiers, keywords and literals of the backend language. Inability to define all identifiers in the backend, which are definable in Katja s lexic. Backend specific checks, which include: (9) Definitions for all external sorts are present and conflict free. The Katja frontend does not consider multiple definitions of the same external in different specifications to be a conflict. (10) Other backend specific checks. 17

18 These twelve checks are done in different stages of the execution, there a four categories in which they can be done. Checks are mostly done when they can be checked in a convenient and natural way and always before other stages depend on them. The categories, including the checks done in them, are presented in the order they are executed: 1. During the creation of the standard sort structure: (1) Duplicate term sorts are found the moment the duplicate is inserted into the sort structure. Note that duplicate externals do not yield an error directly, but are checked later for consistency. (1) Interfering position sorts, either with other positions sorts or term sorts, are found on their insertion to the structure as well. (2) Missing sorts can be detected on position structure creation. (7) Higher order positions are detected on construction of position structures. (11) Names of specifications are gathered and checked against all created sorts, as well as checked for conflicts. (12) Suffix names of position structures are checked against all others at the creation of the structure. 2. During the creation of the specialized sort structure, but called from the super constructor: (1)(9) Duplicate externals are checked for consistency in the specific sort structure, but in a method called from the super constructor. Backends can use this to check if all externals are defined. 3. After the creation of the sort structure, called from the frontend: (2) The sort structure is explicitly checked for missing sorts. (13) The sort structure is explicitly checked for duplicate selector names in sorts. (3)-(5) All those semantic issues cannot be detected by name-based construction and analysis; special checks are invoked on the sort structure. (8) The frontend checks all sort names against the Namespace provided by the backend. 4. After the creation of the sort structure, called from the backend: 18

19 (6) This is only checked in the Java backend for now, as methods making the check easy are defined there. The Isabelle backend has its own checks, as it has to find witnesses. (10) All backend checks, which can wait for the constructor to be finished, should be made here. The Java backend, for example, has to check all sort names against the top level package they are generated to. The creation of a sort structure is a difficult task and there are some implicit rules which mustn t be violated at the moment. Making these rules explicit isn t straightforward in Java and would involve changing the design decisions made for the sort structures. First of all you can t call most of the methods of a sort structure from within the constructor, as most methods work only with the guarantee that all sorts are already known to the structure. The results of those methods are also cached in general, so calling them to early will yield both a wrong result and damage the cache. Methods used in the constructor are therefore documented, explaining why it s safe to call them. Also after the creation of a sort structure some checks have to be done, before calling of recursive methods is allowed. As the specialized sort structures are subtypes of the normal sort structure, their super constructor is called first. As some checks need to be done in the super constructor, which can in turn be done only by backend specific code, this super constructor calls methods of the specialized sort structure, before attributes are initialized. Therefore the super constructor calls a special initialization method first, before creating the structure, in which specialized sort structures have to initialize all attributes they intend to use in the checks. As the backend block data will have to be parsed for those checks to be done, the sort structure will need some of its attributes to safe the results. Backend specific checks, which are done after the creation of the sort structure are defined in the specialized sort structure as well, but are executed from the frontend and therefore mustn t be called from the backend itself. All these rules can be summarized as some kind of usage protocol, which cannot be enforced in Java directly, as conditions change over time. It would, however, be possible to minimize the possible usage errors with a different design, but this was simply not done in the current Katja system. 19

20 2.6 Bootstrapping Katja is a system utilizing itself in greater parts of the implementation. It was created by constant bootstrapping and continues to do so with each feature added. The significant changes to the complete Katja system made it necessary to clearly separate and understand the role of each artifact in the projects build process. This had not been done to this degree so far, so I had to go back one step and unfold the bootstrap cycle. I copied the complete project to be allowed to freely make changes in certain parts of the project, without breaking it. This was necessary, for example, to adjust the katja.common package, without the need to adjust the generated classes immediately. I kept one version running and able to generate code, while refactoring the other. This would not have been necessary with a build process which is really aware of the bootstrapping going on, shown in Figure 3. Input Targets Output parser scanner generate-parser, generate-scanner (needs java_cup, JFlex) source files Symbols.java Scanner.java Parser.java common sources compile-common-sources class files bin/ sources compile-sources (compiled against results of compile-spec) class files commonbin/ specifications Libraries compile-specs compile-spec-x, compile-spec-y,... (needs Katja, compiled against deployed jar) build deploy spec.jar spec.jar common.jar specbin/ Katja bootstrapping cycle java_cup runtime jar common.jar bootstrap stand-alone Katja java_cup JFlex katja.jar Figure 3: The Build Process of the Katja System It has to be possible to adjust all different parts of the Katja system and integrate a new feature, while still being able to compile them all, without 20

Java Application Developer Certificate Program Competencies After completing the following units, you will be able to: Basic Programming Logic Explain the steps involved in the program development cycle

1 Introduction The purpose of this assignment is to write an interpreter for a small subset of the Lisp programming language. The interpreter should be able to perform simple arithmetic and comparisons

Fundamentals of Java Programming This document is exclusive property of Cisco Systems, Inc. Permission is granted to print and copy this document for non-commercial distribution and exclusive use by instructors

Concepts and terminology in the Simula Programming Language An introduction for new readers of Simula literature Stein Krogdahl Department of Informatics University of Oslo, Norway April 2010 Introduction

Software Engineering Architectural Design 1 Software architecture The design process for identifying the sub-systems making up a system and the framework for sub-system control and communication is architectural

Moving from CS 61A Scheme to CS 61B Java Introduction Java is an object-oriented language. This document describes some of the differences between object-oriented programming in Scheme (which we hope you

The following applies to all exams: Once exam vouchers are purchased you have up to one year from the date of purchase to use it. Each voucher is valid for one exam and may only be used at an Authorized

APPENDIX A AP Computer Science Java Subset The AP Java subset is intended to outline the features of Java that may appear on the AP Computer Science A Exam. The AP Java subset is NOT intended as an overall

CS506 Web Design and Development Solved Online Quiz No. 01 Which of the following is a general purpose container? JFrame Dialog JPanel JApplet Which of the following package needs to be import while handling

PHP Debugging Draft: March 19, 2013 2013 Christopher Vickery Introduction Debugging is the art of locating errors in your code. There are three types of errors to deal with: 1. Syntax errors: When code

Objectif This six-day instructor-led course provides students with the knowledge and skills to develop applications in the.net 3.5 using the C# 3.0 programming language. C# is one of the most popular programming

Curriculum Map Discipline: Computer Science Course: C++ August/September: How can computer programs make problem solving easier and more efficient? In what order does a computer execute the lines of code

Appendix E Glossary of Object Oriented Terms abstract class: A class primarily intended to define an instance, but can not be instantiated without additional methods. abstract data type: An abstraction

Embedded Software Development with MPS Markus Voelter independent/itemis The Limitations of C and Modeling Tools Embedded software is usually implemented in C. The language is relatively close to the hardware,

Introduction A QUICK OVERVIEW OF THE OMNeT++ IDE The OMNeT++ 4.x Integrated Development Environment is based on the Eclipse platform, and extends it with new editors, views, wizards, and additional functionality.

Developers Guide Designs and Layouts HOW TO IMPLEMENT WEBSITE DESIGNS IN DYNAMICWEB Version: 1.3 2013.10.04 English Designs and Layouts, How to implement website designs in Dynamicweb LEGAL INFORMATION

Chapter 6 Variable Base Interface 6.1 Introduction Finite element codes has been changed a lot during the evolution of the Finite Element Method, In its early times, finite element applications were developed

PROBLEM SOLVING WITH SEVENTH EDITION WALTER SAVITCH UNIVERSITY OF CALIFORNIA, SAN DIEGO CONTRIBUTOR KENRICK MOCK UNIVERSITY OF ALASKA, ANCHORAGE PEARSON Addison Wesley Boston San Francisco New York London

UML for C# C# is a modern object-oriented language for application development. In addition to object-oriented constructs, C# supports component-oriented programming with properties, methods and events.

Functional Decomposition Top-Down Development The top-down approach builds a system by stepwise refinement, starting with a definition of its abstract function. You start the process by expressing a topmost

Sun Educational Services Instructor-Led Course Description Fundamentals of Java SL-110 The Fundamentals of the Java course provides students, with little or no programming experience, with the basics of

Dinopolis Java Coding Convention Revision : 1.1 January 11, 2001 Abstract Please note that this version of the Coding convention is very much based on IICM s internal Dino coding convention that was used

Systems Integration: Component-based software engineering Objectives To explain that CBSE is concerned with developing standardised components and composing these into applications To describe components

Chapter 4 Web Presentation Layer Architecture In this chapter we provide a discussion of important current approaches to web interface programming based on the Model 2 architecture [59]. From the results

Everyday Lessons from Rakudo Architecture Jonathan Worthington What do I do? I teach our advanced C#, Git and software architecture courses Sometimes a mentor at various companies in Sweden Core developer

PL/SQL Overview PL/SQL is Procedural Language extension to SQL. It is loosely based on Ada (a variant of Pascal developed for the US Dept of Defense). PL/SQL was first released in ١٩٩٢ as an optional extension

Chapter 6. Transition to Java Not all programming languages are created equal. Each is designed by its creator to achieve a particular purpose, which can range from highly focused languages designed for

2008 AGI-Information Management Consultants May be used for personal purporses only or by libraries associated to dandelon.com network. Computing Concepts with Java Essentials 3rd Edition Cay Horstmann

Overview Elements of Programming Languages Lecture 12: Object-oriented functional programming James Cheney University of Edinburgh November 6, 2015 We ve now covered: basics of functional and imperative

66 CHAPTER 5 INTELLIGENT TECHNIQUES TO PREVENT SQL INJECTION ATTACKS 5.1 INTRODUCTION In this research work, two new techniques have been proposed for addressing the problem of SQL injection attacks, one

Parsing Technology and its role in Legacy Modernization A Metaware White Paper 1 INTRODUCTION In the two last decades there has been an explosion of interest in software tools that can automate key tasks

WP. 2 ENGLISH ONLY UNITED NATIONS STATISTICAL COMMISSION and ECONOMIC COMMISSION FOR EUROPE CONFERENCE OF EUROPEAN STATISTICIANS Work Session on Statistical Data Editing (Bonn, Germany, 25-27 September