Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.
Γεια χαρά

 

Γιατί να υπάρχει bytecode......γιατί να μην είναι ένας απλός interpreter από source σε γλώσσα μηχανής ;;;

 

Θέλω να μάθω γιατί το σύστημα της γλώσσας python χρησιμοποιεί compiler για μεταγλώττιση σε bytecode και interpreter για διερμήνευση του bytecode σε γλώσσα μηχανής ;;;

 

Επίσης πάντα γίνεται διερμήνευση του bytecode στην python η λειτουργεί και ως κλασικός interpreter διερμηνεύοντας εντολή εντολή σε κώδικα μηχανής όπως οι παλιοί κλασικοί interpreters (basic κλπ);;;

 

Η αναλυτική εξήγηση όποιων τα γνωρίζουν καλά θα ήταν επιθυμητό σε μένα και πολλούς άλλους πιστεύω 

 

       

       ευχαριστώ!!!

 

  • Απαντ. 37
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Η διερμήνευση του bytecode μπορεί να γίνει σχεδόν τόσο γρήγορη όσο θα ήταν αν έτρεχε απευθείας σε γλώσσα μηχανής. Αυτό συμβαίνει επειδή το bytecode μπορεί να αντιστοιχηθεί ένα-προς-ένα με διαθέσιμες εντολές. Το interpreter δε χρειάζεται να καταλάβει τι προσπαθείς να του πεις, το οποίο παίρνει πολύ περισσότερο χρόνο, έχει κάνει αυτή τη δουλειά ήδη ο compiler.

 

Αλλά με την python συγκεκριμένα δε νομίζω ότι είναι υποχρεωτικό να τη μεταγλωττίσεις.

Δημοσ.

Αλλά με την python συγκεκριμένα δε νομίζω ότι είναι υποχρεωτικό να τη μεταγλωττίσεις.

 

Καταρχήν η Python γενικά δεν είναι ούτε compiled ούτε interpreted ούτε τίποτα γιατί είναι μόνο η γλώσσα, το implementation της γλώσσας μπορεί να είναι compiled και οι βασικές Python που ξέρω (CPython, PyPy, Ironpython και Jython) είναι όλες compiled σε bytecode και κάθε μια κάνει target διαφορετικό VM. Άρα είναι υποχρεωτικό.
H Cython επίσης μπορεί να κάνει transpile όλη την Python (+ τον γρήγορο Cython specific code) σε C και μετά να γίνει compile σε native.
Ο λόγος για τον οποίο γίνεται το compilation σε bytecode είναι ο εξής: Φαντάζομαι ότι είναι αρκετά πιο εύκολο να κάνει κάποιος implement ένα VM σε διαφορετικά λειτουργικά παρά να γράφει διαφορετικούς compilers για κάθε λειτουργικό. Αυτό νομίζω συμβαίνει γιατί είναι αρκετά πιο πολύπλοκο να παράγεις native με έναν compiler παρά bytecode για ένα VM.
Επιπρόσθετα το bytecode δίνει τη δυνατότητα για JIT (κάτι που δε χρησιμοποιεί αυτή τη στιγμή η CPython αλλά υπάρχει η δυνατότητα από την 3.6 μετά να γίνει plug in κάποιο JIT (PEP 523) και ένα implementation εδώ.
  • Like 1
Δημοσ.

Όταν γράψεις ένα αρχείο πρόγραμμα module η όπως θέλουμε ας το πούμε το αποθηκεύσεις ως file.py και μετά το τρέξεις από το cmd των windows τότε εμφανίζει στο cmd τα αποτελέσματα αλλά δεν δημιουργεί bytecode αρχείο στο δίσκο......δημιουργεί μόνο αν βάλεις το διακόπτη -m στο τρέξιμο....δηλαδή  python -m file.py..............και ρωτώ τι γίνεται σε αυτή την περίπτωση του cmd......δουλεύει ως κλασικός interpreter η δημιουργεί bytecode (pyc) το τρέχει από την μνήμη και μετά εξαφανίζεται;;;.....όπως και όταν γράφεις στο shell κονσόλα terminal command line της python >>>  και εκτελεί.....δημιουργεί bytecode η όχι;;;

 

 

ευχαριστώ

Δημοσ.

 

An interpreter generally uses one of the following strategies for program execution:

  1. parse the source code and perform its behavior directly.
  2. translate source code into some efficient intermediate representation and immediately execute this.
  3. explicitly execute stored precompiled code[1] made by a compiler which is part of the interpreter system.

 

Source: wikipedia.

 

Ερωτήσεις όπως αυτές του OP εδώ ξεκινάνε επειδή στο μυαλό τους έχουν το #1, το οποίο ήταν σχεδόν ο μονάδικός ορισμός του interpreter μέχρι και πριν 15 χρόνια και είναι έτσι γραμμένο σε πολλά βιβλία είτε επειδή δεν έχουν ανανεωθεί, είτε για υπεραπλούστευση.

Δημοσ.

Συνοψιζω 

 

Οι συγχρονες γλωσσες προγραμματισμου  (python perl ruby κλπ (ιδιαιτερη η java) ) εχουν νεου τυπου interpreters compilers και δημιουργουν  ενδιαμεσο κωδικα (bytecode)

 

Η γλωσσα παραγει παντα bytecode απο το πηγαιο με τον compiler και αυτο διερμηνευει ο interpreter

 

Φυσικα καλα θα ηταν να μπορουσε να τρεχει το bytecode που δημηουργηθηκε απο μια αρχιτεκτονικη σε ολες απλα τρεχει το πηγαιο παντου...............στη java νομιζω γινεται αυτο λογω του jre

Δημοσ.

Το bytecode υπάρχει γιατί το ατόφιο source δεν βολεύει καθόλου ως ενδιάμεση (πριν την εκτέλεση) μορφή αναπαράστασης, είναι σε τελείως άβολο abstraction level και για έναν compiler (πώς κάνεις optimizations?) αλλά και για interpretability.

 

Επίσης η εκτέλεση του bytecode σε vm δεν έχει καμία σχέση σε ταχύτητα με την εκτέλεση machine code όπως λανθασμένα αναφέρθηκε νωρίτερα, γι αυτό όλες οι γλώσσες που είναι για πρακτική χρήση περιλαμβάνουν και compiler -- συνήθως JIT αλλά καμιά φορά και AOT όπου βέβαια αναγκαστικά στοχεύεις συγκεκριμένη πλατφόρμα.

  • Like 2
Δημοσ.

Επίσης η εκτέλεση του bytecode σε vm δεν έχει καμία σχέση σε ταχύτητα με την εκτέλεση machine code όπως λανθασμένα αναφέρθηκε νωρίτερα, γι αυτό όλες οι γλώσσες που είναι για πρακτική χρήση περιλαμβάνουν και compiler

 

Δεν ισχύει αυτό. Όταν λες "καμία σχέση" ο άλλος νομίζει ότι εννοείς 100 φορές γρηγορότερη, ενώ στη πραγματικότητα είναι 2-3 φορές γρηγορότερη. Οι κύριοι λόγοι που μια γλώσσα είναι αργή σπάνια έχουν να κάνουν με το πώς τρέχει και σχεδόν πάντα με το τι τρέχει, δηλαδή οι μηχανισμοί της, όπως GC, dynamic typing, κτλ.

 

Πχ αν το bytecode που παράγει η CPython είναι τόσο καλό σαν αυτό που παράγει ο compiler της Oracle Java, δε πρόκειται να δεις διαφορά στη ταχύτητα, εξαιρώντας βέβαια τις δομικές διαφορές. Αν από την άλλη το παραγόμενο bytecode είναι προχειράτζα, μάλλον έχεις δίκιο.

Δημοσ.

Καλά τα λέει, καμία σχέση. Προφανώς μιλάω για bytecode vs machine code. Και όχι "bytecode" που το 1% είναι ένα call και το 99% είναι machine code.

Δημοσ.

Λυπάμαι, αλλά μπορεί να τρομάξετε με το πόσο δίκιο είχα, δείτε αυτό το βίντεο.

https://www.youtube.com/watch?v=TDBTiwjTT0k

Και το είπα στη τύχη! Μέντιουμ είμαι και δεν το ξέρω?! :P

Δεν είδα το βίντεο αλλά.

 

Τι καμία σχέση έχει αυτό που λες με αυτό που βλέπω στον τίτλο του βίντεο; Η Java κάνει JIT compile το bytecode, και από κει και πέρα μετράς machine code vs machine code.

 

Get your facts straight.

  • Like 1
Δημοσ.

Εκτος απο την python και την java που κανουν compile το source δημιουργουν bytecode και το τρεχουν σε vm με τον interpreter (η java διαφερει λιγακι λογω jre απο την python) οι αλλες δημοφιλεις γλωσσες π.χ perl ruby go scala και λοιπα......πως εκτελουν ;;;.....φτιαχνουν bytecode ; τρεχουν σαν interpreter ;..............μονο python java εχουν σχεση με bytecode;;;;;;;

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...