Efficient function composition with Truffle
    Timothy Baldridge 
    tbaldridge at gmail.com
       
    Sun Jan 20 20:52:43 UTC 2019
    
    
  
Something that I haven't figured out yet in my studies of Truffle, is the
best way to deal with higher-order functions in a Truffle language. Let's
say we have a function like comp from Clojure:
(defn comp [a b]
  (fn inner [x]
    (a (b x))))
The semantics here are fairly simple, comp takes two functions and composes
them. A problem in on the JVM (and I think in Truffle) is that these call
sites quickly become megamorphic. There may be thousands of functions in a
runtime, and so if comp is used a lot, the callsites in the inner function
(calls to a and b) have to become indirect.
This problem exists in may situations, for example with reduce:
(defn sum [coll]
  (reduce + 0 coll))
Reduce may be called in many places in the runtime, but in this specific
case, the callsite that invokes + can be monomorphic.
So what's the best way to code this sort of thing? Do I manually clone AST
trees that use higher-order-functions? Is there some sort of feature in
Truffle that allows me to say "duplicate this entire AST whenever this node
changes?"
Thanks,
Timothy Baldridge
    
    
More information about the graal-dev
mailing list