Software by Per Bothner

Here is a partial list of software of which I wrote the initial useable versions or otherwise major portions. I'm currently (2015) mostly spending time on Kawa and DomTerm.

JavaFX Script compiler

From 2007 to 2010 my day job was working on the compiler, runtime, and language definition of SUN's JavaFX Script language.


As technical lead for the Cygnus Java project, I did most of the design and wrote most of the early code for the compiler.


Kawa compiles the Scheme functional language to Java bytecodes. It is both a full-featured Scheme implementation, and a compiler toolkit for implementing other programming languages.


DomTerm is a combined terminal emulator and rich-text console written using JavaScript and DOM/HTML5 technologies.

Qexo aka Kawa-XQuery

Qexo ("Query Expressions for XML Object") is a project to implement XQuery, the W3C's new XML Query language. Qexo achieves high performance because a query is compiled down to Java bytecodes using Kawa.


A project to implement Emacs using Kawa, compiling Emacs Lisp to Java bytecodes.

QAlbum: Picture-group (digital photo) managing

I wrote some scripts useful for managing images, such as photographs downloaded from a digital camera. The original version used XSL; the current re-write uses XQuery. The idea of these scripts is that you write a "picture-group file", which is an XML file which describes a group of images. You then run a script which reads the picture-group file, and the script generates a series of html files: An overview page containing small images, plus one page for each picture. The advantage is that you just edit the picture-group file, tweak the scripts to your preference, and automatically get nice linked web pages.

Scripts for presentations (slides and papers): make-slides

I wrote some scripts that I'm using for paper and slide presentations. The make-slides script converts an XML file with <slide> elements containing HTML markup to a set of linked HTML pages with flexible navigation. Another script converts Docbook to LaTeX.

Bitstring Primitives

An efficient library for manipulating bit-strings, based an macro framework for iterating over bitstrings. Includes a complete implementation of one-dimensional "bitblt": that is all 16 bit-wise operations of two equal-length bitstrings, which need not be aligned and can overlap. This is included in libg++, or you can get just the bitprims source.

Chill Gcc front-end

Chill is the "CCITT [now ITU] HIgh-Level Language". It is a programming language similar to Modula-2 and Ada, and is still used in the tele-communications industry in various parts of the world. Cygnus wrote a Chill implementation based on Gcc. It was in the Gcc source tree until it was removed for lack of interest.


I wrote config.guess, a script to figure out the "canonical host triple" of a system. This make it easier to "configure" various GNU programs. It is now being maintainer by the current maintainers.


The C Pre-Processor library provides a library API to the functions of cpp, the C Pre-Processor. I wrote it in 1994-1995, but never had time to finish it, so it languished little-used in the Gcc source tree for years. (However, I was amused to find a copy in the Enlightenment sources.) Later, Zack Weinberg and others worked on making it a complete and efficient replacement for cpp.

Eterm: The Emacs Terminal Emulator

The term major mode for Emacs provides the full functionality of Shell mode combined with a complete standard ANSI terminal emulator. While I no longer maintain it, it is part of the standard Emacs and XEmacs distributions; other people have added features such as color support.

You can get the README, the TODO list, and an old version of the term.el source. (This is the most recent version I have personally worked on.)

rlfe: A readline front-end processor

The rlfe program (previously called fep) provides input line editing for any program. There are a number of similar front-ends; what distinguishes this one is that it monitors the state of the inferior pty, and if the inferior program switches its terminal to raw mode, then rlfe passes your characters through directly. This basically means you can run your entire session (including bash and terminal-mode emacs) under rlfe. Also worth noting is that rlfe uses GNU readline. This is alpha software, only tested on a few platforms. Grab the compressed archive here.


I wrote an integrated implementation of the C stdio interface and the C++ iostreams interface. This was picked up for the Linux version of libc.


The mkshadow programs makes a "shadow tree" of a directory tree. It logically copies all of the "MASTER" directory into ".". However, ordinary files, and RCS/SCCS directories are "copied" by creating a sybolic link to the corresponding file in MASTER. This program is inspired by the traditional X11 program lndir, but is better in various ways.

You can get the README or the source as a shell-script archive. It was also included in X11R6.

The Q language

Q was a programming language I developed for my dissertation, and enhanced in the years following. Lately, I have stopped work on Q, but I hope to implement some of the good ideas in the context of Kawa.

Note that Q is not being maintained, but the source code is available, and I still think it had some neat ideas.

Q is a very high-level programming language. Where APL uses arrays to avoid explicit looping, Q uses generalized sequences (finite or infinite, stored or calculated on demand). Q has lexical scoping, and some support for logical and constraint programming. Q can be compiled (into C++), or interpreted interactively. The syntax was designed to make it a convenient interactive command language. A macro facility together with primitives to run programs is used to make an interactive command language with full shell features. Q also provided various primitives to implement Scheme and Common Lisp.

You can find a quick overview here. You can browse the (quite incomplete) Q Reference manual. The article A Programming-Language Shell discusses the features of Q that make it a very high-level shell.

The source code is available for perusal, but getting it to run will be a challenge at this point!

Per Bothner