59 research outputs found
Streams à la carte: Extensible Pipelines with Object Algebras (Artifact)
In Streams à la carte we address extensibility shortcomings in libraries for lazy-streaming queries with a new design. The architecture underlying this design borrows heavily from Oliveira and Cook's object algebra solution to the expression problem, extended with a design that exposes the push/pull character of the iteration, and an encoding of higher-kinded polymorphism.
In this library we apply our design to Java and show that the addition of full extensibility is accompanied by high performance, matching or exceeding that of the original, highly-optimized Java streams library.
In this artifact we present a fundamental set of sequential operators map, filter, reduce, count, take/limit and iterate.
Additionally we present the behaviors that are discussed in the paper: push, pull, fused pull, logging, id (for blocking terminal operators), future (for non-blocking terminal operators)
Streams a la carte: Extensible Pipelines with Object Algebras
Streaming libraries have become ubiquitous in object-oriented languages, with recent offerings in Java, C#, and Scala. All such libraries, however, suffer in terms of extensibility: there is no way to change the semantics of a streaming pipeline (e.g., to fuse filter operators, to perform computations lazily, to log operations) without changes to the library code. Furthermore, in some languages it is not even possible to add new operators (e.g., a zip operator, in addition to the standard map, filter, etc.) without changing the library.
We address such extensibility shortcomings with a new design for streaming libraries. The architecture underlying this design borrows heavily from Oliveira and Cook's object algebra solution to the expression problem, extended with a design that exposes the push/pull character of the iteration, and an encoding of higher-kinded polymorphism. We apply our design to Java and show that the addition of full extensibility is accompanied by high performance, matching or exceeding that of the original, highly-optimized Java streams library
Expressive and Efficient Streaming Libraries
Οι ροές επεξεργασίας δεδομένων είναι και πάλι στο προσκήνιο: ευρέως-διαδεδομένες βιβλιοθήκες για επεξεργασία ροών υπάρχουν σε κάθε μοντέρνα γλώσσα προγραμματισμού και οικοσύστημα, από την Java στην C# και από την Scala και OCaml στη Haskell. Ωστόσο, καίρια χαρακτηριστικά τους όπως η εκφραστικότητα και οι επιδόσεις έχουν σημαντικά περιθώρια βελτίωσης. Στην παρούσα διατριβή, εξακριβώνουμε το ποια είναι ακριβώς τα ποιοτικά χαρακτηριστικά κάθε βιβλιοθήκης και παρατηρούμε ότι παρούσες αλλά και μελλοντικές χρήσεις τους, είναι άρρηκτα συνδεδεμένες (και δεσμευτικές) με την εκάστοτε υλοποίηση. Απλοί μηχανισμοί αφαίρεσης δεν είναι επαρκείς. Είναι εφικτό να διαμορφώσουμε την υλοποίηση των βιβλιοθηκών ροών και να τις κάνουμε πιο επεκτάσιμες και με μεγαλύτερες επιδόσεις; Παρουσιάζουμε δυο λύσεις προς την επίτευξη της επεκτασιμότητάς τους. Κατά την πρώτη, διαχωρίζουμε τους ορισμούς του συντακτικού και της σημασιολογίας των βιβλιοθηκών και κατά τη δεύτερη λύση απελευθερώνουμε τις εν λόγω βιβλιοθήκες από την επιτακτική ανάγκη ύπαρξης ενός ικανού και έξυπνου μεταγλωττιστή. Ο στόχος της διατριβής είναι να δημιουργήσει επεκτάσιμες βιβλιοθήκες ροών, υψηλών επιδόσεων, διατηρώντας όμως την υψηλού επιπέδου δομή τους. Η παρουσίαση των ερευνητικών μας αποτελεσμάτων έπεται αξιολόγησης επιδόσεων σε σύγχρονες βιβλιοθήκες που διεξήγαμε για διάφορες σύγχρονες γλώσσες προγραμματισμού. Στη συνέχεια προτείνουμε έναν μηχανισμό για την ενίσχυση της συντήρησης βιβλιοθηκών ροών διατηρώντας ενός υψηλού επιπέδου επεκτασιμότητα. Για να το επιτύχουμε αυτό, θεωρούμε τις εν λόγω βιβλιοθήκες ως γλώσσες προγραμματισμού ειδικού σκοπού, σχεδιάζοντας και υλοποίώντας την βιβλιοθήκη StreamAlg, μία βιβλιοθήκη που προσφέρει την δυνατότητα να δεχθεί επεκτάσεις με νέες μεθόδους και συμπεριφορά κατ' επιλογή. Στη συνέχεια, παρουσιάζουμε την εφαρμογή της προαναφερθείσας τεχνικής σε μία γλώσσα προγραμματισμού, την Java, για να επιτύχουμε την ίδια γενικότητα κατά την επέκταση της, με το εργαλείο που ονομάζουμε Recaf. Δείχνουμε πώς δημιουργούμε διαλέκτους στην Java για να υποστηρίξουμε νέο συντακτικό και νέα σημασιολογικά στοιχεία στην ίδια τη γλώσσα. Ως αποτέλεσμα, δημιουργήσαμε επεκτάσεις της Java, μία εκ των οποίων μας έδωσε τη δυνατότητα να δημιουργήσουμε βιβλιοθήκη ροών στη Java, όπως ακριβώς γίνεται και στην C#. Τέλος παρουσιάζουμε την πρότασή μας για βιβλιοθήκες ροών υψηλών επιδόσεων που υλοποιήσαμε σε δύο γλώσσες προγραμματισμού με τον ενιαίο όρο-ομπρέλα Strymonas. Η βιβλιοθήκη που παρέχουμε, χωρίς να βασίζεται σε απροσπέλαστους βελτιστοποιητές ή ``ικανοποιητικά-ικανούς'' μεταγλωττιστές, παρέχει, υψηλού επιπέδου, εγγυημένη και φορητή ταχύτητα ως προς την επεξεργασία δεδομένων. Η προσέγγισή μας βασίζεται σε έννοιες υψηλού επιπέδου οι οποίες στη συνέχεια υλοποιούνται.Stream processing is mainstream (again): Widely-used stream libraries are now available for virtually all modern OO and functional languages, from Java to C# to Scala to OCaml to Haskell. Yet expressivity and performance are still lacking. This dissertation identifies the key high-level differences between various implementations, observes that future use cases are tied with past design decisions, and shows that simple abstraction mechanisms are not sufficient. Is it possible to modularize the implementation of streams to enhance such libraries in terms of extensibility and performance? We present a twofold modularization of streams. To begin with, we untangle streams from the definition of their syntax and semantics and afterwards we liberate them from the need of a ``sufficiently-smart'' compiler. The utmost goal of this dissertation is to make streams extensible and performant, while maintaining their high level structure. Our contributions are preceded by a performance assessment of the current state-of-the-art of streaming libraries. Subsequently, we first propose a mechanism to enhance the maintainability of streams, supporting a high-level of extensibility. We treat streams as a domain-specific language and we design and implement StreamAlg, a library that has the ability to accept new operators and semantics à la carte. Next, we port the library design we used for streams to Java itself, with a lightweight tool named Recaf. We show how to create dialects in Java, override its semantics, support new syntactic elements and much more. Among many examples and case studies we build an extension of Java with a keyword that enables us to construct streams similar to C#. The culmination of our work is a library design, Strymonas, for very efficient streams while preserving their high-level nature.It explicitly avoids the reliance on black-box optimizers and ``sufficiently-smart'' compilers, offering highest, guaranteed and portable performance. Our approach relies on high-level concepts that are then readily mapped into an implementation
Εκφραστικές και αποτελεσματικές βιβλιοθήκες ροών
Stream processing is mainstream (again): Widely-used stream libraries are now available for virtually all modern OO and functional languages, from Java to C# to Scala to OCaml to Haskell. Yet expressivity and performance are still lacking. This dissertation identifies the key high-level differences between various implementations, observes that future use cases are tied with past design decisions, and shows that simple abstraction mechanisms are not sufficient. Is it possible to modularize the implementation of streams to enhance such libraries in terms of extensibility and performance? We present a twofold modularization of streams. To begin with, we untangle streams from the definition of their syntax and semantics and afterwards we liberate them from the need of a ``sufficiently-smart'' compiler. The utmost goal of this dissertation is to make streams extensible and performant, while maintaining their high level structure. Our contributions are preceded by a performance assessment of the current state-of-the-art of streaming libraries. Subsequently, we first propose a mechanism to enhance the maintainability of streams, supporting a high-level of extensibility. We treat streams as a domain-specific language and we design and implement StreamAlg, a library that has the ability to accept new operators and semantics à la carte. Next, we port the library design we used for streams to Java itself, with a lightweight tool named Recaf. We show how to create dialects in Java, override its semantics, support new syntactic elements and much more. Among many examples and case studies we build an extension of Java with a keyword that enables us to construct streams similar to C#. The culmination of our work is a library design, Strymonas, for very efficient streams while preserving their high-level nature.It explicitly avoids the reliance on black-box optimizers and ``sufficiently-smart'' compilers, offering highest, guaranteed and portable performance. Our approach relies on high-level concepts that are then readily mapped into an implementation.Οι ροές επεξεργασίας δεδομένων είναι και πάλι στο προσκήνιο: ευρέως-διαδεδομένες βιβλιοθήκες για επεξεργασία ροών υπάρχουν σε κάθε μοντέρνα γλώσσα προγραμματισμού και οικοσύστημα, από την Java στην C# και από την Scala και OCaml στη Haskell. Ωστόσο, καίρια χαρακτηριστικά τους όπως η εκφραστικότητα και οι επιδόσεις έχουν σημαντικά περιθώρια βελτίωσης. Στην παρούσα διατριβή, εξακριβώνουμε το ποια είναι ακριβώς τα ποιοτικά χαρακτηριστικά κάθε βιβλιοθήκης και παρατηρούμε ότι παρούσες αλλά και μελλοντικές χρήσεις τους, είναι άρρηκτα συνδεδεμένες (και δεσμευτικές) με την εκάστοτε υλοποίηση. Απλοί μηχανισμοί αφαίρεσης δεν είναι επαρκείς. Είναι εφικτό να διαμορφώσουμε την υλοποίηση των βιβλιοθηκών ροών και να τις κάνουμε πιο επεκτάσιμες και με μεγαλύτερες επιδόσεις; Παρουσιάζουμε δυο λύσεις προς την επίτευξη της επεκτασιμότητάς τους. Κατά την πρώτη, διαχωρίζουμε τους ορισμούς του συντακτικού και της σημασιολογίας των βιβλιοθηκών και κατά τη δεύτερη λύση απελευθερώνουμε τις εν λόγω βιβλιοθήκες από την επιτακτική ανάγκη ύπαρξης ενός ικανού και έξυπνου μεταγλωττιστή. Ο στόχος της διατριβής είναι να δημιουργήσει επεκτάσιμες βιβλιοθήκες ροών, υψηλών επιδόσεων, διατηρώντας όμως την υψηλού επιπέδου δομή τους. Η παρουσίαση των ερευνητικών μας αποτελεσμάτων έπεται αξιολόγησης επιδόσεων σε σύγχρονες βιβλιοθήκες που διεξήγαμε για διάφορες σύγχρονες γλώσσες προγραμματισμού. Στη συνέχεια προτείνουμε έναν μηχανισμό για την ενίσχυση της συντήρησης βιβλιοθηκών ροών διατηρώντας ενός υψηλού επιπέδου επεκτασιμότητα. Για να το επιτύχουμε αυτό, θεωρούμε τις εν λόγω βιβλιοθήκες ως γλώσσες προγραμματισμού ειδικού σκοπού, σχεδιάζοντας και υλοποίώντας την βιβλιοθήκη StreamAlg, μία βιβλιοθήκη που προσφέρει την δυνατότητα να δεχθεί επεκτάσεις με νέες μεθόδους και συμπεριφορά κατ' επιλογή. Στη συνέχεια, παρουσιάζουμε την εφαρμογή της προαναφερθείσας τεχνικής σε μία γλώσσα προγραμματισμού, την Java, για να επιτύχουμε την ίδια γενικότητα κατά την επέκταση της, με το εργαλείο που ονομάζουμε Recaf. Δείχνουμε πώς δημιουργούμε διαλέκτους στην Java για να υποστηρίξουμε νέο συντακτικό και νέα σημασιολογικά στοιχεία στην ίδια τη γλώσσα. Ως αποτέλεσμα, δημιουργήσαμε επεκτάσεις της Java, μία εκ των οποίων μας έδωσε τη δυνατότητα να δημιουργήσουμε βιβλιοθήκη ροών στη Java, όπως ακριβώς γίνεται και στην C#. Τέλος παρουσιάζουμε την πρότασή μας για βιβλιοθήκες ροών υψηλών επιδόσεων που υλοποιήσαμε σε δύο γλώσσες προγραμματισμού με τον ενιαίο όρο-ομπρέλα Strymonas. Η βιβλιοθήκη που παρέχουμε, χωρίς να βασίζεται σε απροσπέλαστους βελτιστοποιητές ή ``ικανοποιητικά-ικανούς'' μεταγλωττιστές, παρέχει, υψηλού επιπέδου, εγγυημένη και φορητή ταχύτητα ως προς την επεξεργασία δεδομένων. Η προσέγγισή μας βασίζεται σε έννοιες υψηλού επιπέδου οι οποίες στη συνέχεια υλοποιούνται
A Practical Unification of Multi-stage Programming and Macros
Program generation is indispensable. We propose a novel unification of two existing metaprogramming techniques: multi-stage programming and hygienic generative macros. The former supports runtime code generation and execution in a type-safe manner while the latter offers compile-time code generation. In this work we draw upon a long line of research on metaprogramming, starting with Lisp, MetaML and MetaOCaml. We provide direct support for quotes, splices and top-level splices, all regulated uniformly by a level-counting Phase Consistency Principle. Our design enables the construction and combination of code values for both expressions and types. Moreover, code generation can happen either at runtime à la MetaML or at compile time, in a macro fashion, à la MacroML. We provide an implementation of our design in Scala and we present two case studies. The first implements the Hidden Markov Model, Shonan Challenge for HPC. The second implements the staged streaming library Strymonas.LAMP
Forsaking Inheritance: Supercharged Delegation in DelphJ
We propose DelphJ: a Java-based OO language that eschews inheritance completely, in favor of a combination of class morphing and (deep) delegation. Compared to past delegation approaches, the novel aspect of our design is the ability to emulate the best aspects of inheritance while retaining maximum flexibility: using morphing, a class can select any of the methods of its delegatee and export them (if desired) or transform them (e.g., to add extra arguments or modify type signatures), yet without needing to name these methods explicitly and handle them one-by-one. Compared to past work on morphing, our approach adopts and adapts advanced delegation mechanisms, in order to add late binding capabilities and, thus, provide a full substitute of inheritance. Additionally, we explore complex semantic issues in the interaction of delegation with late binding. We present our language design both informally, with numerous examples, and formally in a core calculus
- …
