LISP and Symbolic Computation

, Volume 2, Issue 1, pp 9–50 | Cite as

Mix: A self-applicable partial evaluator for experiments in compiler generation

  • Neil D. Jones
  • Peter Sestoft
  • Harald Søndergaard


The program transformation principle called partial evaluation has interesting applications in compilation and compiler generation. Self-applicable partial evaluators may be used for transforming interpreters into corresponding compilers and even for the generation of compiler generators. This is useful because interpreters are significantly easier to write than compilers, but run much slower than compiled code. A major difficulty in writing compilers (and compiler generators) is the thinking in terms of distinct binding times: run time and compile time (and compiler generation time). The paper gives an introduction to partial evaluation and describes a fully automatic though experimental partial evaluator, called mix, able to generate stand-alone compilers as well as a compiler generator. Mix partially evaluates programs written in Mixwell, essentially a first-order subset of statically scoped pure Lisp. For compiler generation purposes it is necessary that the partial evaluator be self-applicable. Even though the potential utility of a self-applicable partial evaluator has been recognized since 1971, a 1984 version of mix appears to be the first successful implementation. The overall structure of mix and the basic ideas behind its way of working are sketched. Finally, some results of using a version of mix are reported.


Operating System Artificial Intelligence Generation Time Generation Purpose Potential Utility 
These keywords were added by machine and not by the authors. This process is experimental and the keywords may be updated as the learning algorithm improves.


Unable to display preview. Download preview PDF.

Unable to display preview. Download preview PDF.


  1. 1.
    Aho, A. V., Sethi, R., and J. D. Ullman,Compilers: Principles, Techniques and Tools, Addison-Wesley, Reading, Massachusetts, 1986.Google Scholar
  2. 2.
    Beckman, L., Haraldsson, A., Oskarsson,:O., and Sandewall, E. A partial evaluator, and its use as a programming tool.Artificial Intelligence 7, 4 (1976), 319–357.Google Scholar
  3. 3.
    Bjørner, D., Ershov, A. P., and Jones, N. D. (Eds.).Partial Evaluation and Mixed Computation, Gl. Avernæs, Denmark, 1987. North-Holland, Amsterdam, 1988 (to appear).Google Scholar
  4. 4.
    Bondorf, A. Towards a self-applicable partial evaluator for term rewriting systems. In [3].Google Scholar
  5. 5.
    Bulyonkov, M. A. Polyvariant mixed computation for analyzer programs.Acta Informatica 21 (1984), 473–484.Google Scholar
  6. 6.
    Bulyonkov, M. A. A theoretical approach to polyvariant mixed computation. In [3].Google Scholar
  7. 7.
    Burstall, R. M., and Darlington, J. A transformational system for developing recursive programs.Journal of the ACM 24 (1977), 44–67.Google Scholar
  8. 8.
    Christiansen, H., and Jones, N. D. Control flow treatment in a simple semantics-directed compiler generator.Proc IFIP WG 2.2: Formal Description of Programming Concepts II (D. Bjørner, Ed.), North-Holland, Amsterdam, 1983, pp. 73–99.Google Scholar
  9. 9.
    Codish, M., and Shapiro, E. Compiling or-parallelism into and-parallelism. Proc. Third International Conference on Logic programming, London, United Kingdom, (E. Shapiro, Ed.),Lecture Notes in Computer Science, Vol. 225, Springer-Verlag, New York, 1986, pp. 283–297.Google Scholar
  10. 10.
    Consel, C. New insights into partial evaluation: the Schism experiment. ESOP'88, European Symp. on Programming, Nancy, France (H. Ganzinger, Ed.).Lecture Notes in Computer Science, Vol. 300, Springer-Verlag, New York, 1988, pp. 236–246.Google Scholar
  11. 11.
    Cousot, P., and Cousot, R. Abstract interpretation: a unified lattice model for static analysis of programs by construction or approximation of fixpoints. Proc. Fourth ACM Symp. Principles of Programming Languages, Los Angeles, California 1977, pp. 238–252.Google Scholar
  12. 12.
    Dybkjær, H. Parsers and partial evaluation: An experiment. DIKU student report No. 85-7-15, University of Copenhagen, Denmark, 1985.Google Scholar
  13. 13.
    Emanuelson, P., and Haraldsson, A. On compiling embedded languages in Lisp. Proc. 1980 Lisp Conference, Stanford, California, 1980, pp. 208–215.Google Scholar
  14. 14.
    Ershov, A. P. On the essence of compilation.Formal Description of Programming Concepts (E. J. Neuhold, Ed.). North-Holland, Amsterdam, 1978, pp. 391–420.Google Scholar
  15. 15.
    Ershov, A. P. Mixed computation: Potential applications and problems for study.Theoretical Computer Science 18 (1982), 41–67.Google Scholar
  16. 16.
    Fujita, H., and Furukawa, K. A self-applicable partial evaluator and its use in incremental compilation.New Generation Computing 6 (2, 3), (June 1988) (to appear).Google Scholar
  17. 17.
    Fuller, D. A., and Abramsky, S. Mixed computation of Prolog programs.New Generation Computing 6 (2, 3) (June 1988) (to appear).Google Scholar
  18. 18.
    Futamura, Y. Partial evaluation of computation process—an approach to a compiler-compiler.Systems, Computers, Controls 2 (5) (1971), 45–50.Google Scholar
  19. 19.
    Futamura, Y. Partial computation of programs. Proc. RIMS Symp. Software Science and Engineering (E. Goto et al., Eds.).Lecture Notes in Computer Science, Vol. 147, Springer-Verlag, 1983, pp. 1–35.Google Scholar
  20. 20.
    Gallagher, J. Transforming logic programs by specialising interpreters. ECAI-86, Proc. 7th European Conference on Artificial Intelligence, 1986, pp. 109–122.Google Scholar
  21. 21.
    Ganzinger, H., and Jones, N. D. (Eds.). Programs as Data Objects, Copenhagen, Denmark.Lecture Notes in Computer Science, Vol. 217. Springer-Verlag, New York, 1986.Google Scholar
  22. 22.
    Haraldsson, A. A partial evaluator, and its use for compiling iterative statements in Lisp. Proc. Fifth ACM Symp. Principles of Programming Languages, Tucson, Arizona, 1978, pp. 195–202.Google Scholar
  23. 23.
    Heering, J. Partial evaluation and ω-completeness of algebraic specifications.Theoretical Computer Science 43 (1986), 149–167.Google Scholar
  24. 24.
    Hoare, C. A. R., and Allison, D. Incomputability.Computing Surveys 4 (3) (1972), 169–178.Google Scholar
  25. 25.
    Jones, N. D. Automatic program specialization: A re-examination from basic principles. In [3].Google Scholar
  26. 26.
    Jones, N. D., Sestoft, P., and Søndergaard, H. An experiment in partial evaluation: The generation of a compiler generator. Rewriting Techniques and Applications, Dijon, France (J.-P. Jouannaud, Ed.).Lecture Notes in Computer Science, 202. Springer-Verlag, New York, 1985, pp. 124–140.Google Scholar
  27. 27.
    Jørring, U., and Scherlis, W. L. Compilers and staging transformations. Proc. Thirteenth ACM Symp. Principles of Programming Languages, St. Petersburg, Florida, 1986, pp. 86–96.Google Scholar
  28. 28.
    Kahn, K. M. A partial evaluator of Lisp programs written in Prolog. Proc. First Int. Logic Programming Conf., Marseille, France, 1982 (M. Van Caneghem, Ed.), pp. 19–25.Google Scholar
  29. 29.
    Kahn, K. M., and Carlsson, M. The compilation of Prolog programs without the use of a Prolog compiler. Proc. Int. Conf. Fifth Generation Computer Systems, Tokyo, Japan, 1984, pp. 348–355.Google Scholar
  30. 30.
    Kleene, S. C.Introduction to Metamathematics, Van Nostrand, New York, 1952.Google Scholar
  31. 31.
    Komorowski, H. J. A Specification of an Abstract Prolog Machine and its Application to Partial Evaluation.Linköping Studies in Science and Technology Dissertations Vol. 69. University of Linköping, Sweden, 1981.Google Scholar
  32. 32.
    Kugler, H.-J. (Ed.),Information Processing 86, Proc. IFIP 86 Conf. North-Holland, Amsterdam, 1986.Google Scholar
  33. 33.
    Lee, P., and Pleban, U. A realistic compiler generator based on high-level semantics. Proc. Fourteenth ACM Symp. Principles of Programming Languages, Munich, FRG, 1987, pp. 284–295.Google Scholar
  34. 34.
    Lloyd, J. W., and Shepherdson, J. C. Partial evaluation in logic programming, Technical Report CS-87-09, Department of Computer Science, University of Bristol, England, 1987.Google Scholar
  35. 35.
    Lombardi, L. A. Incremental computation.Advances in Computers Vol. 8, (F. L. Alt and M. Rubinoff, Ed.), Academic, New York, 1967, pp. 247–333.Google Scholar
  36. 36.
    Lombardi, L. A., and Raphael, B. Lisp as the language for an incremental computer. InThe Programming Language Lisp: Its Operation and Application (E. C. Berkeley and D. G. Bobrow, Eds.). MIT Press, Cambridge, Massachusetts, 1964, pp. 204–219.Google Scholar
  37. 37.
    Mogensen, T. The Application of Partial Evaluation to Ray-Tracing. Master's thesis, University of Copenhagen, Denmark, 1986.Google Scholar
  38. 38.
    Mogensen, T. Partially static structures in a self-applicable partial evaluator. In [3].Google Scholar
  39. 39.
    Mosses, P. D. SIS—Semantics Implementation System, Reference Manual and User Guide, DAIMI Report MD-30, University of Aarhus, Denmark, 1979.Google Scholar
  40. 40.
    Paulson, L. A semantics-directed compiler generator. Proc. Ninth ACM Symp. Principles of Programming Languages, Albuquerque, New Mexico, 1982, pp. 224–233.Google Scholar
  41. 41.
    Rogers, H.Theory of Recursive Functions and Effective Computability. McGraw-Hill, New York, 1967.Google Scholar
  42. 42.
    Romanenko, S. A compiler generator produced by a self-applicable specializer can have a surprisingly natural and understandable structure. In [3].Google Scholar
  43. 43.
    Safra, S., and Shapiro, E. Meta interpreters for real. In [32] pp. 271–278.Google Scholar
  44. 44.
    Sestoft, P. The structure of a self-applicable partial evaluator. In [21] pp. 236–256.Google Scholar
  45. 45.
    Sestoft, P. Automatic call unfolding in a partial evaluator. In [3].Google Scholar
  46. 46.
    Sestoft, P., and Søndergaard, H. A bibliography on partial evaluation.SIGPLAN Notices 23 (2) (February 1988), 19–27.Google Scholar
  47. 47.
    Sestoft, P., and Zamulin, A. V. Annotated bibliography on partial evaluation and mixed computation. In [3].Google Scholar
  48. 48.
    Takeuchi, A., and Furukawa, K. Partial evaluation of Prolog programs and its application to meta programming. In [32] pp. 415–420.Google Scholar
  49. 49.
    TsNIPIASS.Bazisnyi Refal i yego Realizatsiya na Vychislitelnykh Mashinakh. TsNIPIASS, Gosstroi SSSR, Moscow, 1977.Google Scholar
  50. 50.
    Turchin, V. F. A supercompiler system based on the language Refal.SIGPLAN Notices 14 (2) (1979), 46–54.Google Scholar
  51. 51.
    Turchin, V. F., Nirenberg, R. M., and Turchin, D. V. Experiments with a supercompiler. Proc. 1982 ACM Symp. Lisp and Functional Programming, Pittsburgh, Pennsylvania, 1982, pp. 47–55.Google Scholar
  52. 52.
    Venken, R. A Prolog meta-interpreter for partial evaluation and its application to source to source transformation and query-optimisation.Proc. ECAI-84, Pisa, Italy (T. O'Shea, Ed.), North-Holland, Amsterdam, 1984, pp. 91–100.Google Scholar
  53. 53.
    Vickers, T. Quokka: A translator generator using denotational semantics.Australian Computer Journal 18 (1) (1986), 9–17.Google Scholar
  54. 54.
    Wand, M. From interpreter to compiler: A representational derivation. In [21] pp. 306–324.Google Scholar
  55. 55.
    Warren, D. Implementing Prolog—Compiling Predicate Logic Programs, DAI Research Report 39-40, University of Edinburgh, Scotland, 1977.Google Scholar
  56. 56.
    Watt, D. A. Executable semantic descriptions.Software—Practice and Experience 16 (1) (1986), 13–43.Google Scholar

Copyright information

© Kluwer Academic Publishers 1989

Authors and Affiliations

  • Neil D. Jones
    • 1
  • Peter Sestoft
    • 1
  • Harald Søndergaard
    • 1
  1. 1.DIKUUniversity of CopenhagenCopenhagen ØDenmark

Personalised recommendations