När mer än en version av ett program måste bibehållas, i allmänhet mycket av koden upprepas oförändrad i många versioner. Tekniker som "deltas" och villkorlig sammanställning används ofta för att undvika duplicering av dessa gemensamma delar. Förutom att spara lagring, dessa metoder hjälper programmeraren i hög grad att hantera uppdateringar av versionerna. Tyvärr kan dessa representationer av multi-version program visas mycket olikt ett program, vilket gör dem svåra att redigera. Beskrivs här är en ny metod för att automatisera en stor del av bokföringen som är involverad i att hantera multi-version program. Det innebär att man använder en speciell editor som gör det möjligt att se och modifiera ett multiversionsprogram på ett sätt som ligger långt närmare det som normalt är tillåtet för ett singelversionsprogram. Ett multi-version program är en datastruktur som innehåller fragment av kod samt kontrollinformation för att bestämma, för varje version, vilken av fragmenten behövs. En automatisk process kan på begäran producera alla önskade versioner vid presentation av ett versionsnamn eller motsvarande identifierare. Två tekniker är i gemensam användning för att hantera de många fall där multi-version program påträffas. Så kallade "deltas" representerar relativt väl sekvenser av versioner över tid men representerar samtidigt befintliga versioner dåligt. Omvänt, villkorlig sammanställning tillåter samtidiga versioner att representeras väl men i praktiken inte sekvenser av versioner. Dessutom kan båda representationerna verka mycket onaturliga för programmeraren. En speciell redaktör beskrivs i detta dokument för att hantera både samtidiga och sekventiella multi-version program på ett enhetligt sätt. Koden för endast den version som programmeraren arbetar med visas och ingen versionskontrollinformation visas. Om han redigerar mer än en version visas en av dem som ett exempel och de avsnitt som skiljer sig åt mellan dessa versioner markeras. Flerversionsdokumentation, såväl som kod, upprätthålls ofta också. I detta dokument, vi först granska några typiska fall av multi-version program. Vi beskriver sedan det traditionella deltat och villkorliga sammanställningsmetoder för att representera multiversionsprogram. I nästa avsnitt granskas en metod där en redaktör används för att övervinna några av de problem med mänskliga faktorer som förknippas med dessa traditionella metoder. Slutligen diskuteras några detaljer om redaktören, P-EDIT. En användning av multi-version program är som en del av en applikation anpassare, såsom MACS [ 11. Här en blivande användare fyller i ett frågeformulär för att göra sina behov kända för anpassningsprogrammet, som som svar producerar en lämplig version av programmet, tillsammans med anpassad dokumentation. Den absolut dyraste delen av en anpassning är multi-version programmet (och dokumentation) inom det som definierar de möjliga versioner som kan produceras. Operativa system skrivs också ofta som multiversion program, med hantering vid varje installation väljer en lämplig version för sitt system. En annan vanlig användning för multi-version program är behovet av att hålla ett register över de ändringar som gjorts till ett program. Här väljs en lämplig tidsperiod (dagligen, redigera session, etc.).), och en ny version skapas varje gång programmet ändras inom perioden; alternativt, en metod för att namnge versioner väljs (version 2.4.3, etc.) och en ny version som skapats när det anses lämpligt. I 0 Copyright 1984 av International Business Machines Corporation. Kopiering i tryckt form för privat bruk är tillåten utan betalning av royalty, under förutsättning att 1) varje reproduktion sker utan ändring och 2) tidningsreferensen och IBM-meddelandet om upphovsrätt ingår på första sidan. Titel och abstract, men inga andra delar, av detta papper får kopieras eller distribueras royalty gratis utan ytterligare tillstånd av datorbaserade och andra informationssystem. Tillstånd att återpublicera någon annan del av detta papper måste erhållas från Redaktören. VINCENT KRUSKAL IBM J. RES. DEVELOP. Vad är det som händer? RÖST. Nötkreatur och andra ryggradslösa vattendjur, färska, kylda, frysta, frysta, frysta, frysta, frysta, saltade eller i saltlake, rökta, saltade eller i saltlake, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, saltade, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta I JANUARI I 984 båda fallen genereras en sekvens av versioner, vanligtvis med en klart senaste version av primärt intresse. Således, sekvenser av versioner verkar helt annorlunda från de samtidiga versionerna av ett program anpassare. Faktum är att de ibland ges olika namn, som i SVCEs versioner och revideringar [2], och vissa multi-version tekniker bara hanterar en eller annan. Men skillnaden är ibland inte så tydlig, som när det finns en släppt version underhålls och en nästa version utvecklas. Här kan en redundans av ansträngning undvikas genom att göra de senaste två versionerna samtidigt med de ansvariga, utvecklarna, eller båda. När ett stort program är konstruerat av en grupp, det finns ofta behov av en programmerare att arbeta på en tillfällig version av en modul utan att påtvinga sina övergående problem på de andra i gruppen. Komplexa relationer kan utvecklas bland sådana versioner när, låt oss säga, en programmerare vill göra modulen han skriver överensstämmer med en annan modul som ännu inte är redo att överlämnas till gruppen som helhet. Ett tillräckligt kraftfullt versionskontrollsystem kan lösa många av de problem som är inneboende i denna situation så att det till och med är möjligt att lätta på de gemensamma reglerna för modulägande som förbjuder mer än en programmerare från att ändra en viss del av ett program. Äganderätt till versioner, snarare än moduler, kan ge samma kontroll med mycket större frihet. Ett annat exempel på behovet av ett mer kraftfullt versionskontrollsystem är kravet från vissa kunder av vissa typer av program för att göra lokala ändringar. Ett sätt som programvarutillverkare kan tillgodose detta behov är att sälja den nödvändiga modifieringen till kunden som en skräddarsydd produkt. Kostnaden för sådana skräddarsydda produkter tenderar dock att vara ganska hög, främst på grund av de höga kostnaderna för att underhålla dem samtidigt som förändringar i den allmänna produkten. Eftersom den allmänna produkten med de ändringar som krävs av en viss användare helt enkelt är ett exempel på en annan version av produkten, skulle varje metod som avsevärt minskar kostnaden för att upprätthålla en ytterligare version göra det möjligt för programvarutillverkare att citera mycket lägre priser för skräddarsydda produkter. En typ av versionskontroll som inte annars diskuteras här är egentligen samma koncept på makroskopisk nivå: kontroll över vilka moduler som ska väljas för att generera en viss version av ett stort system. Här utövas kontrollen på modulnivå, snarare än på kodfragmentnivå. Det typiska förfarandet för att bygga ett stort system från moduler styrs dock av en styrfil för varje version som ska byggas. Sådana styrfiler själva kan ses som program skrivna på ett mycket speciellt syfte språk. Således, kodfragment versionskontroll kan mycket väl visa sig användbar även på modulnivå om en multi-version kontrollfil behölls, snarare än många separata. Detta skulle särskilt vara fallet när det fanns en stor mängd dubblering i de i övrigt separata kontrollfilerna. Två generella sätt används för att representera multi-version program, deltas och interna Booleska uttryck. Deltas är instruktioner om hur man ändrar en tidigare version för att producera nästa version. De använder radnummer eller liknande identifiering för att ange de punkter i den tidigare versionen där ändringarna ska göras. Deltas är verkligen paket med redigeringskommandon och uppfanns ursprungligen för att tillhandahålla partiredigering för band åtminstone så tidigt som FAP-monteringen för IBM 7090. De används fortfarande för andra ändamål än versionskontroll, d.v.s. för att skicka instruktioner om hur man ändrar ett program på en fjärrplats. Men de ser inte alls ut som de redigeringskommandon som är vanliga idag i interaktiva redaktörer och är ganska svåra att hantera. Varje delta representeras vanligtvis som en separat fil. ( SCCS-systemet, som beskrivs i ett papper som ger en utmärkt beskrivning av deltaproblemen [3], är ett undantag.) Således finns det typiskt en basfil och en sekvens av deltafiler. Ytterligare mekanismer införs ofta för att tillåta katalogisering av den ordning i vilken deltat ska tillämpas för olika versioner. Deltas fungerar ganska bra för att representera sekvenser av versioner, men de representerar samtidiga versioner dåligt. Parallella versioner representeras som ett träd av delta. Ta ett enkelt fall av en multi-version fil med tre samtidiga versioner, X, Y och Z. En typisk representation kan tilldela X rollen att vara basen, och ett delta skulle representera omvandlingen av X till Y och ett separat delta skulle representera omvandlingen av X till 2. Men om en viss plats i X måste ändras på samma sätt för både Yand Z, den förändringen skulle behöva representeras i både X till Y delta och X till Z delta. Men dubbleringen av identiska kod är exakt vad som undviks genom att ha multi-version program. När en programmerare ändrar den delen av X-deltat till Y-deltat får han ingen hjälp med att göra motsvarande ändring av X-deltat till Z-deltat, inte ens hjälp med att veta att det ska göras. Det kan inte hävdas att den ursprungliga deltarepresentationen var felaktig, dvs. handlar om deras obskyra uppgiftsrepresentation, som inte är allmänt tillgänglig för deras alternativ, som beskrivs nedan. Alternativet till deltas är att metalingvistik villkorliga uttalanden placeras i ett annars normalt utseende program. Detta kallas ofta villkorlig montering eller sammanställning. Tolkningen av dessa villkorade uttalanden görs ibland under sammanställningen [4] och ibland av en förbehandlare [5]. Men i båda fallen finns det metavillkorliga uttalanden som innehåller booleska uttryck som gör att kompilatorn ignorerar eller sammanställer de kodfragment som de villkorliga uttalandena hänvisar till. När du redigerar en sådan multi-version program, dessa metavillkorliga uttalanden är synliga, och alternativa fragment av kod som inte skulle samexistera i någon version ses nära tillsammans. Om man överanstränger sig, kan resultatet bli omöjligt att komma till rätta med. Representerar sekvenser av versioner över tid med denna metod är ogenomförbar, eftersom antalet förändringar är stort och normalt inte av intresse för programmeraren. Därför ser vi ofta två olika versionskontrollsystem användas (och måste läras) inom samma projekt: ett deltasystem för inspelning av sekvenser över tid och ett internt Booleskt uttryckssystem för samtidiga versioner. Ännu värre är att mer än ett booleskt uttryckssystem ofta används, ett för varje programmeringsspråk som används. Men bortsett från mänskliga faktorer finns det inget multiversionsprogram som inte kan representeras av den interna Booleska uttrycksmetoden, ett faktum som utnyttjas av det tillvägagångssätt som ska beskrivas i detta dokument. När det gäller både delta och intern Boolesk uttryckskontroll är den råa datarepresentationen helt onaturlig, och programmeraren kan behöva ta itu med ett objekt som är lite som ett källprogram. Men när det gäller delta har man utvecklat en metod för att undvika detta problem. Redaktörer, såsom XEDIT [ 6 ], har byggts för att tolka delta språk och kan därför instrueras att redigera någon version, vanligtvis den senaste, av ett multi-version program som representeras som deltas. Användaren placeras sedan i en miljö där det förefaller honom som om han redigerar denna version, även om den inte finns som sådan utanför editorn. Han använder vanliga redigeringskommandon, men när han förklarar att han är klar med redigeringen registreras bara ändringarna, i form av ett delta, snarare än hela versionen. Detta delta skulle valfritt vara en ändring av det sista deltat som applicerades när han började redigera, eller så kan det vara ett nytt delta som ska läggas till deltasekvensen. Denna metod var en betydande förbättring jämfört med den direkta redigeringen av delta. Det löste alla mänskliga faktorproblem, men lämnade problemen med att hantera samtidiga versioner, VINCENT KRUSKAL som är inneboende i delta representation. I detta dokument presenteras ett sätt att utvidga denna idé till den interna Booleska uttrycklige representationen. Det är intressant att observera hur begränsningarna i deltarepresentationen visar sig genom en sådan deltaredigerare. Ta igen exemplet med tre-version program med version X, basen, och deltas Y och Z. När programmeraren ändrar version Y med denna editor, får han inte veta vilka delar av det är samma i version Z. Även om han visste detta av erfarenhet, kunde han inte ändra båda versionerna på en gång. Så vi ser att han behöver två faciliteter: anmälan av allmängiltighet och förmågan att ändra mer än en version en t en gång. Följande diskussion visar hur detta kan tillhandahållas genom att tillåta honom att redigera båda versionerna samtidigt och definiera lämpliga metoder för att visa dem för att informera honom om vilka avsnitt som är gemensamma för båda. Detta har inte gjorts med hjälp av deltarepresentation; ett sådant försök skulle resultera i ett ohanterligt stort antal delta. Denna teknik är endast realistiskt möjlig med den interna Booleska uttryck representation. Början När redigeringen av en fil börjar med den metod som beskrivs i det här dokumentet förs hela multiversionsfilen in i lager så att användaren snabbt kan välja de versioner som ska redigeras för tillfället. Alla kodfragment och styr booleska uttryck är omedelbart tillgängliga för editorn, så att det enkelt kan skapa vilken miljö användaren vill. Användaren kan definiera en standardmiljö så att han inte nödvändigtvis placeras i positionen för att redigera alla versioner initialt. Till exempel, om det fanns en sekvens av versioner, skulle han förmodligen vilja ange att han automatiskt redigerar endast den senaste versionen. Han kanske också vill att en ny senaste version ska skapas för honom. Från den punkten på i detta enkla fall, kunde han använda redaktören normalt utan någon särskild kunskap om att han redigerar en multi-version program. En annan typ av automatisk initiering kan krävas för ett program som består av många relaterade filer. Här kan användaren ange att oavsett vilka av dessa filer han redigerar, ska motsvarande versioner av dem vara tillgängliga. Således, till exempel, om han redigerar den senaste versionen av ett program och han vill också redigera dokumentationsfilen, kommer den senaste versionen av dokumentationsfilen att redigeras också. Omvänt är det viktigt att kunna redigera andra filer under oberoende versionskontroll. Redaktörer, som kan ansöka och generera delta. Men eftersom redaktören kan tillåta samtidig redigering av mer än en version, kan användaren begära att redigera, låt oss säga, både förra månadens version och den nuvarande versionen, eller till och med alla versioner som har funnits sedan början av året. Detaljerna om hur detta fungerar lämnas till nästa avsnitt, men det kan nu ses att eftersom redaktören är ansvarig för att hålla användaren informerad om den gemensamma karaktären bland de versioner som redigeras, måste det i detta fall belysa de fragment av kod som skiljer sig mellan de valda tidpunkterna (dessa är de delar som inte är vanliga bland versionerna). Ett kommando ges för att återställa någon kod från det förflutna till nuet (RESTORE). Även en sådan förändring som denna registreras korrekt i den meningen att den återställda koden kommer att styras av ett booleskt uttryck som anger att denna kod existerade under en tid, sedan försvann, och sedan återfanns (1981 > JEAR < 1922). Detta är ett implicit sätt att introducera en O R i Booleska uttryck. Som kommer att ses, de flesta komplexa Booleska uttryck införs på sådana implicita sätt, vilket befriar användaren från att behöva ta itu med dem explicit. Sequences of versions Eftersom den underliggande datastrukturen för dessa multi-version filer är den traditionella en av Booleska uttryck som förknippas med kodfragment, är det tydligt att innovation av denna editor är det sätt på vilket detta material presenteras för användaren. Som tidigare nämnts är det viktigt att han inte förväxlas med komplexa booleska uttryck eller kodfragment som inte motsvarar ett normalt källkodsprogram. För att uppnå detta visas bara en version av programmet, även när han redigerar mer än en version. Han kontrollerar vilken version som visas, eller om han inte utövar sådan kontroll, görs det av redaktören. I det senare fallet använder redaktören heuristik för att undvika godtyckliga ändringar av den version som visas. Till exempel görs ingen ändring när användaren bläddrar genom filen. Dessutom, om användaren ändrar sin miljö, i betydelsen vilka versioner han redigerar, och återvänder till en tidigare miljö, kommer redaktören ihåg vilken version den tidigare visade i den miljön. Denna kontroll över vilken version som visas kan ses som en flerdimensionell förlängning av den normala tvådimensionella rullning som redaktörer tillhandahåller (vertikal och horisontell). Även om detta kan ses som att lägga till en tredje dimension, är det mest användbart att tänka på som att lägga till många dimensioner. Om det finns en sekvens av versioner över tid, det finns en TIME dimension. Om det finns samtidiga versioner för att stödja programmet som körs under olika operativsystem finns det en SYSTEMdimension. Om det finns samtidiga versioner för att stödja enkel- och dubbelprecisionsberäkning, finns det en PRECISION dimension. Var och en av dessa dimensioner varierar oberoende av de andra. Det totala antalet versioner i detta fall är antalet kontrollpunkter gånger antalet system som stöds gånger två (antalet precisioner). Den version som ska visas kan anges genom att begära att editorn ska HIDE någon kod som visas eller UNHIDE några som inte är det. Dessa kommandon lämnar ofta ett val för redaktören att arbitrera om det finns mer än två versioner av den koden. För att se till att alla syns kan användaren begära en VIEWSHOW som startar en slinga, som visar var och en i tur och ordning när användaren begär STEG. Loopen avslutas av UNSHOW. En sådan ögla kan inbäddas i andra öglor. All redigering är tillåten även när en sådan loop är aktiv. Det slutliga och minst använda alternativet är att ange ett uttryckligt booleskt uttryck (VIEW PRECISION = DOUBLE). Detta kan eller kanske inte lämna ett val för redaktören att arbitrera, beroende på komplexiteten i Booleska uttryck som anges med avseende på Booleska uttryck som styr koden tittat på. Användaren måste varnas för att det finns andra versioner av koden han tittar på, precis som redaktörer ofta talar om för honom att han saknar något ovanför, nedan, till vänster om, eller till höger om skärmen. Detta görs genom att markera (t.ex., uppljusning) visas kod som är i vissa, men inte alla, versioner som redigeras. Detta lämnar dock inget att markera om en del av koden saknas i den visade versionen men inte i alla versioner som redigeras. I detta fall markeras ett intilliggande avsnitt, kanske i en annan färg, om tillgängligt. Med denna metod ser användaren inget annat än ett normalt källkodsprogram, men varnas för vilken kod som är vanlig och som varierar mellan de versioner som redigeras. Att välja de versioner som ska redigeras Versionerna som ska redigeras väljs slutligen genom att ange ett booleskt uttryck, även om detta vanligtvis görs implicit. Detta booleska uttryck kallas mysk, eftersom det döljer de oönskade versionerna. Redaktören simulerar att de maskerade versionerna inte existerar genom att jämföra Booleska uttryck som styr kodfragmenten med masken. Om ett specifikt booleskt uttryck är oförenligt med masken, fungerar redaktören som om dess kod inte existerade. Om detta Booleska uttryck måste vara sant med tanke på masken (masken antyder det Booleska uttrycket), är motsvarande kod i alla versioner som redigeras. Denna kod kallas jxed, i betydelsen "definierad" - det bestäms att koden är i de versioner som redigeras. Om Booleska uttryck kan eller kanske inte är sant med tanke på masken, är motsvarande kod i vissa, men inte alla, av de redigerade versionerna och visas ljust om det är i den version som visas. En sådan kod kallas unjxed. För att tillåta att delar av masken manipuleras självständigt, ger redaktören faktiskt ett antal masker. Men i praktiken finns det bara en, AND of all DEVELOP. RÖST. Nötkreatur och andra ryggradslösa vattendjur, färska, kylda, frysta, frysta, frysta, frysta, frysta, saltade eller i saltlake, rökta, saltade eller i saltlake, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, saltade, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta, rökta JAG JANUARI 1984 maskerna. Flera masker är bara en teknik för att hänvisa till delar av den verkliga operationsmasken. Några av dessa masker har användarvalda namn, ofta betecknande den begränsning de definierar, låt oss säga, TIME. Andra bildar en push-down lista för att tillåta en användare att spara en version av en miljö och ange en mer restriktiv en, en gemensam verksamhet (PUSHMASK och POPMASK). Masker kan tillfälligt stängas av (TURN TIME OFF) så att redaktören kan komma ihåg dess rätta värde, men att ignorera det för tillfället. Som påpekats tidigare, masker sätts ofta som svar på en användares deklaration av den standardmiljö som önskas när en redigeringssession börjar. Ett typiskt kommando som kan utfärdas automatiskt är MASK V VERSION> = 2.3.4 för att ställa in V masken så att endast den senaste versionen redigeras. Observera att sekvenser definieras av ett större än eller lika förhållande så att nästa version, upprättad av MASK V VERSION>=2.3, säger, kommer att införliva den tidigare versionen utom där uttryckligen ändras i den nya versionen. Användarna zoomar ofta in i en mer restriktiv miljö, gör några ändringar och återvänder. Ofta görs detta som ett resultat av användarens förståelse av innebörden i någon ofixad kod. Han kan säga att han vill göra ändringar endast till de versioner som innehåller den koden genom att använda FIX kommandot för att ställa in en mask så att koden upphör att vara ofixad. Eller alternativt kan han säga att han vill göra ändringar endast till de versioner som inte har den koden genom att använda kommandot EXCLUDE, som på liknande sätt sätter en mask. Efter att ha gjort de förändringar han hade i åtanke, brukade han använda UNMASK kommandot för att rensa masken precis satt. För att göra en ändring till någon ofixad kod själv, är det inte nödvändigt att gå igenom problemet med att fixa det, göra ändringen, och sedan rensa masken. I så fall kan normala redigeringskommandon användas, eftersom ingen redigeringsåtgärd ändrar versioner som för närvarande inte redigeras. På samma sätt finns det också en korthand för att infoga någon kod efter någon ofixad kod endast i de versioner som innehåller den (ANNEX). Det finns en analogi mellan HODE kommandot och EXCLUDE kommandot. HIDE är ett flerdimensionellt rullningskommando som gör sig av med en rad endast i betydelsen vad som visas. EXCLUDE är ett kommando för versionskontroll som gör sig av med kod i betydelsen att begränsa vilka versioner som redigeras. (Kontrast dessa med DELETE, som blir av med kod i den meningen att det inte längre finns i de versioner som redigeras.) På liknande sätt är kommandot VIEWSHOW jämförbart med kommandot SHOW. VIEWSHOW garanterar att varje version av en sektion av kod kommer att visas, och SHOW garanterar att en mask kommer att ställas in i tur och ordning så att varje version av en sektion av kod kommer att vara den version som redigeras. Som med VIewSHOW, SHOW används för att säkerställa att inga versioner missas. Observera att "varje version av ett avsnitt av kod" inte betyder varje version av hela programmet, eftersom det avsnittet inte kan variera i någon dimension. Så även om koden mot vilken SHOW utfärdades nödvändigtvis kommer att vara fast under slingan, andra delar av koden kan mycket väl förbli ofixerade. En typisk användning av SHOW är att göra motsvarande, men annorlunda, ändringar i den ena delen av koden enligt vilken version av en annan kommer att samexistera med den. Eftersom den nuvarande masken (AND of all masks påslagen) avgör vilka versioner som redigeras, görs en begäran om att infoga ny kod i filen så att det kontrollerande booleska uttrycket för det är just den nuvarande masken. På samma sätt, begäran om att ta bort kod från filen ändrar den koden Booleska uttryck så att det blir OCH av vad det brukade vara och INTE av masken. Om resultatet av detta OCH är FALSE, koden är i ingen version och kan fysiskt raderas. Att ändra befintlig kod är bara en kombination av att ta bort den i förhållande till den nuvarande masken och infoga dess nya version som tidigare. Men här om den modifierade koden var unfixed, den infogade koden skulle ytterligare begränsas genom att göra dess kontrollerande Booleska uttryck vara AND av den ursprungliga kontrollerande Booleska uttryck och mask. Ovanstående metod för att presentera multi-version filer utformades med avsikten att användaren aldrig behöver hantera Booleska uttryck explicit, utom för enkla relationer när en ny version skapas. Men som i de flesta strategier på hög nivå, är detta bara ofullständigt fallet. Ett antal kommandon ges för att visa Booleska uttryck som styr kodfragment. BOOL gör det för en liten del av koden. SHOUPARM visar dimensionsnamnen (VERSION) och de värden som de jämförs med i relationer (2.4.3 och så vidare). SHOWUNFIXED visar alla alternativ på en gång, tillsammans med de kontrollerande Booleska uttrycken för ett litet segment av kod. På liknande sätt ges kommandon för att visa maskerna. MASKS visar namnen på de masker som används. MASK visar värdet av en av dem. SHOWMASKS visar alla masker, tillsammans med deras värden, och som slås på eller av. Dessutom tillhandahålls ett sätt att ändra de kontrollerande Booleska uttrycken med samma redigeringskommandon som används för texten (EDITMODE BOOLEAN). En sådan direkt ändring skulle kunna leda till ett försök att införa syntax som inte kan representeras internt. Sådana fel upptäcks och rapporteras. Redaktören måste försäkra att varje sådan direkt redigering endast görs till de versioner som redigeras, som vanligt. Detta uppnås genom att det nya Booleska uttrycket blir (B&T M)((B'&M), där B är det tidigare Booleska uttrycket, M är den nuvarande masken och B' är det nya Booleska uttrycket. På grund av detta, även om ändringen specificerades med hjälp av normala textredigering kommandon, resultatet i allmänhet kommer att vara mer komplicerat än en enkel textförändring. Mer vanligt än direkt redigering av Booleska uttryck är användningen av kommandot MAKE. Detta är inte ett kommando för textredigering och beror inte på funktionen EDITMODE. Den redigerar de booleska uttrycken på ett semantiskt sätt och är därför mycket enklare och säkrare att använda. Den agerar på ett segment av kod, typiskt hela programmet, och tar som argument ett jämlikt förhållande och ett godtyckligt Booleskt uttryck. Den söker igenom Booleska uttryck som styr det angivna segmentet av kod för semantiska förekomster av det lika stora förhållandet (VERSION=2.4.3). Varje förhållande baserat på samma dimension som i det lika stora förhållandet (VERSION) anses vara en "semantisk händelse". Detta beror på att ett sådant förhållande kan anses ha detta lika förhållande som en del av det [VERSION> 2.4.3 kan betraktas som VER-SION> 2.4.3 & l(VERSION=2.4.3)]. MAKE ersätter den lika stora delen av varje sådan relation med det angivna booleska uttrycket (se tabell 1 ). Resultatet kan vara att helt enkelt ändra namnen som används i Booleska uttryck (MAKE GONDER=MALE SEX=MALE). Eller det kan vara att införa en ny version som initialt ska vara densamma som en befintlig version (MAKE GENDER=MALE GENDER = MALE I GENDER = NEUTER). Det kan även användas för att ta bort en version helt (MAKE GEN-DER=NEUTER FALSE). Men det kommer aldrig att ha effekten av att skapa en version av det segment som det tillämpas på som inte fanns tidigare. Det vill säga, det kan inte placera två ömsesidigt uteslutande segment av kod i samma version eller ta bort en del av en version av segmentet utan att ta bort alla den versionen. Vissa av dess användningsområden är lite obskyra men kan vara snyggt förpackade i en redaktör som har makron eller andra metoder för extensibilitet. Till exempel kan PURGE makro användas för att ta bort alla versioner före 2.4.3 (MAKE VERSION=2.4.3 VERSION <=2.4.3). Naturligtvis, som med EDITMODE BOOLEAN, redaktören försäkrar att de ändringar som görs av MAKE kommandot görs endast till de versioner som redigeras. Därför måste det tidigare exemplet för att ta bort gamla versioner från filen föregås av ett kommando för att få dessa versioner att redigeras (TURN V OFF). För att ändra ett jämlikt förhållande E till ett booleskt uttryck B på ett semantiskt konsekvent sätt måste alla relationer R som utgör de booleska uttryck som handlar över samma dimension som E ersättas som i tabell 1. Det värde som ett dimensionsnamn jämförs med i ett förhållande X visas i tabellen som V(X)[V(VERSION <2.4.3) är 2.4.31.  Alla tekniker för att hantera multi-version program som nämns här har en vanlig brist: ett visst segment av kod kan endast förekomma en gång (noll eller en gång) i en viss version, och den relativa ordningen av kod kan inte vara olika mellan versioner. Detta tvingar på konstlad dubblering av kod i vissa ovanliga fall. Det verkar som Theodor Nelson planerar att ta itu med dessa fall i sitt XANADU-system, James King har föreslagit en relaterad redaktör som skulle tillåta användaren att se ett program under olika förenklade antaganden. Detta skulle skilja sig från den redaktör som diskuteras här i att syftet är att klargöra en enda version program. De booleska uttryck som användes skulle vara de som kodades i själva programmet. Denna redaktör skulle använda Kings program reduktion tekniker [ 8 ]. De idéer som presenteras här har implementerats av författaren och Paul Kosinski [9, 101 med hjälp av ett booleskt uttryck förenklare skriven av Peter Sheridan [ l] på IBM Thomas J. Watson Research Center i Yorktown Heights, New York. Det har en liten gemenskap av användare inom IBM, och nästa steg är att ordna en realistisk fältförsök i ett omfattande programutvecklingsprojekt. De normala redigeringskommandona, inte de som införs för multiversionsprogram, är som de som vanligtvis stöds av redaktörer som körs under IBM Virtual Machine/System Product (VM/SP) [ 121. Eftersom P-EDIT körs under VM/SP, det finns lite nytt för användare av det systemet att lära sig för att redigera en enda version program eller den senaste versionen av en multi-version program som representerar en sekvens av versioner. För att ge stöd för någon form av fil, ingen av de befintliga representationerna av interna Booleska uttryckskontroll valdes, eftersom var och en stöder endast det programmeringsspråk som det utformades för. I stället innehåller varje fysisk rad i en multiversionsfil två fält, den normala texten för raden och det booleska uttrycket som styr i vilka versioner texten ska visas. Eftersom poster med variabel längd med mer än ett terminalt blanktecken är sällsynta i VM/SP-miljön, används förekomsten av exakt två terminalt blanktecken för att beteckna att de föregående icke-blanka tecknen är ett booleskt uttryck. Frånvaron av ett booleskt uttryck är en korthand för TRUE och tillåter att en singelversionsfil behandlas som en multiversionsfil som råkar bara ha en version. Denna kompromiss för att uppnå språkoberoende fungerar ganska bra i praktiken. Det har dock ibland framförts invändningar mot strukturerade språk (där indentering vanligtvis används för att illustrera strukturen) när identisk kod förekommer på olika nivåer i två versioner. Till exempel, i en version kan ett fragment av kod köras villkorslöst och i en annan villkorligt, vilket skulle göra det indragen mer. Detta skulle göra hela fragmentet formellt annorlunda i de två versionerna, inte bara indenteringen av det. Dessutom, med filer som representerar dokumentation, kommer användaren att få bättre resultat om linjer bryts vid naturliga syntaktiska punkter, snarare än när det inte finns mer utrymme på en linje. Den senare kommer att ha en tendens att skapa alltför många oviktiga skillnader mellan versioner när, låt oss säga, en punkt omformuleras efter det att bara några få ord tagits bort. Men alla ovanstående kommentarer gäller endast P-EDIT i sig, inte denna metod för att hantera multi-version filer i allmänhet. Den allmänna metoden skulle passa ganska bra i syntaxstyrda redaktörer, som har vissa kunskaper i programmeringsspråket [ 13, 141. I själva verket genomfördes det först för en sådan redaktör [15, 161]. Det skulle också passa ganska bra in i en sann dokumentredigerare som ständigt håller dokumentet formaterat [ 171. Alla redaktörer förbättras avsevärt genom att ha anläggningar genom vilka det kan utökas, särskilt en multi-version editor. P-EDIT tillåter detta med hjälp av en allmän makrotolk, EXEC 2 [ 181, som ingår i VM/SP. Förutom makron, som utökar kommandot som, P-EDIT har ganska många platser där det kallar sådana program. Exempel är när ett angivet antal ändringar görs i en fil, när redigeringssessionen startar och när redigeringen av en viss fil startar. Den senare görs enligt den typ av fil som redigeras, oftast namnet på kompilatorn som kommer att behandla den. Detta är hur ovan nämnda standard miljö anges, genom att skriva ett EXEC 2 program för att utfärda P-EDIT kommandon som bör göras initialt. Således, multi-version filer har vanligtvis en annan filtyp för varje program som underhålls, och av konventionsfiler av samma typ delar samma masker. Dessutom används EXEC 2 för att tillåta användaren att skriva utökad P-EDIT stöder också ett UNDO-kommando, som tillåter att de senaste kommandona tas bort helt. Detta är helt klart en viktig funktion för alla redaktörer, men är särskilt viktigt för redaktörer som P-EDIT som spelar in förändringar snarare än bara gör dem. Detta beror på att triviala misstag ofta upptäcks och repareras omedelbart. Utan ett UNDO-kommando skulle reparationen innebära normala redigeringskommandon som bara råkade återställa koden. Detta kan inte lätt upptäckas av redaktören och skulle fortfarande spelas in som en förändring, vilket genererar falska skillnader mellan versioner. I fall där tillgängligheten av UNDO misslyckas med att undvika falska skillnader mellan versioner, kan användaren använda MERGE kommandot för att kombinera ömsesidigt uteslutande, identisk text. En syntaxstyrd editor kunde göra den här sammanslagningen automatiskt. Många programplaneringsprojekt omfattar multiversionsprogram på ett eller annat sätt. Programmerarna måste drabbas antingen av en explicit hantering av en förvirrande datastruktur eller av en som ofta visar sig vara otillräcklig för deras behov. En teknik har beskrivits som tillåter mer än en version att redigeras på en gång utan att förvirra användaren genom att visa versionskontrollinformation eller koden för mer än en version. Detta erbjuder ett nytt sätt på hög nivå att interagera med flerversionsfiler som lovar att göra sådana program mer tillförlitliga, billigare och användbara för ett större antal användare. Man hoppas att en utbredd användning av dessa tekniker inte bara kommer att lösa de problem som erkänns i dag, utan också öppna nya möjligheter. Även om det alltid är svårt att förutse sådana förvärvade möjligheter, verkar det troligt att dessa tekniker kommer att göra det möjligt för programvarutillverkare att reagera mer flexibelt på sina kunders individuella behov och att ta bort mycket av den formella interaktion som krävs mellan programmerare som arbetar i stora grupper. Författaren står i tacksamhetsskuld till dem som arbetade med honom för att genomföra P-EDIT, Paul Kosinski och Peter Sheridan. Stöd
Redaktören P-EDIT REF tar upp problemet med att hantera flera kodvarianter.
Managing multi-version programs with an editor
{'venue': 'IBM Journal of Research and Development', 'journal': None, 'mag_field_of_study': ['Computer Science']}