viernes, 21 de junio de 2013

Tipos de llamadas

Desde la llegada del ILE se dispone de varios formas de hacer llamadas para ejecutar código y es conveniente conocer el funcionamiento de cada una de ellas para definir una correcta estrategia de diseño de aplicaciones utilizando ILE.

Formas de ejecutar código

1. Ejecución de programa.

Existe desde el comienzo de la programación y se corresponde con la ejecución de un programa desde otro programa. En Rpg sería el tradicional CALLHasta la llegada de ILE era la única opción existente. 

El funcionamiento es simple desde un programa llamamos a otro y podemos pasarle parámetros. 

A nivel de sistema operativo, la verificación del programa llamado se realiza en tiempo de ejecución por lo que si, por alguna causa, no concuerdan los parámetros se producirá un error de ejecución. 
La inicialización del programa llamado conlleva bastante tiempo de ejecución ya que debe cargar el programa en memoria, inicializar variables y realizar aperturas de ficheros. Y lo mismo ocurre al finalizar un programa.

Es por ello que cuando desde un programa se llama a otro en múltiples y repetidas ocasiones, incidía notablemente en el rendimiento de la aplicación; por ejemplo, tenemos un programa que procesa un elevado número de registros y por cada registro llama a un programa para un determinado cálculo. Por ello, para reducir el tiempo y mejorar el rendimiento, recurríamos a finalizar el programa llamado con return para evitar los costes de tiempo de inicialización y finalización de programa. 

2. Llamada a módulo de un programa.

Se incorporó con la llegada del ILE y permite "llamar" a un módulo desde otro módulo del mismo programa. En RpgLe sería CALLPRC.

La verificación de la llamada (y sus parámetros) se produce en tiempo de compilación y creación del programa, cuando se "linkan" todos los módulos dentro del mismo programa. 

Al nivel de rendimiento, como se ha verificado, revisado y linkado en tiempo de compilación, el tiempo de carga e inicialización del módulo es irrelevante ya que sería el mismo que la ejecución de una subrutina dentro del programa.

Esta posibilidad de tener llamadas a módulos codificados independientemente pero cuyo rendimiento es como el de una subrutina a permitido dividir los programas en varios módulos para facilitar el desarrollo y el mantenimiento del programa.
Antes de existir ILE teníamos programas monolíticos de miles de líneas de código cuyo desarrollo y sobre todo mantenimiento (ante nuevas funcionalidades o corrección de incidencias) era muy complejo y problemático. Con ILE ese mismo programa se puede dividir en varios módulos (facilitando el desarrollo y el mantenimiento) y que se enlazan finalmente para formar un programa y cuyo rendimiento es exactamente igual que el antiguo programa monolítico.

3. Llamadas a programas de servicio.

También se incorporó con la llegada del ILE y permite "llamar" a un proceso desde un programa. Normalmente encapsulan procesos que van a ser utilizados desde múltiples programas y se corresponderían con una rutina de negocio reutilizable, por ejemplo, un procedimiento que devuelva el total de impuestos a aplicar a un determinado importe.

La verificación de la llamada (y sus parámetros) se produce, parte en tiempo de compilación y creación del programa y parte en tiempo de ejecución. 
Cuando se crea el programa es necesario indicarle que programas de servicio va a utilizar y en ese momento verifica, a través de los prototipos, la correspondencia de parámetros y en base a ello almacena en el programa la SIGNATURE del programa de servicio.  

La signature se como una firma basada en los componentes que tiene almacenados el programa de servicio y en los parámetros de esos mismos componentes. En próximas entregas hablaré de este concepto y del lenguaje binder.

Al nivel de rendimiento, consume mucho más tiempo que llamadas a módulos pero no se acerca al tiempo de inicialización de llamadas de programas
Simplemente, cuando se inicializa un programa que tiene una llamada a un programa de servicio, en ese momento se verifica que la signature que tiene el programa con relación al programa de servicio y la que tiene el programa de servicio son la misma y si es así se ejecuta y en caso contrario da un error.

Adicionalmente, el tiempo de carga es menor que el de llamadas a programas ya que el sistema operativo solo cargará en memoria una instancia del programa de servicio que podrá ser utilizada por todos los programas que lo llamen.

También es necesario indicar que es posible modificar el programa de servicio  sin tener que volver a compilar o a recrear todos los programas que lo utilizan lo cual facilita el desarrollo y mantenimiento.


Resumen

Con la llegada de ILE existen más opciones de llamadas que nos facilitan el desarrollo, mantenimiento y ejecución de aplicaciones y es necesario conocerlas para definir una estrategia conveniente en el desarrollo de aplicaciones. 
Así, por ejemplo, yo utilizaré:

  • En programas de servicio, rutinas de negocio que van a ser llamadas desde múltiples programas.
  • Llamadas de módulos. Cuando divida un programa en multiples módulos para facilitar el desarrollo y mantenimiento. Por ejemplo, un diseño de un programa que tiene cuatro pantallas podría hacerse que cada pantalla esté gestionada en un módulo y después de cree el programa utilizando los cuatro módulos
  • Llamadas entre programas. Pues eso, cuando necesite llamar a otro programa


No hay comentarios:

Publicar un comentario