quinta-feira, 1 de dezembro de 2011

Tipos de Linguagem de Programação

  O que é uma linguagem de programação
   É um conjunto de instruções e métodos padronizados, numa determinada língua de programação, que contém um conjunto de regras sintáticas e semânticas para determinar uma instrução.

Exemplos:

Basic (Beginners All-Purpose Symbolic Instruction Code), criada por J.Kemeny e T. Kurtz em 1963.
FORTRAN e Assembly: rotinas de baixo nível
Basic: facilitar ao programador sua tarefa, não precisando se preocupar com métodos e algoritmos exigidos para construir e depurar programas.

Evolução:
GW-BASIC(1970) -> Quick Basic (1982) -> Visual Basic (1991)

Comparação entre Basic, QBasic e Visual Basic:


10 INPUT A,B
20 FOR I=A TO B STEP 1
30 IF MOD(I,2)>0 THEN 50
40 PRINT I
50 NEXT I
60 END
INPUT A,B
FOR I=A TO B
   IF MOD(I,2)=0 THEN PRINT I
NEXT
Private Sub CommandButton1_Click()
For I = Val(Text1.Text) To Val(Text2.Text)
If I Mod 2 = 0 Then Text3.Text = Text3.Text + Str(I)
End If
Next
End Sub


Curiosidades sobre COBOL:

Alguns fatos bem interessantes (quase chocantes) sobre COBOL

Grace M. Hopper (a mãe do Cobol)

Sempre que ouvia falar em COBOL, vinha a imagem de uma tecnologia ultrapassada, esquecida e fedorenta.  Óbviamente,  fruto do meu preconceito. Na realidade, até então, eu nunca havia visto uma linha sequer de Cobol na minha frente!

Sei que muitos compartilham comigo esta primeira impressão também ficarão chocados com alguns fatos bem interessantes sobre Cobol:

    Em 1999, o grupo Gartner fez uma pesquisa e concluiu que 80% das aplicações corporativas em execução no mundo naquele momento eram escritas em Cobol. Os outros 20% eram compartilhados pelas demais linguagens. Este dado tem 9 anos hoje, no entanto, a realidade não deve ser tão diferente nos dias atuais. Basta levar em consideração que BOA parte deste código estava presente em aplicações de missão crítica que, com alta probabilidade, ainda estão em execução hoje. Aliás, um estudo mais recente do mesmo instituto, comprovou que atualmente (artigo de 2006), há aproximadamente 180 bilhões de linhas de código escritas em Cobol em execução atualmente. Uou!
    Cobol é orientado a objetos. O padrão Cobol 2002 aceita orientação a objetos. E tanto Fujitsu quanto Microfocus oferecem compiladores que suportam o paradigma. Mais interessante ainda: se você programa na plataforma .net, pode experimentar Cobol se quiser. Aliás, logo aparecerá um compilador para Java também. É apenas questão de tempo.
    Em 2002, uma pesquisa do grupo Gartner comprovou a existência de dois milhões de programadores Cobol no mundo.
    Cobol paga bem. Dada a necessidade por profissionais que saibam trabalhar com Cobol, e a escassez de mão-de-obra, temos como resultado um aumento significativo dos salários destes programadores. Os salários podem chegar a até R$ 12.000. No exterior, a situação é ainda melhor.
    Programas feitos em Cobol costumam ficar em execução por décadas, ou seja, estes sistemas estão em execução não porque simplesmente “já existem”, mas sim porque são extremamente fáceis de se manter. Boa parte do problema do agora risível “bug do milênio” se deveu ao fato de que os desenvolvedores iniciais daquelas aplicações (a maior parte, escrita em… adivinha!) não imaginava que elas fossem durar tanto tempo.
    Dado que o ponto forte de venda de plataformas como Java e .net é justamente a facilidade de manutenção destes sistemas, soa quase “conspiracionista” pensar no porquê deste fato ser tão pouco mencionado.
    A sintaxe não é horrível. Sério: eu imaginava que a sintaxe do Cobol fosse algo ridículamente complexo e, para a minha surpresa,  é incrívelmente simples. Parece inclusive linguagem coloquial, tal como nos exemplos abaixo:

1          MULTIPLY B BY B GIVING B-SQUARED.
2          MULTIPLY 4 BY A GIVING FOUR-A.
3          MULTIPLY FOUR-A BY C GIVING FOUR-A-C.
4          SUBTRACT FOUR-A-C FROM B-SQUARED GIVING RESULT-1.
5          COMPUTE RESULT-2 = RESULT-1 ** .5.
6          SUBTRACT B FROM RESULT-2 GIVING NUMERATOR.
7          MULTIPLY 2 BY A GIVING DENOMINATOR.
8          DIVIDE NUMERATOR BY DENOMINATOR GIVING X.

    Como pode ser visto no exemplo acima, na realidade, é extremamente coloquial!
   Claro, o exemplo que dei acima é péssimo. Trata-se da execução da fórmula de Bhaskara (lembra? Para se calcular equações de segundo grau…). Isto quer dizer que você não pode escrever fórmulas complexas em Cobol? Claro que não, veja o exemplo abaixo:

1          COMPUTE X = (-B + (B ** 2 - (4 * A * C)) **.5) / (2 * A)

   Após tomar conhecimento destes fatos, uma pergunta fica: por que tão poucas pessoas sabem disto? Por que temos a impressão de que as linguagens mais utilizadas são Java, C/C++, C#, Visual Basic, PHP ou outras? Simples: por causa do mercado no qual Cobol é focado.
   Cobol foi desenvolvido para a criação de aplicações de negócios, ou seja, não se trata aqui do mercado horizontal (que produz software de prateleira, ou componentes que são feitos para serem distribuídos), mas sim do mercado vertical, ou seja, Cobol é mais utilizado na confecção de aplicações internas para empresas. Aplicações estas que, normalmente, jamais sairão do ambiente para o qual foram desenvolvidas. Este é o porquê. Ao vermos uma aplicação como o Word, por exemplo, sendo vendida aos milhões, passamos a achar que C++ é uma das linguagens mais utilizadas no mundo. No entanto, nos esquecemos de que esta aplicação foi desenvolvida por apenas UM pequeno grupo de desenvolvedores (em comparação ao resto).

E por que devemos nos preocupar com Cobol?

   Tal como expus acima: porque Cobol possui um mercado imenso, assim como as oportunidades que podem surgir do mesmo. Mais um fato interessante com relação ao mercado: foi estimado que o custo de substituição de código Cobol por código em outra linguagem gira em algo em torno de US$ 25,00 por linha de Código Cobol substituida. Uou!
    Para acabar com a ilusão de que nossa plataforma de desenvolvimento é a “mais linda do mundo” por ser relativamente recente. Só para lembrar: Cobol foi desenvolvido no final da década de 50. Foi uma das primeiras linguagens de programação e, até hoje, é utilizada em massa com relativamente poucas alterações desde sua introdução.
    Cobol é a coisa mais linda do mundo? Não. É uma das sete maravilhas do mundo? Também não. Mas também, como pode ser visto, com certeza não é uma das maiores desgraças da história.
    Conseguirá Java e C# por exemplo esta façanha? Atualmente, só conheço três linguagens que conseguiram: Cobol, Lisp e Fortran.

E eu sei Cobol? Ainda não. ;)

à Histórico
   A linguagem de programação vêm desde a época da Babilônia, os programadores dessa época escreviam os algoritmos na linguagem natural e serviam apenas  para descrever o procedimento da vida cotidiana. Não se usavam variáveis, apenas os números serviam como exemplo.Então desde antes de cristo já existe a linguagem de programação, mas que não possuía nenhum método e servia apenas para o cotidiano da vida.
   Em 1800 e pouco surge Augusta Ada, a primeira programadora, filha de um poeta inglês Lord Byron. Ada quebrou Tabu, pois uma mulher não podia ter escolaridade, e teve aulas de matemática. Tornou-se reconhecida por ter escrito algoritmos que permitiam a máquina analítica de Babage de computar.
   Em 1936 konrad Zuse constrói um computador  mecânico, era um ábaco com pinos de metal e correia, programado por fitas perfuradas. Zuse em 1945 -46 também criou uma linguagem de programação chamada Plankalkul, nessa linguagem implantou idéias revolucionárias de atribuição, expressões aritméticas, tipo primitivo e tipo derivado, execução condicional, laços, sub-rotinas, asserções. Mas não teve muita significância na história das linguagens.
   Programar antigamente era muito difícil, pois programar em assembly gerava muitos erros e exigia um grande esforço intelectual, o mais simples era perfurar os cartões. Como facilitador da vida do programador surgem os copiladores primitivos, que tinham a função de verificar a lógica do algoritmo.
Ex: short code, A0, A1 e A2.
   Linguagem que também surgiram nessa época foi o ENIAC coding System, 1943, e o C-10, 1949.

   Umas das primeiras linguagem de programação a se tornar bastante popular foi o Fortran, criada em 1954 por John Backus na IBM, que diminuiu muito os erros de programação e com seu copilador gerava códigos de qualidade. Inicialmente não executava códigos grandes, mas com o surgimento de programas grandes o Fortran evoluiu e passou a ser uma linguagem modular.  O Objetivo do Fortran era se tornar independente de máquina.
   Em 1956, surge numa conferência de I.A. (inteligência artificial), uma linguagem para um programa de raciocínio, no qual possuía possibilidades de suportar listas encadeadas. A LISP (Information Processing Language), criada por John McCarthy e outros, tornou-se a linguagem mais utilizada em I.A e até a década de 80 não possuía nenhuma padronização, permitindo que cada computador possuísse sua própria LISP, hoje já possui uma padronização e é a segunda linguagem de programação utilizada.
   Em 1957 com o “baby boom” da linguagem de programação, houve a necessidade de uma regularização, uma padronização então surge o comitê internacional que tinha um objetivo de criar uma linguagem única, no qual foi denominada de ALGOL. Três projetos foram aprovados o Algol 58, Algol 60 e Algol 68. O ALGOL trouxe muitas idéias revolucionárias para as linguagens de programações, e todas as linguagens criadas a partir de 1958 tem idéias baseadas no ALGOL , idéias como:
     -Bloco delimitadores, Estrutura Léxica formato livre, sintaxe definida via BNF, Escopo de Bloco, Tipagem estática com anotações de tipo, IF-then-else aninhados, chamada por valor, recursão e expressões condicionais, alocação de memória, procedimentos de primeira classe, operadores definidos pelo usuário e etc. O ALGOL formulou o que hoje chamamos de linguagem estruturada. Infelizmente não se tornou popular como era esperado, pois não possuía suporte governamental ou corporativo, existiam alguns erros e o projeto negligenciou a entrada/saída de dados. 
   Em 1960 surge também o COBOL (COmmon Business Oriented Language),  Linguagem Orientada aos Negócios, que define seu objetivo principal. Criada por Grace Hoper  para ser usada em sistemas comerciais, financeiros e administrativos para empresas e governos. O COBOL 2002 inclui suporte para programação orientada a objetos e outras características das linguagens modernas.
Em 1970 surge a linguagem Pascal, uma linguagem de programação estruturada, que recebeu este nome em homenagem ao matemático Blaise Pascal. Criada pelo suíço Niklaus Wirth, tendo em mente encorajar o uso de código estruturado.
   O Pascal foi criada simultaneamente para ensinar programação estruturada e para ser utilizada em sua fábrica de software. Simultaneamente, a linguagem reflete a liberação pessoal de Wirth das restrições impostas após seu envolvimento com a especificação de ALGOL 68. Grande parte de seu sucesso se deve a criação, na década de 1980, da linguagem Turbo Pascal, inicialmente disponível para computadores baseados na na arquitetura 8086 (com versões para 8080 no seu início). Pascal é normalmente uma das linguagens de escolha para ensinar programação.
   Simula inventada nos anos de 1960 por Nygaard e Dahl, sendo um conjunto de Algol 60. Simula foi a primeira linguagem a suportar o conceito de classes.
C foi umas das primeiras linguagem de programação voltada para sistemas, criada entre 1969 e 1973 por Dennis Ritchie e Ken Thompson.
   Em 1971 surge a linguagem denominada de SmallTalk, criada por Alan Kay, foi a primeira linguagem orientada a objeto, tudo nesta linguagem é objeto. Ainda hoje essa linguagem é usada, e todas as linguagens descendentes acabaram enfatizando mais a sua eficiência em copilação.
   Em 1972 surge a Prolog, criada por Alain Coumerauer e Philippe Roussel, sendo parte de um projeto de I.A. baseado em deduções lógicas. Em 1964 surge a ML, sendo uma linguagem escrita para axiomas e teoremas, já que nessa época as construções de provas de teoremas e axiomas estavam em moda.
   Na década de 90 , era da internet, surge o conceito de aplicações de desenvolvimento rápido, com isso a preocupações das linguagem eram em ser funcionais para o ambiente web. Tendo como seus antecessores linguagens Orientada a Objetos, surge linguagem com Object pascal, visual Basic e C#. O Java, na época denominada de OAK (a denominação Java ocorreu em 1995), era uma linguagem mais conservadora que atraiu também muitos adeptos. Na era da internet também surgiram as linguagem de scripting que eram mais radicais e inovadoras que a linguagem RAD, não descende diretamente de nenhuma linguagem, portanto contam com uma sintaxe nova e incorporação liberal de novas funcionalidades.

Resumo dos Históricos das Linguagem de Programação

1943 - Plankalkül (Konrad Zuse)
1943 - ENIAC coding system
1949 - C-10
1951 - Regional Assembly Language
1952 - Autocode
1954 - FORTRAN
1955 - FLOW-MATIC (ant. do COBOL)
1957 - COMTRAN (ant. do COBOL)
1958 - LISP
1958 - ALGOL 58
1959 - FACT (antecessor do COBOL)
1959 - COBOL
1962 - APL
1962 - Simula
1964 - BASIC
1964 - PL/I
1970 - Pascal
1970 - Forth
1972 - C
1972 - Smalltalk
1972 - Prolog
1973 - ML
1978 - SQL
1983 - Ada
1983 - C++
1985 - Eiffel
1987 - Perl
1989 - FL (Backus)
1990 - Haskell
1991 - Python
1991 - Java
1993 - Ruby
1993 - Lua
1994 - ANSI Common Lisp
1995 - JavaScript
1995 - PHP
2000 - C#
2008 - JavaFX Script

Tipos de linguagem de Programação

   O computador só entende uma linguagem conhecida como código binário ou código de máquina.

Classificação de linguagem em relação ao grau de abstração

     -Baixo nível
          Linguagens mais próximas da arquitetura de hardware.
               Ex: Assembly
    -Médio nível
         Definição não é bem aceita por todos, encontra se em um ponto médio entre a linguagem de baixo nível e a de alto nível.
               Ex: C,C++
    -Alto nível
          Linguagens mais próximas dos programadores
               Ex: Fortran

Classificação quanto a geração

    Primeira Geração – são linguagens interpretadas diretamente pela máquina, ou seja, escrita na linguagem de máquina.
    Segunda Geração – são linguagens de montagem ou assembly, legível por ser humano para o código de máquina que uma arquitetura de computador específica usa.
    Terceira Geração – é uma linguagem projetada para ser facilmente entendida pelo ser humano, incluindo coisas como variáveis com nomes.
    Quarta Geração – são linguagens de alto-nível com objetivos específicos, como o desenvolvimento de software comerciais de negócios. Elas permitem o programador  especificar o que deve ser feito visando um resultado imediato.  A diferença entre as de terceira geração e de quarta geração, é que estas primeiras são linguagens procedurais que descrevem como fazer algo, enquanto a segunda descreve o que você quer que seja feito.
    Quinta Geração – são linguagens que mais se aproxima da linguagem real.


Tipos da Linguagem

    -Linguagem interpretada:
       Linguagem interpretada é uma linguagem de programação, onde o código fonte nessa linguagem é executado por um programa de computador chamado interpretador, que em seguida é executado pelo sistema operacional ou processador.

    -Linguagem compilada
      Linguagem compilada é uma linguagem de programação, onde o código fonte nessa linguagem é executado diretamente pelo sistema operacional ou pelo processador, após ser traduzida, através de um processo chamado compilação, usando um programa de computador chamado compilador, para uma linguagem de baixo nível, como linguagem de montagem ou código de máquina.

    -Linguagem marcação
    Linguagem marcação é um sistema moderno para anotação de um texto de modo que seja sintaticamente distinguível daquele texto. Sgml,html,xml.

   -Linguagem script
      Linguagem script são linguagem executadas no interior de programas e/ou de outras linguagens de programação, não se restringindo a esse ambiente.

   -Linguagem servidor
       Asp, asp.net

   -Linguagem de banco de dados
       sql

   -Linguagem estruturada
       As linguagens procedurais são um dos sub-tipos das linguagens chamadas “estruturadas”.
      * Design descendente (top-dow): o problema se descompõe em etapas ou estruturas hierárquicas.
          * Recursos abstratos (simplicidade): consiste em descompor as ações complexas em outras mais simples capazes de ser resolvidas com maior facilidade.
            * Estruturas básicas: existem três tipos de estruturas básicas: 
               - Estruturas sequenciais: cada ação segue a outra ação sequencialmente. A saída de uma ação é a entrada de outra.
       - Estruturas seletivas: nestas estruturas avaliam-se as condições e em função do resultado das mesmas realizam-se umas ações ou outras. Utilizam-se expressões lógicas.
       - Estruturas repetitivas: são seqüências de instruções que se repetem um número determinado de vezes.

   -Linguagem modular
       Na programação modular, o programa principal coordena as chamadas aos módulos secundários e passa os dados necessários em forma de parâmetros. Por sua vez cada módulo pode conter seus próprios dados e chamar a outros módulos ou funções.

   -Linguagem funcionais
         Linguagens funcionais são linguagens que evidenciam um estilo de programação diferente das linguagens procedurais, chamado de programação funcional. A programação funcional enfatiza a avaliação de expressões, ao invés da execução de comandos. As expressões nessas linguagens são formadas utilizandose
funções para combinar valores básicos.

   -Linguagem orientada a objetos
         É um paradigma de análise , projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos.

Conceito importante:
Herança
Poliformismo
encapsulamento

   -Linguagem programação visual
        As linguagens de programação visual partem do princípio de que gráficos são mais fáceis de serem entendidos do que textos. Sendo assim, a especificação de um programa por meio de diagramas e outros recursos gráficos tende a tornar a própria programação mais fácil, permitindo mesmo que usuários sem muitas habilidades em programação gerem programas.
               Ex: Simulink, Khoros.

    As 10 Linguagem mais utilizadas
           1. C
              2. Java
                 3. Visual Basic
                    4. C++
                       5. SQL
                          6. Pascal
                              7. C#
                                 8. Fortran
                                    9. Delphi
                                        10. Ruby

Paradigmas da Linguagem de Programação

   Definiu-se de como o programador lida com determinado problema, da sua visão de estruturação e execução do programa. Antigamente se achava que o homem que se adaptava a máquina e com a evolução das máquinas capacitaram ela a fazer o que o homem desejava, esse pensamento era conhecido como programação linear. Na realidade surgiram diferentes trajetórias, e que cada linguagem se adaptava ao paradigma em qual foi criado. Esses paradigmas servem para facilitar o desenvolvimento de algoritmo.

Ex: Paradigma Imperativo;
      Paradigma Declarativo;
      Paradigma Funcional;
      Paradigma Estruturada;
      Paradigma Orientado a Objetos;
      Paradigma Orientada a Aspecto;
      Paradigma Com Restrições;
      Paradigma Genérica;
      Paradigma Multiparadigma.

        -Paradigma Imperativo

   “Primeiro faça isso e depois faça aquilo.”
Chamado também de paradigma procedural, sua base se caracteriza por ter seu problema analisado até que se encontre uma solução, sempre um problema de cada vez. É uma seqüência de comandos que o computador executa, passo-a-passo, modificando dados e variáveis para que se possa chegar a um resultado satisfatório.

Exemplo de linguagem Imperativa é C, Ada, ALGOL, PHP, Cobol, Fortran, Lua, Pascal e etc.

Ex: Algoritmo de Ordenação escrito em C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int InsertionSort(int *vetor, int tam){
               int i, j, elemento;

               for (i=1; i<tam; i++){
                               elemento=vetor[i];
                               j=i-1;
                               while ((j >= 0) && (vetor[j] > elemento)){
                                              vetor[j+1] = vetor[j];
                                              j--;
                               }
                               vetor[j+1] = elemento;
               }

               return 0;
}
  
        -Paradigma Declarativo

   “Qual é o problema?”
Caracteriza-se pelo método preciso de descrever um problema, sem se preocupar com qual algoritmo será utilizado para resolvê-lo. Nesse paradigma a idéia é criar um algoritmo que funcione para qualquer problema, ou seja, um algoritmo “Universal”.

Exemplo de linguagem Declarativa Prolog,

Ex: Algoritmo escrito em Prolog
1
2
3
4
5
6
fatorial(0, 1).
fatorial(N, F) :-
      N>0,
      Nmenos1 is N-1,
      fatorial(Nmenos1, X),
      F is X * N.
  
        -Paradigma Funcional
   Caracteriza-se pela a subdivisão de problema e resolução separadamente desse problema. As soluções desses microproblemas no final se associaram para mostrar a solução do Problema.

Exemplo de linguagem Funcional Haskell.

Ex: Algoritmo em Haskell.
1
2
3
4
5
pertence :: Eq t => t -> [t] -> Bool
pertence x (c:r)
    | x == c = True
    | otherwise = pertence x r
pertence x [] = False

        -Paradigma Estruturado
   É uma forma de programação que preconiza todos os programas podem ser reduzido a três estruturas: seqüência, decisão e repetição. A programação estruturada orienta os programadores a criar seus programas com estruturas simples, usando as sub-rotinas e as funções. Essa forma ainda é bastante usada, principalmente na aprendizagem da programação.

Exemplo de linguagem Estruturado Cobol, PHP, Pearl.

        -Paradigma Orientado a Objetos
    Caracteriza-se pela resolução do problema através de Objetos (classes) e interações entre objetos. Tudo são Objetos organizados Hierarquicamente que si comunicam entre si.

Exemplo de linguagem Orientado a Objetos.

Ex: Algoritmo em Java.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Caminhao extends Veiculo {

    private double capacidade;
    private int numEixos;

    public Caminhao(double capacidade, int numEixos) {
        this.capacidade = capacidade;
        this.numEixos = numEixos;
    }

    public double calcularIPVA() {
        return 0.05 * this.getValor();
    }
}

        -Paradigma Orientada a Aspecto
   Proposta criada por Gregor Kiczales, é um paradigma de programação que permite aos desenvolvedores de software separar e organizar o código de acordo com a sua importância para aplicação. Difere muito do conceito da Programação Orientada a Objeto e tem funcionalidade similar aos protocolos de meta-objetos. Esse paradigma inclui também composition filters e abordagem por Hyperslices. Os aspectos formam uma extensão de lógica de segunda ordem e possibilita um raciocínio baseado em conjuntos destas entidades utilizando pointcuts com um caráter de substituição na sua assinatura. A desvantagem desse paradigma é a depuração que pode se tornar imprevisível quando não definida bem.
Exemplo de linguagem Orientado a Aspecto é AspectJ (extensão para Java), AspectH (extensão para Haskell).

        -Paradigma Com Restrições
   É um paradigma de programação que se refere ao uso de restrições na construção de relações entre as variáveis. Esse paradigma consiste em especificar para uma solução o s critérios que este será obrigado a cumprir. Inicialmente fazia parte do contexto da programação da lógica e hoje já possui extensão para programação funcional e imperativa.
Exemplo de linguagem com Restrição é Oz e Kaleidoscope.

        -Paradigma Genérica
   É um paradigma no qual os algoritmos são escritos em uma gramática de forma a adaptar-se através da especificação das partes variáveis que são definidas na instância do algoritmo. É diferente da forma normal de programação na medida em que invoca de certa forma as facilidades da linguagem. Como isso ocorre novas semânticas e a linguagem é enriquecida no processo. Não envolve a geração de código fonte, pelo menos visivelmente ao programador. O paradigma permite que um parâmetro assuma diferentes tipos de dados desde que certas regras sejam mantidas, como sub-tipos e assinaturas.

       - Paradigma Multiparadigma
  É uma linguagem que suporta mais de um paradigma de programação. A ideia de uma linguagem multiparadigma é fornecer um framework no qual o programador possa trabalhar com vários estilos, misturando livremente construtores de diferentes paradigmas. O objetivo em se projetar linguagens deste tipo é reservar aos programadores a melhor ferramenta para determinado trabalho, admitindo que nenhum paradigma resolva todos os problemas da maneira mais elegante, ou mesmo eficiente.
Exemplos de linguagem multiparadigma é a Scala.