TODO LIST
Note that this list is old, and not really maintained anymore.
For more information on any of these issues see our
contacts page.
mode analysis
- fix various bugs in mode inference:
need to fix it to work properly in the presence of functions;
also need to change normalise_inst so that it handles complicated
insts such as `list_skel(any)'.
- extend the mode system to allow known aliasing.
This is needed to make partially instantiated modes and unique modes work.
[supported on the "alias" branch, but there were some serious
performance problems... has not been merged back into the main
branch]
determinism analysis
- add functionality for promise exclusive declarations:
- add error checking and type checking as for assertions
- include declaration information in the module_info
- take into account mutual exclusivity from promise_exclusive
and promise_exclusive_exhaustive declarations during switch
detection
- take into account exhaustiveness from promise_exhaustive and
promise_exclusive_exhaustive declarations during
determinism analysis
unique modes
- handle nested unique modes
- we will probably need to extend unique modes a bit,
in as-yet-unknown ways; need more experience here
module system
- check that the interface for a module is type-correct
independently of any declarations or imports in the implementation
section
- there are some problems with nested modules (see the language
reference manual)
C interface
- exporting things for manipulating Mercury types from C
- need to deal with memory management issues
code generation
- take advantage of unique modes to do compile-time garbage collection
and structure reuse.
back-ends
low-level (LLDS) back-end
- support accurate garbage collection
high-level C back-end
- finish off support for accurate garbage collection;
see the comments in compiler/ml_elim_nested.m
- see also the comments in compiler/ml_code_gen.m
debugger
- support back-ends other than LLDS
- allow interactive queries to refer to values generated by
the program being debugged
- trace semidet unifications
Unicode
- allow alternative external encodings, particularly iso-8859-1
- consistent and robust handling of invalid strings
(overlong sequences, unpaired surrogates, etc.)
- add analogue of wcwidth and make some formatting procedures use it
- io.putback_char depends on multiple pushback in ungetc for
code points > 127
WISH LIST
type-system
- allow construct.construct/3 to work for existential types
- remove limitation that higher-order terms are monomorphic.
i.e. allow universal quantifiers at the top level of
higher-order types, e.g. :- pred foo(all [T] pred(T))..
- constructor classes
- allow a module exporting an abstract type to specify that other modules
should not be allowed to test two values of that type for equality (similar
to Ada's limited private types). This would be useful for e.g. sets
represented as unordered lists with possible duplicates.
[this is a subset of the functionality of type classes]
- subtypes?
- optimisation of type representation and manipulation (possibly
profiler guided)
- fold/unfolding of types
mode analysis
- split construct/deconstruct unifications into their atomic
"micro-unification" pieces when necessary.
(When is it necessary?)
- extend polymorphic modes,
e.g. to handle uniqueness polymorphism (some research issues?)
- handle abstract insts in the same way abstract types are handled
(a research issue - is this possible at all?)
- implement `willbe(Inst)' insts, for parallelism
- mode segments & high-level transformation of circularly moded programs.
determinism analysis:
higher-order preds:
- implement single-use higher-order predicate modes.
Single-use higher-order predicates would be allowed to bind curried
arguments, and to have unique modes for curried arguments.
- allow taking the address of a predicate with multiple modes
[we do allow this in case where the mode can be determined from
the inst of the high-order arguments]
- improve support for higher-order programming, eg. by providing
operators in the standard library which do things like:
- compose functions
- take a predicate with one output argument and treat it like a function.
ie. :- func (pred(T)) = T.
source-level transformations
- more work on module system, separate compilation, and the multiple
specialisation problem
- transform non-tail-recursive predicates into tail-recursive form
using accumulators. (This is already done, but not enabled by
default since it can make some programs run much more slowly.
More work is needed to only enable this optimization in cases
when it will improve performance rather than pessimize it.)
- improvements to deforestation / partial deduction
code generation:
- stack allocation of structures
LLDS back-end:
- inter-procedural register allocation
- other specializations, e.g. if argument is known to be bound to
f(X,Y), then just pass X and Y in registers
- reduce the overhead of higher-order predicate calls (avoid copying
the real registers into the fake_reg array and back)
- trim stack frames before making recursive calls, to minimize stack usage
(this would probably be a pessimization much of the time - zs)
and to minimize unnecessary garbage retention.
garbage collection
- implement liveness-accurate GC
- implement incremental GC
- implement generational GC
- implement parallel GC
- implement real-time GC
compilation speed
- improve efficiency of the expansion of equivalence types (currently O(N^2))
(e.g. this is particularly bad when compiling live_vars.m).
- improve efficiency of the module import handling (currently O(N^2))
- use "store" rather than "map" for the major compiler data structures
better diagnostics
- optional warning for any implicit quantifiers whose scope is not
the entire clause (the "John Lloyd" option :-).
- give a better error message for the use of if-then without else.
- give a better error message for the use of `<=' instead of `=<'
(but how?)
- give a better error message for type errors involving higher-order pred
constants (requested by Bart Demoen)
- give better error messages for syntax errors in lambda expressions
general
- coroutining and parallel versions of Mercury
- implement streams (need coroutining at least)
- implement a very fast turn-around bytecode compiler/interpreter/debugger,
similar to Gofer
[not-so-fast bytecode compiler done, but bytecode interpreter
not implemented]
- support for easier formal specification translation (eg a Z library,
or Z to Mercury).
- implement a source visualisation tool
- distributed Mercury
- improved development environment
- additional software engineering tools
- coverage analysis
- automatic testing
- literate Mercury
- implement a GUI library (eg Hugs - Fudgets)
- profiling guided optimisations
- use profiling information to direct linker for optimal
code placement (Alpha has a tool for this).
- use of attribute grammar technology
(including visit sequence optimization)
to implement code with circular modes