20
To PM kai h filosofÐa tou Nikìlaoc Qristìpouloc [email protected] ’Ekdosh 0.3 Ajăna, 28 AprilÐou 2004 Perieqìmena 1 To peribĹllon tou logismikoÔ 2 1.1 Η νέα συλλογική ανάπτυξη ................................ 2 2 To prìblhma tou ădh grammènou kÿdika 3 2.1 Ι/Ο ............................................. 3 2.2 Η είσοδο τη εξόδου ................................... 3 2.3 Νεκρή φύση ........................................ 4 2.4 Συμπεράσματα ....................................... 4 3 ’Ena eniaÐo interface 4 4 En’ arqă ătan h SB 5 4.1 Το ιεραρχικό σύστημα των αρχείων ........................... 6 4.2 Πω έγινε όμω αυτό ................................... 7 5 H idèa 8 5.1 Τα modulec ανεξάρτητα από το PM ........................... 9 6 Teqnikèc anĹptuxhc tou PM 9 6.1 Σύνδεση αρχείου και κώδικα ............................... 10 6.2 Εξέλιξη σε module .................................... 10 6.3 VFS ............................................ 12 6.4 Εκτό του VFS ...................................... 14 6.5 PMFS ........................................... 14 6.6 ΄Ενα έτοιμο εικονικό σύστημα αρχείων .......................... 14 7 Arqèc tou PM 15 7.1 Λογική σχεδίαση ..................................... 15 7.2 Ενιαίο interface ...................................... 16 7.2.1 Ομαδοποίηση στο PM .............................. 16 7.3 Ενιαίο τρόπο μεταφορά δεδομένων ........................... 16 7.4 Διαχείριση modulec .................................... 17 7.5 Αυτόματη συμπλήρωση συναρτήσεων των modulec ................... 17 8 ’Etoima paradeÐgmata 17 8.1 vfstest ........................................... 17 8.2 Συνοδευτικά παραδείγματα — εφαρμογέ ......................... 19 8.3 Συνοδευτικά παραδείγματα — modulec .......................... 19 1

To PM kai h filosofÐa touchristopoulos.users.sourceforge.net/doc/pm-idea.pdf · Τα αρχεία, εκτόc των άllων, είναι “νεκρή φύση”. ∆εν κάνουν

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

  • To PM kai h filosofÐa tou

    Nikìlaoc Qristì[email protected]

    ’Ekdosh 0.3Ajăna, 28 AprilÐou 2004

    Perieqìmena

    1 To peribĹllon tou logismikoÔ 21.1 Η νέα συllογική ανάπτυξη . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    2 To prìblhma tou ădh grammènou kÿdika 32.1 Ι/Ο . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 Η είσοδοc τηc εξόδου . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.3 Νεκρή φύση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.4 Συµπεράσµατα . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    3 ’Ena eniaÐo interface 4

    4 En’ arqă ătan h SB 54.1 Το ιεραρχικό σύστηµα των αρχείων . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.2 Πωc έγινε όµωc αυτό? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    5 H idèa 85.1 Τα modulec ανεξάρτητα από το PM . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    6 Teqnikèc anĹptuxhc tou PM 96.1 Σύνδεση αρχείου και κώδικα . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106.2 Εξέlιξη σε module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106.3 VFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126.4 Εκτόc του VFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146.5 PMFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146.6 ΄Ενα έτοιµο εικονικό σύστηµα αρχείων . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    7 Arqèc tou PM 157.1 Lογική σχεδίαση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157.2 Ενιαίο interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    7.2.1 Οµαδοποίηση στο PM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167.3 Ενιαίο τρόποc µεταφοράc δεδοµένων . . . . . . . . . . . . . . . . . . . . . . . . . . . 167.4 ∆ιαχείριση modulec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177.5 Αυτόµατη συµπlήρωση συναρτήσεων των modulec . . . . . . . . . . . . . . . . . . . 17

    8 ’Etoima paradeÐgmata 178.1 vfstest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178.2 Συνοδευτικά παραδείγµατα — εφαρµογέc . . . . . . . . . . . . . . . . . . . . . . . . . 198.3 Συνοδευτικά παραδείγµατα — modulec . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    1

  • 1 TO PERIB§ALLON TOU LOGISMIKO§U 2

    9 JewrhtikĹ paradeÐgmata 199.1 ΄Εναc e-mail client που lειτουργεί σαν σύστηµα αρχείων . . . . . . . . . . . . . . . . 199.2 ΄Ενα παντοδύναµο εργαlείο µε lίγο κώδικα . . . . . . . . . . . . . . . . . . . . . . . 19

    PerÐlhyh

    To PM eÐnai èna sÔsthma pou sqedÐasa gia na lÔsei sugkekrimèna problămata, ìpwc toneniaÐo trìpo epikoinwnÐac ìlwn twn suskeuÿn allĹ kai diĹforwn bibliojhkÿn me to desktopperibĹllon tou arm0nia project. ’Eqei ìmwc polÔ megalÔterec proektĹseic. To jewrÿ idiaÐteraaplì, allĹ dustuqÿc o perissìteroc kìsmoc adunateÐ na to katalĹbei, kai edÿ èrqetai autì toèggrafo pou skopì èqei na exhgăsei autì to “perÐergo” sÔsthma pwc leitourgeÐ kai poiec eÐnaioi dunatìthtèc tou. To PM ektìc apì èna uposÔsthma, mporeÐ na qrhsimopoihjeÐ wc jewrhtikìprìtupo gia eniaÐo interface, kajÿc epÐshc kai gia uposÔsthma tÔpou OLE/CORBA k.a.

    1 To peribĹllon tou logismikoÔ

    Εµείc οι προγραµµατιστέc γνωρίζουµε ποlύ καlά την ποlυπlοκότητα των πραγµάτων. ΄Εχουµε νακάνουµε µε ένα χαοτικό περιβάllον στο οποίο εκατοµµύρια γραµµέc κώδικα, εκατοµµύρια εντοlέc,ταξινοµηµένεc συνήθωc σε “βιβlιοθήκεc”, που αllηlεπιδρούν και συνδυάζονται για να παράγουν τοτεlικό έργο, είτε αυτό είναι µια “εφαρµογή”, είτε ένα οlόκlηρο L.Σ. µε όlα τα συνοδευτικά αυτού.

    Υπάρχουν αστρονοµικά µεγέθη κώδικα, γραµµένα από διάφορουc προγραµµατιστέc ανά τον κόσµο,για ένα επίσηc µεγάlο εύροc θεµάτων1. Μια επίσκεψη στο sourceforge ή στο codeguru ή στο simtelκαι αllού, θα σαc πείσει παρά το ότι είναι ένα µικρό µέροc του κώδικα που “κυκlοφορεί” στο internet!

    Μέσα σ΄ αυτό το “codespace”2 βρίσκουµε συχνά lύσειc τιc οποίεc χρειαζόµαστε ή “θα ήταν χρήσιµο”ή “θα ήταν όµορφο” ή “θα ήταν έξυπνο” ή “θα ήταν βοlικό για το µέllον” να τιc προσθέσουµε. Lύσειcέτοιµεc και δοκιµασµένεc, lύσειc που τιc συντηρούν και αναπτύσσουν άllοι, lύσειc που εκτοξεύουντην ίδια την ανάπτυξη του lογισµικού στα ύψη µέσω τηc συllογικήc πια εργασίαc.

    1.1 H nèa sullogikă anĹptuxh

    Στο “O Kajedrikìc kai to PazĹri” ο Raymond προσπάθησε να εξηγήσει την δύναµη τηc συllογικήcεργασίαc από µια παlαβή[Bazaar, 10 π.19], τυπική αµερικάνικη (≥ 1950) οπτική γωνία, δηlαδή, ανύ-παρκτηc ή προπαγανδισµένηc κοινικοποlιτικήc “φιlοσοφίαc”. ΄Οπωc και να έχει αυτό το έργο είναισηµαντικό από ποllέc πlευρέc και έχει ενδιαφέρουσεc απόψειc· το σηµαντικότερο όlων είναι ότι είναιοlοκlηρωµένο και ο αναγνώστηc που δεν έχει επαφή µε το open/free source µπορεί να αντιlηφθείτην “επανάσταση” στην ανάπτυξη του lογισµικού που συντεlέστηκε τιc τεlευταίεc δεκαετίεc3 καθώcεπίσηc και την δύναµη τηc συllογικήc εργασίαc που είναι γνωστή στο ευρύ κοινό σήµερα, µε το όνοµαLinux.

    Βάση αυτών, lοιπόν, βlέποµαι ότι υπάρχει ήδη υποδοµή, προσπάθειεc αllά και µεγάlο έργο φτιαγµένογια να lειτουργεί για το σύνοlο, δηlαδή για εµάc. Οι περισσότεροι τηc free source κοινότηταc είναιιδεοlόγοι και βασίζουν τιc κινήσειc αυτέc στην ηθική, έτσι αποκαlούν τουc εκάστοτε προγραµµατιστέcπου συνεισφέρουν ωc εθεlοντέc.

    Εδώ όµωc θα διαφωνήσω διότι βlέπω τον κώδικα διαφορετικά, τον βlέπω σαν ανταllαγή απόψεων4

    ή/και εργασίαc. Η ανταllαγή των απόψεων είναι και η ρίζα τηc ανάπτυξηc τηc επιστήµηc και τηc

    1Na jumÐsw to prìgramma pou èggrafe poiămata :)2 ’Enac prìqeiroc dikìc mou orismìc, antÐstoiqoc tou dataspace, gia na dhlÿsw to sÔnolo tou kÿdika, public

    domain, open/free source allĹ kai “kleidwmènou” me kĹpoio nomikì trìpo, pou upĹrqei sto internet.3To open source arqÐzei “epÐshma” me to TEX apì ìso xèrw...4O kÿdikac eÐnai èkfrash ìpwc ta majhmatikĹ kai o lìgoc kai ìsoi diafwnoÔn s’ autì eÐnai giatÐ den eÐnai pro-

    grammatistèc parĹ mìno kat’ ìnoma.

  • 2 TO PR§OBLHMA TOU §HDH GRAMM§ENOU K§WDIKA 3

    φιlοσοφίαc5. Η ανταllαγή δεν προôποθέτει την θέlηση χωρίc αντάllαγµα που απαιτεί ο εθεlοντισµόcγια αυτό και περιµένω να µεγαlώσει ακόµα περισσότερο ο “πlηθυσµόc” τηc κοινότηταc.

    Το free/open source είναι περισσότερο µια επιστηµονική “κοlεκτίβα” παρά ένα “φιlανθρωπικό ίδρυ-µα”. Βοηθώνταc ένα έργο που χρησιµοποιούµε, βοηθάµε τον εαυτό µαc διότι το έργο αυτό, θα τοχρησιµοποιήσουµε και στο µέllον. Η ανάπτυξη ενόc τέτοιου έργου είναι και δικό µαc θέµα αφούβασίζουµε µέροc τηc εργασίαc µαc επάνω του.

    Περισσότερα για την σκlηροπυρηνική ιδεοlογία του eleÔjerou logismikoÔ θα βρείτε στιc σεlίδεc τηcGNU , ενώ για την µετριοπαθή ιδεοlογία του logismikoÔ anoiktoÔ kÿdika, στιc σεlίδεc του OSI . Μιαπεριγραφή και για τα δύο από το Ε∆ΕΤ[Ε∆ΕΤ-Γ4], όχι και τόσο lεπτοµερείc, αllά χρήσιµη για τουcάσχετουc.

    2 To prìblhma tou ădh grammènou kÿdika

    Συµβαίνει η κάθε οµάδα ανάπτυξηc ενόc έργου να διαµορφώνει την επικοινωνία µε άllο κώδικα ανά-lογα µε τιc ανάγκεc τηc και συµβαίνει αυτή η επικοινωνία να είναι κάθε φορά διαφορετική από έργοσε έργο, ακόµα και όταν αναφέρεται στο ίδιο θέµα. Αυτό είναι φυσικό να συµβαίνει διότι η συllογικήεργασία παραµένει σε επίπεδο έργου και όχι συνόlου πράγµα έτσι και αllιώc ποlύ δύσκοlο.

    Αυτό όµωc έχει σαν αποτέlεσµα, να αναγκάζει τουc προγραµµατιστέc να αποφεύγουν συχνά τηνχρήση τέτοιων έργων διότι:

    1. Απαιτεί από αυτούc να δώσουν χρόνο για την εκµάθηση του διαφορετικού interface.

    2. Συχνά δεν ταιριάζει το interface µε την δοµή του ήδη υπάρχων κώδικα.

    3. Είναι αναγκασµένοι να γράψουν ειδικό κώδικα για την υποστήριξη του καθενόc µε αποτέlεσµα,εκτόc από κουραστικό και χρονοβόρο, να είναι και ανασφαlέc διότι ο κώδικαc όσο πιο περίπlοκοcείναι τόσο πιο πιθανό είναι να κάνει σφάlµατα.

    2.1 I/O

    Το κάθε πρόγραµµα χαρακτηρίζεται από την “είσοδο” και την “έξοδο”. ΄Ωc “είσοδο” ονοµάζουµετο σύστηµα εισαγωγήc στοιχείων, όπου αυτό µπορεί να είναι µια συσκευή όπωc το ποντίκι ή τααποτεlέσµατα κάποιαc επεξεργασία όπωc ένα αρχείο, ή και άllα. Αντίστοιχα και η “έξοδοc” είναιτα αποτεlέσµατα του προγράµµατοc τα οποία µπορεί να είναι ένα αρχείο, κάποια ή κάποιεc γραφικέcπαραστάσειc στην οθόνη και πάει lέγονταc.

    Στην σηµερινή κατάσταση τα συστήµατα εισόδου/εξόδου κατά κανόνα απαιτούν απόlυτα διαφορετικότρόπο χειρισµού από το πρόγραµµα. ΄Οταν για παράδειγµα σχεδιάζουµε ένα διάγραµµα στην οθόνη,χρειάζεται να γράψουµε και νέο διαφορετικό κώδικα για να το εκτυπώσουµε ή να το πάρουµε σε µορφήαρχείου.

    2.2 H eÐsodoc thc exìdou

    Τα πράγµατα γίνονται ιδιαίτερα ποlύπlοκα όταν θέlουµε να επεξεργαστούµε τα αποτεlέσµατα µιαcεφαρµογήc, καθώc επίσηc και τα αποτεlέσµατα τηc δικήc µαc εργασίαc να είναι δυνατό να επεξεργα-στούν από άllεc εφαρµογέc.

    5Dhladă na perimènoume na pollaplasiasteÐ se ekplhktikì bajmì to ădh terĹstio codespace.

  • 3 §ENA ENIA§IO INTERFACE 4

    Κατά κανόνα, η επικοινωνία των προγραµµάτων γίνετε µέσω αρχείων, ενώ χρειάζεται ειδικό χειρισµόγια την επικοινωνία τηc κάθε εφαρµογήc. Για παράδειγµα για ένα διανυσµατικό σχέδιο, είµαστε αναγ-κασµένοι να χρησιµοποιήσουµε διάφορεc µορφέc αρχείων που χρησιµοποιούνται από τα προγράµµαταCAD, και αν θέlουµε να κάνουµε καlή δουlειά θα πρέπει να υποστηρίζουµε 2-3 τουlάχιστον τέτοιεcµορφέc.

    2.3 Nekră fÔsh

    Τα αρχεία, εκτόc των άllων, είναι “νεκρή φύση”. ∆εν κάνουν υποlογισµούc, δεν συµπεριφέρονταιανάlογα µε τιc ανάγκεc µαc, αllά είναι στατικά, νεκρά κατά κάποιο τρόπο. Αυτό περιορίζει κατάποlύ τιc δυνατότητεc εισόδου/εξόδου. Για παράδειγµα δεν µπορείc από ένα αρχείο διανυσµατικώνγραφικών να του ζητήσειc να µετατραπεί σε άllη ανάlυση (χρήσιµο για επεξεργασία σε bitmap) ήσε άllο σύστηµα αξόνων (+ψ επάνω ή κάτω), πρέπει να το κάνειc στο πρόγραµµά σου. Αυτό είναιµια τυπική διεργασία - ρουτίνα που φαντάζοµαι ποllοί από εµάc την κάνουν “βόlτα” από πρόγραµµασε πρόγραµµα, αν και lογικό είναι να γίνετε σε ένα µέροc, επειδή η δοµή των στοιχείων διαφέρειαναγκαζόµαστε να αντιγράφουµε και να διορθώνουµε αυτή την ρουτίνα. ∆εν θα γινόταν όµωc αυτόαν µπορούσαµε από την “είσοδο” να ζητήσουµε το πωc θέlουµε τα στοιχεία.

    2.4 SumperĹsmata

    Αυτά ακριβώc περιορίζουν στο εlάχιστο την δοκιµή (και χρήση) ενδιαφέρον έργων µε αποτέlεσµατον περιορισµό τηc τοπικήc και συνοlικήc ανάπτυξηc του lογισµικού σε παγκόσµιο επίπεδο. ∆ηlαδήµαc δυσκοlεύει να δοκιµάσουµε και να χρησιµοποιήσουµε έτοιµεc lύσειc, και αν αυτά τα προβlήµαταδιορθωθούν είµαι σίγουροc θα έχουµε εκτίναξη τηc ανάπτυξηc lογισµικού, εµπορικού και µη, σεπαγκόσµιο επίπεδο.

    Θα δούµε όlα αυτά πωc lύνονται και πωc προωθούνται σε µια τεlείωc διαφορετική lογική χρήσηc καιανάπτυξηc. Θα ασχοlηθούµε όµωc σχεδόν αποκlειστικά µε το lεγόµενο VFS, δηlαδή το “εικονικόσύστηµα αρχείων”, διότι είναι το πιο σηµαντικό αllά και το πιο απlό τµήµα του PM.

    3 ’Ena eniaÐo interface

    Τα προβlήµατα αυτά τα έχω “νιώσει στο πετσί µου” από την εποχή προ του DOS. ΄Οσο όµωc πέρναγεο καιρόc, και όσο µεγάlωνε η αθlίοτητα του Windows API [CrqAPI] µε ανάγκασε ποllέc φορέc ναφτιάχνω C modules που ουσιαστικά δεν έκαναν τίποτα άllο από το να προσφέρουν ένα ενιαίο interfaceανάµεσα ίδιου θέµατοc βιβlιοθήκεc ή τµήµατα του API !

    Στο arm0nia project βρέθηκα να είµαι σε θέση που έπρεπε να συνδέσω εκατοντάδεc βιβlιοθήκεcγνωστέc και µη, τµήµατα κώδικα γνωστά και µη καθώc και την διασύνδεση όlων αυτών µεταξύ τουc.Αυτό πίστευα, και επιµένω ότι πρέπει να γίνει και σε ποlύ µεγάlο βαθµό το PM τα κατάφερε. ∆εν µεενδιέφερε και τόσο το arm0nia αυτό διότι είχα και έχω περιορισµένο χρόνο κυρίωc lόγο τηc εργασίαcµου και τηc SB. Αllά το είδοc του προβlήµατοc ήταν που µου κέντρισε το ενδιαφέρον.

  • 4 EN§ ARQ§H §HTAN H SB 5

    ApplicationInput

    Input B

    Input C

    Output A

    Output B

    Output C

    Η όlη κατάσταση έµοιαζε µε το παραπάνω σχήµα. Τα προγράµµατα ήταν φτιαγµένα όπωc το applica-tion τηc εικόναc, δηlαδή είχαν φτιαχτεί για µιαc συγκεκριµένηc µορφήc είσοδο ή για συγκεκριµένωνµορφών σύνδεσηc µε βιβlιοθήκεc6.

    Αυτό lοιπόν που χρειαζόταν ήταν τα πάντα να οµιlούν την ίδια γlώσσα, να έχουν δηlαδή την ίδιαυποδοχή σύµφωνα µε το σχεδιάγραµµα.

    � i � Το ενιαίο interface για τα πάντα είναι η βασική αρχή του PM. Είναι η αρχή όπουξεδιπlώνεται γύρω τηc το υπόlοιπο σύστηµα.

    Ωc δια µαγείαc, lοιπόν, όlα τα προβlήµατα θα lυνόντουσαν αν υπήρχε κοινή υποδοχή καθώc επίσηcκαι η “έξοδοc” ήταν όπωc η “είσοδοc”. Και αν για κάποιο lόγο δεν µπορούσαµε να είχαµε κοινήείσοδο ένα τέτοιο πρόγραµµα που θα αναlάµβανε να έχει µια γνωστή “έξοδο” θα κάlυπτε αυτό τοκενό ώστε να έχουµε το ενιαίο τρόπο επικοινωνίαc.

    Ωc δια µαγείαc, lοιπόν, όlα όσα δεν lυνόντουσαν µε αυτό θα µπορούσαν να lυθούν µε επιπlέον κώδι-κα. Στο PM η “είσοδοc” και η “έξοδοc” είναι σχεδόν πάντα κώδικαc, δηlαδή “ζωντανό”, ευµετάβlητοπράγµα. Και αν κατά περίπτωση δεν τύχει, µπορεί να γίνει.

    4 En’ arqă ătan h SB

    Ανάµεσα στα άllα, έχω φτιάξει και µια BASIC , την SmallBASIC (για συντοµία SB). Η SB έχειµεγάlη σηµασία για το PM, διότι είναι ο “σχεδιαστικά” πρόγονόc του.

    Η SB είναι ένα ιδιόµορφο έργο· πρέπει να παρέχει την µέγιστη ευκοlία στον χρήστη µιαc και απευθύ-νεται — εκτόc των άllων — σε παιδιά, πρέπει επίσηc να lειτουργεί κάτω από διαφορετικά lειτουργικάσυστήµατα όπωc PalmOS, Linux,Windows κ.lπ. ΄Οlα αυτά σηµαίνουν ότι έπρεπε η SB να προσφέρειένα ενιαίο περιβάllον για µεγάlο αριθµό διαφορετικών πραγµάτων αllά και ταχύτατη lειτουργία διότιειδικά στα Palms η ταχύτητα καθώc και οι δυνατότητέc τουc είναι ενοχlητικά περιορισµένεc.

    6Sto sqediĹgramma deÐqnoume mìno thn “eÐsodo” kai “èxodo” allĹ to Ðdio sumbaÐnei kai me tic diĹforec bibliojăkec.

  • 4 EN§ ARQ§H §HTAN H SB 6

    Για να καταφέρω αυτά, πήγα πίσω στιc πρώτεc εκδόσειc του Unix αllά και στο DOS (και CP/M)και αναρωτήθηκα γιατί δεν επιβlήθηκε µια όµορφη σχεδιαστική δυνατότητα. Και στα δύο αυτά L.Σ.η σειριακή πόρτα lειτουργεί όµοια µε την κονσόlα και τα δύο lειτουργούν µε εντοlέc file I/O. Ναι,έχουν ένα ενιαίο interface, έστω και πρόχειρα φτιαγµένο.

    1 fp_console = fopen("CON:", "wt"); // Anoigma device consolas2 fp_serial = fopen("COM1:", "wt"); // Anoigma serial port 13

    4 fprintf(fp_console, "Hello, world!"); // typwma sto monitor5 fprintf(fp_serial, "Hello, world!"); // apostolh mesw serial

    Πιστεύονταc ότι σχεδόν όlα τα δεδοµένα µπορούν να οργανωθούν έτσι ώστε να διαχειρίζονται µεfile I/O εντοlέc, αllά και επειδή είχα ήδη αποκτήσει αναγκαστικά εµπειρία σε τέτοια θέµατα, αντίνα προσθέτω εντοlέc στην SB για κάθε driver, άllαξα τον κάθε driver να συµπεριφέρεται σανfilesystem.

    ΄Ετσι σήµερα στην SB, µε τιc τέσσεριc εντοlέc OPEN , INPUT#, PRINT# και CLOSE που χρησι-µοποιούνται για το κlασσικό file I/O, µπορούν οι χρήστεc να κάνουν τα εξήc

    1. Να χειρίζονται τα αρχεία του δίσκου τουc.

    2. Να στέlνουν και να παίρνουν δεδοµένα µέσω σειριακήc.

    3. Να γράφουν και να διαβάζουν PDOC αρχεία (PalmOS database compressed documents).

    4. Να γράφουν και να διαβάζουν memos από το memo database.

    5. Να γράφουν και να διαβάζουν µέσω telnet protocol, δηlαδή να επικοινωνούν µε τιc περισσότερεcυπηρεσίεc του internet (POP3, SMTP, HTTP κ.α.)

    Η SB συνέβαllε βέβαια παραπάνω στο PM, διότι ο κώδικαc για τα πρώτα δυναµικά modules καθώcκαι άllα, είναι αντιγραφή του αντίστοιχου κώδικα τηc SB.

    4.1 To ierarqikì sÔsthma twn arqeÐwn

    Το ιεραρχικό σύστηµα των αρχείων είναι µια κlασσική και πάµποllα διαδεδοµένη δοµή που µπορεί ναεκφράσει σύνθετεc δοµέc δεδοµένων. ∆εν νοµίζω ότι υπάρχει κάποιοc που δεν µπορεί να περιγράψειτην δοµή των δεδοµένων όπωc ακριβώc σε ένα RDBMS. Οι σχέσειc των στοιχείων καθώc και τα ευ-ρετήρια, µπορούν να εκφραστούν µε πιο σύνθετουc τρόπουc αllά πάντα στα πlαίσια του “συστήµατοcαρχείων” καθώc επίσηc και οι lειτουργίεc µέσω κώδικα. Για παράδειγµα τα συνδεδεµένα προγράµµατα(το ‘#!’ στο Unix και η “επέκταση” στα Windows) και οι συνδέσειc (links στο Unix).

    Πέρα από αυτά, οι διαδικασίεc που χρειάζονται για να γίνει η “ανάγνωση” ή “εγγραφή” των στοιχείων,είτε έχουµε αρχείο, είτε socket, είτε database, είτε δυναµική lίστα, κ.lπ. είναι πάντα η ίδια. Αllάζουνµόνο οι εντοlέc ανάγνωσηc και εγγραφήc.

    Τυπικόc ψευδοκώδικαc που εκφράζει µια τυπική διεργασία µε “ανάγνωση” και “εγγραφή”.

    1 Păgaine sthn arqă twn stoiqeÐwn2 Efìson den teleÐwsan ta stoiqeÐa3 anĹgnwsh stoiqeÐwn4 epexergasÐa5 eggrafă stoiqeÐwn sthn èxodo6 păgaine sto epìmeno stoiqeÐo

  • 4 EN§ ARQ§H §HTAN H SB 7

    Είτε είναι δυναµική lίστα, είτε database, είτε αρχείο κειµένου, ποllέc φορέc και socket κ.lπ. αυτόcο ψευδοκώδικαc εκφράζει κάτι που έχουµε βαρεθεί να το επαναlαµβάνουµε. Η SB (και το PM κατ΄επέκταση) δεν υπόσχεται ότι δεν θα το γράψουµε, υπόσχεται όµωc ότι έτσι θα γίνετε και µε τιc ίδιεcεντοlέc για οποιοδήποτε θέµα. INPUT# για την ανάγνωση, PRINT# για την εγγραφή.

    � Οι χρήστεc τηc SB είναι ευχαριστηµένοι µε την χρήση αυτών αντί να µαθαίνουν τιcidiìthtec και τιc mejìdouc του εκάστοτε class. �

    4.2 Pwc ègine ìmwc autì?

    ΄Εχω το εlάττωµα να lατρεύω τα function-pointers, στην SB όµωc τέτοια υlοποίηση ήταν δύσκοlοlόγω των ποllαπlών code segments που απαιτούσε το PalmOS. ΄Ετσι αυτό υlοποιήθηκε µε τον πlέοναπlό τρόπο, τον οποίο και θα δούµε αν θέlουµε να καταlάβουµε αργότερα το ιδιαίτερα σύνθετο PM.

    Η εντοlήOPEN παίρνει παράµετρο το όνοµα του αρχείου για άνοιγµα. Στην BASIC , αντίθετα από τηνC , αυτή η εντοlή παίρνει ωc παράµετρο και το file-handle. ΄Οταν ο χρήστηc, πέραν του συνηθισµένουsustămatoc arqeÐwn, θέlει να χρησιµοποιήσει κάποιον από τουc προκαθορισµένουc οδηγούc πουπροσφέρονται µε την SB, χρειάζεται αυτό να το δηlώσει στο ìnoma arqeÐou. ΄Ετσι χρησιµοποιώνταcτο σύµβοlο ‘:’ διαχωρίζει το όνοµα του οδηγού και τιc παραµέτρουc του. Για παράδειγµα το ’onomaarqe’iou “myfile.txt” σηµαίνει ένα απlό αρχείο, το ìnoma arqeÐou “COM1:9600” σηµαίνει ότι η SB ναχρησιµοποιήσει τον οδηγό τηc σειριακήc πόρταc 1 (COM1) αντί για το κlασσικό sÔsthma arqeÐwn,στην ταχύτητα των 9600 BAUDs.

    SB source

    1 handle = 12 OPEN "COM1:9600" AS #handle

    ΄Ετσι το παραπάνω παράδειγµα µεταφράζεται από την SB στο παρακάτω κώδικα.

    AntikatĹstash thc OPEN

    1 fileName = "COM1:9600";2 driverName = fileName.leftOf (’:’); // driverName

  • 5 H ID§EA 8

    SB source

    1 PRINT #handle; "Hello, world!"

    Αντίστοιχα και η αποστοlή στοιχείων (PRINT) γίνετε µε το ίδιο τρόπο.

    AntikatĹstash thc PRINT

    1 params = "Hello, world!";2 if ( fileTable[handle].driverID == SERIAL )3 serial_write_string(fileTable[handle].serialHandle, params);4 else5 fprintf(fileTable[handle].fp, "%s", params);

    ΄Οπωc αντιlαµβανόµαστε η διαδικασία είναι ποlύ απlή. ΄Ενα switch ή διαδοχικά if υlοποιούν αυτό τουποσύστηµα.

    5 H idèa

    ΄Οπωc είδαµε ο χρήστηc τηc SB έχει ένα ενιαίο interface για µια πlηθώρα δυνατοτήτων. Τι θα γινότανάραγε αν προσαρµόζονταν τα πάντα γύρω από δύο - τρία τέτοια interfaces? και τι αν η εφαρµογή έπαιρνεπαραµετρικά το αντίστοιχο driver αφού ο κώδικαc τηc θα ήταν ο ίδιοc ενώ µόνο η παράµετροc τηcεντοlήc “open()” θα άllαζε? και τι αν ο έναc driver φόρτωνε τον άllο? Και τι αν ο χρήστηc (ήπρόγραµµα - γονιόc) επέlεγε ποιοc είναι ο default driver για κάθε lειτουργία?

    Απάντηση... τρεlά πράγµατα, χωρίc να αllάξει ούτε µια γραµµή κώδικα, τόσο τρεlά που ούτε ηφαντασία µαc δεν µπορούσε να συllάβει. Αυτό που ονειρευτήκαµε την ενοποίηση τεράστιου όγκουκώδικα.

    � ii � Στο PM δεν υπάρχει πια η έννοια του αρχείου, τηc εικόναc, database, TCP/IPκ.lπ. υπάρχει µόνο αυτόνοµοc κώδικαc που συµπεριφέρεται µε προκαθορισµένο τρόπο.

    Η εφαρµογή ανοίγει ένα αρχείο όπωc κάνει πάντα, µε τιc ίδιεc εντοlέc πάντα, και φυσικά τον ίδιο τρόποχειρισµού. Το τι κάνει όµωc αυτό το αρχείο δεν το ξέρει διότι δεν έχουµε να κάνουµε µε αρχείο αllάκώδικα που συµπεριφέρεται σαν αρχείο.

    � iii � Αντίστοιχα µε τα εικονικά αρχεία η εφαρµογή χειρίζεται και άllα πραγµατικά ήεικονικά συστήµατα εισόδου / εξόδου ή επεξεργασίαc τα οποία παραµένουν άγνωστα στηνεφαρµογή αllά µε γνωστό τρόπο διαχείρισηc αυτών.

    Μερικά τρεlά παραδείγµατα

    • ΄Ενα filemanager που να στέlνει email χωρίc να έχει κώδικα για αυτό, δεν τον χρειάζεται, δενχρειάζεται καν να ξέρει τι είναι socket!

    • ΄Ενα filesystem που να προσθέτει unix attributes σε FAT!

    • Μια εικόνα που να αποθηκεύεται σαν ήχοc και το αντίστροφο! ΄Εχετε ποτέ τραβήξει γραµµέcσε ήχο?

    • ΄Ενα γραφικό περιβάllον που να lειτουργεί το ίδιο καlά σε graphics terminals όσο και σεASCII terminals.

  • 6 TEQNIK§ES AN§APTUXHS TOU PM 9

    • Μια εφαρµογή που να εµφανίζεται κατά επιlογή σε PDF αρχείο αντί για οθόνη, είτε επειδήορίστηκε έτσι στην εφαρµογή, είτε επειδή ο χρήστηc διάlεξε για driver οθόνηc το PDF driver!

    Ο ∆ηµήτρηc, είχε πει ότι το PM είναι η αποθέωση του “εικονικού”, το virtual του virtual. Και είχεδίκιο, διότι το σύστηµα αυτό προσφέρει ένα εικονικό περιβάllον, µε εικονικά ή µη δεδοµένα, απόεικονικέc ή µη συσκευέc όπου το ένα µπορεί να βασίζεται στο άllο.

    Για παράδειγµα, είναι δυνατό να φτιαχτεί ένα οlόκlηρο GUI περιβάllον του οποίου η είσοδοc καιέξοδοc καθορίζεται δυναµικά από τον χρήστη, δηlαδή να εκτεlείται στην µνήµη, και αν και ότανσυνδέσουµε ένα module “εξόδου” όπωc η κάρτα γραφικών, ο εκτυπωτήc, τερµατικό, βιβlιοθήκη aviή pdf να παίρνουµε τα αποτεlέσµατα στην οθόνη, εκτυπωτή, σε οθόνη άllου τερµατικού ή αρχείο.Αντίστοιχα ωc “είσοδο” αυτού του συστήµατοc θα µπορούσαµε να έχουµε ένα άllο πρόγραµµα ή τοπlηκτροlόγιο ή το ποντίκι, ή συνδυασµό αυτών.

    � iv � ∆εν πρόκειται για κάτι ποlύπlοκο, επαναlαµβάνω ότι έχουµε να κάνουµε µεποlύ απlό σύστηµα, µε απlέc τεχνικέc, που είναι έτσι σχεδιασµένο ώστε να ενοποιεί µεικανοποιητικό τρόπο άσχετα µεταξύ τουc κοµµάτια lογισµικού αllά και να αποτρέπει τουcπεριορισµούc τηc ίδιαc τηc φύσηc του κάθε κώδικα. Το αποτέlεσµα αυτού είναι όlεc αυτέcοι δυνατότητεc.

    Εφόσον το ποντίκι (pointing device interface) µπορεί να αντικατασταθεί από κώδικα, η οθόνη(graphics device interface) από κώδικα και το ταχυδροµείο από κώδικα που συµπεριφέρεται σαν σύ-στηµα αρχείων (virtual file system interface). Εφόσον όlα αυτά µπορούν να γίνουν χωρίc να αllάξειούτε µια γραµµή κώδικα, τότε δεν θα έπρεπε να σαc παραξενεύουν τα αποτεlέσµατα αllά αντίθετα ναµαc κριτικάρετε για έllειψη φαντασίαc.

    5.1 Ta modules anexĹrthta apì to PM

    Το arm0nia project όµωc είναι, τουlάχιστον προc το παρών, ευάlωτο. Σήµερα υπάρχει, αύριο µπορείκαι όχι. Το έργο όµωc πάνω στιc αρχέc του PM έπρεπε και πρέπει να επιζήσει.

    Ο lόγοc είναι απlόc. Εµείc θα κάναµε και κάνουµε ήδη µια εργασία. Αυτή η εργασία προσφέρει ένατυποποιηµένο µοντέlο lειτουργίαc για διάφορα πράγµατα η οποία µπορεί να χρησιµοποιηθεί και απότρίτουc, και θα πρέπει να γίνει αυτό ή έστω να απαιτηθεί να γίνει αυτό.

    Το PM lοιπόν προσφέρει εκτόc του συνοlικού συστήµατοc και ένα τρόπο ètsi ÿste anexĹrthtecefarmogèc me to PM na eÐnai ikanèc na prosjèsoun ta modules tou PM ston kÿdikĹtouc qwrÐc na qreiĹzontai to Ðdio to PM ă thn bibliojăkh autoÔ. Η ανεξαρτητοποίηση τωνmodules αυτών είναι για ΄µένα σηµαντικό θέµα.

    Το πωc γίνετε — πράγµα απlό και εύχρηστο — αυτό δεν θα το αναlύσουµε εδώ, αllά το βρίσκωαπόlυτα απαραίτητο να ειπωθεί.

    6 Teqnikèc anĹptuxhc tou PM

    Θα εξηγήσουµε παρακάτω — µε τον πlέον τυπικό τρόπο — τιc τεχνικέc που χρησιµοποιήθηκαν για ναεπιτευχθεί η ανάπτυξη του PM. ΄Οlα αυτά είναι ενσωµατωµένα στο υποσύστηµα και είναι αόρατα στοντεlικό χρήστη - προγραµµατιστή.

  • 6 TEQNIK§ES AN§APTUXHS TOU PM 10

    6.1 SÔndesh arqeÐou kai kÿdika

    ΄Οπωc είδαµε στην SB, η επιlογή των ρουτινών για το άνοιγµα ή την ανάγνωση ή την αποστοlήστοιχείων γινόταν µε διαδοχικά if . Αυτή η διαδικασία στο PM έπρεπε να γίνετε αυτόµατα και το πωcαυτό είναι δυνατό θα το αναlύσουµε τώρα.

    Αν αντί για µια σειρά από ‘if ’, συνδέσαµε το εικονικό αρχείο µε την βιβlιοθήκη που είναι ικανή να τοδιαχειρίζεται...

    AntikatĹstash thc OPEN

    1 fileName = "COM1:9600";2 driverName = fileName.leftOf (’:’); // driverName

  • 6 TEQNIK§ES AN§APTUXHS TOU PM 11

    βlιοθήκη να συµπεριφέρεται µε τον ίδιο τρόπο, δηlαδή να έχει µια προκαθορισµένη σύνταξη για τιcπροαναφερθέντεc εντοlέc.

    ΄Οµωc µέχρι τώρα όlα αυτά γινόντουσαν στο ίδιο το πρόγραµµα - εφαρµογή. Αυτό που µαc ενδιαφέρειείναι οι βιβlιοθήκεc αυτέc να φορτώνονται κατά επιlογή από την εφαρµογή. Αυτό είναι δυνατό ναγίνει αν χρησιµοποιήσουµε τον µηχανισµό δυναµικήc διασύνδεσηc βιβlιοθηκών που παρέχεται στασηµερινά L.Σ.

    Για να γίνει αυτό, αντί να έχουµε µια µεταβlητή τύπου fileTable, φτιάχνουµε εµείc ένα structure στοοποίο αποθηκεύουµε τιc διευθύνσειc των ρουτινών.

    AntikatĹstash tou fileTable

    1 struct module {2 void *dlHandle; // handle of dynamic linked library3 int (*open) (const char *fileName, const char *mode);4 void (*close)(int handle);5 int (*write)(int handle, char *buffer, int size);6 int (*read) (int handle, char *buffer, int size);7 };

    ΄Ετσι, lοιπόν, καθορίζουµε το ενιαίο interface όlων των βιβlιοθηκών, που από τώρα ονοµάζονταιmodules, όπου συµπεριφέρονται σαν αρχεία. ∆ηlαδή, χειρίζονται µε τιc κlασσικέc εντοlέc του fileI/O7.

    Dunamikì fìrtwma module

    1 module serial_io_lib;2 module file_io_lib;3

    4 serial_io_lib.dlHandle = dlopen("my_serial_io_lib.so", RTLD_LAZY);5 serial_io_lib.open = dlsym(serial_io_lib.dlHandle, "open");6 ...7 file_io_lib.dlHandle = dlopen("my_file_io_lib.so", RTLD_LAZY);8 file_io_lib.open = dlsym(file_io_lib.dlHandle, "open");

    Περισσότερα για τιc δυναµικήc — σύνδεσηc βιβlιοθήκεc στο [LPLib]. Με αυτό τον τρόπο είναι δυνατόνα φορτώνουµε ποllά τέτοια modules και κρατώνταc τον ίδιο κώδικα - εφαρµογήc να εναllάσσουµετην έξοδο/είσοδο απlά αllάζονταc τον deÐkth του module όπωc ακριβώc βlέπουµε στο παρακάτωπαράδειγµα.

    ParĹdeigma me dÔo modules

    1 module *current_module;2

    3 //current_module = &serial_io_lib;4 current_module = &file_io_lib;5 int handle = current_module->open("myfile", "w");6 current_module->read(handle, buffer, 1024);7 current_module->close(handle);

    ΄Οπωc βlέπουµε, αν απενεργοποιήσουµε την γραµµή 4 και ενεργοποιήσουµε την 3, τότε ο κώδικαcαυτόc αντί να διαβάζει από ένα αρχείο θα παίρνει στοιχεία από την σειριακή πόρτα.

    7open(), read(), write(), close(), eof(), seek(), fgets(), etc

  • 6 TEQNIK§ES AN§APTUXHS TOU PM 12

    � Σ΄ αυτό το σηµείο θα πρέπει να αντιlαµβάνεστε πόσο εύκοlο θα ήταν, αllάζονταc µιαµόνο γραµµή κώδικα στην εφαρµογή, αυτή να χρησιµοποιεί συµπιεσµένα ή όχι αρχεία µετην χρήση τηc zlib. �

    6.3 VFS

    Το VFS σηµαίνει Virtual File System δηlαδή εικονικό σύστηµα αρχείων. Το ονοµάσαµε έτσι διότι ηεφαρµογή νοµίζει ότι διαχειρίζεται ένα σύστηµα αρχείων, αllά αυτό το σύστηµα µπορεί να εκφράζειτεlείωc διαφορετικά πράγµατα. Κlασσικά δείγµατα, είναι τα zip αρχεία όπου περιέχουν καταlόγουcκαι αρχεία σε συµπιεσµένη µορφή, το registry των Windows, κ.α.

    Το VFS υποσύστηµα του PM, εκφράζει δύο καταστάσειc.

    1. Επίπεδο αρχείου. ∆ηlαδή όταν έχουµε να κάνουµε µε εικονικά αρχεία όπωc η σειριακή πόρτα.

    2. Επίπεδο καταlόγων. ∆ηlαδή όταν έχουµε να κάνουµε µε οlοκlηρωµένο περιβάllον, µε κατα-lόγουc, αρχεία και file-attributes.

    Υποθέτω ότι η lέξη file ακόµα σαc περιορίζει την φαντασία στα κlασσικά αρχεία. Αυτό είναι σηµαντικόlάθοc, δεν πρόκειται για αρχεία αllά για κώδικα! Η lέξη file εκφράζει τον τρόπο επικοινωνίαc µε τοmodule και όχι τι κάνει το module. Το αρχείο στο VFS θα µπορούσε κάllιστα να είναι µια ρουτίναπου στέlνει πίσω στην εφαρµογή τα αποτεlέσµατα µιαc επεξεργασίαc ή οποία έγινε την ώρα ακριβώcπου η εφαρµογή ζήτησε να “ανοίξει” το αρχείο.

    Αc δούµε ένα απlό παράδειγµα.

    Υποθέτουµε ότι έχουµε ένα µετρητή θερµοκρασίαc στο PC µαc ο οποίοc επιστρέφει την θερµοκρασίασε βαθµούc Kelvin. Αυτή την συσκευή την διαχειριζόµαστε από την βιβlιοθήκη που µαc παρέχει οκατασκευαστήc, η οποία βιβlιοθήκη έχει µια και µόνη συνάρτηση, την ‘curTherm()’.

    ΄Ενα τυπικό πρόγραµµα θα έκανε τα παρακάτω για να µαc εµφανίσει την θερµοκρασία σε βαθµούcKelvin και Celsius.

    thermometer

    1 main()2 {3 double t = curTherm();4

    5 printf("%f Kelvin\n", t);6 printf("%f Celsius\n", t - 273);7 }

    Επειδή όµωc εµείc θέlουµε να βlέπουµε αυτέc τιc µετρήσειc σε ένα file-manager έτσι ώστε ότανκάνουµε κlικ σε ένα αρχείο που ονοµάζεται ‘/thermometer/Kelvin’ και ένα που ονοµάζεται‘/thermometer/Celsius’ να βlέπουµε την τρέχουσα µέτρηση στην αντίστοιχη κlίµακα· φτιάχνουµεένα αντίστοιχο VFS module.

    thermometer vfs module

    1 char strKelvin[32];2 char strCelsius[32];3

    4 int therm_open(const char *fileName)5 {6 if ( strcmp(fileName, "Celsius") == 0 ) {

  • 6 TEQNIK§ES AN§APTUXHS TOU PM 13

    7 sprintf(strCelsius, "%f", curTherm() - 273);8 return 1;9 }

    10 else if ( strcmp(fileName, "Kelvin") == 0 ) {11 sprintf(strKelvin, "%f", curTherm());12 return 2;13 }14 return -1; // error15 }16

    17 int therm_read(int handle, char *buf, int size)18 {19 int len = 0;20

    21 switch ( handle ) {22 case 1: // Celsius-file data23 len = strlen(strCelsius);24 strncpy(buf, strCelsius, len);25 break;26 case 2: // Kelvin-file data27 len = strlen(strKelvin);28 strncpy(buf, strKelvin, len);29 }30 return len;31 }32

    33 void module_init(module *mod)34 {35 mod->open = therm_open;36 mod->read = therm_read;37 }

    Αυτό το module είναι ένα εικονικό σύστηµα αρχείων. Βέβαια το έχουµε απlοποιήσει εδώ αllά δενέχει και µεγάlη διαφορά από την πραγµατικότητα. Στο ‘module init’ όπωc βlέπουµε καθορίζουµεποια συνάρτηση αναlαµβάνει να κάνει το open και ποια το read.

    Αc δούµε τι και πωc ακριβώc θα συµβεί

    1. Η εφαρµογή — file-manager ζητά από τον PM να φορτώσει το module.

    2. Το PM εκτεlεί την ‘module init’ ώστε να ξέρει ποιεc συναρτήσειc είναι υlοποιηµένεc στοmodule και ποια αναlαµβάνει να κάνει τι.

    3. Η εφαρµογή ζητά από το PM να ανοίξει το εικονικό αρχείο ‘Celsius’.

    4. Το PM εκτεlεί την ‘therm open("Celsious")’ και επιστρέφει τον εικονικό handle (επιστρέ-φεται από την ‘therm open()’) πίσω στην εφαρµογή.

    5. Η εφαρµογή ζητά από το PM να πάρει τα περιεχόµενα του αρχείου µε µια τυπική κlήση στην‘fgets()’ (‘module->fgets(...)’).

    6. Το PM, µέσω τηc δικήc του ‘fgets()’ καlεί την ‘therm read()’ για να πάρει τα στοιχεία καιτα επιστρέφει στην εφαρµογή.

  • 6 TEQNIK§ES AN§APTUXHS TOU PM 14

    6.4 Ektìc tou VFS

    ...

    ...κlειδιά...

    6.5 PMFS

    Ωραία όlα αυτά αllά θα έπρεπε η εφαρµογή να µπορεί να ξέρει τι modules υπάρχουν στο σύστηµαγια ποιο interface. ΄Ετσι το deamon του PM, ανέlαβε να παρέχει αυτέc τιc πlηροφορίεc µέσω ενόcεικονικού συστήµατοc αρχείων, το ονοµαζόµενο pmfs.

    LÐsta ìlwn twn vfs modules

    1 main()2 {3 pm_vfs_module_t *pmfs;4 strlist_t *list;5 int i;6

    7 pm_init(); // initialize PM8

    9 // load PM virtual-file-system module10 if ( (pmfs = pm_vfs_load("vfs/pmfs")) == NULL )11 panic("pm_vfs_load(): failed");12

    13 printf("The following VFS modules found:\n\n");14 list = pmfs->list(pmfs->mid, "/vfs/*");15 for ( i = 0; i < list->count; i ++ )16 printf("%d: %s\n", i+1, list->str[i]);17

    18 strlist_destroy(list);19 pm_vfs_release(pmfs);20 }

    Η “µέθοδοc” list είναι µια πιο προχωρηµένη έκδοση των opendir()/closedir(), και επιστρέφει µια lί-σταc µε τα ονόµατα των αρχείων. ∆ηlαδή το αντίστοιχο των εντοlών ‘ls’ ή/και ‘dir’ που γνωρίζουµεαπό την κονσόlα.

    6.6 ’Ena ètoimo eikonikì sÔsthma arqeÐwn

    Αc υποθέσουµε ότι έχουµε ένα file-manager ο οποίοc lειτουργεί µε modules αντίστοιχα µε αυτά πουπεριγράψαµε παραπάνω, αllά προσθέστε και lοιπέc κοινότυπεc εργασίεc όπωc opendir()/closedir()και chdir()/rmdir()/mkdir().

    � ΄Εχουµε ήδη φτιάξει τέτοιο πρόγραµµα - εφαρµογή που lειτουργεί άψογα, το vfssh, τοοποίο είναι ένα shell σαν τα bash και tcsh µόνο που αντί να lειτουργεί µε το σύστηµααρχείων του L.Σ., αυτό lειτουργεί αποκlειστικά µε modules του PM. �

    Σκεφτείτε όµωc τώρα, πωc θα φτιάξουµε ένα vfs module για την παρουσίαση των στοιχείων του κάθεχρήστη έτσι όπωc αυτά αναφέρονται στο ‘/etc/passwd’.

  • 7 ARQ§ES TOU PM 15

    � Το συγκεκριµένο module, αν και όχι ακριβώc το ίδιο, υπάρχει στα παραδείγµατα καιµπορείτε να το δείτε να lειτουργεί µέσω του vfssh. �

    ΄Εχουµε τα παρακάτω στοιχεία από τα κlασσικά αρχεία του Unix

    (todo: passwd structure, groups)

    Τώρα πρέπει να φανταστούµε πωc θα θέlαµε να υπάρχουν σε µορφή αρχείων. Lογικά θα θέlαµεένα κατάlογο για τουc χρήστεc και ένα για τιc οµάδεc. Κάθε το κάθε αρχείο στον κατάlογο τουχρηστών, θα πρέπει να περιέχει τα στοιχεία του χρήστη και φυσικά το όνοµά του να είναι το αντίστοιχοusername.

    IerarqÐa eikonikoÔ sustămatoc/users/

    |--- root|--- nikos|--- dimitris+--- yannis

    /groups/|--- root+--- users

    Και να πωc θα έπρεπε να εµφανίζεται ένα τυπικό εικονικό αρχείο.

    Perieqìmena arqeÐou ‘/users/nikos’Nicholas ChristopoulosUser-ID : 501Group-ID : 100Home directory: /home/nikosShell : /bin/tcsh

    � Μπορείτε να τα δείτε αυτά µέσω του vfssh εκτεlώνταc τιc εντοlέc ‘ls’ και ‘cat’ όπωcακριβώc θα κάνατε αν ήταν πραγµατικά αρχεία. �

    Προσθέσαµε lοιπόν στο PM µια βιβlιοθήκη η οποία χτίζει ένα εικονικό σύστηµα αρχείων στηνµνήµη. Το µόνο που χρειάζεται, lοιπόν, να κάνει το module µαc είναι να επεξεργαστεί τα στοιχείατων ‘/etc/passwd’ και ‘/etc/groups’, και να τα γράψει στο εικονικό σύστηµα αρχείων, πράγµα πουεπιτυγχάνετε µε τιc τυπικέc, file I/O, εντοlέc, όπωc θα κάναµε αν τα γράφαµε στο δίσκο. Από εκείκαι πέρα το vfslib, η βιβlιοθήκη αναφέραµε, αναlαµβάνει την διαχείριση του module κατά επιlογήβέβαια του προγραµµατιστή.

    7 Arqèc tou PM

    7.1 Logikă sqedÐash

    Η lογική στο PM έχει µεγαlύτερη σηµασία από την δυνατότητα, διότι ο προγραµµατιστήc και οκάθε άνθρωποc βοlεύεται µε τυποποιηµένεc lογικέc lύσειc και όχι µε “ακροβατικέc” δυνατότητεc- προχειρότητεc. ΄Οταν ένα πράγµα είναι φτιαγµένο για να κάνει µια συγκεκριµένη lειτουργία, έτσιπρέπει να παραµείνει και όχι να προσφέρεται µέσω αυτήc τηc lειτουργίαc άσχετεc δυνατότητεc.

    Κατά την γνώµη µου, ο σωστόc σχεδιασµόc έχει να κάνει µε αυτό, δηlαδή ο προγραµµατιστήc ναµην χρειάζεται να ανοίξει το βιβlίο για να βρει πωc θα κάνει τι, αllά αυτό να είναι αυτονόητο. Αν

  • 7 ARQ§ES TOU PM 16

    χρειαστούν ποτέ εξτρά δυνατότητεc αυτέc µπορούν να γίνουν µε µια παραπάνω συνάρτηση · κατάκανόνα, αυτά τα εξτρά δεν χρειάζονται παρά µόνο σε εξαιρέσειc.

    Το ακριβώc αντίθετο του “σωστού σχεδιασµού” µπορείτε να το µεlετήσετε στο Windows API , ήαπlά να διαβάσετε τον ποlύ καlό σχοlιασµό του Σπινέllη[CrqAPI].

    7.2 EniaÐo interface

    ΄Οταν γράφουµε κώδικα για µια εικόνα τύπου bmp, είναι αυτονόητο να απαιτούµε ο ίδιοc κώδικαc ναlειτουργεί και για εικόνεc τύπου jpeg . ΄Οταν έχουµε µια βιβlιοθήκη γραφικών που γράφει/διαβάζει τηνVideo RAM , είναι αυτονόητο να απαιτούµε να διαχειρίζεται και memory bitmaps. ΄Οταν γράφουµε καιδιαβάζουµε στο default file-system είναι αυτονόητο να απαιτούµε µε τον ίδιο τρόπο να διαχειριζόµαστεκαι memory sticks.

    Αυτά είναι από τα πlέον τυπικά παραδείγµατα που αναlαµβάνει το PM να lύσει. ΄Οµωc δεν σταµατάεδώ, αllά επεκτείνετε στο ότι εφόσον κάτι µπορεί να δοµηθεί µε την κlασσική ιεραρχική δοµή τωνσυστηµάτων αρχείων τότε είναι αυτονόητο ότι πρέπει να lειτουργεί και έτσι µε τιc ίδιεc εντοlέcόπωc το κlασσικό σύστηµα. ΄Οταν έχουµε µια εικόνα είναι αυτονόητο ότι η εικόνα αυτή µπορεί ναεπεξεργαστεί µε την βιβlιοθήκη γραφικών που προσφέρει το ίδιο το PM, και δεν χωρά αντιθέσειc σ΄αυτό, εφόσον είναι εικόνα θα πρέπει να αποθηκεύεται / διαβάζεται σε / από όlεc τιc µορφέc µε τονίδιο τρόπο, εφόσον εµφανίζεται στην οθόνη µπορεί και να εκτυπωθεί και να καταγραφεί σε αρχείο.

    7.2.1 OmadopoÐhsh sto PM

    Ποια όµωc τµήµατα του lογισµικού ταιριάζουν σε τι είδουc interface? Το file I/O βlέπετε, µπορείνα ενσωµατώσει σχεδόν τα πάντα, αllά δεν µπορεί να ικανοποιήσει όlεc τιc απαιτήσειc ούτε να κάνειτο σύστηµα τόσο ευέlικτο. Για παράδειγµα πωc θα σχεδιάζουµε γραµµέc µε εντοlέc read/write?Σίγουρα µπορούµε, και µπορούµε να έχουµε ένα παραπάνω επίπεδο, που έτσι και αllιώc ήδη υπάρχειστο pml, για να χρησιµοποιούµε line αντί για write αllά δεν θα µπορούσαµε να εκµεταllευτούµετον επιταχυντή τηc κάρταc γραφικών.

    1. VFS (virtual file system interface). Το αντίστοιχο module θα έπρεπε να υποστηρίζει τιc fileI/O εντοlέc. Το interface αυτό έχει δύο επίπεδα, α) σαν αρχείο, β) σαν file system.

    2. GFX (bitmap and vector graphics interface). Το αντίστοιχο module θα έπρεπε να υποστηρίζειεγγραφή και ανάγνωση pixels.

    3. SND (sound interface). Το αντίστοιχο module θα έπρεπε να υποστηρίζει εγγραφή και ανά-γνωση wave.

    4. PTD (pointing devices interface). Το αντίστοιχο module θα έπρεπε να υποστηρίζει θέση καικατάσταση πlήκτρων.

    5. KBD (keyboard interface). Το αντίστοιχοmodule θα έπρεπε να υποστηρίζει πlήκτρα-χαρακτήρεcκαι συνδυασµούc αυτών.

    7.3 EniaÐo trìpoc metaforĹc dedomènwn

    Το ενιαίο interface δεν lύνει όµωc όlα τα προβlήµατα. Αν υποθέσουµε ότι έχουµε µια εικόνα σεµορφή png και θέlουµε να την µετατρέψουµε σε µορφή jpeg , θα πρέπει αυτά τα δύο να συνεργάζονται,πράγµα που σηµαίνει ότι χρειαζόµαστε και ενιαία µορφή δεδοµένων.

    Για παράδειγµα όlεc οι εικόνεc που επιστρέφονται ή στέlνονται σταmodules είναι απαραίτητο να έχουνσυγκεκριµένη µορφή, και αυτή καθορίστηκε να είναι όπωc στην Video RAM αllά µε προκαθορισµένο

  • 8 §ETOIMA PARADE§IGMATA 17

    header που αναφέρει την ανάlυση και το βάθοc χρώµατοc. ΄Ετσι όlα τα σχετικά µε γραφικά modulesή βιβlιοθήκεc ξέρουν επακριβώc µε τι και πωc να εργαστούν. Αντίστοιχα και για τα διανυσµατικάγραφικά (ξέρουµε ποlύ καlά ότι κάθε βιβlιοθήκη έχει δικό τηc ορισµό για το διάνυσµα). Αντίστοιχακαι για τον ήχο.

    7.4 DiaqeÐrish modules

    Κατ΄ αρχήν έπρεπε να φτιαχτεί ένα σύστηµα που να φορτώνει και να ξεφορτώνει τουc drivers µε όσοτον δυνατό ταχύτερο τρόπο και αυτό έγινε µε την χρήση ενόc daemon (‘pmd’) και µιαc βιβlιοθήκηc(‘pml’) που συνδέεται µε την εφαρµογή. Οι drivers από την άllη µετατράπηκαν σε shared libraries(dynamic linked libraries) γι΄ αυτό και αποκαlούνται modules.

    Για όlα τα modules θα έπρεπε να ισχύουν και συγκεκριµένοι κανόνεc, όπωc

    1. Οι drivers να φορτώνονται και να ξεφορτώνονται δυναµικά ανάlογα µε τα κέφια τηc εφαρµογήc.

    2. Οι drivers να µπορούν να ορίζονται και εξωτερικά, από τον χρήστη. ∆ηlαδή αν ο χρήστηc θαήθεlε η έξοδοc µιαc εφαρµογήc αντί για την οθόνη να είναι το jpeg driver αυτό να είναι δυνατόνα γίνει.

    3. ΄Οlεc οι εικόνεc που στέlνονται ή επιστρέφουν από ένα driver να είναι πάντα µε συγκεκριµένηµορφή και µάlιστα µε την πlέον απlή. Αυτό επιτρέπει την µετακίνηση και επεξεργασία τωνδεδοµένων από κοινό κώδικα.

    4. ΄Οlα τα δεδοµένα ήχου που στέlνονται ή επιστρέφουν από ένα driver να είναι πάντα µε συγκε-κριµένη µορφή και µάlιστα µε την πlέον απlή.

    Το PM έχει και άllα πράγµατα καθώc και υποστηρίζει lειτουργία ανά έκδοση του κάθε interface(όπου το module αναφέρει ποια έκδοση και τι interface υποστηρίζει) καθώc και δικτυακή επικοινωνίακ.α. ∆εν θα επεκταθούµε όµωc σε αυτά, θέlουµε εδώ να δώσουµε την “φιlοσοφία” του έργου καιόχι τον αναlυτικό σχεδιασµό του.

    7.5 Autìmath sumplărwsh sunartăsewn twn modules

    Ποllά πράγµατα που πρέπει να απαιτούνται από το interface µπορούν να αντικατασταθούν από κοινό-τυπο κώδικα. Για παράδειγµα η γραµµή στα γραφικά. ∆εν χρειάζεται κάθε GFX module να περιέχειτον αlγόριθµο αυτό, παρά µόνο αν υποστηρίζει κάποιον επιταχυντή. ΄Αllο ένα παράδειγµα είναι τοfgets() στο VFS, το οποίο υlοποιήται µε κlήσειc στην αντίστοιχη read(), είναι όµωc απαραίτητο ναυποστηρίζεται από το VFS interface.

    Σ΄ αυτέc τιc περιπτώσειc το PM αναlαµβάνει να συµπlηρώσει αυτέc τιc συναρτήσειc αν αυτέc δενέχουν οριστεί µέσα στο module.

    Lογικό είναι να περιµένουµε ειδικά από τα γραφικά σε κάποιεc περιπτώσειc το module να περιέχειµόνο τιc getpixel / putpixel ενώ σε άllεc να θέlει να αντικαταστήσει το µεγαlύτερο µέροc τηcβιβlιοθήκηc γραφικών.

    8 ’Etoima paradeÐgmata

    8.1 vfstest

    Το ακόlουθο πρόγραµµα είναι µια τυπική εφαρµογή που χειρίζεται VFS modules. ∆εν κάνει τίποταπαραπάνω από το να φορτώνει το αντίστοιχο module που παίρνει σαν παράµετρο και να τυπώνει τα

  • 8 §ETOIMA PARADE§IGMATA 18

    περιεχόµενα ενόc από τα εικονικά αρχεία.

    Το module-key και το όνοµα του αρχείου δίδονται από τον χρήστη σαν παράµετρο από την κονσόlα.

    1 // vfstest.c2 #include 3

    4 int main(int argc, char *argv[])5 {6 int handle;7 pm_vfs_module *m;8

    9 pm_init(); // initialize PM10

    11 if ( argc != 3 ) // arguments12 panic("usage: vfstest module-key open-file");13

    14 // load the module15 if ( (m = pm_vfs_load(argv[1])) == NULL )16 panic("Can’t load the %s module", argv[1]);17

    18 // open the "file"19 if ( (handle = m->open(m->mid, argv[2], 0)) == -1 )20 panic("Can’t open the %s file", argv[2]);21

    22 // display theirs contents23 while ( m->gets(m->mid, handle, buf, 256) )24 printf("%s", buf);25

    26 m->close(m->mid, handle); // close "file"27 pm_vfs_release(m); // unload the module28 return 0;29 }

    Μπορούµε τώρα να δούµε εύκοlα µερικέc από τιc δυνατότητεc του PM. Θα προτιµούσαµε να είσαστεσυνδεδεµένοc σαν διαχειριστήc (root) διότι ορισµένα modules-παραδείγµατα έχουν φτιαχτεί για ναlειτουργούν µε πlήρη δικαιώµατα στο σύστηµα.

    ParĹdeigma 1Χρησιµοποιήστε το vfstest για να δείτε την ώρα από ένα τοπικό ή εξωτερικό (internet) διακο-µιστή.

    # vfstest vfs/telnet localhost:13

    Αν η σύνδεση αποτύχει, αυτό σηµαίνει ότι δεν έχετε ενεργοποιήσει το timegen service στοσύστηµά σαc. Φορτώστε µε ένα editor το αρχείο ‘/etc/inetd.conf’ και βγάlτε το ‘#’ απότην γραµµή του timegen. Xαναφορτώστε το inetd και προσπαθήστε ξανά.

    ParĹdeigma 2Χρησιµοποιήστε το vfstest για να συνδεθήτε µέσω σειριακήc πόρταc µε ένα άllο µηχάνηµα.

    # vfstest vfs/serial /dev/ttyS1:57600

    Στο Palm µου, το δοκίµασα τρέχονταc το πρόγραµµα ‘sertest.bas’ που είναι παράδειγµα τηcSB και ... έστειlα χαρακτήρεc στο PC . Αν το δοκιµάσετε θυµηθήτε ότι το vfstest µόνο διαβάζειδεδοµένα άρα το πρόγραµµα που θα συνδεθεί (π.χ. Minicom, Telix, Procomm, Hyperterminal)θα πρέπει να αποστέllει δεδοµένα (πlήκτρα που πατάτε).

  • 9 JEWRHTIK§A PARADE§IGMATA 19

    ParĹdeigma 3Χρησιµοποιήστε το vfstest για να πάρετε τα στοιχεία ενόc χρήστη.

    # vfstest vfs/users users/root

    Πlηροφορίεc, όπωc το home directory και το επιlεγµένο shell του χρήστη root θα πρέπει ναεµφανιστούν στην κονσόlα σαc.

    8.2 SunodeutikĹ paradeÐgmata ` efarmogèc

    Από το CVS µπορείτε να κατεβάσετε περισσότερα παραδείγµατα. Τα παραδείγµατα αυτά βρίσκονταιστον κατάlογο apps.

    ...(lίστα και µια περιγραφή)...

    8.3 SunodeutikĹ paradeÐgmata ` modules

    ...(lίστα και µια περιγραφή)...

    9 JewrhtikĹ paradeÐgmata

    Προσωρινά τα ονοµάζουµε “θεωρητικά” διότι απlούστατα δεν έχουµε κάτσει ακόµα να τα φτιάξουµε.∆ηlαδή δεν έχουµε αµφιβοlία ότι µπορούµε, απlά δεν το έχουµε κάνει ακόµα.

    9.1 ’Enac e-mail client pou leitourgeÐ san sÔsthma arqeÐwn

    ...

    9.2 ’Ena pantodÔnamo ergaleÐo me lÐgo kÿdika

    ...

    Anaforèc

    [Bazaar] “The Cathedral and the Bazaar”, Eric S. Raymond,1998/08/11 20:27:29

    [CrqAPI] “A Critique of the Windows Application Programming Interface”, Diomidis Spinellis,University of the Aegean, Dec. 1997

    [Ε∆ΕΤ-Γ4] “EleÔjero Logismikì / Logismikì AnoiktoÔ Kÿdika (EL/LAK) sthn EkpaÐdeush, thDhmìsia DioÐkhsh kai stic Epiqeirăseic MikroÔ / MesaÐou Megèjouc.”, Οµάδα Εργασίαc ΟΕ Γ4,Εθνικό ∆ίκτυο ΄Ερευναc & Τεχνοlογίαc, Αθήνα, Ιαν. 2003

    [LPLib] “Program Library HOWTO”, David A. Wheeler,LDP, ver 1.07, 30 December 2002

  • ANAFOR§ES 20

    EuqaristÐec

    Dhmătrio KoukorĹba kai GiĹnnh BlaqogiĹnnhΤο πείσµα του ∆ηµήτρη πάνω στο PM — είχα και έχω σκοπό να µην ασχοlούµαι µε το arm0niaproject — αllά και η εκνευριστική επιµονή του, είναι ο lόγοc ύπαρξηc αυτού του εγγράφου.Για τα κρασιά που κεράσανε, και για τιc ιδέεc που αναπτύξαµε και οι τρειc από κοινού κάτω απόαρκετέc ώρεc αµπεlοφιlοσοφίαc (το αγαπηµένο µου σπορ).

    To perib'allon tou logismiko'uH n'ea sullogik'h an'aptuxh

    To pr'oblhma tou 'hdh gramm'enou k'wdikaI/OH e'isodos ths ex'odouNekr'h f'ushSumper'asmata

    'Ena enia'io interfaceEn' arq'h 'htan h SBTo ierarqik'o s'usthma twn arqe'iwnPws 'egine 'omws aut'o?

    H id'eaTa modules anex'arthta ap'o to PM

    Teqnik'es an'aptuxhs tou PMS'undesh arqe'iou kai k'wdikaEx'elixh se moduleVFSEkt'os tou VFSPMFS'Ena 'etoimo eikonik'o s'usthma arqe'iwn

    Arq'es tou PMLogik'h sqed'iashEnia'io interfaceOmadopo'ihsh sto PM

    Enia'io tr'opos metafor'as dedom'enwnDiaqe'irish modulesAut'omath sumpl'hrwsh sunart'hsewn twn modules

    'Etoima parade'igmatavfstestSunodeutik'a parade'igmata -- efarmog'esSunodeutik'a parade'igmata -- modules

    Jewrhtik'a parade'igmata'Enas e-mail client pou leitourge'i san s'usthma arqe'iwn'Ena pantod'unamo ergale'io me l'igo k'wdika