Magik (programmeringsspråk)

Magik er et objektorientert programmeringsspråk som støtter flere typer arv, polymorfisme og dynamiske data. Den leveres av GE Energy som en del av Smallworld -plattformen og ble opprinnelig designet for å implementere komplekse applikasjoner for virksomheter som telekommunikasjon.

Magik ble opprinnelig opprettet i 1990 , og i løpet av årene har den blitt forbedret og oppdatert. Den nåværende versjonen er 4.0 eller Magik SF (Small Footprint).

Likheter med Smalltalk

Magik har noen likheter med Smalltalk når det gjelder språkfunksjoner og arkitektur: Magik-språket er kompilert til bytekode som tolkes av Magik Virtual Machine . Magiks virtuelle maskin er tilgjengelig på forskjellige plattformer, inkludert Microsoft Windows, forskjellige versjoner av Unix og Linux .

Magik er konsollbasert, og koden kan endres mens applikasjonen kjører. Konsollen kan brukes både til å kjøre Magik-kode og til å se resultatene.

Den kompilerte koden lagres i en enkelt fil kalt en bildefil. Hver bildefil inneholder den komplette bytekoden og sesjonstilstanden (f.eks. variabelverdier) på tidspunktet for siste bildelagring.

Språkfunksjoner

Kommentarer

Magik bruker for #å merke deler av kode som kommentarer:

# Dette er en kommentar. oppdrag

Magik bruker operatøren <<til å lage oppdrag:

til << 1234 b << b + a

Denne notasjonen leses som "a blir 1234" eller "b blir b+a". Dette tjener til å differensiere sammenligningskartlegging på riktig måte.

Magik støtter også en komprimert variant av operatøren som fungerer på samme måte som de som finnes i C:

b +<< a # Ekvivalent b << b + a symboler

I tillegg til konvensjonelle datatyper som heltall, flyttall og strenger, implementerer Magik også symboler. Symboler er en spesiell datatype som brukes mye i Magik for å identifisere objekter unikt. De er representert med et kolon ":" etterfulgt av en streng med tegn. Symboler kan unnslippes ved å bruke røret "|". For eksempel:

a << :hello # Når :hello oppstår vil det referere til samme instans b << :|hei verden| dynamiske typer

Magik-variabler har ikke faste typer som i C# og kan referere til forskjellige objekter under kjøring. Alt i Magik er et objekt (det er ingen forskjell mellom objekter og primitive datatyper som heltall):

a << 1,2 # et flyttallnummer tilordnet variabelen 'a' a << "1.2" # senere blir en streng tilordnet variabelen 'a' Objekter

Elementer er implementert i Magik ved hjelp av instanser. Forekomster ligner på klasser i andre programmeringsspråk som Java, men med viktige forskjeller. Magik støtter flere arv og fusjoner. Nye forekomster opprettes ved å klone en eksisterende (som vanligvis er forekomsten, men ikke trenger å være det).

Nye forekomster opprettes med setningen def_slotted_exemplar(), for eksempel:

def_slotted_exemplar(:mitt_objekt, { {:slot_a, 34}, {:slot_b, "hei"} }, {:parent_object_a, :parent_object_b})

Denne kodebiten definerer en navngitt forekomst my_objectsom har to hull (eller felt) navngitt slot_a(forhåndsinnstilt med verdien 34) og slot_b(forhåndsinnstilt med verdien "hei") som arver fra to eksisterende forekomster navngitt parent_object_aog parent_object_b.

Sammenligning

Magik implementerer alle de typisk brukte binære operatorene ( =, <, <=, >, >=, ~=/<>) for sammenligning, så vel som noen mer uvanlige. Operatorene _isog _isntbrukes til å sammenligne spesifikke forekomster av objekter, eller objektreferanser i stedet for verdier.

For eksempel:

til << "hei" b << "hei" a = b returnerer True (_true) fordi verdiene til a og b er like a _is b returnerer False (_false) fordi a og b ikke er samme forekomst til << "hei" b << a a = b returnerer True (_true) fordi verdiene til a og b er like a _is b returnerer True (_true) fordi b er tilordnet en spesifikk forekomst av det samme objektet som a, i stedet for samme verdi som a. Metoder

Metoder er definert på forekomster som bruker setningene _methodog _endmethod:

_metode mitt_objekt.min_metode(a, b) _retur a + b _sluttmetode

Dette er en måte å overstyre metodene new()(for å opprette nye forekomster) og init()(for å initialisere en forekomst).

# Ny metode _metode person.ny(navn, alder) _return _clone.init(navn, alder) _sluttmetode # Initialiseringsmetode _privat _metode person.init(navn, alder) # Ring foreldreimplementeringen. _super.init(navn, alder) # Initialiser feltene. .navn << navn .age << alder _returnere _selv _sluttmetode

Han _clonelager en fysisk kopi av objektet person. Utsagnet _superlar objekter kalle en implementering av en metode på en overordnet forekomst. Objekter kan referere til seg selv ved å bruke _self. Feltene til et objekt åpnes ved å bruke prikken "."-notasjonen.

Metoder som ikke er en del av et objekts offentlige grensesnitt kan merkes som private ved å bruke _private. Private metoder kan bare kalles av _self, _superog _clone.

Det er valgfrie argumenter som kan deklareres med setningen _optional. Valgfrie argumenter som ikke blir bestått tilordnes av Magik til et spesielt objekt _unset(tilsvarer NULL). Utsagnet _gatherkan brukes til å deklarere en liste over valgfrie argumenter.

_metode mitt_objekt.min_metode(_samle verdier) _sluttmetode Iterasjon

I Magik utsagnene _for, _over, _loopog _endlooptillate iterasjon.

_metode mitt_objekt.min_metode(_samle verdier) totalt << 0,0 _for en _over values.elements() _Løkke totalt +<< til _endeløkke _returtotal _sluttmetode m << my_object.new() x << m.my_method(1.0, 2, 3.0, 4) # x = 10.0

De nye iterasjonsmetodene er definert ved å bruke _iterog -setningene _loopbody:

_iter _method my_object.even_elements() _for til _over _self.elements() _Løkke _hvis a.jevn? _Er sant _deretter _loopbody(a) _slutt om _endeløkke _sluttmetode Prosedyrer

Magik støtter også funksjoner kalt prosedyrer. Prosedyrer er også objekter, erklært med _procog uttalelser _endproc. Prosedyrer er tildelt variabler som kan kalles:

min_prosedyre << _proc @min_prosedyre(a, b, c) _retur a + b + c _endproc x << min_prosedyre(1, 2, 3) # x = 6 Språklige særegenheter

Siden Magik opprinnelig ble utviklet i England, er Smallworlds kjernemetoder og biblioteker skrevet på britisk engelsk britisk engelsk . For eksempel:

"initialisere" brukes i stedet for "initialisere".

Hello World-eksempel

Følgende kodebit er programmet som sender ut "hello world"-meldingen skrevet i Magik:

skriv ("Hei verden!")