Moduł-3
Paradygmaty | imperatywny , ustrukturyzowany , proceduralny , modułowy , współbieżny |
---|---|
Rodzina | Moduł Wirtha |
Zaprojektowany przez | Luca Cardelli , James Donahue, Lucille Glassman, Mick Jordan; Billa Kalsowa, Grega Nelsona |
Deweloperzy |
DEC Olivetti elego Software Solutions GmbH |
Po raz pierwszy pojawiły się | 1988 |
Wersja stabilna | 5.8.6 / 14 lipca 2010
|
Wersja podglądu | 5.8.6 / 14 lipca 2010
|
Dyscyplina pisania | silny , statyczny , bezpieczny lub, jeśli jest niebezpieczny, wyraźnie bezpieczny izolowany |
Zakres | Leksykalny |
Platforma | IA-32 , x86-64 , PowerPC , SPARC |
system operacyjny | Wieloplatformowość : FreeBSD , Linux , Darwin , SunOS |
Strona internetowa | |
Główne implementacje | |
SRC Modula-3, CM3, PM3, EZM3, M3/PC Klagenfurt | |
Pod wpływem | |
ALGOL , Euclid , Mesa , Modula-2 , Modula-2+ , Oberon , Pascal | |
Pod wpływem | |
C# , Java , Nim , OCaml , Rust , Python |
Modula-3 to język programowania pomyślany jako następca ulepszonej wersji Modula-2 znanej jako Modula-2+ . Chociaż wywarł wpływ w kręgach badawczych (wpłynął na projekty języków takich jak Java , C # i Python ), nie został szeroko przyjęty w przemyśle. Został zaprojektowany przez Lucę Cardelli , Jamesa Donahue, Lucille Glassman, Micka Jordana (wcześniej w Olivetti Software Technology Laboratory), Billa Kalsowa i Grega Nelsona w Digital Equipment Corporation (DEC) Systems Research Center (SRC) i Olivetti Research Center (ORC) pod koniec lat 80.
Główne cechy Moduli-3 to prostota i bezpieczeństwo przy jednoczesnym zachowaniu mocy języka programowania systemów. Modula-3 miała na celu kontynuację Pascala w zakresie bezpieczeństwa typów, wprowadzając jednocześnie nowe konstrukcje do praktycznego programowania w świecie rzeczywistym. W szczególności Modula-3 dodała obsługę programowania ogólnego (podobnego do szablonów ), wielowątkowości , obsługi wyjątków , wyrzucania elementów bezużytecznych , programowania obiektowego , częściowego ujawnienia [ wymagane dalsze wyjaśnienie ] oraz wyraźne oznaczenie niebezpiecznego kodu. Celem projektowym Moduli-3 był język, który implementuje najważniejsze cechy współczesnych imperatywnych języków programowania w dość podstawowych formach. W ten sposób pominięto rzekomo niebezpieczne i komplikujące funkcje, takie jak wielokrotne dziedziczenie i przeciążanie operatorów .
Rozwój historyczny
Projekt Modula-3 rozpoczął się w listopadzie 1986 roku, kiedy Maurice Wilkes napisał do Niklausa Wirtha z kilkoma pomysłami na nową wersję Moduli. Wilkes pracował w DEC tuż przed tym momentem, po czym wrócił do Anglii i dołączył do Rady ds. Strategii Badań Olivetti. Wirth przeniósł się już do Oberona , ale nie miał problemów z kontynuacją rozwoju zespołu Wilkesa pod nazwą Modula. Definicja języka została ukończona w sierpniu 1988 r., A zaktualizowana wersja w styczniu 1989 r. Wkrótce pojawiły się kompilatory DEC i Olivetti, a potem implementacje innych firm.
Na jego projekt duży wpływ miały prace nad językiem Modula-2+ używanym w SRC i Acorn Computers Research Center (ARC, później ORC, kiedy Olivetti przejął Acorn) w tamtym czasie, który był językiem, w którym powstał system operacyjny dla Napisano wieloprocesorową stację roboczą VAX DEC Firefly , w której Acorn Compiler for Acorn C i Modula Execution Library (CAMEL) w ARC dla projektu systemu operacyjnego ARX Acorn Archimedes opartego na ARM napisano zakres komputerów. Jak stwierdzono w poprawionym raporcie Modula-3, na język miały wpływ inne języki, takie jak Mesa , Cedar , Object Pascal , Oberon i Euclid .
W latach 90. Modula-3 zyskała znaczną popularność jako język nauczania, ale nigdy nie została powszechnie przyjęta do użytku przemysłowego. Przyczynić się do tego mógł upadek firmy DEC, kluczowego zwolennika Moduli-3 (zwłaszcza gdy przestał ją skutecznie utrzymywać, zanim DEC został sprzedany firmie Compaq w 1998 r.). W każdym razie, pomimo prostoty i mocy Moduli-3, wydaje się, że zapotrzebowanie na skompilowany język proceduralny z ograniczoną implementacją programowania obiektowego było niewielkie . Przez jakiś czas komercyjny kompilator o nazwie CM3 utrzymywane przez jednego z głównych wdrożeniowców przed DEC SRC, który został zatrudniony przed sprzedażą DEC firmie Compaq , zintegrowane środowisko programistyczne (IDE) o nazwie Reactor i rozszerzalna wirtualna maszyna Java (licencjonowana na kod binarny i kod źródłowy formaty i buildable z Reactor) były oferowane przez Critical Mass, Inc., ale firma ta zaprzestała aktywnej działalności w 2000 roku i przekazała część kodu źródłowego swoich produktów firmie elego Software Solutions GmbH. Modula-3 jest obecnie nauczana na uniwersytetach głównie na kursach języka programowania porównawczego, a jej podręczniki są wyczerpane. Zasadniczo jedynym korporacyjnym zwolennikiem Moduli-3 jest elego, które odziedziczyło źródła po Critical Mass i od tego czasu wydało kilka wydań systemu CM3 w kodzie źródłowym i binarnym. Reactor IDE został wydany jako open source po kilku latach, pod nową nazwą CM3-IDE. W marcu 2002 elego przejęło również repozytorium innej aktywnej dystrybucji Modula-3, PM3, utrzymywanej do tej pory pod adresem École Polytechnique de Montréal , ale która później była kontynuowana przez prace nad HM3, ulepszana przez lata później, aż stała się przestarzała.
Składnia
składni języka jest „Hello, World!” program .
MODUŁ Główny ; IMPORT IO ; ROZPOCZNIJ IO . Put ( "Witaj świecie\n" ) END Main .
Wszystkie programy w Modula-3 mają co najmniej plik modułu, podczas gdy większość zawiera również plik interfejsu, który jest używany przez klientów do uzyskiwania dostępu do danych z modułu. Podobnie jak w niektórych innych językach, program Modula-3 musi wyeksportować moduł główny, którym może być plik o nazwie Main.m3 lub plik może wywoływać EXPORT
w celu wyeksportowania modułu głównego.
MODUŁ Foo EKSPORT Główny
Zaleca się, aby nazwy plików modułów były takie same jak nazwy w kodzie źródłowym. Jeśli się różnią, kompilator emituje tylko ostrzeżenie.
Inne konwencje w składni obejmują nazewnictwo wyeksportowanego typu interfejsu T
, ponieważ typy są zwykle kwalifikowane przez ich pełne nazwy, więc typ T
wewnątrz modułu o nazwie Foo będzie nosił nazwę Foo.T
. Pomaga to w czytelności. Inną podobną konwencją jest nazywanie obiektu publicznego Public
, jak w poniższych przykładach OOP.
Funkcje językowe
Modułowość
Przede wszystkim wszystkie skompilowane jednostki są INTERFEJSAMI
lub MODUŁAMI implementacyjnymi
o takim czy innym smaku. Skompilowana jednostka interfejsu, zaczynająca się od słowa kluczowego INTERFACE
, definiuje stałe, typy, zmienne, wyjątki i procedury. Moduł implementacji, zaczynający się od słowa kluczowego MODULE
, dostarcza kod i wszelkie dalsze stałe, typy lub zmienne potrzebne do zaimplementowania interfejsu. Domyślnie moduł implementacyjny zaimplementuje interfejs o tej samej nazwie, ale moduł może jawnie EKSPORTOWAĆ
do modułu o innej nazwie. Na przykład program główny eksportuje moduł implementacyjny dla interfejsu głównego.
MODUŁ HelloWorld EXPORTS Główny ; IMPORT IO ; ROZPOCZNIJ IO . Put ( "Hello World\n" ) END HelloWorld .
Każda skompilowana jednostka może IMPORTOWAĆ
inne interfejsy, chociaż import cykliczny jest zabroniony. Można to rozwiązać, wykonując import z MODUŁU implementacji. Elementy w ramach importowanego modułu mogą być importowane zamiast tylko nazwy modułu, przy użyciu FROM Module IMPORT Item [, Item]*
:
MODUŁ HelloWorld EXPORTS Główny ; Z IMPORTU IO Umieść ; BEGIN Umieść ( "Hello World\n" ) END HelloWorld .
Zwykle importuje się tylko interfejs i używa notacji „kropka”, aby uzyskać dostęp do elementów w interfejsie (podobnie jak dostęp do pól w rekordzie). Typowym zastosowaniem jest zdefiniowanie jednej struktury danych (rekordu lub obiektu) dla każdego interfejsu wraz z wszelkimi procedurami pomocniczymi. Tutaj główny typ otrzyma nazwę „T”, a jeden użyje jak w MyModule.T
.
W przypadku kolizji nazw między zaimportowanym modułem a inną jednostką w ramach modułu, słowo zastrzeżone AS
może być użyte jak w IMPORT CollidingModule AS X;
Bezpieczny kontra niebezpieczny
Niektóre zdolności są uważane za niebezpieczne, gdy kompilator nie może już zagwarantować, że wyniki będą spójne; na przykład podczas łączenia się z językiem C. Słowo kluczowe UNSAFE
poprzedzone prefiksem INTERFACE
lub MODULE
może być użyte do poinformowania kompilatora o włączeniu niektórych niskopoziomowych funkcji języka. Na przykład niebezpieczną operacją jest obejście systemu typów przy użyciu LOOPHOLE
w celu skopiowania bitów liczby całkowitej do liczby RZECZYWISTEJ zmiennoprzecinkowej
.
Interfejs, który importuje niebezpieczny moduł, również musi być niebezpieczny. Bezpieczny interfejs może zostać wyeksportowany przez niebezpieczny moduł implementacji. Jest to typowe zastosowanie podczas łączenia się z bibliotekami zewnętrznymi , gdzie zbudowane są dwa interfejsy: jeden niebezpieczny, drugi bezpieczny.
Generyki
Ogólny interfejs i odpowiadający mu moduł generyczny poprzedź słowo kluczowe INTERFACE
lub MODULE słowem
GENERIC
i weź jako formalne argumenty inne interfejsy. Tak więc (podobnie jak szablony C++ ) można łatwo definiować i używać abstrakcyjnych typów danych, ale w przeciwieństwie do C++ , szczegółowość jest na poziomie modułu. Interfejs jest przekazywany do ogólnego interfejsu i modułów implementacji jako argumenty, a kompilator wygeneruje konkretne moduły.
Na przykład można zdefiniować GenericStack, a następnie utworzyć instancję za pomocą interfejsów, takich jak IntegerElem
lub RealElem
, a nawet interfejsów do obiektów, o ile każdy z tych interfejsów definiuje właściwości wymagane przez moduły ogólne.
Nagich typów INTEGER
lub REAL
nie można używać, ponieważ nie są to moduły, a system typów generycznych opiera się na używaniu modułów jako argumentów. Dla porównania, w szablonie C++ użyto by gołego typu.
PLIK: IntegerElem.i3
INTERFEJS IntegerElem ;
CONST nazwa = "liczba całkowita" ; TYP T = LICZBA CAŁKOWITA ; PROCEDURA Format ( x : T ): TEKST ; PROCEDURA Skanuj ( txt : TEKST ; VAR x : T ): BOOLEAN ; END IntegerElem .
PLIK: GenericStack.ig
OGÓLNY INTERFEJS GenericStack ( Element );
(* Tutaj Element.T jest typem, który ma być przechowywany na ogólnym stosie. *) TYPE T = Public OBJECT ; Public = METODY OBIEKTOWE init (): TStack ; format (): TEKST ; isEmpty (): BOOLEAN ; liczba (): INTEGER ; push ( wiąz : Element .
T ); pop ( VAR element : Element . T ): BOOLEAN ; KONIEC ; KONIEC GenericStack .
PLIK: GenericStack.mg
0 MODUŁ OGÓLNY GenericStack ( Element );
< ... ogólne szczegóły implementacji ... > PROCEDURA Format ( self : T ): TEXT = VAR str : TEKST ; BEGIN str := Element . Nazwa & "Stos{" ; DLA k := DO siebie . N
0
- 1 DO JEŻELI k > TO str := str & ", " ; KONIEC ; str := str & Element . Format ( self . arr [ k ]); KONIEC ; str := str & "};" ; POWRÓT str ; KONIEC formatu ; < ...
więcej ogólnych szczegółów implementacji ... > KONIEC GenericStack .
PLIK: IntegerStack.i3
INTERFEJS IntegerStack = GenericStack ( IntegerElem ) KONIEC IntegerStack .
PLIK: IntegerStack.m3
MODUŁ IntegerStack = GenericStack ( IntegerElem ) END IntegerStack .
Identyfikowalność
Każdy identyfikator można prześledzić do miejsca jego pochodzenia, w przeciwieństwie do funkcji „włącz” w innych językach. Skompilowana jednostka musi importować identyfikatory z innych skompilowanych jednostek, używając IMPORT
. Nawet wyliczenia wykorzystują tę samą notację „kropkową”, co podczas uzyskiwania dostępu do pola rekordu.
INTERFEJS A ; TYP Kolor = { Czarny , Brązowy , Czerwony , Pomarańczowy , Żółty , Zielony , Niebieski , Fioletowy , Szary , Biały }; KONIEC A ;
MODUŁ B ; IMPORTUJ ; _ Z IMPORTU Kolor ; _ VAR Kolor : A. _ kolor ; (* Używa nazwy modułu jako przedrostka *) theColor : Color ; (* Nie ma nazwy modułu jako przedrostka *) anotherColor : A . kolor ; ROZPOCZNIJ aKolor := A . Kolor . brązowy ; kolor
:= Kolor . czerwony ; inny kolor := kolor . pomarańczowy ; (* Nie można po prostu użyć Orange *) END B .
Alokacja dynamiczna
Modula-3 obsługuje alokację danych w czasie wykonywania . Istnieją dwa rodzaje pamięci, które można przydzielić, TRACED
i UNTRACED
, różnica polega na tym, czy moduł wyrzucania elementów bezużytecznych może ją zobaczyć, czy nie. NEW()
służy do przydzielania danych z jednej z tych klas pamięci. W module NIEBEZPIECZNYM
DISPOSE
jest dostępny w celu zwolnienia nieśledzonej pamięci.
Zorientowany obiektowo
Techniki programowania obiektowego mogą być używane w Modula-3, ale ich użycie nie jest potrzebne. Wiele innych funkcji zapewnianych przez Modula-3 (moduły, generyczne) może zazwyczaj zastąpić orientację obiektową.
Obsługa obiektów jest celowo ograniczona do najprostszych warunków. Typ obiektu (określany jako „klasa” w innych językach zorientowanych obiektowo) jest wprowadzany wraz z OBJECT
, która ma zasadniczo taką samą składnię jak deklaracja RECORD
, chociaż typ obiektu jest typem referencyjnym, podczas gdy RECORD w Modula-3 są not (podobnie jak struktury w C). Wyeksportowane typy są zwykle nazywane T zgodnie z konwencją i tworzą oddzielny typ „Publiczny”, aby udostępnić metody i dane. Na przykład:
INTERFEJS Osoba ; TYP T < : Publiczny ; Publiczny = METODY OBIEKTOWE getAge (): INTEGER ; init ( nazwa : TEKST ; wiek : INTEGER ): T ; KONIEC ; KONIEC Osoba .
Definiuje interfejs Person
z dwoma typami, T
i Public
, który jest zdefiniowany jako obiekt z dwiema metodami, getAge()
i init()
. T
jest zdefiniowany jako podtyp Public
przez użycie operatora <:.
Aby utworzyć nowy obiekt Person.T
, użyj wbudowanej procedury NEW
z metodą init()
as
VAR jim := NOWY ( Osoba . T ). init ( "Jim" , 25 );
REVEAL
Moduli-3 zapewnia koncepcyjnie prosty i przejrzysty, ale bardzo potężny mechanizm ukrywania szczegółów implementacji przed klientami, z dowolnie wieloma poziomami przyjazności . Użyj REVEAL
, aby pokazać pełną implementację interfejsu Person
z góry.
MODUŁ Osoba ; REVEAL T = Publiczna nazwa OBIEKTU MARKI : TEKST ; (* Te dwie zmienne *) wiek : INTEGER ; (* są prywatne. *) ZASTĘPUJE getAge := Wiek ; inicjacja := inicjacja ; KONIEC ; PROCEDURA Wiek ( self : T ): INTEGER = BEGIN RETURN self
. wiek ; KONIEC Wiek ; PROCEDURA Init ( self : T ; imię : TEXT ; wiek : INTEGER ): T = BEGIN self . imię := imię ; ja . wiek := wiek ; ZWRÓĆ siebie ; KONIEC Początek ; POCZĄTEK KONIEC Osoba .
Zwróć uwagę na użycie słowa kluczowego BRANDED
, które „markuje” obiekty, aby uczynić je wyjątkowymi, aby uniknąć równoważności strukturalnej. BRANDED
może również przyjąć ciąg jako argument, ale jeśli zostanie pominięty, generowany jest unikalny ciąg.
Modula-3 jest jednym z niewielu języków programowania, który wymaga ścisłej kwalifikacji zewnętrznych referencji modułu. Oznacza to, że odwołanie w module A
do obiektu x
wyeksportowanego z modułu B
musi mieć postać Bx
. W Modula-3 niemożliwe jest zaimportowanie wszystkich wyeksportowanych nazw z modułu.
Ze względu na wymagania języka dotyczące kwalifikowania nazw i nadpisywania metod , nie można zepsuć działającego programu po prostu dodając nowe deklaracje do interfejsu (dowolnego interfejsu). Umożliwia to jednoczesne edytowanie dużych programów przez wielu programistów bez obaw o konflikty nazw; a także umożliwia edycję podstawowych bibliotek językowych z pełną świadomością, że żaden istniejący program nie zostanie uszkodzony w tym procesie.
Wyjątki
Obsługa wyjątków jest oparta na systemie blokowym TRY
… EXCEPT
, który od tego czasu [ potrzebne źródło ] stał się powszechny. Jedną z funkcji, która nie została przyjęta w innych językach [ potrzebne źródło ] , z godnymi uwagi wyjątkami Delphi , Python [1] , Scala [2] i Visual Basic.NET , jest to, że konstrukcja EXCEPT
definiuje formę instrukcji switch z każdym możliwym wyjątkiem jako przypadkiem we własnej klauzuli EXCEPT. Modula-3 obsługuje również LOOP
... EXIT
... END
, która zapętla się do momentu wystąpienia EXIT
, struktury równoważnej prostej pętli wewnątrz klauzuli TRY
... EXCEPT
.
Wielowątkowy
Język obsługuje wielowątkowość i synchronizację między wątkami. W bibliotece wykonawczej ( m3core ) znajduje się standardowy moduł o nazwie Thread, który obsługuje aplikacje wielowątkowe. Środowisko uruchomieniowe Modula-3 może wykorzystywać oddzielny wątek do zadań wewnętrznych, takich jak wyrzucanie elementów bezużytecznych.
Wbudowana struktura danych MUTEX
służy do synchronizacji wielu wątków i ochrony struktur danych przed równoczesnym dostępem z możliwym uszkodzeniem lub wyścigiem. Instrukcja LOCK
wprowadza blok, w którym blokowany jest muteks. Odblokowanie MUTEX-a
jest niejawne poprzez opuszczenie bloku przez miejsce wykonania kodu. MUTEX jest obiektem i jako taki, inne obiekty mogą być z niego wyprowadzane .
Na przykład w sekcji wejścia/wyjścia (I/O) biblioteki libm3 czytniki i programy piszące (Rd.T i Wr.T) wywodzą się z MUTEX-a i blokują się przed uzyskaniem dostępu lub modyfikacją jakichkolwiek danych wewnętrznych, takich jak bufory.
Streszczenie
Podsumowując, cechy języka:
- Moduły i interfejsy
- Wyraźne oznaczenie niebezpiecznego kodu
- Generyki
- Automatyczne zbieranie śmieci
- Mocne typowanie , strukturalna równoważność typów
- Obiekty
- Wyjątki
- Wątki
Modula-3 jest jednym z nielicznych języków, których ewolucja cech jest udokumentowana.
W programie Systems Programming with Modula-3 intensywnie omawiane są cztery zasadnicze punkty projektowania języka. Te tematy to: równoważność strukturalna a równoważność nazw, reguły podtypów, moduły ogólne i tryby parametrów, takie jak READONLY
.
Standardowe funkcje biblioteki
Kontynuując trend zapoczątkowany w języku C , wiele funkcji potrzebnych do pisania prawdziwych programów zostało pominiętych w definicji języka i zamiast tego zostało dostarczonych za pośrednictwem standardowego zestawu bibliotek . Większość poniższych interfejsów jest szczegółowo opisana w
Biblioteki standardowe zapewniające następujące funkcje. Są to tak zwane interfejsy standardowe i są wymagane (muszą być dostarczone) w języku.
- odwołaniach do łańcuchów, zwane
TEKSTAMI
- Wątek: Operacje związane z wątkami, w tym
MUTEX
, zmienna warunkowa i wstrzymywanie wątków. Biblioteka wątków zapewnia przełączanie wątków z wywłaszczaniem - Słowo: Operacje bitowe na liczbach całkowitych bez znaku (lub słowach maszynowych). Zwykle implementowane bezpośrednio przez kompilator
- Interfejsy zmiennoprzecinkowe
Niektóre zalecane interfejsy zostały zaimplementowane w dostępnych implementacjach, ale nie są wymagane
- Lex: Do parsowania numeru i innych danych
- Fmt: Formatowanie różnych typów danych do drukowania
- Pkl (lub Pickle): serializacja obiektów dowolnych typów referencyjnych osiągalnych przez moduł wyrzucania elementów bezużytecznych
- Tabela: Ogólne moduły do map
Podobnie jak w C, I/O jest również dostarczane przez biblioteki, w Modula-3 zwane Rd
i Wr
. Zorientowany obiektowo projekt bibliotek Rd (czytelnicy) i Wr (pisarze) jest szczegółowo omówiony w książce Grega Nelsona. Interesującym aspektem Moduli-3 jest to, że jest to jeden z nielicznych języków programowania, których standardowe biblioteki zostały formalnie zweryfikowane pod kątem braku różnego rodzaju błędów, w tym błędów blokujących. Dokonano tego pod auspicjami projektów Larch/Modula-3 (patrz rodzina Larch ) i rozszerzonej kontroli statycznej w DEC Systems Research Center .
Implementacje
Dostępnych jest kilka kompilatorów, większość z nich to open source .
- DEC-SRC M3, oryginał.
- Olivetti Research Center (ORC) Modula-3 Toolkit, pierwotnie kompilator, teraz dostępny jako biblioteka do analizy składniowej, leksykalnej i semantycznej programów Modula-3.
- Critical Mass CM3, inny następca DEC-SRC M3
- Polytechnique Montreal Modula-3 PM3, następca DEC-SRC M3, obecnie łączący się z CM3
- EzM3, niezależna, lekka i łatwa do przenoszenia implementacja, opracowana w połączeniu z CVSup
- HM3, następca wydania pm3-1.1.15 PM3, z obsługą natywnego wątkowania przy użyciu NPTL
- CM3, następca Critical Mass CM3. Jest to jedyna aktualna, utrzymywana i rozwijana implementacja. Wersje są dostępne pod adresem http://www.opencm3.net/releng/ .
, którego brakuje w Modula-3, jest typ unii, wszystkie istniejące implementacje Moduli-3 są w stanie zapewnić dobrą kompatybilność kodu binarnego z deklaracjami tablic i struktur w języku C.
Książki
Żadna z tych książek nie jest nadal drukowana, chociaż można uzyskać używane kopie, a niektóre są zdigitalizowane, częściowo lub w całości, a niektóre rozdziały jednej z nich mają wcześniejsze lub późniejsze wersje, które można uzyskać jako raporty z badań w Internecie.
- Greg Nelson, red., Systems Programming with Modula-3 Ostateczne odniesienie do języka Modula-3 z interesującymi artykułami na temat budowy oprogramowania systemów zorientowanych obiektowo oraz dokumentacją dyskusji prowadzącej do ostatecznych cech języka. Istnieją pewne wcześniejsze (patrz rozdział drugi, rozdział czwarty, rozdział piąty, rozdział szósty) i niektóre późniejsze (patrz rozdział pierwszy i bardziej zaktualizowane dwa, a więc zarówno wcześniejsze wersje definicji języka, jak i rozdział trzeci i rozdział siódmy) publikowania wersji większości z ośmiu rozdziałów dostępnych indywidualnie z wcześniejszego Centrum Badań Systemów DEC (SRC) jako raporty z badań do pobrania.
- Samuel P. Harbison, Modula-3 Łatwy w użyciu podręcznik klasowy.
- Robert Sedgewick , Algorytmy w module-3
- Laszlo Boszormenyi & Carsten Weich, Programowanie w Modula-3: Wprowadzenie do programowania ze stylem
- Renzo Orsini, Agostino Cortesi Programmare in Modula-3: introduzione alla programmazione imperativa ea oggetti, włoska książka języka wyjaśniająca jego główne cechy.
Projekty wykorzystujące Modula-3
Oprogramowanie, które jest zaprogramowane Modula-3 obejmuje:
- System operacyjny SPIN
- Program do synchronizacji repozytorium oprogramowania CVSup
- Język Obliq , który wykorzystuje zdolność obiektów sieciowych Modula-3 do przejrzystej migracji obiektów w sieciach lokalnych, umożliwiając rozproszoną zdolność do paradygmatu programowania obiektowego Modula-3. Został użyty do budowy aplikacji rozproszonych, animacji komputerowych i aplikacji do programowania stron internetowych w postaci rozszerzenia skryptowego do Moduli-3.
Wpływy na inne języki programowania
Chociaż Modula-3 nie zyskała statusu głównego nurtu, kilka części dystrybucji DEC-SRC M3 tak. Prawdopodobnie najbardziej wpływową częścią była biblioteka Network Objects, która stanowiła podstawę pierwszej implementacji Java Remote Method Invocation (RMI), w tym protokołu sieciowego. Dopiero gdy Sun przeszedł ze Common Object Request Broker Architecture (CORBA) na protokół oparty na IIOP, został on porzucony. Dokumentacja Java dotycząca wyrzucania elementów bezużytecznych zdalnych obiektów nadal odnosi się do pionierskiej pracy wykonanej dla Modula-3 Network Objects. Implementacja klas w Pythonie była również inspirowana mechanizmem klasowym znajdującym się w C++ i Modula-3. Również język Nim wykorzystuje niektóre aspekty Moduli-3, takie jak śledzone i nieśledzone wskaźniki.
Linki zewnętrzne
- Oficjalna strona internetowa
- Modula3 na GitHubie
- Witryna wdrożenia CM3
- Strona główna Modula-3 (już dawno nie żyje, lustro )
- Moduł-3: Definicja języka
- Rozwiązania w zakresie oprogramowania elego
- Grupa dyskusyjna Modula-3 , w większości opustoszała
- Lista mailingowa rozwoju Modula-3 , aktywna
- Notatki z zajęć CS2 Caltech, prowadzonych w Modula-3 w 2002 i 2003 roku
- Caltech's CS3 class 2009 w Wayback Machine (archiwum 23 maja 2013)
- mirror Programowanie w Modula-3 : przykłady programów
- Budowanie rozproszonych aplikacji obiektowych: obiekty Modula-3 w pracy . Michel R. Dagenais. Wersja robocza (styczeń 1997)
- Moduł-3: język, biblioteki i narzędzia . Prezentacja na Modula-3 ponad 120 slajdów. Michael R. Dagenais [ stały martwy link ] , nie żyje
- Zorientowana obiektowo abstrakcja danych w Modula-3 . Joseph Bergin (1997)
- Wywiad Computerworld z Lucą Cardelli na temat Modula-3