EGL (linguaxe de programación)

**EGL** (*Enterprise Generation Language*) foi desenvolvida orixinalmente por IBM e agora está dispoñible como EDT (EGL Development Tools).

O proxecto aberto baixo a Licenza Pública Eclipse (EPL) é unha tecnoloxía de programación deseñada para enfrontar os desafíos do desenvolvemento de aplicacións modernas e multiplataforma ao proporcionar unha linguaxe e un modelo de programación comúns en todos os idiomas, marcos e plataformas de tempo de execución. A linguaxe toma conceptos familiares para calquera que use linguaxes de tipo estático como Java, COBOL, C etc. Con todo, toma o concepto de estereotipo de Linguaxe de Modelaxe Unificada (UML) que non se atopa normalmente nas linguaxes de programación estáticas.

En poucas palabras, EGL é unha linguaxe de desenvolvemento de aplicacións universal de nivel superior.

EGL é similar en sintaxe a outras linguaxes comúns, polo que os desenvolvedores de aplicacións poden aprendela con antecedentes previos de programación similares. As abstraccións de desenvolvemento de aplicacións de EGL protexen os programadores das interfaces técnicas dos sistemas e o middleware, o que lles permite centrarse en desenvolveren a funcionalidade empresarial, compilada en código COBOL, Java ou Javascript para admitir a implementación de aplicacións empresariais que poden executarse en calquera das seguintes contornas:

* Plataformas cunha máquina virtual Java como Microsoft Windows, Linux, e UNIX, por exemplo, no contexto dun colector de servlets Java EE (IBM WebSphere Servidor de Aplicación, apache Tomcat, GlassFish).
* IBM System z: CICS Transacción Server, IMS, z/VOS Batch, UNIX System server, WebSphere Application Server, z/VSE, Linux.
* IBM System i: IBM i5/VOS, IBM WebSphere Application Server, apache Tomcat,Integrated Web Application Server for i.
* Navegadores web compatibles con Javascript, como Internet Explorer, Firefox, e Safari, para aplicacións web ricas en Ajax.

## Exemplos de código 
### Programa 
Unha parte do programa EGL é unha parte lóxica xerable cun punto de entrada. Cada parte do programa contén unha función main (), que representa a lóxica que se executa no inicio do programa. Un programa pode incluír outras funcións e pode acceder a funcións que están fóra do programa. A función main () pode invocar esas outras funcións. As funcións do programa están compostas por un conxunto de sentenzas, variables e constantes de EGL.
```pascal
Program HelloWorld

	const GREETING string = "Hello, ";
    
	function main()
		myName string = "John";
		sayHello(myName);
	end

	function sayHello(name String in)
		SysLib.writeStdOut(GREETING + name + "!");
	end

end
```

### Gravar 
Unha parte de rexistro EGL define un conxunto de elementos de datos. Neste exemplo, un rexistro co nome CustomerRecord defínese con 6 campos.
```pascal
Record CustomerRecord type BasicRecord
	customerNumber INT;            
	customerName STRING;
	customerAddr1 STRING;
	customerAddr2 STRING;
	customerAddr3 STRING;
	customerBalance MONEY;
end

EGL ten un tipo de rexistro especializado chamado SQLRecord que se utiliza para intercambiar datos cunha base de datos relacional.
record Employee type sqlRecord { tableNames ="Employee", keyItems =[EMPNO]}
    EMPNUMBER string{ column = "EMPNO", maxLen = 6};
    FIRSTNME string{ sqlVariableLen = yes, maxLen = 12};
    MIDINIT string{ isSqlNullable = yes, maxLen = 1};
    LASTNAME string{ sqlVariableLen = yes, maxLen = 15};
    DEPT string{ column = "WORKDEPT", isSqlNullable = yes, maxLen = 3};
    PHONENO string{ isSqlNullable = yes, maxLen = 4};
    HIREDATE date{ isSqlNullable = yes};
end
```

* Neste exemplo, o rexistro Empregado está vinculado a unha táboa (ou vista) denominada Empregado.

### Servizo 
Unha parte do Servizo EGL contén funcións públicas destinadas a seren accedidas desde outras aplicacións ou sistemas. Neste exemplo, defínese un servizo con dúas funcións.
```pascal
package com.mycompany.services;

service EmployeeService

    function getEmployees() returns(Employee[])
        records Employee[0]; // define an empty array of records
        get records; // retrieve records from the database
        return (records); // return the records       
    end
    
    function addEmployee(emp Employee in) returns (boolean)
    	try
    		add remp;
    		return (true);
    	onException (ex AnyException)
    		return (false);
    	end
    end

end
```

* En EGL, o código está organizado en paquetes (como Java (linguaxe de programación))
* A primeira función, getEmployees, devolve unha matriz de rexistros completados a partir dos rexistros nunha base de datos.
* A segunda función, addEmployee agrega un novo rexistro á base de datos e devolve un verdadeiro ou falso dependendo de se o rexistro se agregou correctamente.

### RUIHandler 
O compoñente principal dunha aplicación de EU enriquecida é unha parte do controlador de EU enriquecida. Estas partes xéranse en JavaScript.
```javascript
package com.mycompany.ui;

import com.mycompany.services.Employee;
import com.mycompany.services.EmployeeService;
import dojo.widgets.DojoGrid;
import dojo.widgets.DojoGridColumn;

handler EmployeeView type RUIhandler { initialUI = [ grid ], 
                                       onConstructionFunction = start, 
                                       cssFile = "main.css" }

    grid DojoGrid { behaviors = [ ], headerBehaviors = [ ], columns = [
                    new DojoGridColumn { displayName = "First Name", name = "FIRSTNAME" },
                    new DojoGridColumn { displayName = "Last Name", name = "LASTNAME" },
                    new DojoGridColumn { displayName = "Salary", name = "SALARY" }
            ] };

    function start()
        svc EmployeeService { };
        call svc.getEmployees () returning to displayEmployees;
    end

    function displayEmployees(retResult Employee [ ] in)
        grid.data = retResult as any [ ];
    end
    
end
```

## Web 2.0 con EGL 
En decembro de 2008, IBM introduciu unha nova tecnoloxía, EGL Rich UI, para simplificar a creación Aplicacións de Internet Enriquecidas ao estilo da Web 2.0 Esta tecnoloxía simplifica o desenvolvemento ao ocultar ao desenvolvedor as complexidades de Ajax, Javascript, Transferencia de Estado Representacional, e SOAP , o que lles permite centrarse nos requisitos do negocio e non nas tecnoloxías subxacentes.

## Produtos comerciais 
As ferramentas de programación de EGL están dispoñibles como un produto comercial baseado en Eclipse, o Rational Business Developer e tamén na edición EGL de Rational Developer for System z.

EGL é un idioma de destino para a modernización de aplicacións herdadas debido á afinidade da semántica da linguaxe coas linguaxes de procedemento e a Linguaxe de programación de cuarta xeración:

* Un conxunto de ferramentas de conversión dispoñibles dentro do produto de Desenvolvedor Empresarial Racional proporciona a conversión automatizada de linguaxes de IBM e Informix de Linguaxe de programación de cuarta xeración máis antiga e estabilizada.
* Un conxunto de ofertas de servizos de IBM e produtos complementarios (Rational Migration Extension for Natural, Rational Migration Extension para System i, Rational Migration Extension para CA-products) ofrece a capacidade de converter de Software AG Natural, IBM RPG, CA Fresco: Gen e CA Ideal/Datacom a EGL

As ferramentas para buscar grandes bases de código EGL, comparar os arquivos individuais de EGL para detectar cambios e detectar códigos duplicados están dispoñibles en Semantic Designs

## Notas