BlackTDN Search

domingo, 27 de novembro de 2011

Protheus :: Advpl :: Duelo de Titãs :: Harbour x ADVPL

Vez em quando me pego fuçando o código e as Classes disponíveis no Harbour Project para verificar as novidades, acompanhar a evolução da linguagem e, por que não, aprender com os mestres e, durante esse processo, faço algumas descobertas interessantes. Na pasta ..\examples\hbxlsxml da instalação padrão deparei-me com três classes:

CLASS ExcelWriterXML :: xlsxml.prg
CLASS ExcelWriterXML_Sheet  :: xlsxml_s.prg
CLASS ExcelWriterXML_Style  :: xlsxml_y.prg

Lendo a documentação no código fonte, percebi que essas três Classes foram originalmente escritas em PHP:

/*
* $Id: xlsxml_y.prg 17099 2011-10-28 18:34:39Z vouchcac $
*/
/*
* Harbour Project source code:
*
* Copyright 2011 Fausto Di Creddo Trautwein, ftwein@yahoo.com.br
* www - http://www.xharbour.org http://harbour-project.org
*
* Thanks TO Robert F Greer, PHP original version
* http://sourceforge.net/projects/excelwriterxml/

O grande “Fausto Di Creddo Trautwein” teve o trabalho de transcrever o código original em PHP para o Harbour e иαldσ dj (esse que vos escreve) assumiu o compromisso de torná-las utilizáveis em ADVPL.

Para isso vou usar um “Poderoso” recurso do ADVPL herdado do CA-Clipper e existente, também, no Compilador Harbour e em outras linguagens como C e C++:

O Pré-Processador.

Segundo Rick Spence (Clipper 5.2, pag.: 23) : “O Pré-Processador é um importante recurso (…). Imagine-o como um programa que executa antes do compilador. Ele lê seu programa como entrada e gera um arquivo pré-processado como saída. O arquivo de saída, então, serve como entrada para o compilador; o compilador não tem conhecimento e nem se importa com a ocorrência do pré-processamento.”

Vou usar “Constantes Simbólicas ou manifestas”, “Arquivos Includes”, “Macros do Compilador”, “Compilação Condicional” e “Comandos Definidos pelo usuário” além de funções “customizadas” para compatibilizar o código escrito usando a sintaxe e semântica do Harbour para o padrão e limitações (no que diz respeito a evolução natural da linguagem) do ADVPL.

Harbour possui muitos recursos interessantes, disponíveis nas maiorias das linguagens modernas de Alto Nível, mas, infelizmente, ainda não disponíveis em ADVPL, a saber: Hash de Array, sintaxe OOP nativa dentre outras.

A idéia e alterar minimamente o código Harbour de forma que ele possa ser compilado e executado em ambas  plataformas.

O Desafio está lançado. Agora vamos ver o que essas classes fazem e acompanhar o processo de “Compatibilização”.

Os programas que serão compatibilizados são:

image

e os existentes no diretório \tests:

image

Compilando as classes no Harbour:

image

… “hbmk2: Criando biblioteca estáticas... libhbxlsxml.a”

image

agora vamos compilar os programas de teste e ver a saída:

Compilado e executando o exemplo.prg

image

que irá gerar o arquivo example.exe

image

que ao ser executado:

image

irá gerar, como saída, o arquivo example.xml

image

que, aberto pelo Excel, nos dará o seguinte resultado:

image

Para o exemplo1.prg:

image

Analisando o arquivo example.xml teremos:

image

Compilando e executando os demais exemplos teremos:

para o example2.prg

image

e, para o example3.prg

image

Analisando os resultados podemos concluir que as classes

CLASS ExcelWriterXML :: xlsxml.prg
CLASS ExcelWriterXML_Sheet  :: xlsxml_s.prg
CLASS ExcelWriterXML_Style  :: xlsxml_y.prg

servem para gerar arquivos no padrão XML compatíveis com o Microsoft Excel.

Agora, vamos ao trabalho de “Compatibilização”.

Pontos de Atenção:

image

Analisando um fragmento da declaração da classe em Harbour identificamos as seguintes incompatibilidades:

  1. O arquivo de cabeçalho “hbclass.ch”;
  2. CREATE na declaração da Classe;
  3. INIT para inicializar as variáveis;
  4. O operador de Hash {=>} e;

image

Declaração dos Métodos da Classe. Uma forma interessante do Harbour resolver “Nomes Longos” na Classe é Prefixando a Classe ao Método. Teremos que resolver isso no Protheus também. Apesar de podermos criar, no Protheus, Classes com Nomes Longos, Herdando-as da LongClassName, o compilador ADVPL ainda considera o limite de 10 Caracteres para a comparação de Nomes.

image

FOR EACH não implementado em ADVPL

image

Funções exclusivas da Linguagem Harbour

image

image

image

Hash não implementado em Advpl.

image

Sintaxe OOP não implementada em ADVPL.

Ufa.. Bastantes compatibilizações a fazer. Melhor seria reescrever as Classes e os Exemplos usando apenas os Recursos do ADVPL (e cadê a graça). A idéia é manter a compatibilidade. O mesmo código deverá, com poucas alterações, compilar e executar tanto no Harbour quanto no Protheus; além do mais os “Recursos do Pré-Processador” fazem parte da linguagem ADVPL.

… Continua no Próximo “POST”

[]s

иαldσ dj

2 comentários: