Tudo sobre Smalltalk e outras linguagens

Introdução ao Smalltalk

Smalltalk é uma linguagem única em vários aspectos. Ela foi uma das primeiras linguagens orientadas a objetos, e nenhuma linguagem orientada a objeto antes ou depois do Smalltalk leva o conceito tão longe. Se você quer conhecer os diferentes tipos de linguagem de programação, as características básicas de uma linguagem orientada a objetos, e as características fundamentais do Smalltalk, então continue lendo!

O que é uma linguagem orientada a objetos? Para entendermos o que ela é, temos que entender primeiro o que é uma linguagem de programação. Uma linguagem de programação é uma forma abstrata de especificar instruções ou regras para o computador; escrever diretamente na forma que um computador entende é extremamente complexo, de modo que as linguagens de programação fornecem uma abstração do processo, para fazer com que a programação de um computador seja mais simples.

Há vários paradigmas de programação, que foram surgindo nos primeiros anos da computação e permanecem até hoje. De fato, há três grandes paradigmas na programação, que detalho a seguir:

  • Linguagens imperativas — as linguagens imperativas consistem em uma sequência de comandos que o computador deve seguir. As primeiras linguagens se encontram nesse conceito, e a abstração era mínima (exemplos: Assembly).

    Com a necessidade de maior abstração, foi criado o que se chama de programação estruturada: as linguagens começaram a suportar subconjuntos de código, que permitiam o agrupamento mais eficaz do código em blocos, de forma que a programação se tornasse mais efetiva (exemplos: FORTRAN, C).

    As linguagens imperativas constituem a maior parte das linguagens modernas, sendo inclusive o cerne de muitas das linguagens orientadas a objeto. Seu ponto forte, e também seu ponto fraco, é a proximidade à estrutura dos processadores modernos, o que limita bastante o nível da abstração que se utiliza. Por isso mesmo, é difícil programar bem em uma linguagem estruturada sem entender como o computador funciona, o que torna as linguagens estruturadas em geral pouco indicadas para o leigo, ou para o aprendizado dos conceitos básicos de programação. Ainda assim, as linguagens estruturadas são imprescindíveis no atual estado da computação, não só pelo código legado, mas porque ainda são usadas para programas em que a performance é essencial, ou nos quais haja uma interação mais próxima com o hardware.

  • Linguagens funcionais — Na ciência da computação há um conceito chamado de computabilidade. As linguagens imperativas são baseadas em um modelo chamado modelo de Turing, que é baseado numa máquina imaginária interagindo com uma fita infinita, com um número limitado de estados internos (uma boa aproximação de um computador atual, ainda que estes sejam muito mais sofisticados).

    No entanto, essa não é a única visão da computabilidade. Um matemático criou o “lambda calculus”, um modelo da computabilidade baseado em funções e valores, baseado em premissas matemáticas, e não numa máquina hipotética. Por ser baseada em fundamentos matemáticos, essa visão da computabilidade é mais abstrata, e possivelmente mais difícil de compreender que a visão de Turing.

    De qualquer forma, alguns dos “pais” da computação viram no cálculo lambda uma melhor capacidade de abstração, e um maior poder na expressão de programas complexos, e criaram a primeira linguagem baseada no lambda calculus. Desde então, todas as linguagens baseadas nessa visão da computabilidade são chamadas de linguagens funcionais, já que o elemento primordial da sua estrutura é a função, um equivalente de programação para a função matemática. Exemplos de tais linguagens são LISP, Haskell e Caml.
    O ponto forte das linguagens funcionais é a sua “formalidade”: é possível provar que um programa está correto expressando-o matematicamente e provando a expressão. Além disso, a maneira como as linguagens funcionais “puras” lidam com valores impedem problemas de inconsistência de dados, que são comuns em programas feitos em linguagens imperativas. O ponto fraco é que a abstração matemática na qual essas linguagens são baseadas é mais difícil de ser aprendida e entendida, ainda que seja extremamente poderosa quando compreendida.

  • Linguagens orientadas a objeto — As linguagens orientadas a objeto surgiram de duas necessidades básicas: a necessidade um nível de abstração maior nas linguagens imperativas, a facilitação da reutilização de código. Surgiu então um modelo de abstração baseado no conceito de objetos — estruturas de dados especiais que não só agrupassem os dados internos de forma organizada, mas também tivessem associadas a elas as funções ou métodos para agir sobre esses dados. Como lidamos com objetos na nossa vida cotidiana, é uma abstração mais intuitiva, e por isso freqüentemente mais simples e poderosa de usar.

    A maioria das linguagens orientadas a objeto utiliza o conceito de “classe”, que seria o “tipo” do objeto. Smalltalk é uma das linguagens que utiliza essa concepção (como são também C++, Object Pascal e Java), e portanto veremos isso em mais detalhes. Mas há também linguagens orientadas a objetos que não têm classes, mas protótipos — não tipos, mas objetos que podem ser “clonados” e modificados de acordo com a necessidade. Não entrarei em detalhes, mas exemplos desse tipo de linguagem são Self, Io e (até certo ponto) Slate.

    O ponto forte das linguagens orientadas a objeto é a aproximação da sua abstração da maneira humana de pensar. Isso possibilita um aprendizado mais rápido e conciso. Outra grande vantagem é que dados e funções internas ao objeto não precisam ser conhecidas por quem utiliza o objeto em um programa, de forma que a complexidade interna pode ser “escondida” do usuário, potencialmente concentrando o código em blocos concisos e relativamente independentes, e facilitando grandemente a reutilização desses objetos.

    O ponto fraco das linguagens orientadas a objeto é que a abstração pode se tornar um impecilho para certos tipos de modelo, especialmente se a linguagem tiver determinadas limitações. Coleções de objetos podem também crescer demais em número, dificultando seu uso eficiente; e, como a maioria das linguagens orientadas a objeto são também linguagens imperativas, as desvantagens destas se aplicam igualmente.

Como disse antes, Smalltalk é uma linguagem orientada a objetos — e como! Vejamos então como isso funciona na prática.

Comments

  1. André Fernandes
    July 21st, 2009 | 8:55 am

    Somente um comentario importante, mas que não invalida a qualidade do texto: LISP não é apenas funcional, mas uma linguagem multi-paradigma, Lisp implementa tanto a programação imperativa, a funcional quanto a orientada a objetos - embora seja comum encontrarmos apenas referências mais freqüentes a ela como sendo apenas funcional.
    Ótimo texto. Espero ansioso pelos próximos.

  2. Roberto
    July 21st, 2009 | 11:24 am

    Oi André,

    Sim, você tem razão. Alguém disse uma vez que existem três modelos computacionais: programação iterativa, funcional, e LISP; e quatro tipos de modelagem: procedural/estruturada, orientada a objetos, funcional, e LISP. :)

    Eu citei LISP como linguagem funcional porque ela está mais próxima de uma linguagem funcional (considerando seus escopos e estruturas de dados fundamentais) do que de uma linguagem imperativa.

    Quanto a outros textos, já faz um tempo que não atualizo este blog, até porque estou pra mudar o “sistema” de blog há algum tempo. Quando eu fizer esse “upgrade”, devo atualizá-lo com mais frequência, possivelmente expandindo o tema para englobar não só o Smalltalk, mas outras linguagens interessantes e menos conhecidas.

    Obrigado pelos comentários e pela visita!