Magik es un lenguaje de programación orientado a objetos que admite herencia múltiple y polimorfismo , y se escribe dinámicamente . Fue diseñado e implementado en 1989 por Arthur Chance de Smallworld Systems Ltd. como parte del Sistema de Información Geográfica (GIS) de Smallworld. Tras la adquisición de Smallworld en 2000, Magik ahora es proporcionado por GE Energy , todavía como parte de su plataforma tecnológica Smallworld.
Magik (Inspirational Magik) se introdujo originalmente en 1990 y se ha mejorado y actualizado a lo largo de los años. Su versión actual es 5.2.
En julio de 2012, los desarrolladores de Magik anunciaron que estaban en el proceso de migrar el lenguaje Magik a la máquina virtual Java . Oracle Corporation confirmó la exitosa portabilidad en noviembre del mismo año. [1]
Similitudes con Smalltalk
El propio Magik comparte algunas similitudes con Smalltalk en términos de sus características de lenguaje y su arquitectura: el lenguaje Magik se compila en códigos de bytes interpretados por la máquina virtual Magik . La máquina virtual Magik está disponible en varias plataformas, incluido Microsoft Windows , varios sabores de Unix y Linux .
Magik se basa en una consola y el código se puede modificar sobre la marcha incluso cuando se está ejecutando una aplicación. La consola también se puede utilizar para ejecutar código Magik y ver los resultados.
El código compilado se almacena en un solo archivo llamado archivo de imagen. Cada archivo de imagen contiene los códigos de bytes compilados y el estado de la sesión (por ejemplo, valores de variables) cuando se guardó la imagen por última vez.
Características del idioma
Comentarios
Magik usa el #
token para marcar secciones de código como comentarios:
# Este es un comentario.
Asignaciones
Magik usa el <<
operador para realizar asignaciones :
a << 1.234 b << b + a c << "foo" + "bar" # Concat strings
Para mayor claridad, esta notación se lee como "a se convierte en 1,234" o "b se convierte en b más a". Esta terminología separa la asignación de la comparación .
Magik también admite una variación comprimida de este operador que funciona de manera similar a las que se encuentran en C :
b + << a # Equivalente a b << b + a
Para imprimir una variable puede usar el siguiente comando
un << "hola" escribe un)
Simbolos
Además de los tipos de datos convencionales, como enteros, flotantes y cadenas, Magik también implementa símbolos. Los símbolos son un tipo de datos de token especial que se utilizan ampliamente en Magik para identificar objetos de forma única. Están representados por dos puntos seguidos de una cadena de caracteres. Los símbolos se pueden escapar usando el carácter de barra vertical . Por ejemplo:
un <<: hola # siempre que se encuentre: hola, es la misma instancia b <<: | hola mundo |
Escritura dinámica
Las variables de Magik no se escriben como en, por ejemplo, C # y pueden hacer referencia a diferentes objetos en tiempo de ejecución. Todo en Magik es un objeto (no hay distinción entre objetos y tipos primitivos como enteros):
a << 1.2 # se asigna un número de coma flotante a la variable 'a' a << "1.2" # después, se asigna una cadena a la variable 'a'
- Objetos
Los objetos se implementan en Magik utilizando ejemplos. Los ejemplares tienen similitudes con las clases de otros lenguajes de programación como Java , pero con diferencias importantes. Magik admite herencia múltiple y mixins (que implementan la funcionalidad sin datos). Las nuevas instancias se crean clonando una instancia existente (que normalmente será el ejemplo, pero no tiene por qué serlo).
Los nuevos ejemplos se crean utilizando la declaración def_slotted_exemplar()
, por ejemplo:
def_slotted_exemplar (: mi_objeto, { {: slot_a, 34}, {: slot_b, "hola"} }, {: parent_object_a,: parent_object_b})
Este fragmento de código definirá un nuevo ejemplar llamado my_object
que tiene dos ranuras (o campos) llamados slot_a
(preinicializados en 34) y slot_b
(preinicializados en "hola") que hereda de dos ejemplos existentes llamados parent_object_a
y parent_object_b
.
Comparación
Implementos Magik todos los operadores lógicos habituales ( =
, <
, <=
, >
, >=
, ~=/<>
) para la comparación, así como algunos más inusuales. Los operadores _is
y _isnt
se utilizan para comparar instancias específicas de objetos o referencias a objetos en lugar de valores.
Por ejemplo:
un << "hola" b << "hola" a = b # devuelve True (_true) porque los valores de ayb son iguales a _is b # devuelve False (_false) porque a no es la misma instancia que b un << "hola" b << a a = b # devuelve True (_true) porque los valores de ayb son iguales a _is b # devuelve True (_true) porque a b se le asignó la instancia específica del mismo objeto que a, en lugar del valor de a.
Métodos
Los métodos se definen en ejemplos utilizando las declaraciones _method
y _endmethod
:
_method my_object.my_method (a, b) _return a + b _endmethod
Es una convención proporcionar dos métodos new()
(para crear una nueva instancia) y init()
(para inicializar una instancia).
# Nuevo método _method person.new (nombre, edad) _return _clone.init (nombre, edad) _endmethod # Método de inicialización. _private _method person.init (nombre, edad) # Llame a la implementación principal. _super.init (nombre, edad) # Inicialice las ranuras. .name << nombre .age << edad _return _ self _endmethod
El _clone
crea una copia física del person
objeto. La _super
declaración permite que los objetos invoquen una implementación de un método en el ejemplo principal. Los objetos pueden hacer referencia a sí mismos mediante la _self
declaración. Se accede a las ranuras de un objeto y se asignan mediante una notación de puntos.
Los métodos que no forman parte de la interfaz pública del objeto se pueden marcar como privados mediante la _private
instrucción. Los métodos privados sólo pueden ser llamados por _self
, _super
y _clone
.
Los argumentos opcionales se pueden declarar usando la _optional
declaración. Magik asigna los argumentos opcionales que no se pasan al objeto especial _unset
(el equivalente de nulo). La _gather
declaración se puede utilizar para declarar una lista de argumentos opcionales.
_method my_object.my_method (_gather values) _endmethod
Iteración
En el Magik _while
, _for
, _over
, _loop
y _endloop
declaraciones permiten iteración.
_cuadra_local s << 0 _local i << 0_mientras yo <= 100_círculo s + << i i + << 1 _endloop>> s_endblock
Aquí, _ while se combina con _loop y _endloop.
_method my_object.my_method (_gather values) total << 0.0 _para un _sobrevalores.elementos () _círculo total + << a _endloop _devolución total _endmethod m << mi_objeto.nuevo () x << m.mi_método (1.0, 2, 3.0, 4) # x = 10.0
Aquí, values.elements () es un iterador que ayuda a iterar los valores.
En Magik , los métodos generadores se denominan métodos iteradores. Se pueden definir nuevos métodos de iterador utilizando las declaraciones _iter
y _loopbody
:
_iter _method my_object.even_elements () _para un _over _self.elements () _círculo _si un.even? _es verdad _luego _cuerpo (a) _terminara si _endloop _endmethod
Procedimientos
Magik también admite funciones llamadas procedimientos. Los procedimientos también son objetos y se declaran mediante las instrucciones _proc
y _endproc
. Los procedimientos se asignan a variables que luego pueden invocarse:
my_procedure << _proc @my_procedure (a, b, c) _return a + b + c _endproc x << mi_procedimiento (1, 2, 3) # x = 6
Expresión regular
Magik admite // sintaxis de expresiones regulares:
_if /Hola\,\s(\w)+!/.matches?("Hello, Magik! ") _entonces escribir ("¡Tengo una coincidencia!")_terminara si
y capturar grupos en Regex:
/sw([0-9]+)-([0-9]+).*/.replace_all("sw65456-324sss "," $ 1 ") #" 65456 "/sw([0-9]+)-([0-9]+).*/.replace_all("sw65456-324sss "," $ 2 ") #" 324 "
Biblioteca HTTP
Magik admite la realización de solicitudes HTTP o HTTPS a través de la biblioteca http, consulte los ejemplos a continuación:
magikhttp << http.new ()magikhttp.url ("https://www.google.com") .get ()magikhttp.url ("https://www.google.com") .post ({"User-agent", "Bot"}, "some data")
Peculiaridades del lenguaje
Dado que Magik se desarrolló originalmente en Inglaterra, los métodos de las bibliotecas centrales de los pequeños mundos se escriben en inglés británico . Por ejemplo:
Utilice "inicializar", no "inicializar".
Colecciones
Al igual que otros lenguajes de programación, Magik también tiene colecciones. Incluyen lo siguiente:
- Vector simple
- Soga
- Tabla de picadillo
- Lista de propiedades
- Conjunto de igualdad
- Pantalón
Ejemplo de Hello World
El siguiente es un ejemplo del programa Hola mundo escrito en Magik:
escribir ("¡Hola mundo!")
Referencias
- ↑ Jim Connors (5 de noviembre de 2012). "Espolvorea algo de Magik en esa máquina virtual Java" . Consultado el 6 de noviembre de 2012 .
Con esta nueva capacidad, GE Energy ha logrado alojar su entorno Magik en la parte superior de la máquina virtual Java.
enlaces externos
- Tecnología del conjunto de productos Smallworld
- MDT - IDE de herramientas de desarrollo de Magik para desarrolladores de SIG de GE Smallworld
- Código abierto (SourceForge)
- Publicación en el foro de idiomas en Magik
- Documento técnico n. ° 5: una descripción general de Smallworld Magik
- GE Smallworld, extensiones de Emacs para desarrolladores de Magik
- Extensión de Visual Studio Code para el lenguaje de programación Smallworld Magik.