TheMesaProgrammingEnvironmentRichardE.Sweet1.IntroductionPeopleeverywherearedevelopingmulti-window,integratedprogrammingenvironmentsfortheirfavoritecomputersandlanguages.ThispaperdescribestheMesaProgrammingEnvironment,sometimesalsocalledtheXeroxDevelopmentEnvironment(XDE).Itisinterestingforseveralreasons.Ithasexistedinsomethingsimilartoitscurrentformforabout4years.Ithasmorethan500users,manyinteractingwithit8ormorehoursaday.Severalmillionlinesofcodehavebeenwrittenbytheseusers,includinglarge,multi-authorsystems.PreviouspapershavedealtwiththeMesalanguage[Geschke77][Mitchell78],theoperatingsystem[Redell79][Lampson80]andtheprocessorarchitectureonwhichitruns[Johnsson82][Sweet82].Thispaperdescribestheprogrammingenvironment:theuserillusion,thesetofprogrammingtools,andthefacilitiesavailableforaugmentingtheenvironment.Section2givesashorthistoryoftheenvironment,includingsomeofouroriginaldesigngoals.Section3describesthecurrentstateoftheuserinterfaceanddiscussesafewoftheschemesthatweretriedanddiscarded.Section4describessomeoftheprogramdevelopmenttoolsavailableanddiscusseshowfeaturesofthelanguagehaveinfluencedtheirdesign,andindeedinfluencedwhattoolsareintheset.Section5describesothertoolsthat,althoughvaluabletotheprogrammingtaskarelargelylanguageindependent.Section6talksabouthoweasyitistomakeadditionstothesystem,andgivesexamplesofuseradditionssomethatmodifytheenvironmentandsomethatsimplyprovidenewtools.Section7discusseswhatwefeelaremajorsuccessesandwhatwefeelneedstobedoneinthefuture.2.HistoryMuchoftheearlyhistoryanddesignmotivationbehindtheMesaprojectisdiscussedinEarlyExperiencewithMesa[Geschke77].Fromthebeginning,ourgoalwastoallowdevelopmentoflargecomplexsoftwareprojectswithsufficientperformancetobeusableinaproductionenvironment.Twooftheconceptsaimedatachievingthisgoalweremodularityandstrongtypechecking.Amajoradditionwasmadein1977withtheintroductionofinterfaces,andintermoduletypechecking.ThisisdescribedinsomedetailinTheImpactofMesaonSystemDesign[Lauer79].Belowisashortlistoflanguageorsystemfeaturesthathavebeenaroundsincethebeginningoftheprojectthathavesignificantlyinfluencedthedirectionofourdesign:·Modularprogrammingwithstrongcompile-timetypechecking.pï^{î «îcî î+[ qïXøî «îUî�rïQÍî «ïQÍîl sïN~î «îd îßîe î!� î*ó î1� î:b îC(îE—ïLJî «îîî î"Ïî&9î*jî0¡î3Pî7I î@5 ïJî «î–î•î¿îQî ¦ î)a î1äî7«î9Tî:ò îAÞîDMïGáî «îèîfîãî†î<î!æî&rî((î* î.Úî2Hî4Œî8uî9±î>#î?¢îBîE¸ïE­î «îEîîì îÀîÞî!8î"pî$8î'Ïî+¨î,Öî0Zî51î9ñî=0î>íîB7îE�ïCxî «î^îZîãî¹îÍî#Œ î+’ï@)î «îXîÑî+î§îÕî"Gî&î+Ý î3² î;¾î>1îDcï=õî « î% îBîæî3î%4 î,£î.–î2’î3Õî6Ý î>ä îEÄï;Àî «î‘î}îá î x î)î+hî.fî3 î6î8%î9â îByîF'ï9Œî «îL îñîíîl î$-î&Î î0<î5]î6Óî:‡î;òî?±îD„îFï7Wî « î&îMîóî¿î"]î'zî+Ýî0\î5Nî6–î<’î?îCáîG%ï5#î «î;îeî;î#î î!tî$Fî&/î(¿î.Sî1Rî4Óî8Kî;2 îBšîGªï2ïî «îtîçî�îÁî0 î&Aî)sî/î1¦î7Mî:2î??î@ØîCï0ºî «î îÝî7îòî ¼î%V î,.î/žî3î5iî7*î9�î<¼îA®îBöï.†î «î)îYî_îúî Rî!ßî$ î,�î/Fî1xî5Ñî;v îCÿï,Qî «î Jîïî;î©îî×î¬î!Äî%âî,?î.Wî1!î6^î9î=[îCÂîEåï*î « î"îîÕî H î(jî+5î.Üî1¾î6Bî;`î>bîB¶îGªï'èî «îrîÏî÷î¢îöîìî%Éî(�î+Þî.î0±î4’î6@î81î;¤î=Rî?±rï ¾î «ï ¾îlsïoî «îãîÑîeîîÈî´î$8 î+Rî0/î2Ãî6¡î;sî=îCRîE5ï:î « îµî½îS î!Ëî%�î'Ú î.‹î1î3éî6‚î8î;³ îCÑîEwïî «îVîõî=î î%£ î-Îî/£î1ºî6%î7úî9J î@x ïÒî «îÂîlî½îJî_îéî#ùî&Œî)vtî,¹ïÒïÒî-ÏsïÒî3stî6ïÒïÒî6 î:*î=sîB'ïÒïÒîCjîDèï�î «îîÐî•îHî”î´î" î)ötî+µï�ï�î,sî1?ï�ï�î2 tî4Ýï�ï�î5@ ï�îfîB¦îD$îE`ï4î «î îåîÍî²îOî!�î$�î'õî+tî0Sî3çî6hî<öî>ÐîAQîFïî «îò îž îbîÂî%‰î'Bî)Íï ±îÎï ±îðî  î"3î%Nî)| î1Íî4ÝTVm$Œ2·Proceduresasfirstclassvalues,sothattheycanbepassedasparameters,storedinsideotherdatastructures,etc.·Acommittmenttosourceleveldebugging.·Sufficientruntimeefficiencyandaccesstounderlyingarchitecturethatalllevelsofthesystemmaybewritteninahighlevellanguage.MesawasfirstimplementedontheAlto[Thacker79]in1976.ThedevelopmentenvironmentwastheAltooperatingsystem[Lampson79]whoseuserinterfacewastheExecutive,aBCPLprogramthatoperatedmuchlikethetime-sharingexecutivesoftheday.Whenoneinvokedatool,suchasthecompiler,itranintheentiremachine(alongwithpiecesoftheoperatingsystem).Whenitwasfinished,theExecutivewasreloadedtoprocessthenextcommand.Therewereprovisionsforchainingtogethercommandsbymeansofdiskfileswithdistinguishednames.Around1978,a"Tools"projectwasstartedtodesignasoftwaredevelopmentenvironment.ThisprojectwaslatermergedintotheMesaproject,andtheuserinterfaceportionwasnamedTajo(pronouncedTAH-hoe).ItsdesignwasinfluencedsignificantlybypreviousworkofKayandofSwinehart[Kay69][Kay76][Swinehart74].Belowisalistofbasicpreceptsfromthe1980TajoFunctionalSpecification[Wallace80]:·Clientprogramsshallnotpreempttheuser(Swinehart'sLaw).Theusershouldneverbeforcedintoasituationwheretheonlythinghecandoisinteractwithonlyonetool.·Don'tcallus,we'llcallyou(Hollywood'sLaw).AtoolshouldarrangeforTajotonotifyitwhentheuserwishestocommunicatesomeeventtothetool,ratherthanadoptan"asktheuserforacommandandexecuteit"model.·Theuserownsthewindowlayout.Individualtoolsshouldmakeminimalassumptionsaboutthesizeandpositionofanywindowsthattheyown.Theproceduralintefacetowritingonwindowsshouldmakesuchconcernslargelyinvisibletotheclientcode.Thereisanotherimportantpoint.Bythistime,theMesaprojecthadmovedfromcorporateresearchintoadevelopmentorganization.Whilesomeofthesamedesignersworkedonitinbothplaces,therewasnowadefiniteengineeringflavortotheeffort.Severaltimesa90%solutionwasimplementedsinceitcouldbedonetoday,ratherthanwaituntilweunderstoodhowtocompletelysolvetheproblem.3.UserIllusionFortheuseofmultipletoolsinmultiplewindowstobemosteffective(forchangingactivitiesquicklyandeasily),theuserinterfacemustbeconsistentacrossalltools.Theperceptions,model,andconjecturesthatauseraccumulatesaboutasystemarereferredtoasthe"userillusion."Theintentuïg/îGäsï_/îÎï_/îð îî­îƒî"²î'7î(ùî+Æî.Ôî1^î3Mî7±î9] î@»îDÜï\ûîðî�î” î!.ïZîÎïZîðî} îðîžî#îî'4 ïXîÎïXîð î+î] î%Œî(>î,Eî-î î4Ø î îF3ïPLî «î ÿî îîŽ î#±î'Óî*Àî0Zî2úî5M î;äî=vî=éïPLïPLî>´sïPLî@�îFïNî «îkîQî îy î"v î)î*Úî-Iî0ãî5 î7Åî=î>NîA‚îDÂîFïKãî «îáîZîñîÁîCîRî#ùî(Tî+‘î/Ìî1§î4)î:jî@îDºîF3ïI¯î «îƒîî§î�î#qî%\î*mî- î0Uî8 îî@õîE¯ï?Âî « îëî½îÝî"Pî% î, î3Ùî5ùî;¬î?NîA+îDJîG%ï=Žî «îYî°î î&íî+Pî,òî.Qî0Åî2³î6\î<î?žîB3îE¯ï;Zî « îœ î ï8 îÎtï8 îðîî î!Tî#Çî(ûî+Wî.J î6sî9ï8 ï8 î:™î=€î@‰îEï5ÖîðîÓî îÓîîî#{î'…î)Öî,âî0hî2Jî4Çî6¿î8î=î@îCîEºï2‡îÎtï2‡îðî«î,î5îEî!Æî$I î,Msî/Qï2‡ï2‡î0ˆî2î4¸î9î=ÿî@(îCCîDÜï0SîðîPîîwîzî"Ýî$• î-î0®î4mî6%î8Žî;¼î?ÓîCîFîï.îðî îiîcî îÊî&+î(âî-Øî/Þï*ÏîÎtï*Ïîðî³î—îõî@î$sî'«ï*Ïï*Ïî)Ž î00î3�î7üî;°îA ï(›îðîÍî'îÍîî$¼î&pî) î.¶î1€î4Šî8`î;3 îBîG0ï&gîðî¢î©î Xî$Ôî(‰î+ºî1kî5åî;^î= î?lîC,ï#î «î›îôîìî;î �î"šî%)î(”î*àî.wî3î5§î:î=nîC{ï ãî «îšîÛ î# î!î%2î(Üî*¬î-"î0·î6Ëî;Ëî=èî?UîAîDnï¯î «îŠîŒîæîetîÆï¯ï¯îa sï¯î$Xî(¤î*¨î-]î2¯î7Øî;Øî=Wî@›îF3ïzî « îî~îÛî®î¥tî"ïzïzî"�sïzî&)î*>î-kî0kî3¹î5è î="î@-îAã ïFî «î(îˆrïî «ïîlîfsïÌî «îCîŽîïî”îúî7îÑî$6î)Òî+mî-Iî0’î6î8¥î>m îCÿï —î «îšîmîî4îî"°î$Ø î+eî/©î1Ðî6lî9{ îA_îF'ï cî « îÎî—î¼î° î!cî%?î&cî*Ùî-(î2dî4 î5¶î8î;´ îBîDç¢TVm$Þ3underlyingTajoistocreateaconsistentuserillusionthatenablestheusertopredictinstinctivelyhowtouseanytool,regardlessofpreviousexposuretoit.TheprincipleissometimescalledtheLawofLeastAstonishment.Firstafewwordsaboutthehardware.TheDandelionhasa17inchCRTorientedwiththelargerdimensionhorizontal.Thedisplayimageisdividedintoanarrayofpixels1024acrossby808down.Theimageisrefreshedfromaregionofmemory,whereeachpixelofthescreencorrespondstoabitinmemory.Suchadisplayisoftenreferredtoasabitmapdisplay.Azerobitinmemorycausesthebackgroundcolortobedisplayed,aonebitdoestheopposite.MostusersrunTajowithawhitebackground,althoughchangingaparameterintheuserprofilewillallowwhiteonblackoperation.Thereisakeyboardandamousewithtwoorthreebuttons.Thesoftwaremakeslimiteduseofthemiddlemousebutton,soitis"pushed"onatwobuttonmousebychordingtheothertwobuttons.Thecoordinationofmovementofthemouseonthedeskandthemovementofthecursoronthescreenisdonebysoftware.Thereisaprocedurethatrunsathighprioritythat"tracks"themousewiththecursor,subjecttokeepingthecursoronthescreen.Itispossibleforaprogramtoreplacethisproceduresothat,forexample,adrawingprogramcanmakethecursorstayonagrid.Thissectiongivesabriefdescriptionofthecurrent(Mesa11.0)versionofTajo.3.1Windowsuïg/îGäsï_/î « î·îîˆîRîoî´ î%&î(:î-3î0î5!î7œî:°îF îEöîG´ïPÍî «î ¾îbî–îÿîîÇî (î#±î(éî*Œî,0tî-OïPÍïPÍî.î1ÄsïPÍî7î8“î;Œî=žî?BîD¥ïN™î «î ý î{îëîŒîp î"Ùî#öî&”î(¤î+Çî.î4^î7Ùî;Iî=Òî@ôîDîEïLeî « î•îVî9î hî&ðî(£î+î.î2}î5-î8Üî<¢î>®îB] ïFÕî «î©îî5î9îëîî fî#|î&$î'ãî+hî10î4î9xî=¬îBZîDÊîFïD î «îXî·î†îOîªîî$Jî&Uî'„î*5î.¬î3 î5 î:×î=<î@àîC‘ïBlî «î— î®î{îRî!î#‘î'ÿî*î,‹î/Ïî2šî5 î;äî=°î@#îDeîFï@8î «îèîVîÌîËî%î!*î"™î#Åî*Kî-î0:î1Õî4þî9õî<ÇîB"îD„ï>î «îÈî)î±î\î î!9î#šî'Êî)Òî,3î1Lî2Åî42î9uî;´î<àîBpîD ï;Ïî «îMîÐî”îºî÷î!Èî"òî(?î-Îî0Yî4 î6mî:›î=hî?nî@˜ï8sî «îÆîbîÔîþîO î"bî$î&zî+Dî/fî2Íî7”î9Mwï2åî «ï2åîlÿÇTVm$O4`QL* DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDÿÿÿÿÿÿÿÿÿÿÿÿüDDDDD?ÿÿÿÿÿÿÿÿÿÿÿÿù0DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDpDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDp@ DDDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿð~H€ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð@€ DDDDDDDDDDDDDDDDDDDDDDDODDDDDDDDDDDDDDp@Hà8„¸ˆ¥Ã£ÄDDDDDDDDDDDDDDDDDDDDDDDDDDDDD|DDDDDDDDDDDDDDp|ID„Ĉ¦$d$DDDDDDùÿÿÿÿÿÿÿÿÿÿð@Ið8„„U$$$"¨ñÿÿÿÿÿÿÿÿÿÿÿð@I„„U$$$"¨DDDDDDDDDDDDDDDDDDDDDDGÄDDDÄDDDDDDDDDDp@IDŒÄ"$$d!DDDDDDDDDDDDDDDDDDDDDDDDDDDODDDEÄDDDDDDDDDDp@Hà8t¸"$#£ÁDDDDD=‘0ù0DDDDDDDDDDDDDDDDDDDDDEäDDDFDDDDDDDDDDDÿÿÿÿÿÿÿÿÿÿÿÿüDDDDDDDDDDDDDDDDDDDDDDDDDDGÄDDDNDDDDDDDDDDDÿÿÿÿÿÿÿÿÿÿÿÿüDDDDD=DDDDDÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDDDDDDDDDDDDDDDàÿÿÿÿßÿÿ¾ÿÇÿùÿÿïÿÿÇßûÇÿ`þÿÿÿÿÿÿÿÿÿÿÿÿÿüDDDDDDDDDDïÿÿÿßÿÿÿ<ÿ»ÿöþìÿïÿÿ»Ÿó»þ~þû¿ÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿÿÿÿùï»n‡±þºÿ³üwÿêÿÖì¿»Ÿë»þ}þÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿù@ DDDDDáÖë®ßÛ®ÿ¾ÿ«û¡ÿžÿÖë?Ç_ûǽ}îÿÿÿÿÿÿÿÿÿÿÿÿÿüOøLDDDDDDDïî îßÝ`ÿ¾ÿ«û·ÿîùÖë¡»_û»½{îï¿ÿÿÿÿÿÿÿÿÿÿÿÿÿüOüìDDïîûîßÝoÿ¾ÿ›û·ÿïÿ‚뿺û»ø;ÿï¿ÿÿÿÿÿÿÿÿÿÿÿÿÿù_þéïÖë¬ÛÞîÿ¾ÿ»û·þïÿºË?»ßû»ÿwþë¿ÿÿÿÿÿÿÿÿÿÿÿÿÿù_þéDDDDDà»rçÞñþ;Çüwÿ?»,¿ÇßàÇ¿wïÿÿÿÿÿÿÿÿÿÿÿÿÿü_>ìDDDDDDDÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿ¿ÿÿÿÿ¿ÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü^<ìDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù^éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù^éDDDDD€@Àp ^ìDDDDDDD€` ^ìDD€@<à _ñãþãé€xÀ OÁà÷ÿóéDDDDD€@€à€ Oáñÿÿ¿ûíÄDDDDDD€€œÐ€`{�‚@€9à Oáûÿç¿?íÄD€A@0@�GFÁ€E OÀÿïÅ~?éñ€³Ž0Uc„9`ÿïÅ~< FD†@àÀ _ÿûÿç¿=IžÀÀ _ÿñÿÿ¿ûéDDDDD¼@€ Oýà÷ÿóìFDDDDDDðàà<Gß| OøñãþáLFDàA!xÀV @ Ày–`Xã€@žŽTà ÿÿÿÿÿÿùDDDDG€A‘!YeD@ž} DDDDDDDDFDDDDD^€Œ!çÑEóAUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ DDDDDDDDFD=€A‚!$E€A9Uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ ñ€‘%YE@BqBU DDDEä€@ãΖAADã„òî0‚Tì DDDDDDDDFDDDDGÄ€A@À 0 DDDDDDDDFD€@À 0 €€ QÇ—¸txˆ† DDD|D€@ÿÿüR$H‘#"�˜‘ÄŒ„ˆ† ÿÿÿÿÿÿüFDDDDôD€ààç?ÿÿü“ã‡!>�Ф„„„U ÿÿÿÿÿÿüFDñ€A!2 ’@™! ��Ф„„„U `‘€yŽXã€wŽTì$H‘#"‘˜„D„Œ„" cWÔWדDDODD€A‘!QeD9b}Ç�—D„tx" d–ÑQœFDDD\DD€Œ!LEóyâUü! bQQFDy€A‚!BE€ñÂU  aQQñ€‘%QE@aÂBU d”QÑ™DEÄDD€@ãÎåŽAADã„÷ß1�‚Tïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ cQQFDDGÄDD€A@À€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ `FD€@€# ÿÿÿÿÿÿù=€€ `D|DDD€@ `FDDäDDD€àðŽ8 `œFDÑ€A! ‘D `™‘€y–TÇ‚X=cŽ“ŽTàD `NDDDD€A‘!äY}"d9”Q•} `ÆD|DDDD€Œ!QTâD9Ì8•Uñ `—�ÆDy€A‚!PU"Dy0ÙU `÷q€‘%PU"HdéQp‘BU@ ÿÿÿÿÿÿùwdDDDD€@ãÎ�TñˆXAAÉŽpŽ0‚Tá| `~DdDDDD€@AA€ð c—“Ó^Dq€@@€À d””T”™q€@À a—“™dDDDD€@€€ `—�”‘“œFDdDDDD€àà€¸çßã€` d�””‘�œFDq€A!DA@� c“qÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù`dG±ÿüÿý÷þ?ÿÏø÷ÿÿþ>ÿÞ?ûðãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿüFDdGýÿÿÿßùçýßÿ·÷gÿÿýÜÿŸßó÷÷ÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿüFDq~=ãÿxãßõ×ýŸã¿ÿWþ·eýÜÿ]ßóï÷ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùq½Ýÿw]ßý÷ý_Ýü÷þ·Yþ:ÿÞ=ëïpóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùdG½Áÿw]ßý÷ý_Ý¿ÿw·]ÍÚÿÝÝëßw}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDDDDDDDDFDdG½ßÿw]ßý÷üßÝ¿ÿwü_ýÐýßÁßÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDDDDDDDDFDq½Ýÿw]ßý÷ýßÝ¿÷wýÖ[ýÞÿýßû¿÷]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùq½ãÿxãßðAÞ?ã¿øÁýÙgþ>ÿv=û¿xãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùdGÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDDDDDDDDFDdGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDDDDDDDDFDqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùq8ÀÿÿÿÿÿÿùdDp€@ FDdD`€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿø@ FDqàÿÿÿÿÿÿÿÿÿÿÿÿÿÿø@ qÀ @ dD€€¾ Cÿàð FDdD@€€ €B ÿü FDq`p ° ðŠÆ€rÇŠ ÿÿÿÿüBÿ ÿþ qâ"ˆ ¤È ¢@"‹)€‹.Š ÿÿÿÿü³Ä%ÄE." B€ ÿþ dEÀ"ˆœˆ¢@"Š(€Š,Q@ šÌ‚$&$E1#!" B€ € FDdG‚"ˆ¤€¢@"Š(€Š<Q@8 �ˆ�Ä$"©!!!@B€¿ÿÿ˜Ï FDq"ˆ ¤€¢H"š)€Š8!@0< �ˆ€$$"©!!!@B€ ˜Î‰qp‹€œ0j&€r0> €px �ˆ‚$f!!#!€Bÿ ?á d\€p€`àÿüˆ�Ã¥Á!€B ?à�ÆDd|à€`ÀÿÿüCÿàñ ÆDqtÀ€À @ÿ€zð‰÷qô€À Gÿðõy weÄ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿøDúú ~DgÄ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿøEUPõ} ^DwxDª�úþ ðEUPÿü |DÀDÿü FD|D8€ Gÿð FDq0@ qpü@ dDà8@ FDdDÀ80@ FDqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ q€àà@ dD€ÀÿÿÿÿÿÿüFDdDÀüDDDDDDDDFDq€q€dD8DDDDDDDDFDdD3à8p>ˆðDDDDDDDDFDq3€pà3`€ ˆˆq3y¢`À3{ïžùï³*qÏÙlj‹°dD?Ï6ˆ¢à3¼óc>ó *Š$Ú(¤ŠL¢ÈDDDDDDDDFDdD3ÍÆ…À3?ðc<Þ ªûäÛæñȾˆÿÿÿÿÿÿüFDq3Ìf…€3<0c<”‚ª$‚H € q3Ï6À‚3|óo<”Š$�ª(¤‚L¢€ dD3yãˆâ>gž9ì qà ©Ç�ë€`ÿðFDdDà `ÿøFDqH Àl ÿüq0À8 €~dD8€`€oFDdDp€`€g€FDq` €€qà €€dDÀ`€€FDdDá€p `€€FDq3"€ˆ €€—q0{?žx rDz˜ªÂˆ ,qÇ €€×dDbÏ>óÌ€‹(¢ËÇ$û"" ²Š(€8`€€æDdDàÏ<ðü€‚/¾Šª"> ¢ù†p`€€vDqÂÏ<0À‚ Š$ª" @ €A` €€?q€3Ï|3Ì"Š¢Š=$«""€  Š(€à €€dGyüx€r‹øžªÂø‹ qÇÀ`€€NDdN€pˆÀ`€€FDqà€ €€q<À€ €€dtÀ`€€FDdä€`ÿÿ€FDqÔ ÿÿ€s”  ÿÿ€gD``FDnD> 8<ø``FD}3 8 Ì?ÿÿÿÿÿÿýy3yïŒø8pyç Íï€0tD3Ï6ì€ppÏ=ŒÌnÈ`üDDDDDDDDFDdD3ýÆÌ€àðÏŒÌlÈÀDDDDDDDDFDq3ÀfÌÀðÏ ŒÌl`ùq3Ï6ÀÌÀðÏ=ŒÌl0dD>yã€Ì€€¿yçÌølDDDDDDDDFDdDüDDDDDDDDFDqq?ÿÿÿÿÿÿýdGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`€FDdD `âÀFDq8!“€qp8ü?ÿÿÿÿÿÿýdD`0aÀœFDdDàpa€œFDqÀ`!6€€�q>€Àð àx ø!b€À�dD3€€À0 ‚ÀÌ Ì`ÿÿÿÿÿÿüFDdD3{ïž{7ˆÁçœ0 {âÀÁï³ yÃÍãùâaÀ�ÀœFDq3ÍŽÆÏ<ÈÃ<ö0 Í‚€Ã>ó 3ÏcÏ33c2!€ˆ�q>ýŒÆýïÈ Ã<3ìq‚Ã<Þ 3Áã>Ïó?cò#€ƒ�È�dD6ÁŒÁìÃ<60 ‚Ã<Þ 3ÃcÏ0cf€ÇψœFDdD3ͼÌÌÀ8Ã<ö0 ͰÏ>Þ 3ÏcÏ33o0ÿÿÿÿÿÿüFDq3xìxLj0ýçŸ0ÆxâyïŒ Þyóùã9â,øÏÈ�—qp ,Ä ‹ˆ�×dDà lmBœæDdDÀ 8mBœvDqÀ?ÿÿÿÿÿÿý?q€-"�dDbl¢œNDdDàf"œFDqÂ#$�q€ ø0{À€€à<?ÿÿÿÿÿÿýdG3` Ì`0ÌÀ€ À0 €`ðFDdN0ùïž 8ÍïÞùà0yïˆÀÇžx€ Þýïž7Œ{çˆcÀFDqc>ó pÏ?óc006ÀÌóÌ€ óÿ63<ÌÍŒÈ#€q<c<ÿ àûÿócÿ°ÆÀÌÜü€¿ÿ6?û?Ìý�È dtc<0 ÀÛóc0fÀÌÆÀ€ °ÿ60< ÁŒÿÿÿÿÿÿüFDdä3o<3ÀÏ?óo006ÀÌÌóÌ óÿ6ó<ÌͼÀDDDDDDDDFDqÔ9ì €ÍïÞ9à?ãˆxÇžx€ ÞýãžçŒxçˆs” €gDDDDDDDDDFDnDDDDDDDDDFD}ytD8üDDDDDDDDFDdDpÿÿÿÿÿÿÿÿÿäq`ÿÿÿÿÿÿÿÿÿðqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpdDˆÀddF"€ dqˆ€ü @pq"@pdDˆ#‡‹ˆàóÃÄpddF" $HLID$$ˆdqˆ$HID$$ppq"@$HID$$pdDè8@øÀ$HHID$$ˆddFâˆ@  #‡ˆHà3ÃÄpdqÈqÇ,h²ÇñÇ,Ç!§,',ppq¢Š!2˜¢Ë(¢@H²€"h²(²ˆpdGˆ‰�"ˆ"Š/ @H¢€"(¢(¢øÿÿÿÿÿÿÿÿÿädN"ˆA"ˆ"Š( @H¢€"( (¢€ÿÿÿÿÿÿÿÿÿäqˆˆŠ!"˜¢Š(¢HH¢(€"h (¢ˆq>"qÁ"hŠ'0G"Çù§ ‚Ç"p€dtˆ ‚€DDDDDDDDDDdæ"ˆ DDDDDDDDDDqÔˆpÀs–"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€gDˆÀcÿÿÿüÿÿñÿ�ÿÿÿÿ€DDDDDDDDDDnF"� ]ÿÿÿýÿÿÿýÿwÿÿÿÿ€DDDDDDDDDD}ì¤îCNï,xî « tî‡ï,xï,xî îƒsîÔï,xï,xîyîsî!šî'zî*Øî-7 î52î7õî:ÚîýîC ï…î «î ¨îmîCîóîIî©î!}î&•î([î*±î/qî6¦î8Uî:¬î=zîCXîE®ïQî «îÊî¸î€îïî™î#Yî&7î(¦î-î1òî3mî6î;î=†îB>îDîFuïî «îgîÖî¼î®îkîÎîøî eî#ôî&Ðî*]î.»î3µî6 î9Lî;Ž îC�îFiïèî «îìîBîZî¶îî!Eî%›î*kî-î/{î3›î7Üî<úî>¥îACîDÔîFï´î «ï eî «îîBîª îøîïî!Ü tî(Dï eï eî),î-sî0€ï eï eî1Xî5bî7 î: î;uî@ëîBãtîD ï eï eîDði‡TVm$²5handlethatpointstothisobject.Theobjectcontainsinformationaboutthetreestructure,thiswindow'slocationwithrespecttoitsparent,andseveralprocedurevariables,suchasarepaintprocedurethatgetscalledwheneveraportionofthewindowhasinvalidcontents.TheimplementationmakesuseofMesa'sopaquetypemechanism,sothatclientprogramsneednotknowanythingabouttheactualrepresentationofthewindowobject.3.2SystemdefinedsubwindowtypesTosimplifythetaskofthetoolwriter,thereareseveralsystem-providedsubwindowtypes,eachwithitsownruntimemanagementroutines.Sometoolshaveonlyonesubwindow,likethefilesubwindowforthelogoftheExecutiveinfigure1.Sometoolshavemultiplesubwindowsofthesametype,likethetwoformsubwindowsoftheFileTool.Thethreemostpopulartypesforincorporatingintoolsarethefollowing:·Amessagesubwindowisoneforgivingsmallamountsoffeedbacktotheuser,suchaserrorconditions.Thesewindowstypicallyhaveonlyafewlines,andasinformationscrollsoffthetopitisthrownaway.·Afilesubwindowisusedbytoolsthatwanttocreatealogoftheiroperations.Theclientprogramsimplywritestothelogbystandardstreamoperations.Ascharactersarewrittentothelog,theyappearonthescreenandalsogointothefile.Thebuilt-inmanagementroutinestakecareofthingslikelinebreaks,scrolling,windowsplitting,selection,etc.·Aformsubwindowisthemajorworkhorsefortheinteractiveportionofatool'suserinterface.Thesewindowscancontainformfieldstobefilledin(witheithertextornumbers),choicestobemade(eitherbymenusorone-of-manyselectiononthescreen),andcommandbuttonstobeinvokedwiththemouse.3.3ToolstateWhenatoolhasitsfull-sizedwindowopenonthescreen,itissaidtobeinanactivestate.Thisislikehavingawoodworkingtooloutontheworkbench,readyforuse.Toolsthatwillnotbeneededforawhilecanbeshrunktoaniconicformonthescreen;thesetoolsareinthetinystate(seefigure1).Atinywindowtypicallyretainsallwindowstate,suchasparametersthattheuserhasgiventhetool,optionsselected,ormessagespostedbytheprogram.Inthephysicalmetaphor,thinkoftoolsthatareplacedinatoolbelt,convenientforuse,butnotclutteringthebench.Thethirdstatefortoolsisinactive.Whentoolsaredeactivated,theydisappearfromthescreenentirely.Byconvention,theyfreeupanysystemresourcesthattheyareusing,includingthepreviouslydescribedwindowstate.Theyare,however,addedtoamenuofinactivetoolssothattheycanbesubsequentlyre-activated.Thesetoolscorrespondtothoseputbackintothetoolbox.uïg/îGätï_,î «sï_,î=î?î–îxîMî!©î$µî)î.˜ î6Vî:kî<þî?ô îF=ï\øî «îôîkîÆî®î!�î#¸î( î+—î0hî7+ î=~î@ðîBÞtîDHï\øï\øîDÌïZÃî «sïZÃî³î^îîÜî íî!óî&®î(Dî*€î/ˆî1Ùî6GîÄîB¡îEÃïKWî «î dîEîZ îRî#˜î'Lî*zî-Ÿî0–î3 î:“î=î?YîA ïI#î «î þîrîÚî¨îî|î?î#Vî%�î){î,áî0<î5Ë î=¢î?pîAäîEvïFîî «î]îÂîtîá î©î hî"Îî%«î)Øî,¶î0Fî3¨î8Ïî­ îG0ïDºî «îýîPî° ïB>îÎïB>îðtî|ïB>ïB>î’î´sïB>î!zî"åî%�î'Ìî+îî/‹î5î6Òî<£î>Pî@¯îDîG0ï@ îðîx î"î#:î(ÿî.™î1öî5%î6dî9î<Äî?�îAT ï=ÕîðîîPî°î%î {î!çî&¥ï;ZîÎtï;Zîðî‹î÷sï;Zî×î [î#°î%Äî).î,î/Šî1Qî5lî6®î9î:ìî>K îFï9%îðî¿î\î!Ûî%ëî'¨î*î,xî.‚î4,î8« î@RîBq ï6ñîðî9îâî†îÛî!|î$‚î(þî*úî-Oî1~î4+î6íî8Óî;¡î=öîA&îCôï4½îð î"î!ˆî$šî'¡î)rî-£î0gî36î8 î=ôîC9 ï2ˆîð îîï0 îÎï0 îðtî–ï0 ï0 îîísï0 îÎî!Sî#Ìî'Ûî.¢î0ùtî3qï0 ï0 î3Õ sï0 î:î? î@ßîB"îEåï-Øîð î¥îÁî$‹î'0î,)tî/ªï-Øï-Øî0sï-Øî3Lî5î7î:Íî<•î@CîDIîGï+¤îðtîXï+¤ï+¤îósï+¤îçî {î"Qî%÷î*Bî,$î0oî2 î:î?¢îAŽîCÓï)oîðtî§ï)oï)oîBsîÂï)oï)oî‰î!¸î#gî%Wî*™î-´î0wï#ðî «ï#ðîlî¾sï ¡î «îÄîîî»î1î îÿî#+î&žî(¤î+î/–î0íî2Yî52î6áî8Òî:€tî~~||üüøüü|~~??€Ààøüÿÿàðþÿÿ€À?àððøøüü||||||üüøøøpTheoutertwo(orperhapsonlytwo)mousebuttonsareusedforselection.Theleftbutton,calledpoint,isusedtobegintheselection.Whenthebuttonisdepressed,theclosestcharacterisselected(videoinverted),andtheselectiontracksthemouseuntilthebuttonisreleased.Inthissense,oneshouldthinkofselectiontakingplaceonthebutton'suptransition.Ifonewishestoselectunitslargerthanasinglecharacter,thisisdonebymultipleclicking.Iftheleftbuttonispressedtwiceinrapidsuccession,theselectionmodebecomesword-selection.Threeclicksgetlines,andfourclicksselectstheentiredocument.Aftertryingseveraldefinitionsofmultipleclicking,wesettledonthefollowing:thereisaparametercalledtheclicktimeout,usersettable,butdefaultedto600milliseconds.Ifthepointbuttonundergoesadowntransitionwithinthetimeoutfromitsmostrecentuptransition,amultipleclickissaidtohavehappened.Multipleclickscyclethroughtheselectionmodes,soa5clickisequivalenttoasingleclick.Therightmousebutton,calledadjust,isusedtoextendorcontracttheselection.Pressingadjustcausestheclosestendofthecurrentselectiontomovetothecursorposition,subjecttoselectionmodeconstraints(e.g.,totheendofthecurrentwordifinwordmode).Aswithpoint,theselectiontracksthecursorand"commits"ontheuptransition.Thereisoneslightlysubtle,butquiteusefuladdition.Ifthedowntransitionofadjustoccurswhenthecursorisoverthelast(orfirst)characteroftheselection,theselectionmoderevertstocharacterforextensionpurposes.Discusspreviouslyusedschemes:Drawthroughselection,char/wordbuttons.Discusspreviousindicationsofselection:underline,boxaround.3.5KeyboardThekeyboardoftheDandelionisunencoded;thereisaregionofmemoryfromwhichaprogramcanreadthecurrentup/downstateofeachkey.Veryfewapplicationsdealwiththekeyboardatthislevel,theyuseafacilitycalledTIP(forterminalinterfacepackage).AttheheartofthispackageisacollectionofTIPtables,usereditabledescriptionsofdesiredoperationsassociatedwithuseractions.Thesetablesareassociatedwithwindowsinatreestructure.Everytimeauseraction(keytransition,buttontransition,ormousemovement)occurs,theTIPsoftwaredetermineswhichwindowuïg/îGäsï_/î «îr îdî î›î  î( î)dî-2î0Fî1‹î4}î9Mî=Sî?¡îCOï\ûî «î°îîvîîîgî �î!Íî%æî)štï\ûî*º î0Àsï\ûî6áî9¥îàîCNïX’î « îÊ î½î‹îBî¡î"ówïSî «ïSîl xî>dï3¤ü©sïOÇî «î¥îfî3î’îàî î#bî'Þî,öî/kî2Èî5' ïM“î «îyîãî¢uîŽïM“ïM“î`sîÉïM“ïM“î›îüî"-î#Ðî'�î)å î0Pî4]î6²ïK^î «î ÿ î–îÝî îñî!Eî&Yî*z î0—î37î5~ïI*î «î¡îÿîXîžîüî lî!×î'üî)Êî,jî0`î3 î7…ïFöî «î `îî*îºî¼îtî$aïFöïFöî%sïFöî&N î-?î.½î1dî5¹î7cïDÁî «îîàî÷îîî î!î#±î%î(qtî*^ïDÁïDÁî+tî/Šsî4ïDÁïDÁî4ìî6^î8¯ïB�î «îîLî˜îŽî�î!ž î(ðtî+±ïB�ïB�î,6î1’sïB�î5‰ï@Xî «î\î¶îÏî!qî%\î(lî+Éî/âî4î78ï>$î «îõî”î—î( î%øî'±î-+î2šî4Âî9ï;ïî «î î¡î/î îÏî!Vî%Rtî'·ï;ïï;ïî(Rî+sî/eï;ïï;ïî0Fî3Eî8£ï9»î «îªîCî î?î«uï9»î!õsï9»î%žî)úî0|tî1�ï9»ï9»î2@sï9»î5 ï7†î «îùîaî€îðîÓî 8tî$dï7†ï7†î%!sï7†î&_ î,Þî.î3“î6×î8Kï5Rî «î bî°îóî î!hî$ãî*#î,Šî27î6òî8½î9ïï3î «îçîS îî°îÙîÅï/Îî «î�îëîQî&uî(ï/Îï/Îîîsî#ï/Îï/Îî#ïî%fî(­î*gî.îî0½î6 î8u î? uîDzï/Îï/ÎîE@sï-šî «îî}îóîÆî›îî"üî(¾î*ˆî.cî0.î2©î6ôî<ªîAnîC9ï+fî «îs î?î‹î+î|î %î!Ðî$!î(Üî,Vî-¨î/Hî2Âî7Ðî9Òuî<ßï+fï+fî=°sî@ï+fï+fî@èîC9ï)1î «î¦îî:îôîÜî!åî$Hî&] î-^î1cî2Òî5€î:Lî>µîA9îDÆï&ýî «îêîgîÁî† îŸuî!Rï&ýï&ýî"sï&ýî%±î)ðî-Ÿî/ùî4"î5ˆî8œî:õî=pî?§tîBóï&ýï&ýîCŽsï$Èî «î dîÄ îÁî!îÆî!œî&î'Æî-®î/ìî6 ï!yî «îÙ î³î'î!<î%>î*® î0äî7àî>"îCOïEî « îœîU ît î!î#¸wïÆî «ïÆîlsïwî «î‘î¦îmîÙî«î!$ î(²î,Hî-Áî.øî3Iî5î:‰î=ýîBîCOïCî «îHîtîåîÀîÚî"î#çî')î*½î.*î0Ý î8„î;�î>»îA,îGFïî «îCî×îÝîHîhîåî Òî#Štî&6ïïî&¦î+‹î1 sî5Êïïî6Cî7�î9�î;Öî?UîAîCœïÚî «î >îŽ îétïÚîÉîÝsî0ïÚïÚî3î!Sî&± î.nî0Mî5= î< îB¤îEåï ¥î «îîîÿîM î!µî$Ëî*vî,î-Dî0 î6‘î:‚î=¢î>ÇîA¼îEÏï qî « î îj îËîzî"¿î)çî.nî0¹î3eî8É î?ºîC³eTVm$P7thatevent"isfor"andlooksuptheeventinthechainoftablesassociatedwiththatwindow.Ifitfindstheevent,itpassesthecorrespondingoperationstothatwindow'sassociatednotifyprocedure.TIPtablescancontaintemporalinformationaswell,sothatdecisionsaboutmulti-clickingandchordingaredeterminedbythecontentsoftheTIPtable.TIPtablesaretextfilesandcanbeeditedbytheuser,soindividualscancustomizetheirenvironmentstoaconsiderableextent.3.6Menus€± ÿÿÿÿÿÿà á8„ € p œ± Áˆ „Ê`ø „Š €Š ˆŠ`p‰    ÿÿÿÿÿÿü € |€à @ @ÓžŽ y0ˆQ AˆL AˆB A0‰Q |ІåŽ    ÿÿÿÿÿÿ„ @„ H„  „ H€  „ Jœ±§*f„ J„Êhªi„ J„Š(ªh„ EŠ(”¨„ EŠh”©„ E‰§¦„ @„ @„ @„ ÿÿÿÿÿÿð„ ÿÿÿÿÿÿð„ }ÿÿüÿð„ ¿ÿßû¿ÿð„ ¼n‡û©Çð„ »µßû¦»ð„ ¸;ßû®Ïð„ »ûßû®÷ð„ »µÛû¦»ð„ ¼nçüiÇð„ ÿÿÿÿïÿð„ ÿÿÿÿïÿð„ ÿÿÿÿïÿð„ ÿÿÿÿÿÿð„ @„ ø@„ €„ �Ë„ ðL¦„ €H¢„ €H¢„ €H¦„ €Hš„ „ „ „ ÿÿûÿÿÿð„ �ñûÿÿÿðä wýÿ¿ÿÿðä8}=ãÿÿñä8ŒÝû¿ÿÿ÷ÄxõÝû¿ÿÿÿÿðõÝû¿ÿÿÿÿðtÝû·ÿÿ÷Äx�=ûÏÿÿñä8ýÿÿÿÿÿðä8ýÿÿÿÿÿðä ýÿÿÿÿÿð„ @„ ð@„ ˆ@„ ‰ÇñÇ,„ Š(„@H²„ ò&@H¢„ ‚!@H¢„ ‚(„HH¢„ �Ç0G"„ „ „ „ „ p„„ „ ±Ï„ Ê$„ ‰„„ €D„ ‚$€„ àˆ�Ä €„ „ „ „ p€„ „ ,qË<„ 2Š,�„ "cè�„ "„ "Š(„ à�¢qÈ ‡à€„„„„pà„€ „!Ç<„""(�„¾#è„ "„ ¢"(’„à‡!Ç „€ü€€€p€€sÀ€$‰€a€$€ $‰ €à�žpÀ€€€€ˆˆªÆ,«)2ª'"R "R 2R¬   ÿÿÿÿÿÿðeAnothermeansforuserinteractionisviamenus.Ratherthanhaveasinglelargemenu,thereistypicallyanentirecollectionofmenusavailableatanytime,determinedbythesubwindowthatcontainsthecursor.Systemsuppliedsubwindowtypescomewiththeirownsetsofmenus,suchasatextoperationsmenufortypescriptsubwindow.Thesetofavailablemenusisobtainedbydepressingthemiddlemousebutton;theyarestackedinsuchawaythattheusercaneitherinvokeoneofthemenuitemsfromthetopmenu,orcauseanothermenutocomeontop.Todothis,movethecursorovertheproperlabeltheneitherreleasethemiddlebuttonorpresstheleftbuttonofthemouse.Fromtheprogrammer'sstandpoint,menusaretrivialtoconstruct.Thereisasystemprocedurethatisgivenawindowhandleandanarrayofpairs.Thestringsbecomethemenuitems,andthecorrespondingprocedureiscalledwhenevertheuserselectsthatitem.3.7Symbiotesb@ @DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD ÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýDGƒØÿÿÿñþcÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDDDG¿þÿÿÿnþïûÿ{îÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDD¿ñÿþïÆì{ÆîÇƯÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý‡Þîïýïºï{»~îºé¿ºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýDG¿Þàïûïº{»nÎ ¿¾¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDDDG¿Þïÿýïºÿ{»~îöûÿ¾¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDD¿Þîÿþîºÿ{»mîºëÿº¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý¿ÞñïÿqÆÿ{Ç›ñÇûƯÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýDGÿÿÿïÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDDDGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýDFDDDFDD   DF8 | à€ à€p 8DDDF€D @ @@D€DD–8Ä€AcŒxà4ç€@å� 9cžŒ4N8çŽ9`8ãž8ç€Aã–8™E%A”R!L"x&S  ”HRLQD"E�EHä‘D™"8„YDDFQ|æAÎ!ðD"@$Q  ND‘0"E|ÇÈŠ|Q"„Q|DDDFPA%A!D"@$Q  ˆRD"E@$Š@Q"„P@DDPE$€ER%L"@@$S  IRLD"BEEI„DY"@D”PD�8ô@9�à4!€@$MÁ †ó�48!‚98ã†ãÄ8–!€8c�8DFDDDFDDDFDDDFDDAADGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁDDDFADDADFDDDFDDDFDDDFDDDFDDDFDDMenuscanprovidemanycommandswithoutrequiringtheusertoremembertheexactcommandnames.However,forfrequentlyusedoperations,itiscumbersometorememberwhichmenucontainsthedesiredcommand,bringittothefront,andselecttheitem.Onesolutiontothisproblemissymbiotesubwindows.Theyappearatthetopofotherwindowsandcontainalistofidentifiers.Whentheuserclicksthemousebuttonononeoftheseidentifiers,thesymbiotehandlersearchesthroughalltheitemnamesfromthecollectionofmenusontheothersubwindowsoftheirwindow.Ifitfindsamatch,itcallsthecorrespondingprocedure.uïg/îGäsï_/î «î�î=î`îUîî¸îÑî"8î%ôî'©î*î-Ìî/Œî3 î9òî=î?êîEÿîGˆï\ûî «îî~î‹îáîîc î&Z î-î.·î1…î7� tï\ûî=ùîAÔsîG{ï\ûï\ûïYªî «î©îÒî™î´î  î(ˆî*sî-õî/õî2ÿî9î=6 îF'ïWvî «îcî§ îáîÎîî$~î&'î(wî+*î/Oî2î5ßî8#î:Ëî=ªî@RîBÎîD¯ïUAî «î §îîXî î"î®î%î(V î0éî2—î3Á î;¯wïOÁî «ïOÁîl xî=ßï8Îü�sïLsî «î'îyîÅîÌ î!µî#/î%zî*×î/xî2¬î6î78ïJ>î «î-î€î$îªîHî Sî$Y î*¨î,{î0ûî6Ðî8ƒïH î «î îLî5î�î!¬î$gî)¸î,î0éî5“ïEÕî «î×îYîðîøî -î#î%­î'Sî+ÿî/î0¹î1Ðî4v ïC¡î «î£î÷ îY î  î#Žî%Âî'‘î-cî1Þî3aî9(ïAmî « îqîÒî|îØî"Äî%Öî(+î- î.¼î1ïî3î5ôî8Äï?8î «î½î`îdî÷îºî‹î!î$üî(½î,<î.´î1Aî5’î7nï=î «î¾î§î]îîî}î!¬î#ºî&»î*‚î,éî1î4Aî6¨ï:Ïî «î7î�î©î^îíî"Åî'fî)Zî-î/–î2:î6Üî8Äï8›î «ï5Jî «îzîÓ î‹ î!¡î&î(Mî,=î-ä î4œî8—î9üî;î?”îFï3î «î <îîdîµîaî>î!Sî%vî&Þï3ï3î'ksî+Øï3ï3vî,Úï3ï3î-‚sï3î5Eî9Çî<ÄîADîFï0áî «îŒîŽîFî¥ î!œî(î)‹î-‚î3¶î6î9î=Tî@"wï+aî «ï+aîlxî ŽïKü Hsïvî «îYîî&î î#î(5î.Oî0Êî3ßî5©î<]î>ØîB}ïAî «îŽî¤î îGî"d î)Lî*ƒî+Ð î3Áî5Pî;Éî?¹îC{ï î «î)îîçî®î#î ïî#lî'Uî**î. î0†î4Ãî7åî=Eî?îAÐîGstïÙî «îe sîÛïÙïÙîÂîŠî"8î#÷î&~î)î*úî.Àî4—î7uî<{î=Ëî@0îB ï¤î «îÜîSîeî=î´î &î$°î&Îî)’î+cî/ î5ìî8cî>XîC{ïpî «îáîÏî-îPî’î÷î"T î(‡î*>î.¡î0¥î3î6Ÿ î>_î@îC[ï;î «î -î„îöî îœîòîîa î'X ÿ*‹TVm$384.ProgrammingToolsThissectiondescribessomeoftheMesaprogramdevelopmenttoolsanddescribeshowtheneedtohavetheminteractinfluencedtheirindividualdesigns.4.1RuntimeloaderTheruntimeloaderistechnicallynotaprogrammingtool,butratherapartofthePilotoperatingsystemkernel.Nevertheless,inordertounderstandtheotherprogrammingtools,someknowledgeoftheruntimeloaderisneeded.AMesaobjectprogramhas,inadditiontocode,aheaderthatspecifiesalistofinterfacesthatareimportedorexported.Theseinterfacesarethe"glue"thatholdsmodulestogetherintolargerprogramsandaredescribedindetailin[Mitchell78]and[Lauer79].Theruntimeloadermaintainsadatabaseofallinterfacesimportedandexportedbyprogramsnowloaded(eitherpartoftheoriginalbootfile,orpreviouslyruntime-loaded).Loadinganewmoduleisathreestepprocess:1.Movethecodefromtheobjectfileintovirtualmemory.2.Forallinterfacesimportedbythisprogram,seeifthereissomethingalreadyloadedthatexportsthedesireditems.3.Forallinterfacesexportedbythisprogram,seeifthereissomethingalreadyloadedthatwishestoimportanyitemsexported.Mesadoesnotrestricttheprogrammertohaveasingleimplementationmoduleforagiveninterface,soitispossibleforstep2or3toonlypartiallysatisfytheimportneedsforaninterface.Notethattheloaderiscapableofmanyofthetaskstypicallyassociatedwiththelinkageeditorofamorebatchorientedsystem.Indeed,smallmulti-modulesystemsaresometimestestedbysimplyloadingthevariousmodules.LargeorpublicallydistributedsystemsarealmostalwaysboundtogetherbytheBinderdescribedbelow.Objectprogramsalsocontainalistofcontrolmodules.ManyMesamodulesaresimplycollectionsofprocedures,butsomecontainmainlinecodeaswell.Whenaprogramisrun,itscontrolmoduleshavetheirmainlinecodeexecutedintheorderspecifiedwhentheobjectprogramwascreated.InkeepingwiththeTajodesignprinciples,mostprogramseithercreatewindowsforinteractionorregistercommandswiththeExecutive(orboth)andthensimplyreturn.Onceaprogramisloaded,itusuallystaysaroundforever(oruntilthenextboot,whichmaybeaweekortwoaway).Thereis,however,anunloaderthatgoesthroughthethreestepsinthereverseorder.Thusisitpossibletoloadtwohighlyinterconnectedmodules,decidethatoneisbuggy,unloadit,makerepairs,loadthenewone,andhavetheinterconnectionsnowproperlymadetothenewmodule.uïg/îGärï^õî «ï^õîl î¦sï[¦î «îÈîgîQîæî¡î!î$®î*? î2rî5Åî8î>iîAoîCÑîG0ïYqî «îòî{îq î6î!} î'ÿwïSòî «ïSòîlîùsïP¢î «î—îáî-î¬ î ›î##î$` î-î0>î2Òî6óî80î;'î<óî?fîBÀïNnî «î,îM î¾îqî#,î$à î,î.tî2 î:±î>aîAúïL:î «î dîÄîûî4î ïHêî «î Dîùîî¸î‘îKî$Æî&€î*+î+`î/óî2Íî8Rî9ˆî;Ñtî=–ïHêïHêî=ùsïHêîC±îF‹tïF¶î «sïF¶î&tîÆïF¶ïF¶îasîÈïF¶ïF¶îáî¿ î"Æî$õî'1î+sî.î1®î7îîBûîFï@î «î o îîî$}î%¦î(”î-”î/î0*î3³î6—ï=�îÎï=�îðîÛî;î‚î éî#Hî'aî)Êî,£î0ýï;!îÎï;!îðî·îà tî ï;!ï;!îlsï;!î$Ãî&Ûî)˜î/›î2 î3‡î7-î8´î?sîDcï8íîðî¾î’îòî"ºï6qîÎï6qîðî¹îÇ tîï6qï6qîªsï6qî$³î&Ìî)Œî/�î2î3€î7'î8±î?qîDcï4=îðî¾îîÇî!Mî#îî'˜ï0íî «îEîeîÊîLî› î#mî% î(Bî)\î-7 î7î;õî>#î?<îBà ï.¹î «î oîÆî1îsî°î”îÉî�îÁî pî#Šî(íî-î/zî4î7âî:î< ï+iî «î îìîIî€îêîèî Ÿî$gî&î({î+Õî1X î7Âî:Ûî=8îAþîEþîG´ï)5î «î[î8îÂîQî#nî'( î/ãî4þî7nî>CîBWîDnï'î «îÖîwî�îcî#�î%• î,- î3aî8¢î;7î?ÝîDƒï$Ìî «îî îjîðî ï!}î «î&îCîîî7î!~tî#Aï!}ï!}î#Üî'âsî,—ï!}ï!}î. î2 î5¿î;Nî=«îB% ïHî «î ] î´î.î¹î‘î%8î(xî*î-Øî1èî3 î8’î9öî<Üî>¯îCZïî «îûîLîîUî!î"Óî%<î(úî.¿î2~î4çî9 î>¢îAWîGïßî «îîTîåîFîÆ î%›î))î/mî3‹î7¿î= î@ îGï«î «îŠîoîŠîéî#5î%rî)'î+ßî/î3uï[î «îZî”î2î®î’îøî"ºî&î*êî/·î2î5[î7Êî:éî>‚îB îE´îG´ï'î «î5îúî§î{î~îCî$ tî&ï'ï'î&Îsï'î+¦î.uî1�î6Éî9)î<´î@îAÌîD,ïóî «î�î8îÍîNî¹î’î!Ëî$¡î) î2tî8zî<ÿî?÷îBÍîDcï¾î «îGîõî©î†î•îóî"áî%äî(šî+àî.?î8€î;„îAîDÑîFï Šî «î™ÿ€TVm$Ø94.2CompilerTheMesacompilerisorganizedintomultiplepasses.Thisispartlytosimplifydealingwithalanguagethatallowsforwardreferences,andpartlybecausetheinitialimplementationwasontheAltowithasmallmemory.ThefirstpassisatabledrivenLALRparserwithsemanticroutinesthatconstructanabstractsyntaxtreeinvirtualmemory.Laterpassesdecoratethetree,andeventuallygeneratemachinecodeaspartoftheobjectfile.Thecodeisforastackarchitecture[Johnsson82]thatisinturnimplementedinmicrocodeontheDandelion.Alljumpinstructionsinthisarchitecturearerelativetotheprogramcounter,sothecoderequiresnorelocationbytheloader.Thereisnoseparateassembler;allportionsofthesystem,downtothe512bytebootstraploader,arewritteninMesa.TheunitofcompilationistheMesaMODULE.Thisistypicallyacollectionofproceduredeclarations,togetherwithglobalvariabledeclarations,andsometimesasmallamountofmainlinecode.Atthebeginningofthesourceprogram,thereisadeclarationofthoseinterfacesthatareimportedorexportedbythismodule.Asmentionedinsection4.1,thecompilermustproduceaheaderontheobjectfilethatprovidesthisimport/exportinformationtotheloader.Thecodeandthebindinginformationareallthatarereallyneededforexecutionofamodule.However,additionalinformationisneededtosupportsource-leveldebugging.TheMesacompilerwritesoutmostofthecompile-timesymboltableforusebythedebuggerandperformancetools.Unlikesomepublishedsymboltablestructures[Graham79],theMesasymboltablesareorganizedinsuchawaythatnoinformationusefultodebuggingisdestroyedinthecompilationprocess.Thecompileralsoprovidesasource-to-objectmappingfacility.Thesymboltablecontainsabodytable,whichcontainsanentryforeachprocedurebodyorBEGIN...ENDblockcontainingdeclarations.Theseentriesarelinkedtogetherintoatreestructureshowingthenestingrelationshipofthesourceprogram.Eachentryinturnisassociatedwithapieceofthefinegraintable,atablethattellstheprogramcountervalueassociatedwiththefirstinstructionofeachstatementofthesourceprogram.Theexactrepresentationofthistableunderwentmassivechangesin1981whenallowancesweremadeforthePackager(seesection4.5).Thequestionmostoftenaskedatthispointis"Whataboutoptimization?"Inanutshell,theMesacompilerdoesn'tdoalotofoptimizationthatrearrangestheorderofexecution;whenitdoesdestroytheabilitytodosource/objectmapping,ittriestoarrangethingssothatthedebuggercangivetheuserfeedbackthatthishashappened.Thisisanexampleofa"90%solution."Beingabletosetsourcebreakpointsissuchapowerfulcapability,andworkssuchahighportionofthetime,thattheusersarewillingtosay"darn"inthefewcaseswhereitdoesn'twork,aslongasthedebuggeriscapableofdeterminingthesecases.(Theyhavebeenknowntosaystrongerthingsinthefewcaseswherethedebuggercan'tdeterminewhat'sgoingon).Thecompiler/debuggercollaborationdoesanadmirablejob,butnewideas[Zellweger84]wouldallowittodoanevenbetterone.uïg/îGäwï_,î «ï_,îlsï[Üî «îºî™îŠî,î ¬î#ºî)jî.Ôî2$î3Æî7óî9Øî?ZîDdîG´ïY¨î «î�îvî¾î î$úî'Íî+ßî1î3–î7� îA—îD]îFïWtî «î¿îÓîöî�îÉî›î"lî%_î&Äî'çî+Iî/‘î3ïî8 î;î@ÉîFïU?î «î¢î îÅîîèî!£î& î,pî0(î4Yî9ëîÔîA] ïN¢î «îîûî¸î&îÄî"+î#þî&lî)Âî/î13 î7¢î9¬î<îAMîE^îFØïLmî «î îÑîÀî#î Ûî#:î( î+×î-„î/ãî2xî5‡î;›î@+îB~îG0ïJ9î «ïFêî «înî;îÞ îSî©îòvî!†ïFêïFêî"—sî&±ïFêïFêî'åî*éî,?î1­î2Á î8àî:ƒî@ð ïDµî «îî3îZî• î%ˆî(Dî/î0/î3Òî8âî:Ÿî@SîDîFïB�î «îPîCîÜîeî!…î%Hî&íî(P î/›î1Žtî5fïB�ïB�î5ÊsïB�î;®î>¶tîACïB�ïB�îA¦sïB�îGtï@Lî «sî9ï@Lï@Lîî<îätî`ï@Lsï@LîÎîæî$Çî&|î+ î-¼î0"î5äî9Sî>³î?äîDrîFï>î «îÄî.îüî‹î, î&/ î-¹î/gî1Æï:Èî «î¯î!îî�îÑ î$†î'î)!î,î.™î2�î7„î9ìî@MîB2îC‡ï8”î «îï îu î î!ˆî&`î(î-8 î4Ñ î<„î?kîC#ï6_î «îÃîOîÁî�î î"mî'Kî*Éî-î/¨î1¹î4/î:Nî= îE6ï4+î «îQîúîfîCî"Á î) î1î3Žî7Mî<*î@+îB”ï1÷î «î Yî‹îµîŒî[îa î ëî%î&²î-kî.×î5î6Åî9% î@¯ï.§î «îŸîuî]îtîMï.§ï.§îÑsï.§î(î-ìî3…î6yî;\î>ßîD^tîE£ï.§ï.§îFTï,sî «sï,sîGîEî™îyîþî +î#Lî)¿î-.vî.âï,sï,sî/›sî2•ï,sï,sî2ìvî3›ï,sï,sî4Tsï,sî6—î:G î@ñ ï*>î «î¬îîlî¤î î"Üî$î&Åî,€î1áî4?î8û î@yîB1îD�ï( î «î)î¥îBîúîî} î%óî)î*Kî-èî/«tî2ï( ï( î2‚î4Íî8asï( î<î=Iî@»îC’îFï%Õî «î<î>îé î Vî#sî%Ôî(­ î/Šî1Dtî4wï%Õï%Õî4ûsï%Õî:Œî§îBøï#¡î «î®îb îƒîgî 3î#Åî*Ëî0 î5aî79î:ªî>‰ îE�ï!mî «îkî©îîÙî¦î!Cïî «î…îîuî îãî }î# î&Áî(/î,¡î0… î:Eî<î=BîBÔîE5ïéî «îSîþîñîîî« î$‘î'L î-Ûî0'î3Èî5n î< î?«î@íîD ï´î «îîNîî î¦î$¿î&î)#î*×î/Ðî3íî5¶î8‰î:îî@üîCŒîFï€î «î°î�îfîî“î$kî'‘î)î+î0‡î2Kî3€î7) î> îBîEîFÁïKî «îò î]îÀîèîî"Ð î)`î,î0î3-î4Nî7jî<@î=ïî@FîCºîFïî «îAî¬îJîî†î;î!î#xî&1î)»î-ëî/Zî4/î8î9âî=î>ÚîAQîGsïãî «î®îi î"î­î!ÿî&î)Lî,«î12î2ãî5Cî:�î>·î@gîBÉîElï®î «îÞîXî|îéî"†î&Úî*¿î.Oî1Bî=M îE®ï zî «î œîîÕîVîDîÁ î(=î,kî0î1jî3î5î7î:Vî>N ´TVm$Ñ10TheMesalanguagecontainstwoclassesofmodules:PROGRAMandDEFINITIONS.ThelaterclassisusedfordefininginterfacesandforsharingtypedefinitionsamongseveralPROGRAMmodules.WhenaDEFINITIONSmoduleiscompiled,itsobjectfilecontainsnoexecutablecode,butcontainsasymboltablelikethatproducedfordebuggingaPROGRAMmodule.Thesetablesareusedtoimplementtheincludedsymbolcapabilityofthelanguage.Forexample,supposemoduleAobtainstypedefinitionsfrominterfaceB.WhencompilingA,thecompileropenstheobjectfileforBandcopiesinformationfromthesymboltabletherein.4.3BinderTheoutputofthecompilerisanobjectfilecontainingthecodeforasinglemodule.Formanyreasons,interestingprogramsaremadeupofmorethanonemodule.Whiletheruntimeloaderiscapableoflinkingtogetherseparatelyloadedmodules,mostmediumtolargesystemsaredistributedasasingleobjectfileputtogetherbyaseparateprogramcalledtheBinder.Thisisdoneforseveralreasons,somemoreobviousthanothers.·It'saloteasiertokeeptrackofonefileinsteadof50,particularlygivenMesa'sstricttypecheckingofinterfaces.·Resolvingthelinkagebetweenmodulesisatimeconsumingprocess,soifallinternalinterconnectionscanberesolvedbytheBinder,theloaderneedonlytaketimetoresolveexternallinkagerequirements.·Packagescanbesharedamongseveralapplicationsmoreeasilyifboundtogetherinconvenientsizedpieces.·Interfacescanbeobscuredfromotherprogramsbybindingthemodulesexportingthemintoalargerconfigurationthatdoesnotexportthatinterface.·Thesymboltableanddebugginginformationproducedbythecompileroccupyalotofspace.TheBinderneednotcopythisintothenewobjectfile,butneedonlychangetheheaderofthenewobjectfiletopointbacktothecompileroutputfiles.Optionally,allofthisinformationcanbecopiedintoanew"symbols"file.Theinputtothebinderisaconfigurationdescriptionthatcontainsalistofobjectfilestobecombinedintoalargerobjectfile.Italsocontainsalistofwhatistobeimportedandexportedbythenewfile,aswellasoptionalinformationdirectinghowtheinternalbindingsaretobedone.Ouroriginaldesign(andeachsubsequentimplementation)oftheBinder[Mitchell79]containsasyntaxallowingcompletecontrolofbinding,withseveralwaysfortheprogrammertodealwithmultipleimplementorsofinterfaceitems.Intheinterveningsixyears,wehavehadveryfewconfigurationdescriptionsotherthanlistsofobjectfilenames,whichmeans"bindthemtogetherintheonlywaypossible."AlmostallofthecomplicateddescriptionscouldbereplacedbysuitablystagedsequentialexecutionsoftheBinderonsimpleconfigurationdescriptions.uïg/îGsï_/î «îƒî,îòîUî î$[î&vî,ï_/ï_/î,¸sï_/î2”vî5Kï_/ï_/î60 sî<æï_/ï_/î>FîAîDBîGsï\ûî «îÊîêî; îHîâî!î%¹î(¬ î/^î3Ævî8:ï\ûï\ûî8âsï\ûî> îDÆïZÆî «vî ÇïZÆïZÆî ¬ sïZÆîØîÉî'î!nî#:î'Dî)Ÿî.ôî0ì î7£î;3î=¦îBûîDïX’î «îî§îiî}î¯î#\vî$zïX’ïX’î%"sïX’î*ñî0µî4«î8‹î:Óî>î?¥îFtïV]î «îþsïV]î| î³îbî·î&Fî(çî.®î3çuî8ÝïV]sïV]î:Jî? îB ïT)î «îúuîˆïT)sïT)î{î«î«uî ÿïT)sïT)î!òî"¶î$þî*¡î.€î0Èî4Éî7uî9?ïT)sïT)î:žî=>îAT ïQôî «îîrî:î¢wïLvî «ïLvîlsïI&î «î£î4î î‹îfîñî!î%9î'Á î.šî1î4î6Ûî8$î¨îBîDMï@Tî «îâîuîî)î Oï=ÙîÎï=ÙîðîNîƒîŸîŠîCî"Ÿî&î'àî*–î- î1Èî3‹î5Ó î='î@åîEvï;¤îðîî¼îu ï9)îÎï9)îðîYîÁî!’î' î,–î. î/=î2kî9eî>™î@fîAÐîCÈï6õîðîgî!'î#Lî(ïî+î-³î2Æî5Zî9Èî=Yî@¨îCÖîG0ï4Àîðî—îÙî"  ï2EîÎï2Eîðîßîˆî–î#î'½î,k î4î7Ðî;¸î=6îA¯îG0ï0îð îìî^ï-•îÎï-•îð î"î•tîlï-•ï-•îsï-•î#äî'2î*¸î0²î2•î7’î9Ùî?DîEUï+`îðîÈîòîÝ î$Pî'î*Nî,Ãî1î3á ï(åîÎï(åîðîÙî±î*î!òî(¼ î0Vî6‡î8“î;î@ÎîE’îFÍï&±îðî˜îîÏî!Dî$�î&ôî*5î,Æî/�î1Üî4¹î8Áî;qî=áîA-îD6ï$|îðî<î®îSîŸî!yî%}î'Óî)mî,øî0+î1Åî4î9¸î>îA· ï"Hîðîàî™î; î!Åî$Pî&@î*±î-Šî.³î1¡î8Oïøî «îÂî¬î™î7îÜî†îï î'  î.ñî1þî7 î9î;…î=|îAÔîEîFîïÄî «î îäî îøîî!Tî"Ëî%—î*úî,#î.`î0î3uî4àî6Žî8~î>pîA'îFãï�î «î îùîºîhîVîîg î&ñî,­î/±î2î7'î<Áî?î@ÃîB´ï@î «î¿îúîyîÛî< î&–î1î3î5˜î:O îB îG´ï î «îîÊîÝî »î" î(9î+€î0<î3Ãî6,î8· î@ÅîBŸîEÃï×î «îh îTîPî"9î'Eî)Wî+ú î3zî5Ùî9ýîEîAÍîG0ïnî «î'î\îP îVî 9î"Eî$î&• î.^ î6î9øî<îA¥îC½ï :î «îå îh î!îÚî!:î%Àî'Æî,+ î4�  LTVm$C114.4DebuggerMesahasafull-functionsource-leveldebuggerthatisusedfordebuggingalllevelsofthesystem,includingtheoperatingsystemkernel.Thedebuggerusesthesymboltableandstatementmappinginformationproducedbythecompiler.Itsfeaturesincludethefollowing:·Theabilitytosetbreakpoints.Tosetabreakpoint,theuserloadsthesourcefileintoawindow,selectsaplaceinthefile,andexecutesaSetBreakmenucommand.Asfeedback,thedebuggerchangestheselectiontobethefirstcharacterofthestatementwherethebreakpointisset.Ifthesourcefileisnotavailable,theusercanstillsetabreakpointattheentryorexitofanyprocedurebytypingitsnametothedebuggercommandinterpreter.·Theabilitytointerruptarunningprogramandfindthecontextofanyprocessrunningatthetimeofinterruption.Equallyimportant,itispossibletoresumeexecutionofaprograminterruptedinthisfashion.·Theabilitytowalkupthelinksofthedynamiccallchain,answeringthequestion"Whocalledwhom."·Theabilitytoexamineandmodifydataintheclientprogram.Thedebuggerhasaninterpreterforthefullexpressionsyntaxofthelanguage.SinceMesaisstronglytyped,theinterpretercanusethistypeinformationtoprintoutthevaluesinamoreunderstandablefashion.Numerictypesprintasnumbers,enumeratedonesasthepropernamedvalue,andrecordsprintoutasalistoffieldnames,eachwithitsvalueprintedaccordingtotype.·Theabilitytocallproceduresintheclientprogram.Theinterpreterdescribedaboveallowstheusertocallprocedures,typecheckingtheactualargumentsagainstthetypesoftheformalparameters.TheMesadebuggerevolvedfromtheAltoimplementationandstillusestheworldswapprinciple[Lampson79]forinsulatingthedebuggerfromtheclientcode.Thereareseveraladvantagestothisscheme:onecansetbreakpointsdowninthebowelsoftheoperatingsystemorininterruptroutines.Therearealsoseveraldisadvantages,ofwhichtheprimaryisspeed.WhentheAltoswappedits128K-byteworlds,ittookbetween3and4seconds.TheDandelionhasafasterdisk,butwiththe768Kbytesofatypicalprogrammerworkstation,ittakes10-15secondsfortheswap.Thingsgetevenworsewithlargermemories;theDandelionwillhold1.5megabytesonthestandardmemorycards.Onesolutiontothisproblemisteledebugging.Thedebugger'spathtotheclientworldisthrougharathernarrowinterface.Theroutinesthatreadthememoryfromtheworld"swapped"onthediskcanbereplacedwithonesthattalktoothermachinesontheEthernet.Coupledwithasmallteledebugnubintheclientcode,theseroutinesgiveessentiallyinstantaneousturnaround.Theclientcomputerneednotbegeographicallynearby,either;animplementorinPaloAltocandebugauïg/îGwï_,î «ï_,îlsï[Ýî «îkîöî6 îE î"æî)î+éî-kî0½î3î9àî;æî?ÆîA•îD ïY©î «î¿îî=î¸î#Ìî&¤î,®î/§î2î6Îî:6î<íîC#ïWtî « î5îVîQî±î$Hî&Cî+pî0Oî2¯ ïTùîÎïTùîðîËîî¸îØ î'/î)Xî+xî,¥ î3ðî6Sî9Oî<åî?HîCšîFïRÄîðî4îÒî0î tî$"î%êî(dî+?î.î3¥uî4éïRÄïRÄî5ÐsïRÄî;aî?]îFÍïP�îðîî~î"Šî'¸î*î/Áî1rî3eî5Çî8¡î>Œî@GîB©ïN\îðîî~ î!zî"ðî%ÿî'Œî)÷î.Rî0Æî2=î4½ î:Ûî=Fî@JîBáîE�îG´ïL'îð îõî¢îî"¿î$—î'Xî)%î+Úî2rî4‚î8Ûî:Êî>žî@aîBÕïIóîðîQ ïGxîÎïGxîðîºîåî…î"?î#Zî(ƒî.î0­î3�î5Þî:¤îâîC§ïECîðîŒîîîîÓ î%aî*z î16î2�î3þî9Cî:õî?ÀîEøîG´ïCîðî î ³î"aî%ï@“îÎï@“îðîöî]î9î ­î"íî%zî(øî*ßî-lî3)î5âî:î@ÁîCNï>_îðîîÿï;äîÎï;äîðîÕîîÖî"[î%î)éî,úî.µî1!î4îî;rî>VîDlîFîï9¯îð î®îÙî'î!  î(Fî,yî. î0mî6ëî:Žî>&î?€îD¯ï7{îðî« îÖî ½î#�î&Šî)õ î1Ûî3äî7¨î:xî=3îA½îCÆîEKï5Fîð îÆî#äî)Üî-¨î1Gî3-î9n îA1îD™îFï3îðîmîõî øî#±î(†î+ðî.gî0î1Aî3€î5;î8lî= î@<îCYîE5ï0ÞîðîÅîî ³ï.bîÎï.bîðîÓîîÑîg î&yî(2î*�î.hî4éî7Ì î>§îDÜï,.îðîîeîRîôî!s î(Æî+Êî1zî3Íî7Äî>fîB÷îEJï)úîðî©î îx ï&«î «îœî^î€î®î!-î#¥î&× î0Ïî3žî6Xî9jtî;âï&«ï&«î<Éî?®sï&«îCï$vî « îÞî înîÑî$Þî(Iî*¬î.pî2šî6 î8÷î=‹ îD‹îF=ï"Bî «îõî’îî î„î#@î$àî'1î+³î-^î/¯î5¿î:,î;áî=�îC:ï î «îÌî>î(îØ î"øî$Ðî(üî+zî0Ïî2Yî7Sî;‰î>îA?îGïÙî «îmî<î™îÄî!9î"uî%3î&nî,mî/Lî6î8’î9Âî=‰î@ÖîC]îFï¤î «îzî&î÷î9î î"½ î*–î,î/šî3rî8 î:öî=mîAìîF•ïpî «îîûî%î î òî#aî*4î,ïî0.î2zî9Cî;Xî=ÇîCqï;î «ïíî «î¸îî¹îdîðtîeïíïíîÕ sî'Yïíïíî)Wî,8 î3&î6Uî8 î:uî>>îB2îC¦ï¸î «î òîîë î§îœî%î'ñî+(î-¥î3/î6³î9/î=8îD\îFï„î «î¤î9î4îÃîèî#î!ûî$¼î&uî*î01î2Bî4¬î;Bî@çîD îE@ï Oî «îæî­îIî—îFîÔî#Kî(‡î+c î1Þ î:` îBWîEï î «î î¡îMîu î#Äî(åî-�î/© î8î9êî=;î@ŒîCNîG´ÿ \TVm$,12programrunningonamachineinLondon.4.5PackagerThePilotoperatingsystemsupportsademandpagedvirtualmemory.Italsoallowstheprogrammertospecifyswapunitssothatwhenaparticularpagemustbeswappedin,theoperatingsystemmakesanefforttobringinitsentireswapunit.Whenthecompilergeneratescodeforamodule,itputsthecodeforthevariousproceduresintoacontiguoussetofpagesintheoutputfile(interspersedwithreadonlyconstants).Whentheprogramisloadedbytheruntimeloader,thesefilepagesaremappedintovirtualmemory.Thedefaultswapunitforcodeistoswapthecodefortheentiremoduleasaunit.Proceduresareoftencollectedinthesamemodulebecausetheyworkonthesameabstraction,orbecausetheysharecommonprivatedefinitionsanddata.Itisoftenthecasethatsomeoftheproceduresofthemoduleareusedonlyforinitialization,orthatsomeprocedureinmoduleAistightlycoupledwithanotherprocedureinmoduleB.ThePackagerisatoolthatallowstheprogrammertoassociateproceduresofacollectionofmodulesintoexplicitswapunits.ItcorrespondsverymuchtotheChineserestaurantstereotypeof"onefromcolumnA,twofromcolumnB."Thepackagertakestwofilesasinput,oneisbinderoutput,theotherapackagingdescription.Apackagingdescriptionisasequenceofswapunitdescriptions.Eachswapunitcontainsalistofmodulesandproceduresfromthosemodules.Thisisaconsiderablesimplification,sinceanexplicitlistisonlyoneofaboutninewayssupportedforspecifyingtheproceduresinaswapunit.Forexample,onecouldspecify"allproceduresofMnotalreadyplacedinswapunitsnamedAandB."Recallthatthesourceleveldebuggingreliesoncompileroutputtablesthatgiveasource/objectmapping.Thesetables,togetherwiththesymboltablestakeuplotsofroom;theysometimesaccountfor80%ofthebulkofacompileroutputobjectfile.WedidnotwantforthePackagertohavetorewritethatinformation.Considerablecarewentintotheredesignofthesource/objectmappingtablesproducedbythecompilertomakethemindependentoftheeventualentrypointlocationoftheproceduresoncetheyhavebeenpackaged.4.6PerformanceToolsThepackagerdiscussedaboveistheeasierhalfofanimportantproblem,thatofreducingworkingsetsize;themoredifficulthalfisthatofdeterminingwhattheswapunitsshouldbe.WehaveanumberoftoolsinXDEtoaidinansweringthisandotherinterestingquestions.Indeed,theprincipalconclusionof[Knuth71]wasthatprogrammersshouldhaveandusemoredataabouttheruntimeperformanceoftheirprograms.Thesetofperformancetoolsincludesthefollowing:·Spyaprogramthatwakesupperiodically(atinterruptlevel)andrecordstheexecutionuïg/îGsï_/î «î:îqîwî¡î&î ÔwïY±î «ïY±îlsïVbî «îsîªî¸î#î!¤î"½î'ûî+øî0Cî6lî7Óî:�î>­î@ü ïT-î «î IîÖî8î�îCîî ¥î!¿ î'äî+î.rî0Rî5èî7Þî:-î@;îD¦ïQùî «î œîgîî¿îmîGî3î!¦ïNªî «îËî2îõîî!Tî#™î$Êî**î+ˆî.”î0üî4Jî6�î8öî=Æ îDÕîG´ïLuî « î“î§îWîî¾îî"~î$Þ î,ûî0 î5³ î<êî@ùîCOïJAî «î îîqîÇîôî|î"ûî%[î)î+fî0ªî3xî7Éî=ÿî@ÍîElïH î «î�îÌîîî-î îî Fî"„î$ãî(Ïî-Ïî/}î0§ïD¾î « îÓî=îæî¸î |î"òî&…î+›î0Óî3øî7‹î9§î<î?° îGïB‰î «îîEîîûî"Ë î)Îî,¹î1î2­î4Lî8î:§î=Éî@ËîD’îFï@Uî « îÎî£îî9î¨î"î%5î'Žî/äî1Äî4®î8\î>ûî@ÄuîEàï@Usï@UîGsï> î «îBîÁî#îuî%>î'3uî,zï> sï> î-mî/[tî2zï> ï> î3asï> î8¾î:qî;âî>õîB îFï;ìî « înîýîƒ î!jî#î$ î*#î+¼î1!î3Ùî8Žî;áî?æîA= ï9·î «îºî‘î?îŸîá î"M î(Ûî*”î-ðî1Wî6Lî81î:Ýî>DîC9ï6hî «î™îuîîÉîÌî�î#¨î&iî'êî,eî1Eî3¹î7nî8­î?9 îGRï44î «îH î€îîaî"oî$Nî'çî*ð î3®î7Gî:ßî=éîCrîDÂîG%ï1ÿî «î,îß îâîFî!áî(9î+Oî,·î-Ý î5Çî>¯îBîD ï/Ëî «î î™îÖî¤îîƒîÀî">î(Ùî+8 î1Òî4S î;}î=Mî>šîB/îF3ï-—î «î{î$îîî‰î' î&,uî'ãï-—sï-—î)�î,î0Ôî5-î6Ùî:Jî=°uîB5ï-—sï-—îCªuîF_ï-—sï-—îGRï*Hî «îîî�îîwî$Zî("î*Rî06î4Òî8èî;ßî>÷î@J ï(î «îîøî#îmî"nî$´î)cî-5î0î2î4Šî6)î:2î=(îCÇï%ßî «î îîáîŸîî:îøî'î çî%_î)}î,Ìî/\î1×î4Qî7³î9õî@îAçîG%ïAî «î îîYîhî¯î" wïÃî «ïÃîl îysïtî «îŽî`îtî�îøtî"bïtïtî"ýsïtî&Cî)î*ßî,Ûî3Gî9.î<î=ËîC‡ï@î «î Üîî‡î.îzî[î Úî#¼î%ˆ î-Sî0Äî37î6½î:9î>ÈîA¼îDZîG´ï î «îîî�îuîBî)î ¶î"žî)Mî,(î/î2ñ î9ã îAEîFï×î «î îZîî »î#sî&M î.Àî3Hî6›î9_î;àî?îB‘îFï ¢î «îã îçî îçî$Qî')î)Fî*ÿ î3î6Tî;¸î> ï 'îÎï 'îðî™îî µî$¡î&“ î-çî/Ùî5€î9î;¶î@jîB©ÿ 9TVm$013contextofagivenprocess(orsetofprocesses).·PerfPackageatoolthatallowstheprogrammertodefineasetofnodesinarunningprogram,usingthestandardmachineryforsettingbreakpoints.Asetoflegs,definedbypairsofnodescanalsobedefined.ThePerfPackagereplacesthebreakpointhandlerwithonethatcountsthenumberoftimesthateachnodeisvisited,aswellastheaveragetimespentoneachofthelegs.·Transfercountingtoolsseveraltoolstonoteallinterestingcontroltransfers(procedurecallsandreturns),andpresentvariousstatisticsaboutthem.·Pagefaultanalysistoolstoolstorecordandpresentdataaboutpagefaultbehavior.Thesetoolsallrelyheavilyonthesource-leveldebugginginformationproducedbythecompilertopresenttheirresultsinthemostusableformat.TheSpyisaninterestingexample.Onecanfirstseeinwhichmodulesaprogramisspendingitstime.Thenforasetofmodules,onecangetstatisticsaboutthemosttime-consumingprocedures.Finally,statisticscanbecollectedatthestatementlevel.SincetheSpyworksonasamplingprinciple,itissometimesusefultoswitchtothePerfPackagetoobtainexactstatisticsatthestatementlevel.4.6ConsistentCompilationToolsTheMesacompilerchoosestopaintRECORDtypeswiththe48bitversionstampoftheobjectfileofthemoduleinwhichtheyaredefined,typicallyaninterfacemodule.ThusifproceduresinprogrammodulesXandYbothreferencearecordtypefrominterfaceA,thenXandYneedtoberecompiledwheneverAis.Thisleadstocompilationdependenciesdeterminedbytheincluderelationshipsofacollectionofprograms.AtoolcalledtheIncludeCheckertriestodealwiththeseproblems.Itsoriginalgoalwastotakeacollectionofmodulesanddeterminewhethertheywereconsistentwithrespecttoversionsofthevariousinterfacesholdingthemtogether.IthasgrowntowhereitcanbepointedatthecurrentversionofaprogramandtoldtocreatethesequenceofCompilerandBindercommandlinesnecessarytomakeanewone.InissimilartotheUNIXTMprogramMake,butdiffersinatleasttwoways:itonlycaresaboutcompilationandbindingdependencies,anditdeterminesthesedependenciesautomaticallyfrominformationintheobjectfile.Anearlier,moreambitious,toolworkedonthefollowingpremise:if,intheexampleabove,thechangestoAwereinareasunusedbyXandY,thentheyneednotbeactuallyrecompiled,butmerelyupdatedtorefertothenewversionofA.SuchatoolrequiressomecareonthepartoftheCompilertoleavebehindasuitable"audittrail"sothatthelatertoolcandetermineexactlywhatwasusedfromagivenincludedmodule.Thistoolwasnotasuccess,quitepossiblybecauseitalsotriedtodealwiththeproblemofaninadequatediskontheAltoworkstation,andhadtheunfortunatesideeffectofsometimesdeletingtheonlycopyofthesoftwarethatitwastryingtomakeconsistent.uïg/îGsï_'îðîÅî~î§î\î$/î&mî(‰î*B ï\«îÎï\«îð î¿î “î#hî'�î* î1íî3¢î7ãî9î;7tî<÷ï\«ï\«î=¶sï\«î@ÁîBvîC§ïZwîðîÜî‹îðî%�î,Oî.‘î2ü î;Wî<éî? tî@ÊïZwïZwîA-sîBüïZwïZwîCÞïXBîðîÑîî±î�î þî#°î%†î+-î-ê î5‘î:¸î<ý îCÓïVîðî8îî î!–î$"î)|î+cî/:î25î5”î94î:Íî?­îAˆîD£îFïSÙîðîïîî¿î!Åî$öî&¯î)ïQ^îÎïQ^îðîYîð î'”î*Ëî,`î/`î16 î7ÕîÈîBïI^î «î´î îîÉî�î™î ÿ î(�î/P î6àî=î? îAnîG0ïG*î «î“îíîOîîƒîòî$Jî)Çî,²î/ˆî1î3 î9Öî@QîChîFïDöî «î çî~îtîàîòîjî ¾î&ƒî(Eî,î/žî1Äî2Öî4Ûî6}îÕîAIîCz ïBÁî «îîÐî î î&àî+Ü î11î3®î5‘î;>î<Éî?îEAï@�î «îdîÇîŒî‘îšîÇî!¦ î'Éî)"î*‘î1Mî5hî7î;Wî= î?k îG0ï>Xî «îðîy îÝîvîÕî# wï8Ùî «ï8Ùîl î. î!îsï5Šî «î�îDî î îÚvî"oï5Šï5Šî#Bsï5Šî'ìî+Œî.²î1î3 î56î: î>"î?æîBQîFuï3Uî «î –î'îXî8îwî¹î!>î&Èî,~î. î4wî:¶î>eî?÷ îG0ï1!î «î<uîÃï1!sï1!î1uîêï1!sï1!îdî¢î%¢î&Îî+ î.2î1›uî7Cï1!sï1!î86î9uî<=ï1!sï1!î=«uî@eï1!sï1!îAÞîE=îFîï.ìî « î"uî¥ï.ìsï.ìîkîPî!¹î%…tî'‚ï.ìï.ìî( î/ sï.ìî7n î?îAQîCÿï,¸î « î»îî´ îôî¹î%¾î'Vî*.î.1tî0œï,¸ï,¸î17 sï,¸î:aî=qî?*îB/îEUï*ƒî «î¿îÒîóîîÇî!�î$žî%ß î,+î-üî3˜î6fî=îBfîE�ï(Oî « î î*îÚî�î âî"¡î%î)× î0î5î8©î>öî@uîBðîG0ï&î «îîîoî%î@îwî:îÄî$¸î)«î+�î,ãî2œî5~î8‚î:[î>ˆîAîG%ï#æî «îÜî¦î>î²î"ÿî)%î*æî.­î/éî2éî6–î8xî9öî>Žî@OîBÁvï$sîF�sï!²î «îˆîîÞî{îwî!]î$Ñî'Ëî+îî-’î0úî4ºî8ê î@ÃîCÈï}î « îªî‰î î 5î#æ î,� î5(î8¶ î@hîB>îDÅïIî «ïùî «î$îæîŸ îsî eî%tî' î*&î0^î6(î8î9Ûî<`îAÿîFïÅî «îýuîÑïÅsïÅîmîãî¶îYî"Guî$hïÅsïÅî%ùuî(ÖïÅsïÅî)Èî*Êî.î1Jî4Ìî7gî9}î>¸ îF]ï�î «î;î“î@î�î<îšî!†î&Luî(ï�sï�î(öî*Sî-Æî.îî1¹î7î:–î=ƒî?‡îAåîDÇîFï\î «îÝîŸî;îøî5î"_î&­î*Uî,,î/î1‚î4»î7›î:;î@ÑîE�ï'î «îZî˜îî.îäî�î%nî(Šî+Zî.î0î1¬î6ºî:Fî?•îD¹îFïóî «îÖîgîDîBî„îìîˆî!\ î(Fî+î-î/Dî2A î9åî<€î?îA] ï ¿î «î~îCîöî©îåî"?î%Sî(Ÿî*Rî,¬î2î4çî68î8Ýî<Ùî>‚îB0 ÿ ¿TVm$¬145.OtherusefultoolsThetoolsdescribedinsection4arearepresentativesampleofthosethatareheavilyintegratedwiththeMesalanguage.Thereareanumberofothertoolsthatrunintheenvironmentthatarevaluableforprogramdevelopment,butarenotaslanguagespecific.Asamplecollectionofthesetoolsfollows:·ProgramLibrarian·DFsoftware,like[Schmidt82]butwithlibrarianextensions·Adobe·built-ins:FileTool,abbreviationexpansion,·Chat·Mailreadingprograms·Tooldriver6.Usersupplied"Hacks"Thereisadefinitepositivefeedbackeffectfromhavingthedevelopersofasystemrelyonitfortheirday-to-dayexistence,particularlyinasystemasopenandextensibleasXDE.Intheearlydays,whenanimplementorwroteasmallprogramthatinhancedhisproductivitytherewasanaturaltendencytoshareitwithhisfriends.Such"neathacks"oftenwereincludedinthenextofficialreleaseofthesystem.Thesymbiotepackagedescribedinsection3.7startedlifethisway.Wereachedthepointwheretheproducersandusersofthisancillarysoftwarewerenolongerhousedinthesamecornerofasinglebuilding,butwerespreadacrossthecontinent(evenafewonothercontinents).Inthissituation,adegreeoforderwascalledfor.ThedirectoryononeofthefileserverswaschangedfromaprivateMesagroupdirectoryintoapublicone,andasetofruleswasestablishedtogoverntheuseofthisdirectory.Herearesomeoftherulesfromthemostrecentset[Johnsson83]:·A"hack"isauseful(orsemi-useful)programthatismadeavailabletothegeneralcommunityasapublicservice.Nowarrantyofsuitabilityorresponsibilityforerrorsisimpliedbytheauthor.·Ahackstoredonthedirectoryremainsthe"property"ofthesubmitter.Othersmaynotmakemodifications(exceptfortheirownprivateuse)withoutnegotiatingwiththeowner(whomayalreadybemakingsimilarorincompatiblemodifications).·Astheownerofahack,youarenotrequiredtofixbugs,butyoumustbewillingtotransferownership(permanently!)tosomeonewhovolunteerstofixthem.·Hacksthatarederivedfromreleasedsoftwareshouldbeannouncedtothepubliconlyuïg/îGrï^õî «ï^õîlî<î sï[¦î «î~îÉîïî—î.î]î!«î"Ï î+•î06î1êî5ƒî8Lî:šî?Q îEÃïYrî «î þîšî#îî^î{î$šî&Fî)Ùî-î/Þî2hî4 î6[ î>]îAîCeïW=î «î"îê î­îgî!ôî$£î&Šî,Šî2Ãî4‰î9j î?ØîAÊîE�ïU î «ïRŽîÎïRŽîðî‰ïPîÎïPîðî{îLî÷ î&Žî)î,*î1¹ ïM˜îÎïM˜îðïKîÎïKîð îØî°î M î(; ïH¡îÎïH¡îðïF&îÎïF&îðî6î+ïC«îÎïC«îðî6rï<€î «ï<€îlîfîÁsï91î «îÌîVîžîÈîýî"íî&×î*]î.÷î1u î8nî:Eî;�î@'îCîE,îF¡ï6ýî «îà î© îË î#î$žî%¶î*î+»î/î1À î8î9¶î>î?¾îB îEaï4Èî «î�î­ îîî]î#)î(çî+ãî1úî4[ î—îAîDBï0`î «î1îêîJî¡îyî"Uî'—î-Âî/pî4 î6Iî:Æî=/î?Ñï-î «î"î/î{îî îUî%£î(Fî+°î-Uî/âî5]î:Áî=þî?ñîD ï*Üî «î eîÐîYî´îxî®î¥î$‚î'î*kî.Ýî2õî5`î;€î?Lî@�îC-îE?ï(¨î « î»î›îM îQî‹î$ î%Öî)œî,Xî0`î3›î6„uîî+î/%î5î8 î9Sî=«î@ÍîC£îDêîG%ï$?î «î î¶ î¾înîî!`î#Öî%‘î(3 î.ãî2Xî4¬î8Aî9ûî<[î?¹îC!îE‚ï" î «îÏîì ï�îÎï�îðîŸîjîùîEî!�î#á î+Æî1wî4hî5÷î9Úî?·îA‰îD ï[îðî;îõî,î"sî'îî*^î0%î1ë î8Nî: îBžîDèï&îðî\îgîbîÂï«îÎï«îðî¸î:î˜îÙuî"tï«ï«î#$sï«î(‰î.–î3üî6— î=Îî?ÂîB\ ïwîðîÜîPî6î#Z î,Sî1�î4;î7òî;fî@tîCÒïBîð î]îÈî!xî%÷î)Åî-î2=î4~î9¸î>Žî@¢ ïîðï“îÎï“îðî îrî¨îjîœî#Dî&î(`î*Ýî0vî2-î4Gî7îî:xî=8î@¨îB¢îG0ï ^îðîûîž î)î*±î0lî3p î:î;Âî=Óï ãîÎï ãîðîîÖî$î"î%sî*ºî0-î4£î6�î=�î?7îA�îEÄÿBTVm$d15afterdiscussionwiththeorganizationorindividualresponsibleforthatreleasedsoftware.·Everyhackstoredonthedirectorywillalsohavedocumentationandallsourcesnecessarytorebuilditstoredonthedirectory.·Testingisimportant.Ahackisnotshoddysoftware;itissoftwaremadeavailableoutsidetheregularreleasechannels.Theseruleshaveprovedquitesuccessful;atlastcounttherewereover200programsstoredonthedirectory.Theprogramscanberoughlydividedintofourcategories:·Modifiedversionsofofficialtools,withaddedfunctionality.Thesenewfeaturesareoftenincorporatedintotheofficialversionsatthenextrelease.·Extensionstotheenvironment.Theseincludeaddingnewkeyboardcommands(madeeasierbytheTIPmechanism),changingtheappearanceoftinywindows,andchangingthesemanticsofscrollbars.·Generallyusefultools.Forexample,thereisacalendarprogram,severalgraphicseditors,aspreadsheet,atoolforbrowsingfilesonremotedirectories,etc.·Funandgames.Thisincludesaprogramtoplaymusiconthetonegeneratorofthekeyboard,severalarcade-likegames,andMazeWar,amulti-playerseek-and-destroygameplayedoverthenetwork.7.ConclusionsThissectionsdiscussesthemajorsuccessesandtheareaswherewefellshortofourgoalsanddesires.Goodpoints·Consistentuserinterface(byseduction,notfiat)·Balanceofnovice/expertusability(accelerators&2Dvs.1D)·Sourceleveldebugging·"personaltimesharing"·homogeneousenvironment(selectionbetweentools)·Adequateperformance(cyclesofaddfeatures/tuneperformance)·Extensibility(TIP,proceduralinterfacetotools)Agreatpercentageofourshortcomingshavecomefrom"thinkingsmall."Bytryingtosqueezetoomuchfunctionalityintotoolittlememory,extensionisdifficult,andtogetadequateperformancethetuningprocessmakesmaintenancedifficult.TheCompilerisanexample,itoriginallyranona64KAlto(anamazinglycomplexlanguagetofitintosuchasmallmachine),butitsdatastructuresnowlimitprogramsizetoabout1000lines.EventhetwoclassesofpointersoftheMesaLanguageareanartifactoftheoriginalAltoimplementation.Anotherproblemisabilitytoscale,butwithuïg/îGsï_/îðî î\î Nî"… î*3î+Î î2' î90î;Eî=êîCï\´îÎï\´îðî î îüî"<uî$Õï\´ï\´î%…sï\´î*éî0ôî3Øî6Þî:^ îCþîFîïZîðîÄî×î †î%Oî&¥î*Èî,Ïuî/.ïZïZî/ßsïZî5 ïXîÎïXîðîøî� î"î#Òî'Bî(×î+vî0hî6„î8î9˜î?:îC#ïUÏîðî¹îîËî$QïR€î «îµîîgîî§ î%~î'î)¦î-„î1î4nî7�î:,î@FîDqîFuïPLî «sïPLî† î4î î!î#ªî%›î*°î/¦î2~î5‚ ïMÑîÎïMÑîðîîqî!Aî%óî)³î,äî1 î:,î>DîAHîF‹ïKœîðî„ î”î"lî$Ëî)gî.³î0Lî2«î5»ïI!îÎïI!îð îÊîmî î'—î+Žî0cî4êî7Íî=ÊîD¥ïFìîðîÃî±îî¶ î&­î,|î.Í î5óî7žî:^î@XîCïD¸îðîPî„î= ïB=îÎïB=îðî€îÉî#Vî&2î,3î/íî1‰î2ãî8—î>¯îCpï@îðîÏîù î!»î"åî%²î'ïî-Öî0Äî2Êî7q î>xï=�îÎï=�îðîóî´îÑî!õî'cî(–î./î/çî2õî6öî9î;pî>”îD¼îFï;Yîðî†îK î&|î+6î.#î4ùî6X î>Zï9$îðî™î î$î!ƒrï1ùî «ï1ùîl sï.ªî «îµîÆî}îÌî²î%î(&î*vî-ãî1ëî4î6[î9Éî;rî=íîAYîDï+[î «î—ï(ßîÎï(ßîð î©î£î#Hî%½ î,@î.µï&dîÎï&dîðîîÊ î#Šî) î0ñî2‰î4Ýî6íï#éîÎï#éîðî‚îÈï!mîÎï!mîðî$ ïòîÎïòîð î¤ î$³ î*Òî0@ïwîÎïwîðî1 î"5î&¥î(^î+ î3• ïüîÎïüîð îÞîq î&Wî+ýî-«ï¬î «î 3î  î�î4îº î$î'Rî*÷î.Xî4}î9œî;³î?°îAYîFuïxî «îŸ îÀîµî<î ‰î&kî,¦î.. î3Ûî6¯î8zî:àî@Ú ïDî «î îiî>îx î#~ î)•î,oî2Žî3ûî5íî;Àî= îC7îE­îG´ïî «î»îÞîQîÛî iî&8î'ðî)Éî,«î/æî1î4Áî; î=«î?�îB� ï Ûî «î¬îïîzî"îÍî«î"íî&ýî*‚î,Þî/‡î3Ýî5“î:Üî<’î>îîB”ï ¦î «îî(îíîÂî>îdî!šî,�î2î7¸î9@î=•î?`îC&îEÃÿ TVm$416unexpectedresults.Worldswapdebuggingisanexample;programsrunbetterwithmorememory,butworldswaptakeslonger.A"sameworld"debuggerisintheplans.Anotherclassisshortcomingscouldbelooselycalledparochialism.Muchbenefithasbeengainedbyhavingasinglelanguagesystem,andwhenwestarted,almostnothingsimilarwasavailablefromoutsideanyway.Astherestoftheworldgetsbitmapdisplaysandmice,manyinterestingapplicationswillappearwritteninotherlanguages.Thecurrentprogramofplacingthisenvironmentinadozenmajoruniversitiesmaywellleadtootherlanguagesbecommingavailable.Lessofalong-termproblemisanon-industry-standardoperatingsystem.Forexample,experienceatPARChasshownthattheUNIXTMschemeofstandard-input/standard-output,alongwithpipestogluesmallprogramstogethercanbereasonablyimplementedintermsofMesainterfaces.Ontheotherhand,twodimensionaluserinterfacesareoftenpreferredtotheparadigmoftypingcommandsintoaTTY-likeexecutive(butcertainlynotalways)uïg/îGsï_/î « îóîîfî×î&Žî'÷î)åî/Õî5æî8zî„îAîDnïWwî «î ¤îîDî,îðî!Áî$uî('î*Lî/î3€î8“î=î?¿îEwïUCî «îZîôîêî.îµîSî —î$hî'î+³î0Ïî3kî6úî:ª îAH ïSî «îPîÐî|î#î¼ î#Ôî&¦î+hî0ðî2£î7eî9ÿ îBîC®îDÑïPÚî «î¢ îÔîØîÅî¿î!mî% î+Wî2Ë ïM‹î «îÊî‰î¸îîœî î <î-÷î4î9}î<-îB ïKWî «î Dî©îînî=îœvïKäî!ksïKWî$ î(éî*£î>dîB$îE?ïI#î «î tî’îJîwîôî"šî$¤ î+˜ î4î5Ëî9°î;ƒî?F îF€ïFîî «îOî3îNî> î!9î$w î*åî-}î1Uî7¢î9•î<9îBœîDšïDºî «î‘îiî“îŽî"˜î%’î+,î-¡ÿ�TVm$qÿGACHA ÿ TIMESROMANþŸÿ TIMESROMANþæÿ HELVETICAþŸÿ TIMESROMANþŸÿ TIMESROMANþŸÿ TIMESROMANþYÿ HELVETICAþYÿ HELVETICAý…3 ÐL8‰N *W|e†~ ç‡ Ô’ › %¤ 2­ s·ú¿ûÇÆËj/ÎÌ�Ûw.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[]<>MesaPaper.tioga%Monday, December 3, 1984 12:16 pm PST