Lambda lifting: transforming programs to recursive equations
Proc. of a conference on Functional programming languages and computer architecture
Compilers: principles, techniques, and tools
Compilers: principles, techniques, and tools
An introduction to fully-lazy supercombinators
Proc. of the thirteenth spring school of the LITP on Combinators and functional programming languages
From interpreter to compiler: a representational derivation
on Programs as data objects
Continuation-passing, closure-passing style
POPL '89 Proceedings of the 16th ACM SIGPLAN-SIGACT symposium on Principles of programming languages
Automatic autoprojection of recursive equations with global variable and abstract data types
Science of Computer Programming
A tour of Schism: a partial evaluation system for higher-order applicative languages
PEPM '93 Proceedings of the 1993 ACM SIGPLAN symposium on Partial evaluation and semantics-based program manipulation
Space-efficient closure representations
LFP '94 Proceedings of the 1994 ACM conference on LISP and functional programming
Lambda, the ultimate label or a simple optimizing compiler for Scheme
LFP '94 Proceedings of the 1994 ACM conference on LISP and functional programming
Object-oriented programming in the BETA programming language
Object-oriented programming in the BETA programming language
Lightweight closure conversion
ACM Transactions on Programming Languages and Systems (TOPLAS)
Modern compiler implementation in Java
Modern compiler implementation in Java
ACM SIGPLAN Notices
Lambda-dropping: transforming recursive equations into programs with block structure
Theoretical Computer Science - Partial evaluation and semantics-based program manipulation
The Java Language Specification
The Java Language Specification
Proceedings of the 4th Fuji International Symposium on Functional and Logic Programming
FLOPS '99 Proceedings of the 4th Fuji International Symposium on Functional and Logic Programming
Partial Evaluation for Class-Based Object-Oriented Languages
PADO '01 Proceedings of the Second Symposium on Programs as Data Objects
Specification and Correctness of Lambda Lifting
SAIG '00 Proceedings of the International Workshop on Semantics, Applications, and Implementation of Program Generation
Towards Automatic Specialization of Java Programs
ECOOP '99 Proceedings of the 13th European Conference on Object-Oriented Programming
An Extensional Characterization of Lambda-Lifting and Lambda-Dropping
FLOPS '99 Proceedings of the 4th Fuji International Symposium on Functional and Logic Programming
Automated Generalisation of Function Definitions
FLOPS '99 Proceedings of the 4th Fuji International Symposium on Functional and Logic Programming
LFP '84 Proceedings of the 1984 ACM Symposium on LISP and functional programming
Super-combinators a new implementation method for applicative languages
LFP '82 Proceedings of the 1982 ACM symposium on LISP and functional programming
The Implementation of Functional Programming Languages (Prentice-Hall International Series in Computer Science)
SIMULA 67 common base language, (Norwegian Computing Center. Publication)
SIMULA 67 common base language, (Norwegian Computing Center. Publication)
Science of Computer Programming
Termination analysis of higher-order functional programs
APLAS'05 Proceedings of the Third Asian conference on Programming Languages and Systems
Hi-index | 0.01 |
Lambda-lifting is a program transformation used in compilers and in partial evaluators and that operates in cubic time. In this article, we show how to reduce this complexity to quadratic time.Lambda-lifting transforms a block-structured program into a set of recursive equations, one for each local function in the source program. Each equation carries extra parameters to account for the free variables of the corresponding local function and of all its callees. It is the search for these extra parameters that yields the cubic factor in the traditional formulation of lambda-lifting, which is due to Johnsson. This search is carried out by a transitive closure.Instead, we partition the call graph of the source program into strongly connected components, based on the simple observation that all functions in each component need the same extra parameters and thus a transitive closure is not needed. We therefore simplify the search for extra parameters by treating each strongly connected component instead of each function as a unit, thereby reducing the time complexity of lambda-lifting from O(n3 log n) to O(n2 log n), where n is the size of the program.Since a lambda-lifter can output programs of size O(n2), we believe that our algorithm is close to optimal.