Παρασκευή 22 Αυγούστου 2014

Τετάρτη 13 Αυγούστου 2014

Net πλατφόρμα σε όλα τα λειτουργικά συστήματα.

Ο προγραμματισμός σε .Net, δηλαδή σε γλώσσες που υποστηρίζουν τον κώδικα Net της Microsoft, μπορεί να γίνει σε διάφορα λειτουργικά, ακόμα και στο Linux.


Για το σκοπό αυτό υπάρχει το MonoDevelop ένα σύστημα που μπορεί να δημιουργήσει εφαρμογές για Linux, Windows και Mac OSX. Παρέχεται ένα ενσωματωμένο περιβάλλον ανάπτυξης (IDE). Λέγεται ενσωματομένο γιατί μέσα από αυτό δημιουργούμε την εφαρμογή και την τρέχουμε με χρήση σημείων διακοπής (ώστε να εξετάζουμε τι γίνεται). Αν και φαντάζει πιλοτίριο αεροπλάνου...δεν είναι τόσο πολύπλοκο.


Το είδος των εφαρμογών φαίνεται στο πλαίσιο διαλόγου νέα λύση. Στην ορολογία του Net η λέξη λύση (Solution) δηλώνει όλα τα αναγκαία αρχεία που χρειάζονται για να δώσουν λύση σε αυτό που ζητάμε, να έχουμε δηλαδή την αρεστή εφαρμογή. Έτσι οι λύσεις μπορούν να δωθούν ανάλογα με το στόχο, το είδος δηλαδή που θέλουμε. Ένα από αυτά είναι το ASP.NET για τη δημιουργία εφαρμογών διαδικτύου (τρέχουν στην πλευρά του εξυπηρετητή και παρέχουν κύρια δυναμικές σελίδες με χρήση βάσης δεδομένων)

Οι γλώσσες συγγραφής είναι δυο τύπου ΝΕΤ, η C# και η VB (καμία σχέση με την vb6) και οι βαριές C και C++. Οι δυο τελευταίες είναι για προχωρημένους προγραμματιστές. Ουσιαστικά οι δυο πρώτες είναι εδώ οι ενδιαφέρουσες, γιατί συνδιάζονται με το σύστημα συγγραφής και παρέχονται όλα τα καλούδια για να φτιάξουμε γρήγορα και με καλό έλεγχο αποσφαλμάτωσης, λύσεις για εφαρμογές.

H C# όπως και η VB εδώ ανοίκουν στις λεγόμενες γλώσσες κοινής υποδομής, έτσι ο τελικός κώδικας τόσο της πρώτης όσο και της δεύτερης γλώσσας τρέχουν στο ίδιο περιβάλλον, στο περιβάλλον ΝΕΤ, όπου αυτό παρεμβάλλεται μεταξύ του χρήστη και του κώδικα. Ουσιαστικά οι γλώσσες αυτές δεν παράγουν προγράμματα σε γλώσσα μηχανής. Παλαιότερα αυτό ήταν ένα ζήτημα. Διότι ό,τι δεν παρήγαγε γλώσσα μηχανής έτρεχε αργά. Δεν συμβαίνει αυτό σήμερα γιατί στην ουσία ο ενδιάμεσος κώδικας είναι πολύ αποτελεσματικός. Και με τις δυο γλώσσες κάνουμε τα ίδια πράγματα. Η διαφορά είναι στο πώς φαίνεται στο χρήστη. Δηλαδή αν αρέσει ο απλός περιγραφικός τρόπος της VB, ή ο σπαρτιάτικος τύπου C της C#. Συγκρίνοντας αυτές τις γλώσσες με τη C, η τελευταία είναι μεν  "τα πάντα όλα", αλλά στερείται της χρήσης των αντικειμένων, άμεσα, ενώ η C++ ενώ έχει υποστήριξη αντικειμένων στερείται μια τυποποίηση για αυτά. Η ελευθερία δηλαδή των C και C++ στις επιλογές δημιουργεί πρόβλημα προσαρμογής, διερεύνησης και επιλογής των κατάλληλων μερών της εφαρμογής.

Η χρήση των γλωσσών της κοινής υποδομής (CIL), δίνει έτοιμες και μετρημένες επιλογές, με στόχο την γρήγορη ανάπτυξη.  Το μειονέκτημα εδώ είναι ότι δεν ξεκινάει κανείς με κάτι απλό, σε ένα βασικό επίπεδο, αλλά από τρία σκαλοπάτια παραπάνω. Πρέπει να έχει καλύψει το πρώτο σκαλοπάτι, την χρήση απλού προγραμματισμού, ανακύκλωση, εκτέλεση υπό συνθήκη, αρχικοποίηση μεταβλητών. Πρέπει να έχει καλύψει το δεύτερο σκαλοπάτι τη χρήση του συναρτησιακού προγραμματισμού, το πέρασμα τιμών με αναφορά ή με τιμή, τους τύπους χρήστη μεταβλητών. Πρέπει επίσης να καλύψει το τρίτο σκαλοπάτι, την χρήση των αντικειμένων, τις ιδιότητες και τις μεθόδους, τα γεγονότα και πως αυτά συνδέονται με τις φόρμες.

Συνέπεια αυτής της απαίτησης για γνώση πέρα από ένα μικρό λεξιλόγιο (όπως στη C), είναι να μένει στα αζήτητα για τους νέους προγραμματιστές, ένα κατά τα άλλα θαυμάσιο σύστημα παραγωγής λύσεων.

Το ενδιαφέρον λοιπόν θα πρέπει να εστιάζεται στα καλά που παρέχει το σύστημα, όπου οι λύσεις τρέχουν σε όλα τα λειτουργικά, στο ότι είναι δωρεάν, στο ότι υπάρχουν παραδείγματα και έτοιμος κώδικας για να ξεκινήσει κανείς.
Έτσι η γνώση που μπορεί να λείπει για τα τρία επίπεδα που αναφέρθηκαν παραπάνω μπορεί να αντληθεί από την χρήση του συστήματος. Όπως ένας οδηγός αυτοκινήτου γίνεται οδηγός πάνω στο αυτοκίνητο. Για το προγραμματισμό η επίβλεψη από κάποιον ειδικό είναι πάντα επιθυμητή, αλλά όχι απαραίτητη.

Γ.Κ.

Δευτέρα 9 Ιουνίου 2014

Έκδοση 6.5

Αισίως έχω φθάσει στην έκδοση 6.5 της γλώσσας Μ2000. Παράλληλα όμως έχω στήσει και την 6.6 η οποία ακόμα βρίσκεται σε στάδιο ανάπτυξης.
Όμως η έκδοση 6.5 θα διατηρηθεί με οποιοδήποτε αναθεώρηση κρίνω ότι χρειάζεται.

Προς το παρόν έχω την έκδοση 6.5 rev 6. Ο κώδικας βρίσκεται στο Vbforums: Δες εδώ

Υ.Γ (25/11/2015)
To IDE έχει καταργηθεί πια. Δεν είχε δυνατότητα αναδίπλωσης λέξεων, και αποφάσισα να φτιάξω ενσωματωμένο διορθωτή. Στην εκδοση 8 και αναθεώρηση 95 έχουμε όχι μόνο έγχρωμο κώδικα αλλά και εξαγωγή στο πρόχειρο HTML Format.

Παρασκευή 16 Μαΐου 2014

Ημερολόγιο Προγραμματισμού

Έφτασα στην έκδοση 6.4 της Μ2000. Ουσιαστικά στοχεύω στην 7η έκδοση με την ενσωμάτωση κλάσεων και αντικειμένων.
Εκτός από την προεργασία που έχω κάνει για την τελική έκδοση έκανα μερικές προσθήκες:

Περιβάλλον Μ2000

Ο Διερμηνευτής εκτελεί το πρόγραμμα (σε μορφή κειμένου) μέσω του περιβάλλοντός του. Μπορούμε να ανοίξουμε το περιβάλλον και να δώσουμε εντολές για να εκτελεστούν άμεσα ή να δημιουργήσουμε τμήματα και συναρτήσεις ή να φορτώσουμε τμήματα από το δίσκο.

 Στην 6.4 έκδοση έφτιαξα τον ενσωματωμένο διορθωτή να μετακινεί οριζόντια κατά στήλες μπλοκ εντολών ώστε να φτιάχνεται σε μια διάταξη το πρόγραμμα που διαβάζεται καλύτερα. Επίσης έβαλα αναζήτηση προς τα μπρος και προς τα πίσω με ένα εύκολο τρόπο, μαυρίζοντας αυτό που θέλουμε να αναζητήσουμε και με επιλογή της ενέργειας από το αναδυόμενο μενού. Επίσης όταν πατάμε Enter για να πάμε στην επόμενη γραμμή αυτόματα μπαίνουν διαστήματα για να διατηρηθεί η σωστή στήλη!

Μια καλή προσθήκη είναι και η λίστα εντολών. Κάθε φορά που δίνουμε μια εντολή για άμεση εκτέλεση το σύστημα την καταγράφει σε μια λίστα και με τα βελάκια μπορούμε να τη  ξαναβρούμε (είτε το πάνω είτε το κάτω βελάκι πάντα δείχνει τα προηγούμενα και αν εκτελέσουμε κάποιο από αυτά τότε μπαίνει πρώτο στη λίστα). Επειδή ο διορθωτής γραμμής άμεσων εντολών δεν επιτρέπει την μετακίνηση προς τα πίσω  (έχω λόγο που το δεν το επιτρέπω), με την EDIT ή ΣΥΓΓΡΑΦΗ ή Σ χωρίς όρισμα θα ανοίξει η λίστα εντολών, όπου εκεί μπορούμε να προσθέσουμε εντολές, να σβήσουμε, να αλλάξουμε και με τη επιστροφή (με Esc) βρίσκουμε τις αλλαγές με τα βελάκια.
Στο περιβάλλον οποτεδήποτε διορθώνουμε κείμενο, είτε είναι πρόγραμμα, είτε αρχείο κειμένου, είτε είναι εισαγωγή μεταβλητής αλφαριθμητικής με κείμενο, δεν αλλάζει την οθόνη του περιβάλλοντος γιατί όλη η εργασία γίνεται σε ένα ξεχωριστό πλαίσιο που εμφανίζεται για αυτή τη δουλειά, πάνω από την οθόνη. Έτσι πάντα στην οθόνη θα μένουν, αν υπάρχουν, δηλαδή αν δεν έχουν σβηστεί με άλλες εντολές, οι άμεσες εντολές και όποια εκτύπωση έχουμε από αυτές.

Επίσης μπορεί κανείς να κάνει ελαχιστοποίηση (ενώ παλιά δεν γίνονταν) και μπορεί αυτή να γίνεται και με επιλογή από το πρόγραμμα. Για το σκοπό αυτό η εντολή ΤΙΤΛΟΣ αλφαριθμητικό μπορεί να πάρει και άλλη μια παράμετρο, όπου με 0 γίνεται ελαχιστοποίηση και με 1 γίνεται επαναφορά. Μπορούν να γίνουν και από τη γραμμή έναρξης όπου εμφανίζεται ο τίτλος. Αν δεν δώσουμε αλφαριθμητικό τότε φεύγει ο τίτλος από την γραμμή έναρξης και δεν μπορούμε να κάνουμε ελαχιστοποίηση (και κλείσιμο γίνεται από εκεί ή προγραμματιστικά από τη γλώσσα).

Επίσης μπορεί κανείς να μειώσει την ένταση των χρωμάτων με μια άμεση εντολή ΕΠΙΦΑΝΕΙΑ 100, όπου η ΕΠΙΦΑΝΕΙΑ είναι ένα νέο επίπεδο πίσω από το  ΠΕΡΙΘΩΡΙΟ και έχει πάντα το μέγεθος της οθόνης. Στην ΕΠΙΦΑΝΕΙΑ μπορούμε να αντιγράψουμε μια εικόνα, ή ακόμα μπορούμε να την κρύψουμε ενώ έχουμε δώσει αδιαφάνεια στο ΠΕΡΙΘΩΡΙΟ...(και όλα πάνω σε αυτό ΟΘΟΝΗ και κάθε ΕΠΙΠΕΔΟ). Η επιφάνεια ξαναέρχεται με την εντολή ΕΠΙΦΑΝΕΙΑ και με ένα ή δυο αριθμούς, ο πρώτος αν είναι 255 σημαίνει 100% αδιάφανα όλα τα χρώματα, ενώ με 0 σημαίνει 100% διάφανα όλα τα χρώματα, και το δεύτερο νούμερο λέει ποιο χρώμα θα είναι πραγματικά 100% διάφανο, χωρίς να το αλλάζει το πρώτο νούμερο! Η παλιά εντολή ΕΠΙΦΑΝΕΙΑ χωρίς όρισμα, κάνει ότι έκανε και στις άλλες εκδόσεις, γεμίζει το περιθώριο με την εικόνα της επιφάνειας εργασίας.

Σε αυτήν την έκδοση μπορούμε να διαβάζουμε πληκτρολόγιο και ποντίκι για το αν πατήθηκαν  την ώρα που διαβάζουμε και όχι αν είναι πατημένα (αυτό γίνονταν). Ειδικά για το πληκτρολόγιο μπορούμε να διαβάσουμε όλα τα πλήκτρα ακόμα και το Esc χωρίς να πυροδοτήσει την "Διαφυγή" (που τερματίζει τμήματα και νήματα), ούτε το Break που καθαρίζει τον διερμηνευτή!

Έγινε επέκταση της εντολής ΑΝΑΝΕΩΣΗ με ένα όρισμα ώστε αν θέλουμε να αλλάζουμε τον ρυθμό ανανέωσης της οθόνης. Μια ολίσθηση προκαλεί ανανέωση όπως και να έχει το πράγμα.

Πίνακες
Πρόσθεσα πίνακες που μπορούν να οριστούν ξανά, και χωρίς να χάσουν τα δεδομένα τους. Πχ. DIM A$(10,4) και έστω ότι η πρώτη διάσταση λέμε να είναι γραμμές, με DIM A$(20,4) βάζουμε άλλες δέκα γραμμές χωρίς να σβήσουμε ότι είχε πριν ο πίνακας! Μπορούμε να αλλάζουμε ένα πίνακα ακόμα και όταν τον περνάμε με αναφορά σε τμήμα ή συνάρτηση (Στη Μ2000 προς το παρόν δεν περνάει με αντιγραφή ένας πίνακας, αλλά μεμονωμένα στοιχεία του). Οπότε έφτιαξα και μια συνάρτηση για να βρίσκουμε πόσες διαστάσεις έχει ένας πίνακας και το εύρος της κάθε διάστασης (το πρώτο στοιχείο είναι στο 0, άρα με εύρος 10 θα έχουμε από 0 έως 9 οι σωστοί δείκτες).

ΠΙΝΑΚΑΣ Α(10,3)
ΤΥΠΩΣΕ ΔΙΑΣΤΑΣΗ(Α())  ' ΤΥΠΩΝΕΙ 2
ΤΥΠΩΣΕ ΔΙΑΣΤΑΣΗ(Α(),1) ' ΤΥΠΩΝΕΙ 10
ΤΥΠΩΣΕ ΔΙΑΣΤΑΣΗ(Α(),2) ' ΤΥΠΩΝΕΙ 3

Μπορούμε να αλλάζουμε όχι μόνο τον αριθμό του εύρους των διαστάσεων αλλά και τον αριθμό των διαστάσεων. Δηλαδή μπορούμε ένα μονοδιάστατο πίνακα να τον κάνουμε δυο διαστάσεων και το ανάποδο!
Παραμένει το "κόλπο" που έπαιζε και στο ξεκίνημα της  6ης έκδοση, να μπορούμε να περάσουμε με αναφορά σε άλλο τύπο, δηλαδή ενώ έχουμε ορίσει αριθμητικό πίνακα να φτιάξουμε μια αναφορά στον πίνακα και να την μεταφέρουμε σε αλφαριθμητικό ώστε τελικά να μπορούμε ταυτόχρονα σε άλλα στοιχεία να βάζουμε αριθμό και σε άλλα αλφαριθμητικό!  Μάλιστα αν το αλφαριθμητικό είναι χαρακτήρες που δηλώνουν αριθμό, τότε αν το ζητήσουμε ως αριθμό θα το μετατρέψει ο μεταφραστής αυτόματα σε αριθμό! Παραμένει εσωτερικά ο πίνακας που αντιστοιχεί στον πίνακα της Μ2000 να έχει στοιχεία τύπου Variant (δες Visual Basic 6)

Προς το παρόν δεν μπορούμε να σβήσουμε ένα πίνακα (θα σβήσει με το πέρας του τμήματος ή της συνάρτησης που το δημιούργησε), μπορούμε όμως να τον ορίσουμε με ένα μόνο στοιχείο ΠΙΝΑΚΑΣ Α(1)



Δομές
Εμπλουτίστηκε η ΑΝ  συνθήκη ΤΟΤΕ { εντολές } ΑΛΛΙΩΣ {εντολές} με την προσθήκη του ΑΛΛΙΩΣ.ΑΝ συνθήκη {εντολές}, όπου { εντολές } μπορεί να είναι ένα μπλοκ πολλαπλών εντολών - σε πολλές γραμμές. Μπορούν να μπουν πολλά ΑΛΛΙΩΣ.ΑΝ αλλά μόλις βρεθεί συνθήκη που ικανοποιείται τα υπόλοιπα και το ΑΛΛΙΩΣ θα αγνοηθούν.

Σε μπλοκ εντολών η ΔΙΕΚΟΨΕ τερματίζει ένα τμήμα άμεσα, χωρίς να σταματήσει το τμήμα που κάλεσε το τρέχον τμήμα, εκτός από την περίπτωση να βρίσκεται σε ένα μπλοκ μέσα στην ΕΠΙΛΕΞΕ ΜΕ. Στην ΕΠΙΛΕΞΕ ΜΕ η ΔΙΕΚΟΨΕ έχει το νόημα, διέκοψε την λειτουργία σου, και εκτέλεσε κάθε περίπτωση μέχρι τέλους ή να βρεθεί μια ΣΥΝΕΧΙΣΕ (τις συνθήκες δεν τις εκτελεί σε κάθε ΜΕ)
Οι εντολές ΚΥΚΛΙΚΑ, ΕΞΟΔΟΣ, ΞΕΚΙΝΑ, ΔΙΕΚΟΨΕ, ΣΥΝΕΧΙΣΕ, ΛΑΘΟΣκατευθύνουν την ροή εντολών σε ένα μπλοκ εντολών που προσδιορίζεται με αγκύλες. Και ένα τμήμα είναι ένα μεγάλο μπλοκ, οπότε μια ΚΥΚΛΙΚΑ οπουδήποτε στο σώμα των εντολών θα κάνει το τμήμα να ξανατρέξει στο πέρας των εντολών. Μια ΞΕΚΙΝΑ ξανατρέχει άμεσα το τμήμα (είναι σαν μια ΚΥΚΛΙΚΑ και μια ΣΥΝΕΧΙΣΕ μαζϊ). Μια ΔΙΕΚΟΨΕ όπως και η ΕΞΟΔΟΣ  διακόπτει τη ροή, αλλά η ΕΞΟΔΟΣ έχει βάθος που ενεργεί σε ένα μπλοκ ενώ η ΔΙΕΚΟΨΕ αρκετά..αλλά σταματάει μέχρι το Τμήμα στο Τμήμα που θα τρέξει. Τώρα πια η ΕΞΟΔΟΣ σταματάει και την ΓΙΑ όπως και έκανε για τις  ΕΝΩ και ΕΠΑΝΑΛΑΒΕ - οι δομές αυτές είναι ΕΝΩ συνθήκη { εντολές } και ΕΠΑΝΑΛΑΒΕ { εντολές} ΜΕΧΡΙ συνθήκη ή ΠΑΝΤΑ χωρίς συνθήκη.  (υπάρχει και το ΕΠΑΝΕΛΑΒΕ  )
Η εντολή ΣΥΝΕΧΙΣΕ κάνει το εξής...αδειάζει ότι έχει άλλο το μπλοκ να εκτελέσει και αν ετρεξε μια ΚΥΚΛΙΚΑ στο ίδιο μπλοκ τότε ενεργεί σαν την ΞΕΚΙΝΑ διαφορετικά τερματίζει το μπλοκ και συνεχίζει μετά από αυτό.  Η ΛΑΘΟΣ τερματίζει όλα τα τμήματα (σε οποιοδήποτε βάθος και αν έχουν φτάσει) εκτός από την περίπτωση της δομής ΔΕΣ μεταβλητήΕλέγχου {μπλοκ εντολών} όπου αυτή πιάνει τα λάθη και σε περίπτωση λάθους συνεχίζει άμεσα και το αναφέρει (κάνει ψευδες την μεταβλητή ελέγχου, δηλαδή την κάνει 0).
Τέλος η ΑΠΟ παράστασηΑριθμητική ΠΡΟΣ ετικέτα1, ετικέτα2.... τώρα λειτουργεί και με νούμερα (από 1 ως 99999) τα οποία μπορούμε να βάζουμε σε οποιαδήποτε γραμμή. Όμως τα άλματα και σε αυτή την δομή ή με το απλό ΠΡΟΣ πρέπει να είναι εντός μπλοκ εντολών. Μάλιστα δεν υπάρχει διάκριση ως προς το τι είναι η γραμμή που θα βρεθεί η ετικέτα, ή αν υπάρχουν δέκα ίδιες, πάντα θα βρίσκει την πρώτη. Είναι στην ευχέρεια του προγραμματιστή...να κάνει λάθος. Δεν μπήκε έλεγχος για να μην καθυστερεί το άλμα, αφού η γλώσσα κάθε φορά το ψάχνει!

Χειρισμός μεταβλητών
Αντί να δώσουμε α=α+1 μπορούμε να δώσουμε αυτό:
α++
αλλά και τα παρακάτω:
α--
α+=10
α-=3
α*=12
α/=2
χ-! αλλαγή προσήμου.
Τα παραπάνω δεν μπορούν να είναι στην δεξιά πλευρά μιας αντικατάστασης και δεν λειτουργούν για πίνακες (ίσως σε άλλη έκδοση)

Μπορούμε να χειριστούμε αλφαριθμητικά με τις αγκύλες
α$= {"ασαδ"}+{
α}+{σδφσ
σδφσφ
σδφσ  }

Νήματα
Εδώ φτιάχτηκαν μερικά πράγματα: δυο άμεσα νήματα, που φτιάχνονται χωρίς να  πάρουμε αριθμό χειρισμού νήματος.
ΜΕΤΑ αριθμητικήΠαράσταση { εντολές}
Μετά από τον αριθμό των χιλιοστών δευτερολέπτου θα εκτελεστούν οι εντολές μια φορά. Βεβαίως αν το τμήμα που δημιουργήθηκε το νήμα τερματίσει πριν ξεκινήσει το μπλοκ εντολών της ΜΕΤΑ τότε θα χαθεί (επειδή τα τμήματα τερματίζουν όλα τα νήματα πριν κλείσουν).
ΚΥΡΙΟ.ΕΡΓΟ αριθμητικήΠαράσταση {εντολές}
Αυτή η δομή είναι ίδια "εξωτερικά"με την εντολή ΚΑΘΕ, αφού εκτελεί και αυτή τις εντολές σε τακτά χρονικά διαστήματα, αλλά η διαφορά είναι στο ότι το ΚΥΡΙΟ.ΕΡΓΟ είναι νήμα και πως αν κάνουμε ΕΞΟΔΟ τότε θα κλείσει όλα τα νήματα. Η δομή ΚΑΘΕ δεν είναι νήμα. Για να συμπεριφερθεί σαν αυτή τη δομή η ΚΥΡΙΟ.ΕΡΓΟ εκτελεί εκτός νήματος μια εσωτερική επανάληψη να δει πότε θα τερματίσει. Με την ΚΥΡΙΟ.ΕΡΓΟ όλα τα μπλοκ εντολών είναι νήματα και ο χρόνος τους είναι διαχειρίσιμος από το σύστημα!
Αναβάθμισα το σύστημα και μπορούν με το Esc να διακοπούν άμεσα τα νήματα. Τα νήματα καλούνται ξεχωριστά από τα Windows με χρονιστή. Αν ένα νήμα δεν δίνει χρόνο στα άλλα τότε φρακάρει το σύστημα. Για το λόγο αυτό οι εργασίες που καλούνται να κάνουν θα πρέπει να είναι μικρές, να προχωρούν με βήματα. Παρόλα αυτά τα νήματα ενδέχεται να τρέξουν το ένα μέσα στο άλλο. Αυτό που δεν γίνεται είναι να τρέξει ταυτόχρονα ένα νήμα δυο φορές και αυτό γιατί κάθε νήμα βγαίνει από την λίστα προς εκτέλεση και πάει σε μια λίστα των υπό εκτέλεση νημάτων! Τα νήματα ανήκουν στο χώρο του τμήματος που τα δημιούργησε, βλέπουν τις μεταβλητές του τμήματος και τις γενικές. Μπορούν όμως να δημιουργήσουν τμήματα, άρα και άλλα νήματα! Τα οποία όμως για να τρέξουν πρέπει να δώσει το τμήμα χρόνο άρα να καθυστερήσει το  νήμα. Το σύστημα της Μ2000 διαχειρίζεται το πότε μπορεί ένα νήμα να ξεκινήσει και πότε μπορεί να έχει χρόνο το σύστημα να ανανεώνει φόρμες και άλλα "γεγονότα"! Αυτά τα δυο δηλαδή στην έκδοση 6.4 διαχωρίστηκαν, με συνέπεια βέβαια να χαθεί λίγο η ακρίβεια χιλιοστού του χρονιστή εκκίνησης  των νημάτων (τα νήματα καλούνται με μέτρημα χρόνου).


Αυτά τα ολίγα...και συνεχίζω! Θέλω να γράψω την ενσωματωμένη βοήθεια! Ευτυχώς έχω προγράμματα αναφοράς και ελέγχο την συμβατότητα της γλώσσας κάθε φορά που την αλλάζω σε όλα τα επίπεδα!






Παρασκευή 9 Μαΐου 2014

Περί γλωσσών προγραμματισμού τα βασικά!

Σήμερα αποφάσισα να κάνω ένα διάλειμμα από την συγγραφή της 7ης έκδοσης της Μ2000, για να γράψω μερικά πράγματα για τις γλώσσες προγραμματισμού και τις εφαρμογές τους, σε αυτό εδώ το Blog.

Θα αναφερθώ σε είδη προγραμματισμού και εφαρμογές όπως τα βλέπει ο χρήστης και όχι ειδικά για κάποια εφαρμογή, δεν έχω σκοπό να κουράσω τον αναγνώστη. Σε άλλες αναρτήσεις θα δείξω και στοιχεία προγραμματισμού.

Οι προηγούμενες αναρτήσεις μου δεν ήταν τυχαίες. Σε τρεις αναρτήσεις δείχνω το πως από  τον αριθμό φτάσαμε στα δεδομένα και από εκεί στο πρόγραμμα, με την έννοια της εφαρμογής. Ήθελα να δείξω την σωστή αντίληψη, ότι οι αριθμοί στον υπολογιστή έχουν αξία κάθε στιγμή. Αν δεν υπολογίσουμε την αξία των αριθμών τότε ο υπολογιστής θα βγάλει λάθος! Η να το δώσω αλλιώς: Το λάθος του προγράματος είναι η προσμέτρηση των αριθμών (δεδομένων) με διαφορετική αξία από αυτή που έχουν.

Δεν συζητώ αλά Πυθαγόρας, ότι οι αριθμοί έχουν μια γενική αξία, αλλά ότι στους υπολογιστές κάθε αριθμός, εκεί που βρίσκεται,  έχει μια μοναδική αξία και αυτή η αξία του είναι που κάνει το πρόγραμμα που τον "ακολουθεί" (τα δεδομένα είναι εντολές ουσιαστικά, όπως έδειξα στις άλλες αναρτήσεις) να αποδίδει τα προβλεπόμενα. Ουσιαστικά δεν γράφουμε πρόγραμμα για το οτιδήποτε αλλά για εκείνα τα δεδομένα που "αξίζουν" για αυτό.

Στα πρώτα χρόνια λοιπόν χρήσης υπολογιστών οι προγραμματιστές ασχολήθηκαν με την αναζήτηση του σωστού προγράμματος που θα "εκτιμήσει" σωστά τα δεδομένα. Μπορεί να φαίνεται αυτό αρκετό αλλά δεν είναι! Αν τα δεδομένα ήταν πιάτα και το πρόγραμμα το πλυντήριο τότε θα σκεφτεί κανείς .."αυτό το πράγμα πλένει όλα τα πιάτα;".  Γιατί υπάρχουν πιάτα με διαφορετικές ποιότητες, άρα θα απαιτούν ειδική μεταχείριση. Οι προγραμματιστές πήγαν παραπέρα. Σκέφτηκαν να ονομάσουν το πλύσιμο ως μια μέθοδο για κάθε πράγμα που πλένεται, ανεξάρτητα από τη συσκευή πλύσης. Στην κυριολεξία βγήκαν εφαρμογές που δέχονταν "αρχεία" ανεξάρτητα από τη συσκευή "επίδειξης". Ακόμα και η έννοια "προσωπικός υπολογιστής" εμπεριέχει την έννοια του "χειρισμού" ανεξάρτητων δεδομένων. Εκεί χάθηκε η γνώση ότι τα δεδομένα είναι εντολές και πέρασε το κομμάτι των εντολών στον χειρισμό του χρήστη επί των δεδομένων. Αργότερα επανήλθαν τα πράγματα, με την έννοια των μεταδεδομένων, των δεδομένων που πάνε παρέα με στοιχεία για την επίδειξή τους και χρήση τους, άρα με εντολές! Για παράδειγμα ένα αρχείο φωτογραφικής μηχανής λέει μεν τι χρώματα θέλει να δείξει στην εμφάνισή της αλλά δίνει και πρόσθετες πληροφορίες για το αν θα πρέπει να την βλέπουμε οριζόντια ή κάθετα, δηλαδή μια εντολή του τι θα γίνει πριν δούμε η φωτογραφία αλλά δεν έχει γίνει ήδη στο αρχείο η προεργασία!

Στα μετέπειτα χρόνια λοιπόν ο προγραμματισμός στράφηκε στο αντικείμενο που κάτι γίνεται χωρίς να ορίζει τι είναι το αντικείμενο, αρκεί να εφαρμόζουν σε αυτό  οι ιδέες μας για την εκτίμησή του, δηλαδή το τι ιδιότητες θα έχει και με ποιες μεθόδους θα χρησιμοποιείται. Σε αυτή τη περίπτωση ο ένας προγραμματιστής φτιάχνει το "ενδιάμεσο" πρόγραμμα, μια προσαρμογή ή ένα πρότυπο, και αρκεί στον τελικό χρήστη προγραμματιστή να πάρει τη προσαρμογή ή πρότυπο και να προσθέσει, να κατασκευάσει, πραγματικά αντικείμενα στο πρόγραμμά του! Σε περίπτωση που ο χρήστης προγραμματιστής θέλει το αντικείμενό του να κάνει κάτι πρόσθετο τότε μπορεί να επεκτείνει την λειτουργικότητά του. Αυτός ο τρόπος προγραμματισμού λέγεται "αντικειμενοστραφής".


Πραγματικά, πιο εύκολα γράφει κανείς προγράμματα στον αντικειμενοστραφή προγραμματισμό παρά τον μαθαίνει! Το αντίθετο συμβαίνει με τον διαδικαστικό προγραμματισμό, όπου μαθαίνεται εύκολα αλλά φτιάχνονται προγράμματα τέρατα και δύσκολα επεκτείνονται! Ο διαδικαστικός προγραμματισμός στέκεται στο πρόβλημα, μάλιστα τεμαχισμένο σε διαδικασίες, και όχι στο αντικείμενο το οποίο θα προκύψει από την ανάλυση του τι χρειάζεται κανείς για την εφαρμογή του. Αν μεθαύριο χρειαστεί επέκταση, τότε κάνουμε κάτι πολύ απλό, ξαναγράφουμε ένα νέο πρόγραμμα...που έχει κόστος άρα χρήμα για τον προγραμματιστή. Έτσι ο διαδικαστικός προγραμματισμός μπήκε στον επιχειρηματικό κόσμο της πληροφορικής και έδεσε τον προγραμματιστή με την συντήρηση του δημιουργήματός του.  Η συντήρηση είναι η ενημέρωση της εφαρμογής, όπου  αλλάζουμε τις δυνατότητές εμπλουτίζοντας τις διαδικασίες της. Το περισσότερο εδώ για τη συντήρηση είναι ο επαναπρογραμματισμός και το λιγότερο η διαγραφή άχρηστων αρχείων. Σαν αντίμετρο στην κάστα των μεγάλων προγραμματιστών ήρθαν τα αρχεία ανοιχτών προδιαγραφών, ή γενικά οι ανοιχτοί τύποι, όπου η συντήρηση τους είναι ανοιχτή προς όλους αλλά απαιτούν γνώσεις, σαφώς όμως λιγότερο εξειδικευμένες από αυτές των μεγαλο-προγραμματιστών.

Δεν σταμάτησε όμως η εφευρετικότητα του ανθρώπου σε αυτά! Με το διαδίκτυο αναπτύχθηκαν οι περιφραστικές γλώσσες όπως η Html, όπου δεν περιλαμβάνουν υποχρεωτικά διαδικασίες αλλά αποτελούν τα προγράμματά τους τα δεδομένα με τα καλοπιστικά τους στοιχεία και "ζωντανά" στοιχεία όπως οι υπερσυνδέσεις και τα γεγονότα. Αν δεν υπήρχαν τα ζωντανά στοιχεία στην Html θα μιλάγαμε για μια φόρμα, για μεταδεδομένα. Τα ζωντανά στοιχεία δίνουν λειτουργικότητα και τότε ακριβώς μιλάμε για πρόγραμμα.


Μια άλλη μορφή προγραμματισμού είναι ο αυτοματισμός, ο οποίος είναι το εργαλείο του εργαζόμενου γραφείου, και για το λόγο αυτό λέγεται αυτοματισμός γραφείο. Ο αυτοματισμός σουίτας γραφείου (ομάδας εφαρμογών) για παράδειγμα είναι ο τρόπος να χειριστεί κανείς τα αντικείμενα της σουίτας μέσω μακροεντολών. Η μακροεντολή, είναι το κάτι παραπάνω από μια απλή εντολή, όπως "δώσε νέα σελίδα", η οποία περιλαμβάνει "μακριά" σειρά εντολών, και από εκεί βγήκε ο όρος "μακρο-" και προστέθηκε στο όνομα. Οι μακροεντολές αρχικά δεν ήταν προγράμματα. Μάλιστα μπορούσε κανείς να κάνει εγγραφή (όπως σε κασετόφωνο) των εντολών που έδινε και να εκχωρήσει ένα συνδυασμό πλήκτρων. Αργότερα αυτό έγινε με εκχώρηση και ονομάτων ώστε τελικά μια μακροεντολή να καλεί μια άλλη όταν το ζητούν οι εντολές. Με το καιρό οι εντολές έγιναν περιφραστικές και μπήκαν και διαδικασίες. Οι μακροεντολές εκτελούνται πια με συνηθισμένες γλώσσες  που τρέχουν με διερμηνευτή με κλήση μέσα από την εφαρμογή! Επειδή όταν τρέχουν αυτές φαίνεται σαν η εφαρμογή να δίνει παράσταση...τις ονομάζουν "γλώσσες σεναρίων".


Το τελικό ερώτημα εδώ είναι: Υπάρχει η γλώσσα προγραμματισμού που τα κάνει όλα; Όχι δεν υπάρχει. Αν υπήρχε θα είχε αντικαταστήσει τις άλλες. Δεν είναι μόνο σκοπός να φέρει αποτέλεσμα ένα πρόγραμμα αλλά και αν ο κόπος και το κόστος που θα κάνει για να το φέρει θα είναι υποφερτός για μας. Οι γλώσσες προγραμματισμού δεν είναι ελεύθερες γλώσσες κατ' ανάγκη. Και αυτό γιατί για να τις χρησιμοποιήσει κανείς πρέπει να αγοράσει το περιβάλλον ανάπτυξης μαζί με τις συνοδευτικές βιβλιοθήκες διαδικασιών ή και αντικειμένων. Μεγάλες εταιρείες σου δίνουν δωρεάν την βασική έκδοση, που αν θες με αυτή μπορείς να ανακαλύψεις πάλι τον τροχό. Για να φτιάξεις  όμως εδώ και τώρα μια "λύση" για το πρόβλημα που θες λύσεις προγραμματιστικά ή θες να προσφέρεις μια Εφαρμογή για όμοια προβλήματα ή ένα γενικευμένο αντικείμενο, τότε θα πρέπει να πληρώσεις για να έχεις πρόσβαση  σε ιδιωτικό λογισμικό.


Στον αντίποδα της άδειας του πληρωμένου λογισμικού είναι το ελεύθερο λογισμικό. Το ωραίο είναι ότι και το πληρωμένο όπως και το ελεύθερο δίνονται ως έχουν, χωρίς δηλαδή να υπόσχονται ότι θα δώσουν αξία στον χρήστη! Αν δεν βγάλεις λεφτά από τον επεξεργαστή κειμένου σου (εξαιτίας του τρόπου που έχει φτιαχτεί) δεν μπορείς να μηνύσεις τον κατασκευαστή του. Ενώ αν μιλάγαμε για αμάξια, το ένα από το άλλο μπορεί να διαφέρει σε τόσα πράγματα ώστε να λέμε ότι  απολαμβάνει κανείς περισσότερα στο ακριβό απ´ ότι στο φτηνό. Στα προγράμματα η επιδίωξη είναι να γίνει το σωστό, όχι η απόλαυσή του! Αξία λοιπόν στο χρήστη δίδεται όταν το πρόγραμμα είναι σωστό! Αν όμως ο χρήστης φαντάζεται ότι το πρόγραμμα μπορεί να κάνει περισσότερα τότε για αυτά δεν θα είναι σωστό! Για να αποφύγουν λοιπόν οι εταιρείες παραγωγής εφαρμογών την αντιπαράθεση με την φαντασία του πελάτη, λένε ότι δίδονται "ως έχουν" και αν δεν του ταιριάζει κάποιου...τότε είναι δικό του πρόβλημα!


Ακόμα και σε αυτή την ιδέα της "ως έχει λειτουργικότητας" (αφηρημένης) υπάρχει πια πρόοδος. Και η πρόοδος έρχεται με την συμμετοχή του κόσμου στην προώθηση και κατανόηση της εφαρμογής. Έτσι καλές εφαρμογές που έχουν γίνει κατανοητές έχουν ακολούθους, που προσφέρουν ιδέες και απόψεις, και έτσι κατατοπίζουν τον νεοεισερχόμενο για το τι γίνεται, με ποιο πρόγραμμα και πώς. Μάλιστα εταιρείες μεγάλες που παλαιότερα ζήταγαν συνδρομή για να έχει κανείς πρόσβαση στην βιβλιοθήκη λύσεων και απόψεων, ενός κλειστού δικτύου, τώρα δίνουν δωρεάν πρόσβαση και χωρίς να απαιτούν ούτε εγγραφή σε μια λίστα ηλεκτρονικής αλληλογραφίας.

Η αναζήτηση του σωστού προγράμματος δεν έμεινε στο χώρο του προγραμματιστή ή του χρήστη προγραμματιστή (εκείνου που παίρνει έτοιμα εργαλεία και φτιάχνει το δικό του πρόγραμμα), ή του απλού χρήστη (το πολύ μέχρι τη  χρήση των απλών μακροεντολών να κάνει), αλλά έγινε μία καθημερινή ασχολία για όλους. Ο καθένας μας έχει ένα τηλέφωνο με εφαρμογές που έχει κατεβάσει, αλλά και με άλλες που θα ήθελε να είχε και αναζητεί!

Γιώργος Καρράς

Τετάρτη 7 Μαΐου 2014

Περιορισμός στο Προγραμματισμό!

Στο Ασκησιολόγιο του Νικολαΐδη (SpiNet) έχω αναρτήσει μερικά προγράμματα για κάθε ενδιαφερόμενο. Εδώ παραθέτω ένα. Ο χρωματισμός έχει γίνει αυτόματα από τη σελίδα του SpiNet. Εκεί έχω το όνομα χρήστη Bugman.
Η γλώσσα του σχολείου είναι απλή και σκοπό έχει να μάθει το μαθητή αλγόριθμους, δηλαδή μια σειρά εντολών που σε πεπερασμένο χρόνο δίνουν μια εξαγωγή για δοσμένη εισαγωγή δεδομένων. Με άλλα λόγια ασχολούνται το πολύ με πίνακες αριθμών. Εδώ το πρόγραμμα παίρνει δυο ακέραιους και τους διαιρεί με τον αριθμό δεκαδικών που έχουμε σε σταθερά γράψει και δεν αλλάζει κατά τη διάρκεια εκτέλεσης. Δίνεται μαζί και μια βοηθητική συνάρτηση όπου επιστρέφει το πρόσημο ενός αριθμού ως μονάδα με πρόσημο και για το μηδέν δίνει το μηδέν (κατατάσσεται στις συναρτήσεις χρήστη, σε αυτή τη γλώσσα, σε όλες τις άλλες αυτή η συνάρτηση είναι ενσωματωμένη).

Η γλώσσα έχει εδώ την Α_Τ() συνάρτηση που σημαίνει ακέραια τιμή. Μερικές γλώσσες όταν διαβάζουν ακέραιο λογαριάζουν μόνο την εισαγωγή χαρακτήρων που κάνουν ένα ακέραιο..και έτσι μεταβιβάζουν το πρόβλημα της σωστής εισαγωγής στοιχείων στον χρήστη. Άλλες γλώσσες το πλεόνασμα το πετάνε! Δηλαδή διαβάζουν ό,τι εισαγωγή δώσει ο χρήστης και από αυτήν βγάζουν ένα αποτέλεσμα. Ουσιαστικά ο περιορισμός υφίσταται στη γλώσσα και απλά εδώ συζητάμε για το χειρισμό. Γιατί όμως να έχει η γλώσσα περιορισμούς, και αφού μιλάμε για τον χειρσμό, άρα μιλάμε για τον προγραμματισμό, αυτό δηλαδή που δίνει εκείνο που θα χειριστούμε;

Το πρόβλημα είναι ότι κάθε μεταβλητή έχει περιορισμό σε μέγεθος άρα και στο τι τελικά θα καταχωρηθεί. Όταν κάνουμε μια διαίρεση και πρέπει να βάλουμε το αποτέλεσμα κάπου θα περιοριστούν τα τυχόν δεκαδικά σε αυτά που χωράνε. Όμως αυτό δεν σημαίνει ότι περιοριζόμαστε από το μέγεθος των μεταβλητών. Το πρόγραμμα παρακάτω αυτό δείχνει. Κάνει διαίρεση με όσα δεκαδικά θέλουμε...αλλά δεν τα γράφει σε μεταβλητή αλλά στην οθόνη, όπου δεν υπάρχει περιορισμός, μάλιστα θα μπορούσε κανείς να σταματάει να διαβάζουμε και να συνεχίζει τη διαίρεση...μέχρι τον αριθμό των δεκαδικών που θα έχουμε δώσει. Αν δεν δώσουμε, τότε δεν έχουμε πρόγραμμα αλλά ένα μποτιλιάρισμα που για να διακοπεί πρέπει να καταρρεύσουμε το σύστημα...(επιμένω ότι η Μ2000 είναι πιο ωραία γλώσσα)

ΠΡΟΓΡΑΜΜΑ διαιρεση
ΣΤΑΘΕΡΕΣ
  ΑΡΙΘΜΟΣ_ΔΕΚΑΔΙΚΩΝ=12
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Α,Β, ΘΕΣΗ
  ΑΚΕΡΑΙΕΣ: ΑΡΧΙΚΟ_Α, ΑΡΧΙΚΟ_Β
  ΧΑΡΑΚΤΗΡΕΣ: Π[3], ΑΠ

ΑΡΧΗ
   ! Πινακας Π μετατροπής προσήμου σε χαρακτήρα
  Π[1] <-- '-'
   ! στο μηδέν λέμε πρόσημο (+) στην εμφάνιση
   ! διότι μας ενδιαφέρει τα +/-, το μηδέν θα φανεί!
  Π[2] <-- '+'
  Π[3] <-- '+'
  ΓΡΑΨΕ '---------------ΕΠΙΔΕΙΞΗ ΔΙΑΙΡΕΣΗΣ-----------'
  ΓΡΑΨΕ 'ΔΩΣΕ ΑΚΕΡΑΙΟ ΩΣ ΔΙΑΙΡΕΤΕΟ'
  ΔΙΑΒΑΣΕ Α
  ΑΡΧΙΚΟ_Α <-- Α

  ΓΡΑΨΕ 'ΔΩΣΕ ΑΚΕΡΑΙΟ ΩΣ ΔΙΑΙΡΕΤΗ'
  ΔΙΑΒΑΣΕ Β
  ΑΡΧΙΚΟ_Β <-- Β
  ΓΡΑΨΕ 'ΠΡΟΣΗΜΟ ΑΠΟΤΕΛΕΣΜΑΤΟΣ=', Π[ΠΡΟΣΗΜΟ(Α)*ΠΡΟΣΗΜΟ(Β)+2]
  Α <-- Α_Τ(Α)
  Β <-- Α_Τ(Β)
   ! Η εξαγωγή της ΠΡΟΣΗΜΟ() μας δίνει τρια πιθανά αποτελέσματα
   ! και εδώ χρησιμοποιούμε το ένα, αν και με ένα Β=0 θα είχαμε το ίδιο αποτέλεσμα

  ΑΝ ΠΡΟΣΗΜΟ(Β)=0 ΤΟΤΕ
    ΓΡΑΨΕ 'ΔΙΑΙΡΕΣΗ ΜΕ ΤΟ ΜΗΔΕΝ - ΛΑΘΟΣ'
  ΑΛΛΙΩΣ
    ΓΡΑΨΕ 'ΔΙΑΙΡΕΣΗ=', (Α DIV Β)
    ΓΡΑΨΕ 'ΥΠΟΛΟΙΠΟ=', (Α MOD Β)
    ΓΡΑΨΕ 'ΥΠΟΛΟΓΙΣΜΟΣ ΔΕΚΑΔΙΚΩΝ'
    ΘΕΣΗ <-- 0
    Α <-- (Α MOD Β)
    ΟΣΟ  (ΘΕΣΗ <  ΑΡΙΘΜΟΣ_ΔΕΚΑΔΙΚΩΝ ) ΚΑΙ (Α>0)  ΕΠΑΝΑΛΑΒΕ
      ΘΕΣΗ <-- ΘΕΣΗ+1
      Α <-- Α*10
      ΓΡΑΨΕ (Α DIV Β)
      Α <-- (Α MOD Β)
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ΓΡΑΨΕ 'ΕΠΑΛΗΘΕΥΣΗ:', ΑΡΧΙΚΟ_Α/ΑΡΧΙΚΟ_Β
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

   ! Στην BASIC υπάρχει η SGN() που δουλεύει ακριβώς όπως η ΠΡΟΣΗΜΟ()
   ! Η διαφορά είναι ότι σε επιστημονικούς υπολογισμούς μπορεί κανεις
   ! να κάνει έτσι την ΠΡΟΣΗΜΟ ώστε σε ένα μικρό διάστημα γύρω από το μηδέν
   ! να δίνει μηδέν π.χ. ( ΑΝ -.00000000000000005<ΑΛΦΑ<.00000000000000005 ΤΟΤΕ ΑΛΦΑ=0)
   ! Στους αυτοματισμούς το λέμε DEAD ZONE:
   ! όσο αυξάνουμε τη νεκρή περιοχή τόσο αναίσθητο κάνουμε το σύστημα!!!!

ΣΥΝΑΡΤΗΣΗ ΠΡΟΣΗΜΟ(ΑΛΦΑ):ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ:  ΑΛΦΑ
ΑΡΧΗ
  ΑΝ ΑΛΦΑ=0 ΤΟΤΕ
    ΠΡΟΣΗΜΟ <-- 0
  ΑΛΛΙΩΣ_ΑΝ ΑΛΦΑ>0 ΤΟΤΕ
    ΠΡΟΣΗΜΟ <-- 1
  ΑΛΛΙΩΣ
    ΠΡΟΣΗΜΟ <-- -1
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ