ASTcentric logo
Note: The following text is a just a copy of a text I wrote in pure ASCII. It has only been formated. Also some spelling errors have been corrected.

Looking for a New Programming Paradigm
======================================

F.J. Elmer
4. March 2005

1. Problems
-----------

I'm a passionate Java programmer in my job and at home. My standard 
development environment is Eclipse 3 (also at my job and at home). 
I really appreciate the code completion and navigation features of 
Eclipse. Of course the most important feature of Eclipse is the 
refactoring tool. It allows to improve the code in a way which I 
never want to miss.

Nevertheless, I'm not satisfied the way to develop software. Below 
some topics are discussed.

1.1 Programming Errors
----------------------
They should be detected as early as possible. Eclipse's on-the-fly 
compilation helps a lot. But in a heterogenous environment errors 
are often detected only at runtime (e.g. a Web application developed 
with Java, JSP, Struts, and various configuration files). In my 
opinion this is a regression.

But even if you are developing only in one language there are still 
lots of possibilities to write syntactically correct code which 
breaks at runtime. A language and a compiler should be designed in 
such a way that errors are detectable as early as possible. Therefore
I like languages with strong types like Pascal and Java. Many 
scripting languages are not strongly typed (e.g. Python) which is 
fine just for experimenting or developing small tools but not 
for larger projects.

1.2 Comments
------------
Comments explain the code for humans. But often the comment is no 
longer reflecting the actual code. Eclipse shows errors in Javadoc 
of a method. But this works only for simple errors like wrong @param 
tags.

There should be a language which allows to write comments that could 
be checked by the compiler or which is a part of the language or 
which makes comments superfluous.

Formalizing pre- and post-conditions is a good examples for such 
types of comments. They are a part of Eifel. They can be added in 
Java with assert statements. Aspect-oriented programming is also a 
way to deal with these pre- and post-conditions. But there are two 
disadvantages: 
1. They are checked at runtime, not earlier! 
2. They are optional. That is, they may be or may be not specified 
   by the programmer.

1.3 Coding Standards
--------------------
For most programming languages the format of the code is not 
important. For example, in Java the code of a class can be filled in 
a single line or be wrapped in an arbitray way. But code has to be 
formated and layouted in a way that it is easy readable for humans. 
Especially the tree-like structure of code blocks should be visible. 
Some languages like Python use indentation as a part of the syntax 
to define code blocks. Nevertheless, there a various ways to format 
code. Formatting rules are usually part of a coding standard. They 
help to establish a consistent style of the code. This is especially 
important in projects with several programmers. A consistent look 
helps readability. In Eclipse formatting rules can be specified and 
applied to the code. 

But there is a problem with long statements. If they are not wrapped 
it is difficult to read because one has to scroll the text. Wrapping 
around comes in conflict with indentation. Usually wrapping 
indentation is choosen in such a way that it is hopefully 
distinguishable from block indentation.

2. Concepts
-----------

Some of the above mentioned problems have to do with the concepts of 
a programming language. For example, a language is strongly typed or 
not. A language is object-oriented, procedurale, functional, and/or 
declarative etc. I'm not discussing this aspect of a programming. 
I want to discuss the traditional concept of programming environment. 

The traditional way to create software is the following:
1. Write one or several text files (called source files) in one or 
   several programming languages (programming languages might be 
   mixed in a single source file).
2. Run a compiler to create an executable program. Sometimes a 
   linker should also be invoked. This process is often coordinated 
   by some make scripts. Ant has become a standard for doing this in 
   the Java world.
3. Run the executable program.

This is a text-centric paradigm. The software is a stream of 
characters. The source files are the master files from which the 
executable program can be (re)created.

What does the compiler? First, it parses the source file and creates 
a so-called abstract syntax tree (AST). By the way, there exists an 
Eclipse plugin which shows the AST of a Java source file. In a second 
step the executable code is created from the AST.

A new programming paradigm would be AST-centric. The master file is 
no longer a text but a the abstract syntax tree. The most important 
question is, how to create an AST? Eclipse with its on-the-fly 
compilation approaches this goal in the traditional way: The 
programmer writes some code and Eclipse interpretes the code as some 
kind of "commands" for AST editing. For example, entering '{' 
together with code completion creates a new subtree of a block 
statement in the AST. Since Eclipse 3 blocks can also be folded and 
unfolded like directories of a file system in a file browser.

Nevertheless, there are still to much freedom for a programmer (see 
coding standards). With this AST-centric view the question rises: Do 
they exists other ways to editing and visualizing an AST? 

Visual programming tries to do this in a less text-centric way. But 
in most cases these approaches didn't reach a level as powerful as the 
traditional paradigm of programming. Typical problems were the 
following: 
1. The AST visualization isn't complete. Some information is hidden 
   and visible only if one clicks on a visual element.
2. The AST visualization isn't as compact as a pure textual 
   representation.
3. Some parts of the AST are still represented as texts using some 
   syntax like in a traditional language.
4. It is difficult the edit an AST efficently compared to 
   traditional text editing.

Intentional programming is also an approach to edit an AST directly. 
It is an experimental system developed at Microsoft for a long time. 
Now the inventor Charles Simonyi has founded its own company. But you 
can not buy such a programming environment. It is used like Eclipse 
where entering a command in the traditional syntax of a text-centric 
language manipulates the AST. It seems to be more restrictive than 
Eclipse. But it is unclear whether it goes beyound what Eclipse 
already could. It is claimed that intentional programming captures 
the semantic intentions of the programmer better than Eclipse or the 
traditional text-centric paradigm.