A Natureza de uma Linguagem de Programação

VN:RO [1.9.11_1134]
segunda-feira, 9 d novembro d 2009
Por Rafael Barbolo, Coop10. Siga no Twitter

Uma linguagem de programação é uma linguagem que possui sintaxe (formato) e semântica (significado), e é usada para expressar uma sequência de ações computacionais que formam um programa.

Existem milhares de linguagens de programação e novas linguagens surgem frequentemente, trazendo novos paradigmas e estabelecendo novos padrões para programadores. Por isso, é importante conhecer as diferenças principais entre as linguagens e quando o uso de cada uma delas é mais adequado.

Linguagens de Programação

Para explorar as diferenças entre elas, serão discutidos os seguintes assuntos: o que são tipos de sistema estáticos ou dinâmicos, o que são linguagens fortemente ou fracamente tipadas e quais são os modos de execução de um programa (código executável compilado ou interpretação de código fonte).

Tipo estático ou dinâmico

As linguagens de programação podem ser classificadas de acordo com o tipo de sistema que elas usam. O tipo de sistema define como são os métodos e as variáveis da linguagem.

Em uma linguagem de tipo estático, o compilador deve conhecer o tipo de uma variável ou método antes da execução do programa (por isso, o tipo de uma variável normalmente é explicitamente declarado). Em uma linguagem de tipo dinâmico, o tipo de uma variável ou método é desconhecido até a execução do programa.

Exemplo prático de declaração de uma variável inteira com valor 10:

Java (Tipo estático):

int a = 10;

Ruby (Tipo dinâmico):

a = 10

Exemplos de linguagens de tipo estático: Java, Pascal, C, C# e C++.
Exemplos de linguagens de tipo dinâmico: Python, Javascript, Perl e Ruby.

Fortemente ou fracamente tipada

Um objeto é determinado pelo que ele pode fazer e não pelo seu tipo.

(tipo fraco)

Um conceito que muita gente confunde com tipo dinâmico ou estático é se uma linguagem é fortemente ou fracamente tipada.

A definição de fortemente ou fracamente tipada tem relação com quão profundamente um sistema verifica as operações que podem ser feitas sobre uma estrutura de dados.

Em linguagens fortemente tipadas, as operações são aplicadas para estruturas de dados bem definidas e cada operação define os tipos de dados que deve receber. Em linguagens fracamente tipadas, as operações são aplicadas para qualquer estrutura de dados; porém, essas operações podem falhar em tempo de execução caso a estrutura não suporte a operação.

Em uma linguagem fortemente tipada o sistema tem garantias sobre o comportamento do programa. Em uma linguagem fracamente tipada, essa garantia não existe porque uma estrutura de dados pode receber novas funcionalidades em tempo de execução.

Exemplo de uma função que realiza a soma de dois números, um inteiro e um ponto flutuante, e devolve um resultado em ponto flutuante:

Java (Fortemente tipada):

float soma(float a, int b) {
    return a + b;
}

Ruby (Fracamente tipada):

def soma (a, b)
  return a + b
end

Em Java, os tipos de dados que a operação soma suporta estão bem definidos (a é float e b é int) e o tipo de dado que a operação devolve também (resultado é float).

Em Ruby, a função soma pode receber quaisquer tipos de dados para a e b, e a operação será aplicada sobre esses tipos, devolvendo um resultado de tipo desconhecido:

  • se a e b forem String, o resultado será uma String concatenada de a e b;
  • se a e b forem inteiros, o resultado será um inteiro que representa a soma a+b;
  • se a for um float e b um inteiro, o resultado será um float que representa a soma a+b.

Vale a pena observar que em linguagens fracamente tipadas, a possibilidade de erros em tempo de execução é muito maior. Por isso, é muito recomendável o uso de testes para verificar erros antes de colocar um sistema em produção.

Exemplos de linguagens fortemente tipadas: Java, Pascal, C e C++.
Exemplos de linguagens fracamente tipadas: Perl e Ruby.

Linguagens compiladas ou de script

Outro modo de classificar uma linguagem é se ela precisa de um passo de compilação antes de executar. Se ela precisa deste passo, ela é chamada de linguagem compilada. Senão, é chamada de linguagem de script.

Um compilador de uma linguagem compilada gera um código executável a partir do código fonte escrito pelo programador. O código executável não possui o conteúdo do código fonte, portanto programas de linguagens compiladas são melhores de distribuir quando o programador não quer que seu código seja público.

Uma linguagem de script normalmente não necessita de um passo específico de compilação para executar um programa. O código fonte escrito pelo programador pode ser executado diretamente por um intepretador. Esse interpretador lê trechos do código fonte em tempo de execução, converte em um formato que o computador consegue ler (compilação em tempo de execução) e realiza sua execução.

Linguagens de script costumam ter performance inferior a linguagens compiladas pois exigem mais passos para rodar um programa em tempo de execução. Porém, elas são muito mais produtivas, pois eliminam a necessidade de compilar o código fonte toda vez que uma alteração é feita.

Quem já mexeu no código fonte de uma aplicação web sabe como é muito melhor trabalhar com linguagem interpretada: você faz uma alteração no código, salva e pode verificá-la de imediato.

Quando usa uma linguagem compilada, como Java, você tem que compilar o código fonte (que pode levar um tempo considerável, dependendo do sistema), fazer o upload do código para o servidor web e só então verificar a alteração.

Exemplos de linguagens compiladas: Java, C, C++ e C#.
Exemplos de linguagens de script: PHP, Perl, Python e Ruby.

Considerações finais

Este artigo apresenta conceitos básicos sobre linguagens de programação que podem ser decisivos para a escolha de uma.

Para ambientes corporativos, em que uma das exigências principais é a estabilidade e performance do sistema, uma linguagem de tipo estático, fortemente tipada e compilada, como Java, é uma boa escolha.

Para uma aplicação que sofre muitas alterações e que exige alta performance (como por exemplo o Twitter), uma combinação de linguagens de script e compiladas é uma boa escolha. Por exemplo, combinar Ruby ou Python com C, ou usar uma linguagem que suporta tanto interpretação quanto compilação, como Scala.

Para cada situação existe um tipo de linguagem de programação mais adequada. O ideal é não ficar preso aos mesmos paradigmas e nunca achar que a linguagem de programação preferida é a melhor para resolver qualquer problema.

Deixo a dica de um amigo meu, Edmar Miyake, para ficar atualizado com os novos paradigmas de programação: estudar uma nova linguagem de programação por ano.

VN:F [1.9.11_1134]
Rating: 4.7/5 (11 votes cast)
A Natureza de uma Linguagem de Programação, 4.7 out of 5 based on 11 ratings
Related Posts with Thumbnails

Rafael Barbolo
Rafael Barbolo

Engenheiro de Computação e administrador do Bit a Bit. Empreendedor desde 2007. É sócio e cofundador do Kauplus, plataforma de e-commerce que oferece inovadoras experiências de compras online.

Tags: , , , , , , , , , , , , , , , , , , ,

5 Comentários para “A Natureza de uma Linguagem de Programação”

  1. Show cara!!!

    Se tivesse lido esse post antes, não ia ficar maluco tentando entender o livro que estou lendo sobre Cocoa!

    Aliás, acho que é algo que vale citar, que Objective-C (a linguagem pra Macs e iPhone) aceita tipagem forte ou fraca! Inclusive, no livro que estou lendo, ele comenta que pode parecer estranho usar tipagem fraca se você está mais acostumado com tipagens fortes, mas que as coisas funcionam tão bem quanto e te permitem maior flexibilidade!

    Esse mesmo exemplo que você citou (a + b), em Javascript, se não me engano, mesmo uma delas sendo uma String, é feita uma soma… agindo de maneira diferente do Ruby!

    Parabéns Barbolo! Excelente post!

    VA:F [1.9.11_1134]
    Rating: +2 (from 2 votes)
    #73
  2. Acho que o escopo foi muito limitado do seu texto.

    Você apenas focou linguagens imperativas e de “orientação a objetos” (sim, com aspas!) e esqueceu de descrever o que realmente faz linguagens de programação diferentes: o paradigma.

    Na sua “colagem de logos” você colocou Haskell e Erlang, por exemplo, mas não as definiu no seu texto. Onde se encaixariam?

    Paradigmas são o que realmente diferenciam linguagens e, entre eles, podemos citar:
    (1) Declarativo, como Prolog
    (2) Imperativo, como C e Pascal
    (3) Orientado a Objetos, como Smalltalk e Java
    (4) Funcional, como LISP, Haskell e Erlang

    Não me lembro, agora, se há outros paradigmas (o Wikipédia não é a melhor referência nesse assunto). Preciso dar uma olhada no livro de Compiladores para relembrar. Mas esse é o “verdadeira razão” pela qual se diferenciam as linguagens.

    Uma excelente referência é o livro “Programming Language Landscape” [ http://portal.acm.org/citation.cfm?id=5429 ] ou os professores de Compiladores.

    VA:F [1.9.11_1134]
    Rating: 0 (from 2 votes)
    #100
    • Vamos por partes.

      1. O objetivo desse texto foi fornecer uma visão prática de características que definem uma linguagem de programação. Por isso eu foquei em linguagens populares e mais usadas no mercado.

      2. Linguagens como Haskell possuem mais frescuras que eu não cobri nesse artigo. O Leandro Lameiro me fez uma pergunta sobre um trecho que eu escrevi:

      “Em uma linguagem de tipo estático, o compilador deve conhecer o tipo de uma variável ou método antes da execução do programa (por isso, o tipo de uma variável normalmente é explicitamente declarado).”

      Pergunta: esse “normalmente” é pra cobrir as linguagens de tipo estático implicito?
      Minha resposta: Sim, como em Haskell.

      Em outros trechos do artigo eu também fugi dessas linguagens. Por exemplo, Scala é uma linguagem que pode ser tanto interpretada quanto compilada.

      Eu gostaria de conseguir cobrir essas peculiaridades de algumas linguagens de programação, porém o texto poderia fugir do objetivo: apresentar de maneira simples conceitos que definem linguagens de programação.

      Mas ainda quero rever o que escrevi, juntar todos os comentários e escrever novamente. Existem alguns ‘problemas’ no texto, porém em termos práticos acho que está tudo ok!

      Valeu pelo comentário!

      VN:F [1.9.11_1134]
      Rating: 0 (from 0 votes)
      #108
      • Vou “re-responder” no seu modelo:

        (1) Se o objetivo é prático, o título é inapropriado. Se o alvo é “mais populares no mercado”, esqueceu de especificar o mercado. Bancos e financeiras, por exemplo, utilizam-se muito de linguagens funcionais como Haskell; sistemas embarcados de C/C++; sistemas críticos de Ada. Já o “feijão com arroz”, o “be-a-bá” da Computação, usa essas que você disse, mesmo.

        (2) Quando você escreve “frescuras” você está denegrindo a linguagem, quando Haskell, na verdade, é o “supra sumo”, com forte formalismo e facilidades que outras linguagens não permitem. Um exemplo prático? http://www.cs.chalmers.se/ComputingScience/Research/Functional/Fudgets/haskell-vs-ada-abstract.html

        (3) Quando você afirma algumas características de Haskell, na verdade, você está afirmando características de paradigmas de programação, o que retorna ao meu primeiro comentário. Se você deseja “apresentar de maneira simples conceitos que definem linguagens de programação”, talvez seja interessante você fazer um paralelo com o ensino da matemática, talvez uma comparação ensinar achar número ímpares por um fluxograma, uma maneira “falada” e por uma equação (do tipo p = 2*k + 1 ). Afinal, Computação é Matemática.

        Eu sei que estou sendo pedante nos meus comentários, mas são apenas críticas construtivas para uma possível série de artigos seus.

        De qualquer forma, parabéns pela iniciativa.

        VA:F [1.9.11_1134]
        Rating: -2 (from 2 votes)
        #111
  3. valdomiro

    gostaria de receber de que forna e para que são usadas pelo menos as 5 linguagens mais atuais
    obrigado estudo ads e preciso descobrir

    VA:F [1.9.11_1134]
    Rating: 0 (from 0 votes)
    #249

Deixe um Comentário

Spam Protection by WP-SpamFree

Get Adobe Flash playerPlugin by wpburn.com wordpress themes