Lexing, parsing and type-checking have this in common: they can succeed or they can fail.
It is very easy to write tests to confirm the correctness of these stages. Much more difficult is to write tests for code-generation.
Even if a formal method is given which proves the correctness of a code-generation pass, it must still be tested for implementation errors.
Hence, THE PLAN:
Every code generation phase takes one form of intermediate language and produces the next.
To test Obelisk, a series of sample programs will be written, which under the semantics will produce a specific output for a specific input.
Then an interpreter must be written for every intermediate language. Each interpreter must be tested on all sample programs.
If an interpreter produces incorrect output when running a sample program, the compiler stage associated with that interpreter has a bug!
Writing several interpreters sounds like a lot of work, just for testing, but it's going to be easier than having to read through several thousand lines of code-generator every time erroneous behaviour is spotted.
23 July 2010
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment