Modulär programmering är organisationen av ett program som en samling små oberoende block som kallas moduler, vars struktur och beteende följer vissa regler. [1] Användningen av modulär programmering gör det lättare att testa programmet och hitta fel. Hårdvaruberoende deluppgifter kan separeras strikt från andra deluppgifter, vilket förbättrar portabiliteten för de skapade programmen.
En modul är en funktionellt komplett del av ett program . På många språk (men inte nödvändigtvis) ges den ut som en separat fil med källkod eller en namngiven kontinuerlig del av den. Vissa språk tillåter att moduler paketeras .
Modularitetsprincipen är ett sätt att förenkla uppgiften att designa mjukvara (SW) och fördela utvecklingsprocessen mellan utvecklingsteam. När programvaran delas upp i moduler specificerar varje modul vilken funktionalitet den implementerar, samt länkar till andra moduler. [2] Bekvämligheten med att använda en modulär arkitektur ligger i möjligheten att uppdatera (ersätta) modulen utan att behöva ändra resten av systemet.
Modulernas roll kan spelas av datastrukturer , funktionsbibliotek , klasser , tjänster och andra mjukvaruenheter som implementerar viss funktionalitet och tillhandahåller ett gränssnitt till den.
Programkoden delas ofta upp i flera filer, som var och en kompileras separat från de andra. Denna modularitet av koden kan avsevärt minska omkompileringstiden för ändringar som görs på endast ett litet antal källfiler och förenklar teamutvecklingen . Det är också möjligheten att ersätta enskilda komponenter (som jar-filer , so eller dll-bibliotek) i den slutliga mjukvaruprodukten, utan att behöva bygga om hela projektet (till exempel utveckla plugins för ett redan färdigt program).
En metod för att skriva modulära program är objektorienterad programmering . OOP ger en hög grad av modularitet genom egenskaper som inkapsling , polymorfism och sen bindning .
Trots det faktum att modulär programmering inte är knuten till detaljerna i ett visst språk (och även i avsaknad av uttryckligt stöd från språket kan användas med tillräcklig disciplin från programmerares sida), driver de flesta språk sitt eget modulsystem till översta nivån, som om att porta modulsystemet från ett språk till ett annat skulle vara omöjligt [3] .
År 2000 föreslog Xavier Leroy att göra modulsystem modulära, det vill säga parametriserade genom beskrivningen av en specifik kärna av språket med ett eget typsystem [3] . Som ett exempel visade han en generaliserad implementering av ML-modulspråket (som det mest utvecklade modulsystemet känt för tillfället) och exempel på dess instansiering i det traditionella ML- språket för det och till C- språket .
Leroys implementering är i sig byggd med hjälp av ML-modulens språk , nämligen som en funktion parametrerad av data om språkets kärna och en beskrivning av dess typkonsistenskontrollmekanism . Detta innebär att när man skriver en kompilator för ett visst språk räcker det med att beskriva kärnan i språket och skicka den till den givna funktorn (som en biblioteksfunktion) - resultatet blir en kompilator för att utöka ett känt språk med ett system av ML-moduler .
Historien om begreppet moduler som kompileringsenheter går tillbaka till Fortran II och Cobol , det vill säga till slutet av 1950-talet [4] [5] . 1976 kom en publikation som utvecklade konceptet modularitet - om Mesa- , som utvecklades vid Xerox PARC . 1977 bekantade sig vetenskapsmannen Niklaus Wirth med detta koncept i detalj och pratade med utvecklare på Xerox PARC. [6] Dessa idéer användes av Wirth för att skapa språket Modula-2 , som publicerades 1977 [7] .
Termen "modul" i programmering började användas i samband med införandet av modulära principer vid skapandet av program. På 1970-talet var en modul en procedur eller funktion skriven enligt vissa regler. Till exempel: "modulen ska vara enkel, stängd (oberoende), synlig (från 50 till 100 rader), implementera endast en uppgiftsfunktion, ha en ingång och en utgångspunkt."
D. Parnas ( David Parnas ) 1972 var den första som mer eller mindre tydligt formulerade huvudegenskaperna hos en programmodul : "För att skriva en modul bör det finnas tillräckligt med minimal kunskap om en annans text." Således, i enlighet med definitionen, kan en modul vara vilken separat procedur (funktion) som helst av både den lägsta nivån i hierarkin (implementeringsnivån) och den högsta nivån, där endast anrop till andra modulprocedurer sker. [åtta]
Således var Parnassus den första som lade fram konceptet att information döljer sig i programmering . De enda syntaktiska konstruktionerna som fanns på 70-talets språk, såsom procedur och funktion, kunde dock inte ge tillförlitlig informationsdöljning, på grund av den utbredda användningen av globala variabler.
Detta problem skulle bara kunna lösas genom att utveckla en ny syntaktisk konstruktion som inte påverkas av globala variabler. En sådan design skapades och kallades en modul. Inledningsvis antogs det att vid implementering av komplexa mjukvarusystem skulle modulen användas tillsammans med procedurer och funktioner som en konstruktion som kombinerar och på ett tillförlitligt sätt döljer detaljerna i implementeringen av en specifik deluppgift.
Således bör antalet moduler i komplexet bestämmas genom nedbrytningen av uppgiftsuppsättningen i oberoende deluppgifter. I extremfallet kan en modul till och med användas för att endast innesluta en procedur i den, om det är nödvändigt att den lokala åtgärden den utför garanteras vara oberoende av påverkan från andra delar av programmet, under eventuella ändringar.
För första gången föreslogs en specialiserad syntaktisk konstruktion av modulen av N. Wirth 1975 och inkluderades i hans nya språk Modula. Hur starkt språkets egenskaper förändras när modulmekanismen introduceras, framgår av följande anmärkning av N. Wirth, som han gjort om det senare Modula-2-språket: "Modules are the most important feature that distinguishes the Modula-2 språk från sin föregångare Pascal."
Språk som formellt stöder konceptet med moduler: IBM S/360 Assembler , Cobol , RPG , PL/1 , Ada , D , F (engelska) , Fortran , Haskell , Blitz BASIC , OCaml , Pascal , ML , Modula-2 , Oberon , Komponent Pascal , Zonnon , Erlang , Perl , Python och Ruby . IBM-systemet använde "moduler" från RPG- , Cobol- och CL- språken när det programmerades i ILE-miljön.
Modulär programmering kan göras även när syntaxen för programmeringsspråket inte stöder explicit namngivning av moduler.
Programvaruverktyg kan skapa moduler med källkod som representeras som delar av grupper – bibliotekskomponenter – som är kompilerade med ett länkprogram .
Standard Pascal tillhandahåller inte mekanismer för separat kompilering av programdelar med efterföljande montering före exekvering. Det är ganska förståeligt att utvecklarna av kommersiella Pascal-kompilatorer vill inkludera verktyg i språket som ökar dess modularitet. [9]
En modul i Pascal är en egenkompilerad programenhet som innehåller olika komponenter i deklarationssektionen (typer, konstanter, variabler, procedurer och funktioner) och, möjligen, några exekverbara satser från den initierande delen. [tio]
När det gäller deras organisation och karaktär av användning i programmet, ligger Pascal-moduler nära paketmoduler (PACKAGE) i programmeringsspråket Ada. I dem, såväl som i Ada-paket, är någon "synlig" gränssnittsdel explicit allokerad, där beskrivningar av globala typer, konstanter, variabler är koncentrerade, och även titlar på procedurer och funktioner ges. Utseendet på objekt i gränssnittsdelen gör dem tillgängliga för andra moduler och huvudprogrammet. Procedurerna och funktionerna finns i den körbara delen av modulen, som kan döljas för användaren.
Moduler är ett utmärkt verktyg för att utveckla applikationsbibliotek och ett kraftfullt verktyg för modulär programmering. En viktig egenskap hos moduler är att kompilatorn placerar sin programkod i ett separat minnessegment. Segmentlängden kan inte överstiga 64 KB, men antalet samtidigt använda moduler begränsas endast av det tillgängliga minnet, vilket gör att du kan skapa stora program.
Ordböcker och uppslagsverk | |
---|---|
I bibliografiska kataloger |
|