LSR

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 9 de junio de 2013; las comprobaciones requieren 49 ediciones .
LSR
clase de idioma

multi- paradigma :
orientado a objetos , procedimental
orientado al dominio ,

memorable
tipo de ejecución interpretado
Apareció en 1994
Autor sergei kubrin
extensión de archivo ..mac
Liberar 1151 [1]  ( 19 de marzo de 2015 )
sistema de tipos dinámica
Implementaciones principales RS-Bank , InterBank, RS-Valores, RS-Pagos
Sitio web softlab.ru

RSL u Object RSL ( abreviado del inglés  R-Style Language ) es un lenguaje de programación propietario, interpretado, orientado a dominios y orientado a objetos desarrollado por R-Style Softlab para su uso en sus productos de software .

El entorno de desarrollo denominado "RSL Shell" incluye:

RSL también se denomina lenguaje de macros , y los programas basados ​​en él se denominan macros . Las herramientas para crear y depurar programas RSL están disponibles para su descarga gratuita en el sitio del desarrollador; sin embargo, dichas macros no deben contener llamadas a módulos que contengan lógica comercial e integrados en los programas principales de R-Style Softlab. El intérprete está implementado bajo Windows , permite trabajar bajo Wine . Las primeras versiones admitían MS-DOS .

El soporte RSL está integrado en todos los subsistemas RS-Bank ABS , así como en InterBank, RS-Payments.

Historia

Módulos de idioma

RSLSRV

El módulo RSLSRV registra el objeto RSLSrv.RslEngine en el sistema, lo que le permite utilizar la macro RSL como un objeto ActiveX . Las macro variables globales se convierten en propiedades y los procedimientos se convierten en métodos. Por ejemplo, digamos que hay una macro myactivex.mac :

var str1: Cadena = "Cadena de prueba" ; macro func1(a) devuelve a*a; fin ;

entonces puede usar el siguiente código de Visual Basic :

Sub TestRSL () Establecer eng = CreateObject ( "RSLSrv.RslEngine" ) Establecer MyObj = eng . LoadModule ( "myactivex.mac" ) Depuración . Imprimir MiObj . str1 ' imprime la cadena de prueba Debug . Imprimir MiObj . func1 ( 2 ) ' imprime 4 End Sub

DSR

RSD es una biblioteca diseñada para el acceso universal a fuentes de datos compatibles con SQL desde programas C++ y RSL . El modelo de objetos se basa en ADO .

La biblioteca tiene varios niveles (cada nivel subsiguiente se basa en el anterior: delega la mayor parte de la funcionalidad al nivel subyacente):

  1. Controladores : a) Controlador de fuente de datos para proporcionar acceso de bajo nivel a los servicios de la biblioteca desde el lenguaje C. La interfaz es genérica, pero la implementación es específica de la fuente de datos. Actualmente hay un controlador para ODBC . b) El controlador del conjunto de registros universal (Recordset), que proporciona un acceso de navegación unificado a los datos.
  2. Clases de C++ e interfaz de acceso a datos orientada a objetos independiente de la fuente.
  3. Clases RSL e interfaz para acceso desde RSL.

Los niveles 1 y 2 se implementan como DLL , mientras que el nivel 3 se implementa como DLM.

RSLX

RSEngine

Informes de Windows

Windows Reports  es una biblioteca orientada a objetos para generar informes en formatos de aplicaciones de oficina MS Excel , MS Word , Internet Explorer . La biblioteca se basa en tecnologías RSCOM y ActiveX . La mayor parte está escrita en RSL, también se incluyen módulos DLM.

Trabajar con bases de datos

RSL tiene soporte incorporado para trabajar con bases de datos (DB) administradas por Pervasive PSQL ( anteriormente Btrieve y Pervasive.SQL ). Los diccionarios de base de datos tienen la extensión .def(analógico .ddf), archivos de tabla de base de datos - .dbt(analógico .mkd). También es posible trabajar con archivos de bases de datos .dbf. El trabajo con SQL se organiza utilizando ADO a través del módulo RSLX y las bibliotecas RSD .

Construcciones de sintaxis y lenguaje

En términos de sintaxis, RSL comparte similitudes con C++ y Pascal . Por ejemplo, las operaciones de asignación y comparación "igual", "desigual" se escriben de la misma forma que en C++ ( =, ==, !=). Y las operaciones lógicas son como en Pascal ( and, or, not).

Comentarios

RSL (similar a C++ ) admite dos tipos de comentarios : de varias líneas y de una sola línea .

/* Un ejemplo de un comentario grande, que consta de varias líneas */ // El resto de la línea es un comentario

El lenguaje RSL permite comentarios anidados de ambos tipos, tanto por separado como juntos.

Tipos de datos

Todos los tipos de datos admitidos en RSL se dividen en escalares y objetos.
Tipos escalares:

  • Entero : Integer.
  • Punto flotante : Double.
  • Número de punto flotante BCD: Decimal, Numeric.
  • Escriba para valores monetarios: Money.
  • Cadena : String.
  • Booleano : Bool(que tiene los valores TRUEy FALSE).
  • Fecha: Date.
  • Tiempo: Time.
  • Fecha y hora: DateTime.
  • Dirección de memoria: MemAddr.
  • Enlace al trámite de la RSL: ProcRef.
  • Referencia de método de objeto RSL: MethodRef.
  • Tipo de valores especiales " Valor nulo " y " Valor por defecto ": SpecVal(teniendo los valores NullValy OptVal).
  • El valor especial " Vacío " sin tipo: NULL.
  • Tipo genérico: Variant.

Tipos de objetos:

  • Enlace al objeto "archivo de base de datos": Tbfile.
  • Referencia al objeto "estructura en memoria": TRecHandler.
  • Referencia al objeto "matriz de valores": TArray.
  • Enlace al objeto "archivo de texto": TStreamDoc.
  • Referencia a cualquier objeto de clase RSL: Object.

RSL proporciona conversión implícita y explícita de un tipo de datos a otro.

  • La conversión implícita (automática) se produce en los siguientes casos:
  • Cuando una operación aritmética involucra dos operandos de diferentes tipos, para los cuales no se define un procedimiento explícito para calcular la operación, el tipo del operando con el peso de tipo más bajo se convierte al tipo del operando con el peso de tipo más alto. A continuación se muestran las opciones para convertir tipos de acuerdo con sus "pesos": Integer→ Double→ Numeric→ String.
  • Al asignar un valor a una variable con un tipo diferente al que se le declaró.
  • ifCuando se utilizan instrucciones y whilevalores no booleanos en expresiones condicionales . En este caso, se intentará convertir a un tipo booleano.

Características del lenguaje orientadas a objetos

En 1997 RSL pasó a estar orientado a objetos y cambió su nombre a Object RSL [3] . Introduce clases que proporcionan las tres propiedades más importantes de la programación orientada a objetos (POO): encapsulación , herencia y polimorfismo .

Objetos

En RSL (a diferencia de otros lenguajes de programación, por ejemplo, C++), la construcción de objetos ocurre en dos etapas:

  • Creación de objetos: asignación de memoria teniendo en cuenta la jerarquía de herencia , creación de listas de reemplazos para métodos virtuales , todas las propiedades de clase se establecen en NULL . Después de eso, dado que el objeto no contiene datos no inicializados, está listo para ser destruido con gracia.
  • Inicialización de objetos: llamada de método Init. Si la inicialización se va a realizar para la clase principal, su método Initdebe llamarse explícitamente al inicializar la clase derivada.

Por lo tanto, los destructores definidos por el usuario no se utilizan en las clases RSL (los objetos y sus propiedades se eliminan automáticamente).

Herencia

En RSL, la herencia le permite describir una nueva clase basada en una clase ya existente (principal, base). Por lo tanto, todos los métodos y propiedades de la clase principal también se convierten en métodos y propiedades de la clase secundaria. Además, la clase descendiente puede agregar sus propias propiedades y métodos o anular los métodos de la clase principal . La herencia le permite crear jerarquías de clases. La herencia múltiple está prohibida en RSL.

Al heredar, el nombre de la clase principal se especifica entre paréntesis después de la palabra clave Class. Para inicializar la clase principal, debe llamar a un método predefinido, cuyo nombre se forma agregando el prefijo al nombre de la clase principal Init.

Un ejemplo de herencia por parte de la clase Empleado ("Empleado") de la clase Persona ("Persona"), al agregarle la propiedad Puesto ("Puesto"):

Clase Persona (Nombre, Apellido) // Lista de propiedades y métodos de la clase Persona end ;

Clase (Persona) Empleado (Nombre, Apellido, Cargo) InitPerson (Nombre, Apellido); // Inicializar la clase Person en la clase Employee Macro Report() println ( "Publicar: " , Publicar); fin ; fin ; Encapsulación

En RSL, la encapsulación se implementa especificando el nivel de acceso a las propiedades y métodos de la clase, así como a las variables y procedimientos del macromódulo.

  • En el cuerpo principal de un módulo de macro, todas las variables, procedimientos y clases declarados sin un modificador de acceso son globales por defecto . Están disponibles no solo dentro del macromódulo, sino también en todos los demás macromódulos que lo importan. Las variables también se pueden convertir en globales por la fuerza (consulte más abajo para obtener más información al respecto ).
  • El modificador de acceso privatepermite declarar variables, procedimientos y clases como privados , lo que impone una prohibición de acceso a ellos desde el exterior. Este modificador es análogo al modificador protecteden C++.
  • El modificador localse puede usar para declarar variables, objetos y procedimientos como locales . Las variables locales solo están disponibles para los procedimientos locales. No es posible acceder a una variable local dentro de ningún otro procedimiento de módulo macro.
     
calle var local ; // Variable de módulo local, solo visible // en el cuerpo del módulo actual o en la macro de procedimiento local Proc1() // Procedimiento de módulo global str = "Text1" ; // ¡Error! str no está disponible end ;

macro local Proc2() // Procedimiento de módulo local str = "Text2" ; // ¡Correcto! fin ;

proc2(); cadena = cadena + "Texto3" ; // ¡Correcto! println (cadena);
Si especifica un modificador localantes de una propiedad de clase, deja de ser una propiedad de clase como tal y se convierte en una variable de constructor local. Por lo tanto, el modificador localsolo es aplicable a los procedimientos de inicialización del constructor de módulos y clases.
  • Para acceder directamente a las variables que están dentro de los procedimientos, debe convertirlas en globales forzosamente . Esto se hace encerrándolos entre llaves ( {}):
     
macroproc (); var x = 2 , // No se accederá a esta variable fuera del procedimiento {y} = 3 ; // Se accederá a esta variable fuera del procedimiento end ;

proceso(); // Llamar al procedimiento

println (x); // Error: "identificador x indefinido" println ( {y} ); // Resultado: 3
Además, ay {a}son variables diferentes. Si una propiedad de clase está encerrada entre llaves, deja de ser una propiedad como tal y se convierte en una variable global del macromódulo. Se accederá directamente por nombre, y no a través de una referencia a un objeto de clase.

Niveles de acceso a las propiedades y métodos de la clase :

Acceso locales
(locales)
Privado
(privado)
Global Fuerza
global
En el aula si / no
(a través del objeto de clase)
en herederos No
(a través del objeto de clase)
Desde afuera No No
(a través del objeto de clase)

Niveles de acceso a variables , procedimientos y objetos de macromódulos :

Acceso locales
(locales)
Privado
(privado)
Global Fuerza
global
En un módulo de macros si / no
En los módulos que
importan esto
No No
Polimorfismo

Todos los métodos de las clases RSL son virtuales . Por lo tanto, RSL implementa el polimorfismo de inclusión (o polimorfismo puro) a través de la herencia. Si agrega un método en una clase derivada con un nombre que ya se usa para uno de los métodos de la clase principal, el método derivado anulará el método principal. Solo se accederá al método principal desde el método secundario que lo reemplaza. Este método padre se llama por su nombre. Pero en la clase descendiente, fuera del método anulado, no habrá acceso al método principal anulado. También será imposible acceder a este método de la clase padre a través de una referencia a un objeto de la clase hijo en la parte principal del programa.

Class First() // Clase principal Var x = 2 , y = 3 ;

Macro Suma() devuelve x + y; fin ; fin ;

Class (First) Second() // Clase descendiente InicialPrimero(); Var a = 100 ;

Macro Sum() // Empezar a anular el método padre Sum() return Sum() + a; // Usando el método Sum() del padre en el método Sum() del hijo end ; // Fin de anular el método padre Sum()

Macro Sum2() return Sum() + a; // Usando el método Sum() del niño end ; fin ;

obj = segundo(); // Crea un objeto de clase Second()

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

En este ejemplo, si el método se elimina de la clase principal Sum(), el método se llamará recursivamenteSum() en la clase descendiente .

Otro

No es necesario declarar variables y especificar su tipo. Los operadores de comparación tienen mayor precedencia que los operadores lógicos. Por ejemplo, si necesita realizar una "acción" en el caso de que la variable a sea igual a 1 o 2, debe aplicar la siguiente construcción:

if ((a == 1 ) o (a == 2 )) // fin de la acción ;

La ejecución del programa comienza en la primera declaración que no forma parte de una clase o procedimiento, como en php .

función macro1 [Soy la función 1 ]; fin ; // la ejecución comienza aquí [¡Vamos!];

Ejemplos de programas

¡Hola mundo! » en RSL [4] :

[¡Hola Mundo!];

Quine en RSL (formato para legibilidad):

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

Véase también

  • Lenguaje de programación integrado 1C:Enterprise

Notas

  1. Para RS-Bank V. 5.50.003.58
  2. Para modo consola y modo EasyWin .
  3. Pero el idioma también se sigue abreviando como "RSL".
  4. RSL en The Hello World Collection (enlace no disponible) . Consultado el 28 de junio de 2009. Archivado desde el original el 5 de diciembre de 2011. 

Enlaces