![]() |
|
|
All software listed below was developed on Linux and Mac OS X and is released under an Open Source license. The source code of most projects is hosted at Google Code from where you can download it with Subversion.
Quick C-- is an implementation of the portable assembly language C--. It is intended for compiler writers to be used as a target language. C-- aims to solve the following problems:
The design of C-- is discussed in several papers that you can find on www.cminusminus.org.
Just to give you an idea, below is Hello World implemented in C--. You will probably agree that this is pretty close to assembler code and therefore best created by a compiler and not by a human.
target byteorder little;
import bits32 printf;
export main, my_data;
section "data" {
my_data: bits8 [] "hello, world!\n\0";
}
foreign "C" main("unsigned" bits32 iargc, "address" bits32 iargv) {
foreign "C" printf("address" my_data);
foreign "C" return(0);
}
Quest is a tool for testing calling conventions in a C compiler. It grew out of my observation that calling conventions are difficult to get right and I suspected that many compilers would have these difficulties. Indeed, Quest found bugs in GCC and other compilers:
Quest generates C code which includes assertions. When compiled and run, failing assertions indicate compiler bugs. This can be done without any manual supervision. The code generation process is controlled by pluggable random generators which may be extended or replaced by the user.
Quest is described in the following paper: Christian Lindig. Random Testing of C Calling Conventions. In Jong Deok Choi and Raimondas Lencevicius, editors, Sixth International Symposium on Automated and Analysis-Driven Debugging, ACM Press, Monterey, CA, USA, September 2005. Download PDF
OCamlBurg generates tree-matching code for Objective Caml from a specification. It was used to implement the code-generation phase of the Quick C-- compiler. OCamlBurg belongs to the same family of tool as Lex and Yacc, which also generate code from specifications. And just like these, OCamlBurg is most useful for compiler writers.
Assume you have a numeric expression that you want to evaluate. Further assume that the expression is represented as a tree and that you have numerical operations to implement the evaluation. To make things interesting, you don't just have add, multiply, and so on, but several of them, each with its own associated cost. Selecting the right operations for evaluation is now no longer straight forward. OCamlBurg generates code that selects the optimal operations for a given expression.
Below is an example specification for OCamlBurg. There are four rules
for Add nodes. Besides the base case x+y with cost 2 (in square
brackets) there are additional rules for special cases. For example,
adding zero can be optimized to an operation with cost 1, and adding two
zeroes can be evaluated at immediately. In the example the evaluation is
carried out immediately. In a real compiler the actions in curly braces
would actually emit instructions that then would perform the evaluation
when executed.
%term int string -- terminal types must be declared
%type number {: int :} -- type declarations for nonterms are optional
%type str {: string :}
%%
number : Add(x:number, y:number) [2] {: x + y :}
number : Add(x:number, Add(y:number, z:number)) [2] {: x + y + z:}
number : Add(x:number, Const(0)) [1] {: x :}
number : Add(Const(0), Const(0)) [0] {: 0 :}
number : Sub(n:number, m:number) {: n-m :}
number : Mul(n:number, m:number) {: n*m :}
number : Div(n:number, m:number) {: if m = 0 then assert false else n/m :}
number : Const(x: int) [1] {: x :}
number : Const(0) [0] {: 0 :}
-- Terminal variables are bound in cost expressions
str : Str(x: string) {: String.length x :} {: x :}
str : Cons(x: string, y:string) [2] {: x ^ y :}
-- recursive chain rules
-- "number" is an abbreviation for "number:number"
str : n:number [1] {: string_of_int n :}
number : str [1] {: int_of_string str :}
The example code is included in the distribution of OCamlBurg. You can find it also discussed here.
Formal Concept Analysis is a theory to study binary relations. A binary relation can be also represented as a cross table and hence, formal concept analysis can be thought of as a theory and tool to study cross tables. A formal concept corresponds to a maximum rectangle in such a cross table. These form a hierarchy which gives insight into the table.
Colibri/Concepts is a portable implementation in C. It requires no special libraries and should compile an almost any Unix systems. It comes with a manual page but assumes some general understanding of concept analysis.
Colibri/ML is a more recent implementation in Objective Caml. Its main strength is a better algorithm. In addition, it implements pattern mining. Two papers describing the algorithms and the mining are part of the distribution. The implementation is divided into a library and an application such that you can easily integrate it into your own project.
Colibri/Java is an efficient implementation of concept analysis in Java by Daniel Götzmann.
Colibri/ML and Colibri/Java are based on my papers Fast Concept Analysis and Mining Patterns and Violations Using Concept Analysis.
Ample is a defect localization tool for Java. From many passing and a single failing unit test it suggests a location for the defect that caused the unit test to fail. The paper Lightweight Defect Localization for Java explains how it works and how it stacked up against the competition. This is joint work with Valentin Dallmeier.
OCaml Annot (on Google Code) is a command-line application to parse type annotations produced by the OCaml compiler. Typically this is used from inside an editor to observe the inferred types for source code expressions.
This project was taken over by Anil Madhavapeddy anil@recoil.org who has published updates of OCaml Annot on GitHup.
Projects where I contributed some code:
GNU Data Display Debugger. Graph layouter and PostScript driver.
OCaml MySQL Binding. Initial implementation.
Lua-ML. An implementation of Lua 2.5 in Objective Caml; implementation of scanner and parser.
I designed the logos for the programming systems Standard ML of New Jersey, Mozart/Oz, and Gecode.

David Schuler, Valentin Dallmeier, and Christian Lindig. A Dynamc Birthmark for Java. 22nd IEEE/ACM International Conference on Automated Software Engineering (ASE 2007). PDF
Andrzej Wasylkowski, Andreas Zeller, Christian Lindig: Detecting Object Usage Anomalies, The 6th joint meeting of the European Software Engineering Conference and the ACM SIGSOFT Symposium on the Foundations of Software Engineering (ESEC/FSE), 2007. PDF
Christian Lindig: Mining Patterns and Violations Using Concept Analysis. Unpublished Manuscript. PDF
Abstract Large programs develop patterns in their implementation and behavior that can be used for defect mining. Previous work used frequent itemset mining to detect such patterns and their violations, which correlate with defects. However, frequent itemset mining gives much more attention to patterns than to the instances of these pattern. We are proposing a more general framework to understand and mine purely structural patterns and violations. By combining patterns and their instances into blocks, we gain access to the rich theory of formal concepts. This results in a novel geometric interpretation, which helps to understand previous mining approaches. Blocks form a hierarchy in which each block corresponds to a pattern and neighboring blocks to a violation. Furthermore, blocks may be computed efficiently and searched for violations. Using our open-source tool Colibri, we mined patterns and violations from five open-source projects in less than a minute each, including the Linux kernel.
Silvia Breu, Thomas Zimmermann, and Christian Lindig. HAM: Cross-Cutting Concerns in Eclipse, Eclipse Technology Exchange Workshop at OOPSLA 2006, USA. PDF
Silvia Breu, Thomas Zimmermann, and Christian Lindig. Aspect Mining for Large Systems (Demo), ACM SIGPLAN Int. Conf. on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA 2006), USA. PDF
Silvia Breu, Thomas Zimmermann, and Christian Lindig. Aspect Mining for Large Systems (Poster), ACM SIGPLAN Int. Conf. on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA 2006), USA. PDF
Silvia Breu, Thomas Zimmerman, and Christian Lindig. Mining Eclipse for Cross-Cutting Concerns. In Stephan Diehl and Harald Gall and Ahmed E. Hassan (Editors), International Workshop on Mining Software Repositories (MSR), May 2006. PDF
Thomas Zimmerman, Silvia Breu, Christian Lindig, and Benjamin Livshits. Mining Additions of Method Calls in ArgoUML (MSR Challenge 2006). In Stephan Diehl and Harald Gall and Ahmed E. Hassan (Editors), International Workshop on Mining Software Repositories (MSR), May 2006. PDF
Silvia Breu, Thomas Zimmerman and Christian Lindig. Mining Aspects from CVS Transactions using Concept Analysis. In Rainer Giminich and Volker Riediger and Andreas Winter, editors, 8. Workshop Software-Reengineering, May 2006. PDF
Reuben Olinksy, Christian Lindig, and Norman Ramsey. Staged Allocation: A Compositional Technique for Specifying and Implementing Procedure Calling Conventions. In Greg Morrisett and Simon Peyton Jones, editors, Conference Record of the 33rd Annual ACM Symposium on Principles of Programming Languages, ACM, 2006. PDF
Christian Lindig. Schwachstellensucher, iX -- Magazin für professionelle Informationstechnik, Volume 05 Number 09, August 2005.
Christian Lindig. Random Testing of C Calling Conventions. In Jong Deok Choi and Raimondas Lencevicius, editors, Sixth International Symposium on Automated and Analysis-Driven Debugging, ACM Press, Monterey, CA, USA, September 2005. PDF
Norman Ramsey, Simon Peyton Jones, and Christian Lindig. The C-- Language Specification Version 2.0, January 2005. PDF
Christian Lindig and Norman Ramsey. Declarative Composition of Stack Frames. In Evelyn Duesterwald, editors, Proc. of the 14th International Conference on Compiler Construction, Springer, LNCS 2985, 2004. PDF
Norman Ramsey and Christian Lindig. Unpublished: Custom Calling Conventions in a Portable Assembly Language, 2003. PDF
Christian Lindig. Fast Concept Analysis. In Gerhard Stumme, editors, Working with Conceptual Structures - Contributions to ICCS 2000, Shaker Verlag, Aachen, Germany, 2000. PDF
Christian Lindig. Algorithmen zur Begriffsanalyse und ihre Anwendung bei Softwarebibliotheken. PhD thesis, Technische Universität Braunschweig, D--38106 Braunschweig, Germany, November 1999. PDF
Christian Lindig and Gregor Snelting. Formale Begriffsanalyse im Software Engineering. In Gerhard Stumme and Bernhard Wille, editors, Begriffliche Wissensverarbeitung. Methoden und Anwendungen, Springer, 1999.
Christian Lindig. Analyse von Softwarevarianten. Informatik-Bericht 98-04, TU Braunschweig, Institut für Programmiersprachen und Informationssysteme, Abt. Softwaretechnologie", D-38106 Braunschweig, January 1998. PDF
Christian Lindig and Gregor Snelting. Assessing Modular Structure of Legacy Code Based on Mathematical Concept Analysis. Proceedings of the 1997 International Conference on Software Engineering, ACM Press, 1997. PDF
Christian Lindig. Komponentensuche mit Begriffen. Softwaretechnik '95, Gesellschaft für Informatik, Braunschweig, October 1995. PDF
Christian Lindig. Concept-Based Component Retrieval. In Jana Köhler and Fausto Giunchiglia and Cordell Green and Christoph Walther, editors, Working Notes of the IJCAI-95 Workshop: Formal Approaches to the Reuse of Plans, Proofs, and Programs, August 1995. PDF
Christian Lindig. Inkrementelle, rückgekoppelte Suche in Software-Bibliotheken Informatik-Bericht 94-07, Technische Universität Braunschweig, Institut für Programmiersprachen und Informationssysteme, Abteilung Softwaretechnologie, Gaussstraße 17,D-38106 Braunschweig, November 1994.
Valentin Dallmeier, Christian Lindig, and Andrzej Wasylkowski and Andreas Zeller. Mining Object Behavior with ADABU. In Neelam Gupta and Andy Podgurski, editors, WODA 2006: ICSE Workshop on Dynamic Analysis, May 2006. PDF
Valenting Dallmeier, Christian Lindig, and Andreas Zeller. Lightweight Defect Localization for Java. In Andrew Black, editors, Proc. 19th European Conference on Object-Oriented Programming (ECOOP 2005), Springer, LNCS 3586, 2005. PDF
Valentin Dallmeier, Christian Lindig, and Andreas Zeller. Evaluating a Lightweight Defect Localization Tool. In Bill Pugh and Jim Laraus, editors, Workshop on the Evaluation of Software Detection Tools (BUGS '05), June 2005. PDF
Christian Lindig, Valentin Dallmeier, and Andreas Zeller. 7th Workshop Software Reengineering: Lightweight Control-Flow Abstraction, Softwaretechnik-Trends, Volume 25 Number 2, May 2005. PDF
Valentin Dallmeier, Christian Lindig, and Andreas Zeller. Lightweight Bug Localization with AMPLE (Demo Paper). In Jong Deok Choi and Raimondas Lencevicius, editors, Sixth International Symposium on Automated and Analysis-Driven Debugging, ACM Press, Monterey, CA, USA, September 2005. PDF
Christian Lindig. Style---A practical Type Checker for Scheme. Informatik-Bericht 93-10, Technische Universität Braunschweig, Institut für Programmiersprachen und Informationssysteme, Arbeitsgruppe Softwaretechnologie, Gaussstrasse 17, D-38106 Braunschweig, October 1993.
Christian Lindig. Style---ein Typ-Checker für Scheme. Diploma Thesis, Technische Universität Braunschweig, Institut für Programmiersprachen und Informationssysteme, Arbeitsgruppe Softwaretechnologie, D-38106 Braunschweig, Gausstrasse 17, Germany, September 1993.