Basics ====== Simple and easy structure, includes tests with results pre- and post-optimization, good for comparing, via e.g. diff. Good README file, points exactly to the changes made in the distribution. Understandability: ================== The explanation in the README file was of high-level, but could have been even a bit higher, for example, explaining how each of the attributes/functions introduced was necessary for each of the "steps" required in the assignment. Techniques/interesting points: ============================== We think that fundamentally the techniques used are similar to the ones we used (get/set/withCache, getGlobal, using mappings from identifiers to contexts, etc.). We found two points in the implementation particularly interesting, and that could be useful to us: - Placing the static-link cache "before" the stack frame of a function, just together with the parameters. This avoids having to readjust the offsets of local variables. - Using the wrapSLCacheLoader function around a Call_ construct, which handles the "unwinding" of the stack after the call is finished. We dealed with the return construct separately. Improvements: ============================== - The cache includes variables of the immediate outer scope and also the variables that are used just once. Both were requirements of the assignment. - The function cacheVars includes copy-paste code which could have been avoided by defining the function as an attribute and using the UUAG copy-rules. Defining this function as an attribute (or rather a combination of an inh and syn attr) would have made the improvements mentioned above possible rather easily.