eCommons

 

Composable Compilers: Evolution toward a Practical Reality

dc.contributor.authorIsradisaikul, Chinawat
dc.contributor.chairMyers, Andrew C.
dc.contributor.committeeMemberKozen, Dexter Campbell
dc.contributor.committeeMemberConstable, Robert Lee
dc.date.accessioned2018-04-26T14:16:21Z
dc.date.available2019-09-11T06:02:27Z
dc.date.issued2017-08-30
dc.description.abstractThe ability to add new features to programming languages is essential for language design experimentation and domain-specific developments, but implementing and maintaining small language extensions in traditional compilers remain a challenge. General-purpose programming languages do not have desired mechanisms to integrate small, independently developed extensions into a working programming language. At the same time, domain-specific languages that support such integration struggle to gain popularity in the programming language community. More language mechanisms and tools are needed as a middle ground so that a broader range of programmers can implement, maintain, and combine compilers for individual language features more easily. At the heart of compiler construction, new design patterns are proposed to allow compilers to be extended in a modular way and to be merged with little effort. These design patterns, implementable in a mainstream programming language, encode dynamic relationships between node types in abstract syntax trees (ASTs) so that inheritance in object-oriented programming still works over the course of language evolution. A new AST representation lets a single AST be viewed as different programs for different languages. Compiler passes are language-neutral, making translations reusable and composable. At the front end, engineering language syntax can be a painstaking process, especially when individual language syntaxes start to interact. Automatic parser generators, albeit a powerful tool to parse complex grammars, are unhelpful when grammars are faulty, as reports of parsing conflicts do not explain these faults. To improve debugging experience, a semi-decision procedure is added to an LALR parser generator to give compact counterexamples illustrating why the grammar in question is ambiguous. For unambiguous grammars that cause parsing conflicts, a different kind of counterexample is constructed to aid removal of conflicts. At the back end, translation passes in compilers require extracting components of AST nodes. Pattern matching, an important feature in functional languages, is a prime candidate for this task. However, data abstraction and extensibility, two concepts central to object-oriented languages, are in conflict with pattern matching. A new language design based on modal abstraction reconciles static, modular reasoning about exhaustiveness in pattern matching with data abstraction.
dc.identifier.doihttps://doi.org/10.7298/X44M92QC
dc.identifier.otherIsradisaikul_cornellgrad_0058F_10542
dc.identifier.otherhttp://dissertations.umi.com/cornellgrad:10542
dc.identifier.otherbibid: 10361478
dc.identifier.urihttps://hdl.handle.net/1813/56801
dc.language.isoen_US
dc.rightsAttribution-ShareAlike 2.0 Generic*
dc.rights.urihttps://creativecommons.org/licenses/by-sa/2.0/*
dc.subjectambiguous grammars and parsing
dc.subjectcompilers
dc.subjectComputer science
dc.subjectpattern matching and data abstraction
dc.subjectprogramming language evolution
dc.subjectextensibility and composability
dc.titleComposable Compilers: Evolution toward a Practical Reality
dc.typedissertation or thesis
dcterms.licensehttps://hdl.handle.net/1813/59810
thesis.degree.disciplineComputer Science
thesis.degree.grantorCornell University
thesis.degree.levelDoctor of Philosophy
thesis.degree.namePh. D., Computer Science

Files

Original bundle
Now showing 1 - 1 of 1
Loading...
Thumbnail Image
Name:
Isradisaikul_cornellgrad_0058F_10542.pdf
Size:
1.06 MB
Format:
Adobe Portable Document Format