Engenharia de Componentes de Software

Universidade Federal de Santa Catarina


Avaliação da linguagem Eiffel para SMP.


Resumo: Eiffel NÃO suporta as técnicas descritas por SMP.

Existem vários motivos para isso, os princípais estão listados abaixo:

  • Não existe suporte para especialização de 'templates'.
        Isso impede o uso de recursão de template como estrutura de loop, pois não é possível
    estabelecer uma condição de saída da recursão.
                 
  • Apenas tipos podem ser usados como parâmetros. Dados, como números inteiros, não são suportados.
        Isso restringe a configurabilidade de uma classe genérica ('template'). Não é possível especificar
    por parâmetro algo como "utilizar_busca_ordenada", ou "número_máximo_de_elementos_na_lista".
                  
  • Os parâmetros (tipos) de uma classe genérica são fortemente tipados.
        A vantagem dessa característica é que a simples leitura de uma classe genérica permite a availação de quais chamadas de
    métodos, acesso a atributos, etc.. são válidas para cada objeto/classe.
      
        Em C++, por exemplo, parâmetros de templates não são tipados. Com isso, um classe template não pode ser validada
    através do seu código, pois dependendo do parâmetro forncecido a instanciação do template pode ou não ser válida.
        
        A abordagem de C++, apesar de dificultar o entendimento do código e complicar a validação de código implementado, permite
    uma flexibilidade muito maior. A vantagem é que um template depende apenas da interface do tipo passado como parâmetro.
    Além disso ele mantém ela flexível, exigindo apenas os métodos/atributos/typedefs que foram efetivamente utilizados.
                  
  • Não é possível fazer um template ser subclasse de um dos tipos passados como parâmetro.
        Em C++ o seguinte template é valido:
    
       template 
       struct Y : public X 
       {
           //code
       };  
                  
  • Classes genéricas utilizam o mesmo código base para todas as instanciações do 'template'.
        SMP implica em gerar código otimizado para cada uma das instanciações dado os parâmetros de
    entrada (além dos externos, porém estes são constantes entre instanciações e suportados pelo Eiffel).
    
        Isso provavelmente não é verdade para classes que possuem a propriedade EXPANDED, que diz que não deve ser usado um ponteiro 
    para um objeto dessa classe, mas sempre copiá-la (tal qual um int na declaração: int x; classes não espandidas equivaleriam a int *x;).
    Isso deve, no entando, ser confirmado.
    
        A explicação para o uso do mesmo código é a tentativa de Eiffel de reduzir ao máximo as penalidades do suporte
    a genericidade, principalmente em tamanho de código, gerada por outras alternativas onde cada instancia irá gerar código
    extra, o que na maioria dos casos não é desejável. 
                  

    Conclusão

    Cada um dos itens acima já é suficiente para restringir muito o uso de SMP em Eiffel. Alguns impedem a demostração de que com recursão de templates, passagem de tipos e dados constantes e especialização de template é possível implementar uma máquina de Turing metaprogramada. Essa informação é importante para provar que qualquer algoritmo pode ser implementado usando SMP numa linguagem. A não ser configurações muito básicas, como TRAIT classes, nenhum dos recursos necessários está presente na linguagem.