RSL

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 9. juni 2013; checks kræver 49 redigeringer .
RSL
Sprog klasse

multi- paradigme :
objektorienteret ,
domæneorienteret proceduremæssig ,

begivenhedsrig
Udførelsestype fortolket
Dukkede op i 1994
Forfatter Sergey Kubrin
Filtypenavn _ ..mac
Frigøre 1151 [1]  ( 19. marts 2015 )
Type system dynamisk
Større implementeringer RS-Bank , InterBank, RS-Securities, RS-Payments
Internet side softlab.ru

RSL eller Object RSL ( forkortelse fra det engelske  R-Style Language ) er et objektorienteret , domæneorienteret , fortolket , proprietært programmeringssprog udviklet af R-Style Softlab til brug i dets softwareprodukter .

Udviklingsmiljøet kaldet "RSL Shell" inkluderer:

RSL kaldes også et makrosprog , og programmer baseret på det kaldes makroer . Værktøjer til oprettelse og fejlretning af RSL-programmer er tilgængelige til gratis download på udviklerens websted, men sådanne makroer bør ikke indeholde opkald til moduler, der indeholder forretningslogik og indbygget i de vigtigste R-Style Softlab-programmer. Tolken er implementeret under Windows , giver dig mulighed for at arbejde under Wine . Tidlige versioner understøttede MS-DOS .

RSL-understøttelse er indbygget i alle RS-Bank ABS -undersystemer såvel som InterBank, RS-Payments.

Historie

Sprogmoduler

RSLSRV

RSLSRV - modulet registrerer RSLSrv.RslEngine-objektet i systemet, hvilket giver dig mulighed for at bruge RSL-makroen som et ActiveX -objekt . Makro globale variabler bliver til egenskaber, og procedurer bliver til metoder. Lad os f.eks. sige, at der er en makro myactivex.mac :

var str1: String = "Test streng" ; makro func1(a) returner a*a; ende ;

så kan du bruge følgende Visual Basic -kode :

Sub TestRSL () Indstil eng = CreateObject ( "RSLSrv.RslEngine" ) Indstil MyObj = eng . LoadModule ( "myactivex.mac" ) Debug . Udskriv MyObj . str1 ' udskriver Teststreng Debug . Udskriv MyObj . func1 ( 2 ) ' udskriver 4 End Sub

RSD

RSD er et bibliotek designet til universel adgang til SQL -understøttende datakilder fra C++ og RSL - programmer . Objektmodellen er baseret på ADO .

Biblioteket har flere niveauer (hvert efterfølgende niveau er baseret på det foregående: det delegerer det meste af funktionaliteten til det underliggende niveau):

  1. Drivere : a) Datakildedriver til at give lavniveauadgang til bibliotekstjenester fra C -sproget . Grænsefladen er generisk, men implementeringen er specifik for datakilden. Der er i øjeblikket en driver til ODBC . b) Føreren af ​​det universelle rekordsæt (Recordset), som giver ensartet navigationsadgang til data.
  2. C++ klasser og kildeuafhængig objektorienteret dataadgangsgrænseflade.
  3. RSL klasser og interface til adgang fra RSL.

Niveau 1 og 2 er implementeret som DLL'er , mens niveau 3 er implementeret som DLM'er.

RSLX

RsEngine

Windows-rapporter

Windows Reports  er et objektorienteret bibliotek til udsendelse af rapporter til kontorapplikationsformater MS Excel , MS Word , Internet Explorer . Biblioteket er baseret på RSCOM- og ActiveX -teknologier . Det meste er skrevet i RSL, DLM-moduler er også inkluderet.

Arbejde med databaser

RSL har indbygget understøttelse til at arbejde med databaser (DB) styret af Pervasive PSQL ( tidligere Btrieve og Pervasive.SQL ). Databaseordbøger har filtypenavnet .def(analog .ddf), databasetabelfiler - .dbt(analog .mkd). Det er også muligt at arbejde med databasefiler .dbf. Arbejdet med SQL er organiseret ved hjælp af ADO gennem RSLX- modulet og RSD - bibliotekerne .

Syntaks og sprogkonstruktioner

Med hensyn til syntaks deler RSL ligheder med C++ og Pascal . For eksempel er opgave- og sammenligningsoperationerne "lige", "ulige" skrevet på samme måde som i C++ ( =, ==, !=). Og logiske operationer er ligesom i Pascal ( and, or, not).

Kommentarer

RSL (svarende til C++ ) understøtter to typer kommentarer : multi-line og single-line .

/* Et eksempel på en stor kommentar, bestående af flere linjer */ // Resten af ​​linjen er en kommentar

RSL-sproget tillader indlejrede kommentarer af begge typer, både hver for sig og sammen.

Datatyper

Alle understøttede datatyper i RSL er opdelt i skalar og objekt.
Skalære typer:

  • Heltal : Integer.
  • FlydendeDouble komma :.
  • BCD flydende decimaltal: Decimal, Numeric.
  • Type for pengeværdier: Money.
  • String :. String_
  • Boolean : Bool(har værdierne TRUEog FALSE).
  • Dato Date:.
  • Tid Time:.
  • Dato og tid DateTime:.
  • Hukommelsesadresse: MemAddr.
  • Link til RSL-proceduren: ProcRef.
  • RSL-objektmetodereference: MethodRef.
  • Type af specielle værdier " Nulværdi " og " Standardværdi ": SpecVal(har værdierne NullValog OptVal).
  • Den specielle værdi " Tom " uden type: NULL.
  • Generisk type Variant:.

Objekttyper:

  • Link til objektet "databasefil": Tbfile.
  • Reference til objektet "struktur i hukommelsen": TRecHandler.
  • Reference til objektet "array of values": TArray.
  • Link til "tekstfil"-objektet: TStreamDoc.
  • Reference til ethvert RSL-klasseobjekt: Object.

RSL giver implicit og eksplicit konvertering fra én datatype til en anden.

  • Implicit (automatisk) konvertering sker i følgende tilfælde:
  • Når en aritmetisk operation involverer to operander af forskellige typer, for hvilke der ikke er defineret nogen eksplicit procedure til beregning af operationen, konverteres typen af ​​operanden med den lavere typevægt til typen af ​​operanden med den højere typevægt. Nedenfor er mulighederne for at konvertere typer i overensstemmelse med deres "vægte": Integer→ Double→ Numeric→ String.
  • Når du tildeler en værdi til en variabel med en anden type end den, der blev erklæret til den.
  • ifNår du bruger ikke-booleske instruktioner og whileværdier i betingede udtryk . I dette tilfælde vil der blive gjort et forsøg på at konvertere til en boolesk type.
  • Eksplicitte konverteringer udføres ved hjælp af særlige procedurer: Int(), Double(), Decimal(), Numeric(), String()osv Money().

Objektorienterede træk ved sproget

I 1997 blev RSL objektorienteret og ændrede navn til Object RSL [3] . Den introducerer klasser, der giver de tre vigtigste egenskaber ved objektorienteret programmering (OOP): indkapsling , arv og polymorfi .

Objekter

I RSL (i modsætning til andre programmeringssprog, for eksempel C++), foregår objektkonstruktionen i to trin:

  • Objektoprettelse: hukommelsesallokering under hensyntagen til arvshierarkiet , opbygning af lister over erstatninger for virtuelle metoder , alle klasseegenskaber er sat til NULL . Efter det, da objektet ikke indeholder nogen ikke-initialiseret data, er det klar til at blive destrueret med ynde.
  • Objektinitialisering: metodekald Init. Hvis initialisering skal udføres for den overordnede klasse, skal dens metode Initkaldes eksplicit, når den afledte klasse initialiseres.

Brugerdefinerede destruktorer bruges således ikke i RSL-klasser (objekter og deres egenskaber slettes automatisk).

Arv

I RSL giver arv dig mulighed for at beskrive en ny klasse baseret på en allerede eksisterende (overordnet, basis) klasse. Således bliver alle metoder og egenskaber i den overordnede klasse også metoder og egenskaber for den underordnede klasse. Derudover kan efterkommerklassen tilføje sine egne egenskaber og metoder eller tilsidesætte metoderne for den overordnede klasse . Arv giver dig mulighed for at opbygge klassehierarkier. Multipel arv er forbudt i RSL.

Ved nedarvning angives navnet på den overordnede klasse i parentes efter nøgleordet Class. For at initialisere den overordnede klasse skal du kalde en foruddefineret metode, hvis navn dannes ved at tilføje præfikset til navnet på den overordnede klasse Init.

Et eksempel på arv fra klassen Medarbejder ("Medarbejder") af klassen Person ("Person"), når ejendommen Post ("Position") tilføjes:

Klasse Person (navn, efternavn) // Liste over egenskaber og metoder for Person-klassens slut ;

Klasse (Person) Medarbejder (navn, efternavn, stilling) InitPerson (navn, efternavn); // Initialisering af Person-klassen i Employee Macro Report()- klassen println ( "Post: " , Post); ende ; ende ; Indkapsling

I RSL implementeres indkapsling ved at specificere adgangsniveauet til klassens egenskaber og metoder samt til makromodulets variabler og procedurer.

  • I hoveddelen af ​​et makromodul er alle variabler, procedurer og klasser, der er erklæret uden en adgangsmodifikator, globale som standard . De bliver ikke kun tilgængelige i makromodulet, men også i alle andre makromoduler, der importerer det. Variabler kan også gøres globale med magt (se nedenfor for mere om dette ).
  • Adgangsmodifikatoren privategiver dig mulighed for at erklære variabler, procedurer og klasser som private , hvilket pålægger et forbud mod adgang til dem udefra. Denne modifikator er analog med modifikatoren protectedi C++.
  • Modifikatoren localkan bruges til at erklære variabler, objekter og procedurer som lokale . Lokale variabler er kun tilgængelige for lokale procedurer. Det er ikke muligt at få adgang til en lokal variabel inden for nogen anden makromodulprocedure.
     
lokale var str; // Lokal modulvariabel, kun synlig // i det aktuelle moduls brødtekst eller i den lokale proceduremakro Proc1 () // Global modulprocedure str = "Tekst1 " ; // Fejl! str er ikke tilgængelig end ;

lokal makro Proc2() // Lokal modulprocedure str = "Tekst2" ; // Korrekt! ende ;

proc2(); str = str + "Tekst3" ; // Korrekt! println (str);
Hvis du angiver en modifikator localfør en klasseegenskab, ophører den med at være en klasseegenskab som sådan og bliver en lokal konstruktørvariabel. Modifikatoren localer således kun anvendelig til modul- og klassekonstruktørinitialiseringsprocedurer.
  • For at få direkte adgang til variabler, der er inde i procedurer, skal du gøre dem globale med magt . Dette gøres ved at omslutte dem i krøllede seler ( {}):
     
macroProc (); var x = 2 , // Denne variabel vil ikke blive tilgået uden for proceduren {y} = 3 ; // Denne variabel vil blive tilgået uden for procedurens afslutning ;

proc(); // Call procedure

println (x); // Fejl: "udefineret identifikator x" println ( {y} ); // Resultat: 3
Desuden, aog {a}er forskellige variabler. Hvis en klasseegenskab er omgivet af krøllede klammeparenteser, ophører den med at være en egenskab som sådan og bliver en global variabel i makromodulet. Det vil blive tilgået direkte ved navn, og ikke gennem en reference til et klasseobjekt.

Adgangsniveauer til klasseegenskaber og metoder :

Adgang Lokal
(lokal)
Privat
(privat)
Global Kraft
globalt
I klasseværelset ja / nej Ja ja
(via klasseobjekt)
Ja
I arvinger Ingen Ja ja
(via klasseobjekt)
Ja
Udefra Ingen Ingen ja
(via klasseobjekt)
Ja

Adgangsniveauer til variabler , procedurer og makromodulobjekter :

Adgang Lokal
(lokal)
Privat
(privat)
Global Kraft
globalt
I et makromodul ja / nej Ja Ja Ja
I moduler, der
importerer dette
Ingen Ingen Ja Ja
Polymorfi

Alle metoder til RSL-klasser er virtuelle . Således implementerer RSL inklusionspolymorfi (eller ren polymorfi) gennem arv. Hvis du tilføjer en metode i en afledt klasse med et navn, der allerede er brugt til en af ​​metoderne i den overordnede klasse, vil den afledte metode tilsidesætte den overordnede metode. Den overordnede metode vil kun blive tilgået fra den underordnede metode, der tilsidesætter den. Denne overordnede metode kaldes ved sit navn. Men i descendant-klassen, uden for den tilsidesættende metode, vil der ikke være adgang til den tilsidesatte overordnede metode. Det vil også blive umuligt at få adgang til denne metode for den overordnede klasse gennem en henvisning til et objekt fra den underordnede klasse i programmets hoveddel.

Klasse First() // Forældreklasse Var x = 2 , y = 3 ;

Makro Sum() returnerer x + y; ende ; ende ;

Klasse (Første) Anden() // Efterkommerklasse InitFirst(); Var a = 100 ;

Makro Sum() // Start med at tilsidesætte den overordnede metode Sum() returner Sum() + a; // Brug af forælderens Sum()-metode i barnets Sum()-metode end ; // Slut på tilsidesættelse af den overordnede metode Sum()

Makro Sum2() returner Sum() + a; // Brug af barnets Sum() metode end ; ende ;

obj = sekund(); // Opret et objekt af klassen Second()

println (obj.Sum()); // Resultat: 105 println (obj.Sum2()); // Resultat: 205

I dette eksempel, hvis metoden er fjernet fra den overordnede klasse Sum(), vil metoden blive kaldt rekursivtSum() i den descendant klasse .

Andet

Det er ikke nødvendigt at deklarere variabler og angive deres type. Sammenligningsoperatorer har højere forrang end logiske operatorer. For eksempel, hvis du skal udføre en "handling" i det tilfælde, hvor variablen a er lig med 1 eller 2, skal du anvende følgende konstruktion:

hvis ((a == 1 ) eller (a == 2 )) // handling ende ;

Programudførelse starter ved den første sætning, der ikke er en del af en klasse eller procedure, som i php .

makro funktion1 [Jeg er funktion 1 ]; ende ; // udførelsen starter her [Lad os gå!];

Programeksempler

Hej verden! » på RSL [4] :

[Hej Verden!];

Quine på RSL (formatering for læsbarhed):

s= "''s=Print(SubStr(s,1,2)+StrFor(34)+s+StrFor(34)+StrFor(59)+SubStr(s,3));''" ; Udskriv ( SubStr (s, 1 , 2 )+ StrFor ( 34 )+s+ StrFor ( 34 )+ StrFor ( 59 )+ SubStr (s, 3 ));

Se også

  • Indbygget programmeringssprog 1C:Enterprise

Noter

  1. For RS-Bank V. 5.50.003.58
  2. Til konsoltilstand og EasyWin -tilstand .
  3. Men sproget bliver også fortsat forkortet som "RSL".
  4. RSL i The Hello World Collection (link utilgængeligt) . Hentet 28. juni 2009. Arkiveret fra originalen 5. december 2011. 

Links