"Ver aquilo que temos diante do nariz requer uma luta constante". George Orwell

Quando eu entrei na área de TI, me deparei com diversos termos antes totalmente desconhecidos por mim. Logo percebi que se eu quisesse realmente me tornar um profissional da área uma das primeiras coisas que eu deveria fazer era aprender o vocabulário comum utilizado por desenvolvedores.

Assim, para citar alguns, logo aprendi a diferença entre servidor e cliente, linguagem alto nível e baixo nível, linguagem orientada a objetos e procedural, etc.

Alguns desses termos, entretanto, tive especial dificuldade de entender. Inicialmente, atribuí isso somente à minha falta de experiência, porém à medida que minha capacidade crítica aumentava, percebi que na verdade muitos desses termos eram utilizados de maneira confusa e, não poucas vezes, inapropriada.

Ciente disso, resolvi abordar a diferença entre algumas dessas palavras tão importantes, mas que causam certa confusão. Acredito que pode ajudar tanto programadores inciantes, quanto aqueles com certa experiência.

  • Framework x Biblioteca x API
  • Linguagem interpretada x compilada
  • Untyped X Dynamic Typed X Statically Type
  • Strongly Typed X Loosely Typed

Framework x Biblioteca x API

Em meu primeiro contato com jQuery eu fiquei sem saber se ele era um framework, uma biblioteca ou uma API.

Biblioteca

De acordo com Martin Fowler neste artigo, biblioteca é apenas um conjunto de funções organizadas normalmente em classes.

Em Javascript, as bibliotecas são organizadas em módulos ou namespaces. Normalmente, elas tornam a utilização da própria linguagem mais fácil. Zepto, jQuery, Closure, Prototype e Underscore são todas bibliotecas.

Underscore, por exemplo, é utilizado na criação do framework Backbone.js. Bibliotecas, então, são tão generalistas que dão suporte até à criação de frameworks.

Frameworks

Framework é um esqueleto que você vai preenchendo com carne até ele ganhar vida.

Falando em termos de programação, um framework lhe proporciona uma estrutura, uma abstração prévia com um comportamento já construído. O que você você faz é preencher a estrutura do framework com o comportamento(código) desejado para construir uma aplicação única.

Uma vez inserido o código nas "lacunas" disponíveis, o próprio framework vai se encarregar de chamar seu código onde necessário.

API

API é uma abreviação para Interface de Programação de Aplicações(Application Program Interface).

Essa definição não ajuda muito. O único significado depreendido é que estamos falando de uma simplificação(abstração) que ajuda a construir aplicações.

A verdade é que popularmente API se tornou significado de qualquer especificação que o ajude na construção de sua própria aplicação. Assim, temos a REST API, jQuery API, GoogleMaps API, Youtube API e diversas outras.

Tome, por exemplo, a REST API. Ela é uma especificação para construção de serviços de web service que simplificam, normalmente, o acesso e modificação de dados resultantes de solicitações HTTP. A REST API não é ao menos um componente desenvolvido por uma empresa específica que você "insere" dentro da sua aplicação. Ela é puramente uma especificação que qualquer empresa pode aderir para facilitar a transferência de dados.

Essa é uma lista de 50 APIs úteis a desenvolvedores para que você possa ter uma idéia ainda melhor do que estamos falando.

Interpretada x Compilada

Os pormenores da diferença são desconhecidos por mim que não tive todo o arcabouço teórico de cursos de computação. Mas existem umas diferenças centrais importantes quando se menciona esses termos. E eles são:

  1. A diferença não é na linguagem em si, mas em sua implementação. Assim, uma implementação permite que um compilador possa processar a linguagem e transformá-la em linguagem de máquina a ser executada diretamente pelo hardware. A outra, a interpretada, é processada para código binário, depois chega o interpretador e performa as ações especificadas.

  2. Linguagens projetadas para ser mais facilmente compiladas, como C, são mais rápidas.

  3. Existem também os chamados compiladores JIT(Just in Time) que podem trabalhar em conjunto com interpretadores pra tornar o processamento mais rápido. É o caso da V8 JavaScript Engine que deixou o Javascript bem mais rápido.

Dinamicamente Tipada x Estaticamente Tipada

É comum ouvir de alguns programadores que Python, Ruby e Javascript são linguagens dinâmicas por não possuírem tipos. Essa consideração é equivocada. Embora essas linguagens realmente sejam dinâmicas, os valores das variáveis possuem tipos. Elas possuem tipos, mas são consideradas "Untyped Languages".

Veja a própria declaração do criador do JavaScript quando perguntado se esta era uma linguagem não-tipada:

Academic types use "untyped" to mean "no static types". they are smart enough to see that values have types (duh!). Context matters.

Resumindo, no vocabulário programador Untyped é o mesmo que Dynamically Typed. Enquanto Typed significa Statically Typed.

Pra evitar a confusão, recomendo o uso dos termos mais precisos Dinamicamente Tipada(Javascript,Python,Ruby) e Estaticamente Tipada(Java e C#).

As linguagens dinâmicas só apontarão erros em tempos de execução. As estáticas acusam erros antes do tempo de execução(runtime).

Strongly Typed X Loosely Typed

O termo fortemente tipado é constantemente associado a um sinônimo de estaticamente tipado. O mesmo acontece com fracamente tipado e dinamicamente tipado.

Os termos, entretanto, não são sinônimos. Vejamos a classificação de 3 linguagens:

  1. Python - Dinamicamente tipada e fortemente tipada.
  2. C# - Estaticamente tipada e fortemente tipada.
  3. Javascript - Dinamicamente tipada e fracamente tipada.

Linguagens fracamente tipadas (loosely typed) fazem uma conversão implícita de tipos e não acusam erros em operações de diferentes tipos. Veja o exemplo do código JavaScript.

var a = 2;  
var b = "2";  
var c = a + b;  
console.log(typeof c); //string  
console.log(c); // 22

var d = 2;  
var e = "2";  
var f = d * e;  
console.log(typeof f); //number  
console.log(f); //4  

Se fossemos executar o mesmo código em Python

a = 2  
b = "2"  
c = a + b  

Obteríamos o seguinte erro: unsupported operand type(s) for +: 'int' and 'str'*.

Enquanto o código em C#:

using System.IO;  
using System;

class Program  
{
    static void Main()
    {
        int a = 2;
        string b = "2";
        var c  = a * b; 
        Console.WriteLine(c);
    }
}

Resultaria no seguinte erro em tempo de compilação: Operator '*' cannot be applied to operands of type 'int' and 'string'.


Veja Também

Sobre o Autor

Johel Carvalho

Johel Carvalho

Engenheiro Civil formado pelo Instituto Militar de Engenharia (IME-RJ) em Dezembro de 2012. Largou a profissão pelo desenvolvimento web, começando com C# e sendo atualmente aficionado por JavaScript.

comments powered by Disqus