SourceForge.net LogoThe Eiffel Compiler / Interpreter (tecomp)

doc/tecomp/history

History

Latest SVN repository (trunk)

Lexical

It is now enforced that class names must be in uppercase and feature names in lower case (except the first character).

Evolution

Version 0.24.1 (r477 21.1.2011)

Bugfixes

The class STRING now inherits from COMPARABLE.

Version 0.24 (r464 10.10.2010)

New features

Simplified void safety syntax implemented

A simplified syntax for void safety has been implemented which replaces the more verbose old syntax

 
    exp:     detachable E
    anc_exp: detachable E_ANCESTOR  -- conformant
 
    -- old syntax
    check attached exp as x  then
       x.some_feature
    end
    check attached {E} anc_exp as x then
       x.some_feature
    end
 
    -- new syntax
    exp.attached.some_feature
    anc_exp.attached{E}.some_feature
 
 

If `exp' is not attached to an object or `anc_exp' is not attached to an object of type E, an exception is thrown, i.e. the semantics is the same as with the old syntax, the syntax is more concise.

For more details see the white paper at http://tecomp.sourceforge.net -> white papers -> language discussion -> improved void safety.

Version 0.23 (r458 17.9.2010)

Incompatible changes

New features

Gnu build system introduced

The Eiffel compiler is now built with the GNU build system in order to be more robust for different environments. Therefore the building and installing of tecomp is now different. Please read "doc/tecomp/installation.txt" to build tecomp.

Compilier binary and standard libraries are now installed

The Eiffel compiler will be installed by `make install'. The location can be chosen by `configure'. The default location is `/usr/local/bin'.

The libraries which come with `tecomp' will be installed (default location `usr/local/lib/eiffel', but location can be configured with `configure --prefix=xxxx') and tecomp is preconfigured to search for the libraries at the proper location. The kernel library is now implicitely included.

New cluster concept implemented

The new cluster concept described in the white paper at http://tecomp.sourceforge.net -> white papers -> language discussion has been implemented. It restricts visibility of classes and allows resolution of class name clashes.

An introduction to the new concept including the simplification of the ace files can be found on http://tecomp.sourceforge.net -> tecomp -> ace file as well.

With the new cluster concept, libraries can have their own ace file describing all needed other libraries. The Eiffel classes uses by a library are not visible within the main program (unless explicitely mentioned there).

Each library has an own view of the classes. Duplicate class names are possible as long as there is only one class with the same name in a view.

A rename facility to avoid the remaining name clashes has been introduced.

Small Eiffel programs simplified significantly

Small Eiffel programs don't need an ace file any more. All classes needed by the program can be included in one main eiffel file.

The root class is not necessary any more, only the root procedure.

In the main Eiffel file a standard unix method of

   #! /usr/bin/env tecomp

as first line can be added to make the file executable (don't forget the chmod!!).

With that the smallest executable Eiffel program looks like

  #! /usr/bin/env tecomp
  do
     print("Hello world.%N")
  end
 

The main eiffel file has the syntax

   Main_eiffel_file: [Ace_section] {Eiffel_class ... }+
   Eiffel_class: Normal_eiffel_class | Implicit_root_class
   Normal_eiffel_class: "class" ... "end"
   Implicit_root_class: ["feature" ... "end"] 
                        ["local" ...] 
                        "do" 
                           Compound 
                        "end"
   Rule: Only one implicit root class is possible

Kernel library

Bugfixes

Others

Version 0.22 (r416 27.4.2010)

New features

Bugfixes

Version 0.21 (21.12.2009)

New features

Bugfixes

Version 0.20 (3.11.2009)

Bugfixes and improvements

Version 0.19 (10.9.2009)

New features

Bugfixes

Version 0.18.1 (8.6.2009)

Bugfix: in version 0.18 target conversion has been introduced. Due to a bug, version 0.18 did not validate operator expressions with binary operators. In case of undetected but invalid Eiffel code, runtime crashes could happen.

Version 0.18 (3.6.2009)

New features

Bugfixes

Version 0.17 (7.5.2009)

New features

Manifest arrays

   a: ARRAY[INTEGER]
   ...
   a := <<1, 2, 3, 4, 5>>
 

Initialized attributes

   class C feature
     a: ARRAY[INTEGER]
        attribute
           create Result.make (1,100)
        end
   end
 

"twin" added as synonym for "cloned"

Notes added

   note
      author: "Micky Mouse"
      release: 100
   class 
      C 
   feature
      ...
   end
 

Bugfixes

Version 0.16 (27.4.2009)

   class MY_EXCEPTION inherit DEVELOPER_EXCEPTION end
 
   class HANDLER inherit EXCEPTION_MANAGER feature
      raise_my_exception
         do
           (create {MY_EXCEPTION}).raise
         end
 
      raise_precondition
         require
            False
         do
         end
 
      test_exceptions
         local
            i:INTEGER
         do
            if      i = 0 then 
                raise_my_exception
            else if i = 1 then 
                 raise_precondition
            end
         rescue
            check i <= 1 end
            check i = 0 implies {e1:MY_EXCEPTION}           exception end
            check i = 1 implies {e2:PRECONDITION_VIOLATION} exception end
            check i = 1 implies {e: ASSERTION_VIOLATION}    exception end
            i := i + 1
            retry
         end
   end
 

Available exception classes in the kernel library

Version 0.15 (10.4.2009)

Features

Basic exception handling implemented. Each procedure can have a rescue clause. The rescue clause can either fall through or trigger a retry of the procecure.

Exception as classes are not yet implemented. Exceptions occuring in old expressions are not yet handled properly.

If a program does not handle an exception an exception trace is written at the end of the program.

1. Performance improvement

Version 0.14 (30.3.2009)

Features

Some bugfixes

Improvements

Version 0.13 (23.3.2009)

Inline agents available

A call agent is an object which represents a call to an existing feature. An inline agent defines the represented feature call inline. An inline agent represents an anonymous feature of the current type. E.g.

  incrementor: FUNCTION[like Current, TUPLE[INTEGER], INTEGER]
  ...
  incrementor := agent (i:INTEGER): INTEGER do
                     Result := i + 1
                 end
  check
    incrementor.item([1]) = 2 
    incrementor.item([2]) = 3
  end

Some bugfixes

Version 0.12 (18.3.2009)

Anchored types completed

An anchored type can now be "like other_feature" as well (beside the type "like Current").

Call agents

In the last release (0.11) call agents could not be defined with unqualified calls. This restriction has been removed.

Version 0.11 (9.3.2009)

Call agents implemented

Call agents are objects which represent routines. In order to create an agent which adds 2 to every integer value simply write

   agent {INTEGER}.plus(2)

or

   agent (2).plus(?)

Both agents are of the type FUNCTION[INTEGER,TUPLE[INTEGER],INTEGER].

   a: FUNCTION[INTEGER,TUPLE[INTEGER],INTEGER]
   ...
   a := agent {INTEGER}.plus(2)
   check
       a.item([1]) = 3
   end

Parenthesized target (|expression|).some_feature is no longer necessary

(expression).some_feature is sufficient (e.g. (1).plus(3) ).

Version 0.10 (25.2.2009)

Example

   inspect
      expression
   when 1, 5, 7, 101.200 then
      ...
   when 2, 3, 201..300  then
      ...
   else
      ..
   end

The inspect expression can be of type INTEGER (or sized variants), CHARACTER, STRING.

The when parts consist only of constants (single value or interval in any order) with a type consistent with the inspect expression. Duplicates and overlaps are not allowed (validated at compile time).

The else part is optional. If the multibranch statement does not have an else part, one of the when parts have to be entered. If not an exception will be raised at runtime.

Version 0.9 (6.2.2009)

Assigner calls are useful to make assignments of array elements more readable:

  local
     a: ARRAY[STRING]
  do
     create a.make(0,9)
     a[0] := "Hello world."
     a[1] := "Africa"
  end

Every query can have an associated assigner command, e.g.

 class D feature
   q(a:A): R  assign c
      do ... end
   c(val:R; a:A)
      do ... end
 end

With that the statement

  d.q(a) := val

is just a shorthand for

  d.c(val,a)

Version 0.8 (22.1.2009)

Tecomp has a correct garbage collector in its virtual machine, i.e. the collector reclaims all objects which are no longer reachable (as opposed to a conservative collector which might not collect all not reachable objects).

You can control the collection by specifying the maximum heap space that can be used by the program, e.g.

  tecomp -sh3K -ws1 acefile

allows for 3 Kilobytes of heapspace. The option -ws1 writes staticstics with level 1. If you ask for the statistics you will get at the end of the execution statistics about the garbage collection, e.g.

	garbage collection cycles: 12
	objects allocated 452(19101B)
	        reclaimed 407(16762B)
	        per cycle 33(1396B)

Valid forms of the option -sh are -sh3500, -sh4K, -sh20M.

Version 0.7 (12.1.2009)

Version 0.6.1 (16.12.2008)

       class 
           C
       create
           make
       convert
           make ( {T} )
       feature
           make (t: T)  do ... end
       ...
       end
 
       local
          t: T;  c: C
       do
          ...
          c := t      -- equivalent to c := create {C}.make(t)
       end
 
       local
          i: INTEGER
	  c: C
       do
          ...
	  if i.type = {INTEGER} then
	     ...
	  else if c.type >= {BASE_TYPE} then 
	      -- equivalent to c.type.conforms_to({BASE_TYPE})
 	      -- because types have a partial ordering 
	     ...
	  end
       end
 

Version 0.5 (11.11.2008)

       local
          t1: TUPLE[INTEGER,INTEGER,CHARACTER,STRING]    -- unlabelled tuple
	  t2: TUPLE[i,j:INTEGER; c:CHARACTER; s:STRING]  -- labelled tuple
	  t3: TUPLE                                      -- empty tuple
	  i,j:INTEGER
       do
          t1 := [1, 2, 'a', "blabla", 200, 300] -- longer tuples conform to
                                                -- shorter ones
          t2 := t1   -- labels are irrelevant for conformance
	  t3 := t2
	  if t2.i < t2.j then ... else ... end
	  if {ot:TUPLE[i,j:INTEGER]} t3 then
	      i := ot.i
	      j := ot.j
	  end
       end

Version 0.4 (25.9.2008)

     local x: ?T 
     do 
       ...
       x := expression_returning_detachable
       if x /= Void 
          and then x.some_query  -- valid because x is not void
       then
          x.some_routine         -- valid because x is not void
       else
          x.some_other_routine   -- invalid, x is not safely attached
       end
       ...
       if {y:T} expression_returning_detachable
          and then y.some_query  -- valid because y is within scope
       then
          y.some_routine         -- valid because y is within scope
       else
          y.some_other_routine   -- invalid, y used out of scope
       end
     end
     count: INTEGER    -- number or elements in the list
     extend_rear(el: G)
        do
           ...
	ensure
	   count = old count + 1  -- old count refers to the value of count
	   	       	          -- at the entry point of the routine
	end

Version 0.3 (30.8.2008)

Particularly the features {ANY}.out and {ANY}.print together with the feature "+" of STRING are very useful. Instead of writing

  io.put_string("i = ")
  io.put_integer(i)
  io.put_string("%Tc = ")
  io.put_character(c)
  io.put_new_line

you can now achieve the same output with

  print ( "i = " + i.out + "%Tc = " + c.out + "%N" )

Version 0.2 (9.7.2008)

Version 0.1.2 (2nd beta, 18.6.2008)

         "This is a string %
         %dispersed over %
	 %more than one line."
         "This is a string dispersed over more than one line."
         "[
             This is a verbatim
	     string.
	     It represents 3 lines.
          ]"
        "This is a verbatim%Nstring.%NIt represents 3 lines.%N"

Version 0.1.1 (1st beta, 8.6.2008)

First beta release. Basic Eiffel language mechanisms and virtual machine implemented.

 Local Variables: 
 mode: outline
 coding: iso-latin-1
 outline-regexp: "=\\(=\\)*"
 fill-column: 65
 End:
Table of contents

- Latest SVN repository (trunk)

- Lexical

- Evolution

- Version 0.24.1 (r477 21.1.2011)

- Bugfixes

- Version 0.24 (r464 10.10.2010)

- New features

- Simplified void safety syntax implemented

- Version 0.23 (r458 17.9.2010)

- Incompatible changes

- New features

- Gnu build system introduced

- Compilier binary and standard libraries are now installed

- New cluster concept implemented

- Small Eiffel programs simplified significantly

- Kernel library

- Bugfixes

- Others

- Version 0.22 (r416 27.4.2010)

- New features

- Bugfixes

- Version 0.21 (21.12.2009)

- New features

- Bugfixes

- Version 0.20 (3.11.2009)

- Bugfixes and improvements

- Version 0.19 (10.9.2009)

- New features

- Bugfixes

- Version 0.18.1 (8.6.2009)

- Version 0.18 (3.6.2009)

- New features

- Bugfixes

- Version 0.17 (7.5.2009)

- New features

- Manifest arrays

- Initialized attributes

- "twin" added as synonym for "cloned"

- Notes added

- Bugfixes

- Version 0.16 (27.4.2009)

- Version 0.15 (10.4.2009)

- Features

- 1. Performance improvement

- Version 0.14 (30.3.2009)

- Features

- Some bugfixes

- Improvements

- Version 0.13 (23.3.2009)

- Inline agents available

- Some bugfixes

- Version 0.12 (18.3.2009)

- Anchored types completed

- Call agents

- Version 0.11 (9.3.2009)

- Call agents implemented

- Parenthesized target (|expression|).some_feature is no longer necessary

- Version 0.10 (25.2.2009)

- Version 0.9 (6.2.2009)

- Version 0.8 (22.1.2009)

- Version 0.7 (12.1.2009)

- Version 0.6.1 (16.12.2008)

- Version 0.5 (11.11.2008)

- Version 0.4 (25.9.2008)

- Version 0.3 (30.8.2008)

- Version 0.2 (9.7.2008)

- Version 0.1.2 (2nd beta, 18.6.2008)

- Version 0.1.1 (1st beta, 8.6.2008)


ip-location