-
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