PYXIDA Institutional Repository
and Digital Library
 Home
Collections :

Title :Στατική ανάλυση και αναδόμηση ασύγχρονου κώδικα
Creator :Γουρλής, Μύρων
Contributor :Ζαφείρης, Βασίλειος (Επιβλέπων καθηγητής)
Διαμαντίδης, Νικόλαος (Εξεταστής)
Γκρίτζαλης, Δημήτριος (Εξεταστής)
Οικονομικό Πανεπιστήμιο Αθηνών, Τμήμα Πληροφορικής (Degree granting institution)
Type :Text
Extent :154 σ.
Language :el
Identifier :http://www.pyxida.aueb.gr/index.php?op=view_object&object_id=6472
Abstract :Η έννοια «ασύγχρονος» (asynchronous), όταν τη χρησιμοποιούμε στο πλαίσιο του προγραμματισμού, προσδιορίζει τη δυνατότητα να κάνεις κάτι ενώ περιμένεις κάτι άλλο για να ολοκληρωθεί. Η έννοια «ταυτόχρονος» (concurrent), όπου στο πλαίσιο του προγραμματισμού χρησιμοποιείται και ο όρος «παράλληλος», προσδιορίζει τη δυνατότητα να κάνεις πολλαπλά πράγματα στην ίδια χρονική στιγμή. Το αρνητικό σημείο και των δύο αυτών εννοιών, στο πλαίσιο του προγραμματισμού, είναι ότι τόσο ο ασύγχρονος όσο και ο παράλληλος προγραμματισμός προσθέτουν επιπλέον πολυπλοκότητα στο λογισμικό. Τα προηγούμενα αναφέρονται για να ορίσουμε το πλαίσιο της εργασίας, διότι οι έννοιες είναι εννοιολογικά πολύ κοντά και συχνά γίνονται αντιληπτές ως ταυτόσημες.Η ασύγχρονη εκτέλεση κώδικα μέσω επανακαλούμενων συναρτήσεων αποτελεί βασικό χαρακτηριστικό του οδηγούμενου από γεγονότα προγραμματισμού (event driven programming) και έχει οδηγήσει σε πολύ πιο αποδοτικές μορφές λογισμικού. Η χρήση της είναι υπόδειγμα που χαρακτηρίζει σύγχρονες εφαρμογές ιστού και κινητών συσκευών για βελτίωση της εμπειρίας χρήσης και προσαρμογή σε πολλά εξωτερικά γεγονότα. Με την έκρηξη της δημοτικότητας της πλατφόρμας NodeJS, τα τελευταία χρόνια, η οποία διαθέτει ένα ασύγχρονο περιβάλλον εκτέλεσης, οι προγραμματιστές χρησιμοποιούν όλο και περισσότερο ασύγχρονο προγραμματισμό στις εφαρμογές τους. Βέβαια ο προγραμματισμός αυτού του είδους δεν είναι νέα εφεύρεση, στη JavaScript o ασύγχρονος κώδικας άρχισε να χρησιμοποιείται ευρέως από την δημιουργία του AJAX το 2005.Στην εργασία αυτή αναλύεται πως η JavaScript εκτελεί τον ασύγχρονο κώδικα σε ένα μοναδικό νήμα, αναλύοντας το μοντέλο εκτέλεσής της το οποίο περιλαμβάνει την μηχανή εκτέλεσης και το περιβάλλον εκτέλεσης τα οποία συνδέονται με τον βρόγχο συμβάντων. Αναφέρεται το πως λειτουργεί η μηχανή εκτέλεσης και πως το περιβάλλον εκτέλεσης βοηθάει στη εκτέλεση ασύγχρονου κώδικα.Παρουσιάζονται οι τύποι των ασύγχρονων επανακλήσεων και η έκταση της χρήσης τους σε λογισμικά που έχουν δημιουργηθεί με τη JavaScript. Γίνεται μελέτη ως προς τις επιπτώσεις της εκτεταμένης χρήσης και εμφώλευσης ασύγχρονων κλήσεων στη συντηρησιμότητα του κώδικα.Στη συνέχεια αναλύονται δημοφιλείς βιβλιοθήκες και APIs που βοηθούν στην καλύτερη διαχείριση του ασύγχρονου κώδικα. Συγκεκριμένα παρουσιάζονται η βιβλιοθήκη Async, το Promise API, οι συναρτήσεις τύπου Generator και οι συναρτήσεις async. H συγκριτική παρουσίασή τους γίνεται μέσω παραδειγμάτων κώδικα που υλοποιούν βασικές περιπτώσεις ασύγχρονης ροής ελέγχου, όπως την σειριακή εκτέλεση, την επαναληπτική σειριακή εκτέλεση, την παράλληλη εκτέλεση καθώς και την περιορισμένη παράλληλη εκτέλεση.Βασικός στόχος της εργασίας είναι η απλοποίηση ασύγχρονου κώδικα μέσω αναδόμησης. Η αναδόμηση στη JavaScript γίνεται με εφαρμογή μετασχηματισμών στην AST αναπαράσταση του κώδικα. Η εργασία κάνει μια σύντομη εισαγωγή σε εργαλεία τα οποία είναι διαμορφωμένα για να δίνουν διάφορες ευκολίες στους προγραμματιστές. Παρουσιάζεται η λογική του δέντρου σύνταξης και τα πρότυπα σύνταξής του για κώδικα JavaScript. Έπειτα γίνεται αναφορά σε διάφορα εργαλεία που μπορούν να το δημιουργήσουν, να το αναλύσουν, να το τροποποιήσουν και να το μετατρέψουν σε κώδικα.Η εργασία δίνει έμφαση στην απλοποίηση ασύγχρονου κώδικα βασισμένου στο Promises API, το οποίο είναι πιο διαδεδομένη λύση για τη διαχείριση του ασύγχρονου κώδικα στην JavaScript. Τα Promises αποτελούν μέρος της τυποποιημένης έκτης έκδοσης της JavaScript (ECMAScript) που δημιουργήθηκε το 2015. Παρόλο που τα Promises έχουν δημιουργηθεί για να προσφέρουν καλύτερη διαχείριση του ασύγχρονου κώδικα, η χρήση τους συνοδεύεται από αντιπαραδείγματα που κάνουν δυσανάγνωστο τον κώδικα. Η εργασία παρουσιάζει μια λίστα με αντιπαραδείγματα συγγραφής κώδικα με Promises, μερικά από τα οποία εξαλείφονται μέσω της προτεινόμενης αναδόμησης. Συγκεκριμένα προτείνεται μιας μέθοδος για την αναδόμηση Promises με χρήση async συναρτήσεων και await εκφράσεων, που αποτελούν μέρος της τυποποιημένης όγδοης έκδοσης της JavaScript του 2017. Η μέθοδος βασίζεται στην μοντελοποίηση μιας αλυσίδας από Promises σε ένα γράφο της ροής εκτέλεσής της, τον οποίο τον ονομάζουμε γράφο αναδόμησης. Έπειτα τον μετασχηματίζουμε σε ένα διάνυσμα κόμβων μορφής δέντρου σύνταξης, που τα στοιχεία του είναι όλες οι εντολές της αλυσίδας Promises σε δομή async/await. Αναλύεται η λογική της κατασκευής του γράφου αναδόμησης και του μετασχηματισμού του σε διάνυσμα async/await. Αναφέρουμε τους περιορισμούς της μεθοδολογίας ως προς την αναδόμηση των αλυσίδων Promises και αναλύουμε τα βήματα της μεθοδολογίας για να καταλήξουμε στον αναδομημένο κώδικα.Η προτεινόμενη μέθοδος δεν έχει δημιουργηθεί ως ένα ολοκληρωμένο εργαλείο λογισμικού και δεν έχει εφαρμοστεί πάνω σε παραγωγικό κώδικα έτσι ώστε να ελεγχθεί πλήρως η εγκυρότητά της. Ως προς την απόδειξη της λειτουργίας της, την εφαρμόζουμε σε κάποια παραδείγματα από περιπτώσεις ασύγχρονου κώδικα και παραθέτουμε το αποτέλεσμά της στο παράρτημα της εργασίας. Τέλος αναφέρουμε προτάσεις για μελλοντική έρευνα που χρειάζεται να γίνει έτσι ώστε να καταλήξουμε σε μια μέθοδο πληρέστερη η οποία να μπορεί να ανταπεξέλθει σε περισσότερες περιπτώσεις χρήσης των αλυσίδων από Promises.
The asynchronous concept, as used in programming, identifies the ability to do something while waiting for something else to get completed. The «concurrent» or «parallel» concept identifies the ability to do multiple things at the same time. The negative point of both concepts in programming is that both the asynchronous and parallel programming add extra complexity to the software. The foregoing is to define the context of this work, because these concepts are conceptually very close to each other and often perceived as identical.Asynchronous code execution through callbacks is a key feature of event driven programming and has led to much more efficient software formats. Its use is a pattern that characterizes modern web applications and mobile devices, and it is used to improve user experience and adapt to many external events. Due to the popularity boom of the NodeJS platform, in recent years, which features an asynchronous execution environment, developers increasingly use asynchronous programming in their applications. Of course, programming of this kind is not a new invention; in JavaScript, asynchronous code has been widely used since the creation of AJAX in 2005.In this work, we analyze how JavaScript executes asynchronous code into a single thread by describing its execution model, which includes the execution engine and execution environment that are connected through the event loop. We briefly describe how the execution engine works and how the execution environment helps the execution of asynchronous tasks.The types of asynchronous callbacks and the prevalence of their use in JavaScript-created software are presented. We examine the impact of the extended use and imposition of asynchronous calls on the consistency of the code.Then we analyze popular libraries and APIs that help to manage asynchronous code better. In particular, the Async library, the Promise API, the Generator functions and the async functions are presented. Their comparative presentation takes place through code examples that implement basic asynchronous control flow cases, such as serial execution, iterative serial execution, parallel execution, and limited parallel execution.The main purpose of the work is to simplify asynchronous code through refactoring. JavaScript refactoring is done by implementing transformations in the AST code representation. In this work, we make a brief introduction to tools that are configured to give developers a variety of facilities. We present the abstract syntax tree logic and its types in JavaScript. Then reference is made to various tools that can create, analyze, modify, and convert it into code.The work emphasizes the simplification of asynchronous code based on the Promises API, which is the most widespread solution for managing asynchronous code in JavaScript. Promises constitutes a part of the standard sixth version of JavaScript (ECMAScript) created in 2015. Although Promises have been created to offer better asynchronous code management, their use is accompanied by anti-patterns that affect the code readability.The work presents a list of Promise anti-patterns, some of which are eliminated through the proposed refactoring. More specifically, a method is being proposed for refactoring Promises using async functions and await expressions. The method is based on modeling a chain of Promises in a graph of its execution flow, which we name it refactoring graph. Then we transform it into a vector of AST nodes, its elements being all the commands of the Promises chain in async / await structure. The logic of constructing the refactoring graph and its transformation into async / await vector is presented and analyzed. We describe the limitations of the methodology for the refactoring of the Promises chains and analyze the steps of the methodology to arrive at the reconstructed code.The proposed method has not been created as a complete software tool and has not been applied to a production code, so its validity is not fully checked. As a proof of its operation, we apply it to some examples of cases of asynchronous code and list its result in the appendix of this work.Finally, we report proposals for future research that needs to be done, in order to forge a more complete method that can cope with more cases of Promise chains.
Subject :Async
Await
Promise
Asynchronous
JavaScript
Date Available :2018-09-29 16:03:14
Date Issued :09/24/2018
Date Submitted :2018-09-29 16:03:14
Access Rights :Free access
Licence :

File: Gourlis-2018.pdf

Type: application/pdf