Linguagens de Programação: Conceitos, Critérios e Paradigmas

Classificado em Computação

Escrito em em português com um tamanho de 10,29 KB

O que é uma Linguagem de Programação?

  • Uma Linguagem de Programação é uma linguagem destinada a ser usada para expressar o processo através do qual um computador pode resolver um problema.

Critérios de Avaliação das Linguagens

  1. Legibilidade de Programas

    Facilidade com a qual o seu código pode ser lido e entendido. Deve ser considerada no contexto para o qual ela foi projetada, ou seja, um programa feito em uma linguagem não projetada para seu uso tende a ser mais "confuso".

    1.1 Simplicidade

    Linguagens complexas permitem construções difíceis de entender, e linguagens simples demais podem gerar programas longos. Há outros fatores que podem complicar a linguagem, como:

    • Multiplicidade de Recursos e
    • Sobrecarga (Overloading).
    Multiplicidade de Recursos

    Refere-se ao fato de haver mais de uma maneira de realizar a mesma operação. Exemplo: acrescentar a um contador em C: Count+=1 ou Count++. Ambas fazem a mesma coisa.

    Sobrecarga (Overloading)

    Um único símbolo pode ter mais de um significado. Exemplo em C: o símbolo + pode ser usado para adição de floats ou adição de inteiros.

    1.2 Tipos de Dados e Estruturas

    Presença de estruturas adequadas para definir estruturas de dados. Por exemplo, em C, que utiliza uma representação numérica para o tipo booleano (var_inicializada=1 (True) ou var_inicializada=0 (False)), o significado mais claro seria var_inicializada=true.

    1.3 Ortogonalidade

    A ortogonalidade de uma linguagem está relacionada com a capacidade de combinar suas estruturas primitivas para criar as estruturas de controle e de dados da linguagem. De modo geral, a ortogonalidade está relacionada com a simplicidade do projeto, pois quanto mais ortogonal, menos exceções às regras existirão, tornando a linguagem mais fácil de ser aprendida.

    1.4 Boa Definição

    Envolve a clareza na gramática e semântica.

    • Palavras Reservadas: Ter cuidado com elas. Em C, por exemplo, as chaves servem para delimitar blocos de comandos e laços (loops).
    • Forma e Significado: Projetar instruções que indiquem, pelo menos parcialmente, a sua finalidade, auxiliando na legibilidade do código.
    1.5 Facilidade de Escrita

    Os programas devem ser fáceis de escrever.

    1.6 Suporte à Abstração

    Deve oferecer a criação de tipos abstratos de dados. Expressões complexas devem poder ser escritas com maior naturalidade. Existem 2 tipos de abstração: processos e dados.

    • Abstração de Processo: É o uso de biblioteca para implementar um algoritmo usado várias vezes por um programa. Basta referenciá-lo, abstraindo detalhes de sua implementação.
    • Abstração de Dados: Refere-se à capacidade de se utilizar estruturas adequadas para representá-los, como é o caso das classes adotadas nas linguagens modernas.
  2. Confiabilidade

    Os programas gerados por uma linguagem devem ter poucos erros.

    II.1 Verificação de Tipos

    Com tipos fortes, erros comuns são detectados mais facilmente. A verificação de tipos representa um papel importante na confiabilidade de uma linguagem. É uma tarefa dispendiosa que deve ser feita em tempo de compilação. Uma linguagem com tipagem fraca é mais suscetível a erros e reduz a confiabilidade.

    II.2 Tratamento de Exceções

    É a capacidade de um programa detectar erros em tempo de execução.

  3. Custos

    Os custos incluem gastos com a compra de compiladores e ferramentas, treinamento e manutenção, tempo de desenvolvimento, compilação e execução. É também um critério decisivo a ser considerado.

Características Importantes das Linguagens de Programação

  1. Legibilidade: A linguagem não deve induzir o programador a erros que não possam ser descobertos com facilidade. A linguagem deve ajudar o programador a identificar erros. É a principal virtude de uma linguagem.
  2. Eficiência do Programa Compilado: A estrutura facilita o processo de geração e otimização de código. O programa tem que fazer uso eficiente dos recursos.
  3. Eficiência do Processo de Compilação: A estrutura da linguagem facilita o processo de compilação.
  4. Disponibilidade de Ferramentas: Existir ferramentas amigáveis para que a interpretação seja realizada, permitindo facilidade e eficiência.
  5. Disponibilidade de Bibliotecas: Existir bibliotecas de software para uso geral ou específico.
  6. Portabilidade: Um projeto desenvolvido em uma linguagem de programação deve ser possível de execução em várias plataformas.

Paradigmas de Linguagem de Programação

Um paradigma é uma forma como a linguagem lida com um determinado problema. São os 4 paradigmas considerados principais:

Paradigma Imperativo

“Primeiro faça isso, depois aquilo”. A frase resume o paradigma imperativo, também conhecido como o paradigma procedural. C e Basic são algumas das linguagens de programação que seguem esse paradigma.

Paradigma Declarativo

“Qual é o problema?”. O paradigma declarativo caracteriza-se pelo método preciso de descrever um problema sem se preocupar com qual algoritmo será utilizado para resolvê-lo. PROLOG é a principal linguagem que utiliza esse paradigma.

A ideia é criar um algoritmo usando axiomas (verdades universais) e regras de inferência. Utiliza sentenças lógicas para a programação. Exemplo (Prolog):

  • Todo gato é bonito
  • Se x é gato, então x é folgado
  • Viant é gato

Paradigma Funcional

Subdivide o problema em funções menores e resolve cada uma separadamente, utilizando os resultados encontrados posteriormente. Sobre o paradigma funcional, é fácil ilustrar através de um fluxograma: cada bloco recebe no topo uma entrada de dados e retorna, na base, os dados de saída. A solução geral é dividida em várias funções que, no final, se associam para mostrar o resultado na tela. Um exemplo de linguagem pode ser a LISP.

Paradigma Orientado a Objetos (POO)

As técnicas orientadas a objeto permitem que o software seja construído de objetos que tenham um comportamento específico. Os próprios objetos podem ser construídos a partir de outros, os quais, por sua vez, podem ainda ser construídos de outros.

A análise de sistemas no mundo orientado a objeto é feita analisando-se os objetos e os eventos que interagem com esses objetos. O projeto de software é feito reusando-se classes de objetos existentes e, quando necessário, construindo-se novas classes.

Entre as ideias fundamentais básicas para o Modelo Orientado a Objeto incluem-se os principais conceitos desse paradigma:

  • Objetos: Qualquer estrutura que faz parte de um grupo.
  • Classes;
  • Métodos;
  • Herança: É comum haver similaridades entre diferentes classes. Frequentemente, duas ou mais classes irão compartilhar os mesmos atributos e/ou métodos. Para não reescrever várias vezes o mesmo código, deve haver algum mecanismo que possa tirar proveito dessas similaridades. A herança é esse mecanismo. Por intermédio da herança, é possível modelar.
  • Encapsulamento.

Nomes, Vinculações, Verificação de Tipos e Escopos

Nomes

Um nome é uma cadeia de caracteres para identificar alguma entidade, como, por exemplo, uma variável.

Em algumas linguagens como JAVA, C e C++, há distinção entre letras maiúsculas e minúsculas.

Exemplo: GATO, Gato e gato. Em alguns casos, pode haver prejuízo na legibilidade.

Palavras-chave e especiais também devem ser tratadas com cuidado:

Em FORTRAN, por exemplo, é possível escrever:

  • INTEGER REAL; (Declarando uma variável cujo nome é Real.)
  • REAL INTEGER; (Declarando uma variável do tipo real com o nome Integer.)

Às vezes, você tem um programa que pode usar variáveis que são a mesma palavra, mas ‘uma letra maiúscula’ pode mudar a ação no código.

Variáveis

São abstrações de uma célula de memória de um computador. É caracterizada por seis atributos: nome, endereço, valor, tipo, tempo de vida e escopo.

  • Nome: Cadeia de caracteres para identificar a variável.
  • Endereço: É o mesmo da memória à qual ela está associada, é conhecido como l-value (valor à esquerda).
  • Valor: Corresponde ao r-value (valor à direita) da variável. Exemplo: Contador = contador + 1 (l-value = r-value).
  • Tempo de Vida: É o intervalo de tempo durante o qual um conjunto de células de memória está amarrado (ou vinculado) a uma variável.
  • Tipo: É a faixa de valores que a variável pode ter e o conjunto de operações definidas para os valores do tipo. Quando você define uma variável do tipo inteiro, ela terá uma faixa de valor (ex: -xxxxxx até +xxxxxx) e só poderá fazer contas de adição, subtração ou divisão.

Checagem de Tipos, Erros e Escopo

  • Checagem de Tipos: É a atividade de se assegurar que os operandos de um dado operador tenham tipos compatíveis.
  • Erro de Tipos: É a aplicação de um operador sobre um ou mais operandos cujos tipos são impróprios.
  • Coerção: Converte automaticamente de um tipo para outro. Exemplo: Média = (7.2 + 7) / 2;
  • Escopo: O escopo de uma variável é o trecho de programa no qual a variável pode ser vista, isto é, referenciada. Pode ser estático ou dinâmico. É aqui que você referencia a variável e define o escopo.

Entradas relacionadas: