Marcio Bueno

Smalltalk – Uma das Primeiras Linguagens Orientadas a Objetos

Uma das primeiras linguagens de programação orientada a objetos (oo) foi o Smalltalk, o grande diferencial entre Smalltalk e a maiorias das outras linguagens oo é que tudo na linguagens são objetos, inclusive if, while e for não são comandos, são métodos por mais incrível que isto pareça.

A notação do Smalltalk é semelhante à escrita em inglês. Veja o código abaixo:

Transcript clear.
Transcript cr.
Transcript show:'Olá Mundo'.
Transcript cr.

Existe um objeto chamado Transcript que representa um console, isto é, um lugar onde as mensagens são exibidas. Na primeira linha, você está executando o método clear (limpar) do objeto Transcript. Na segunda linha é solicitado ao Transcript que pule de linha através do método cr, como um endl do C++ ou um “n” do C ou Java. Na terceira linha, é solicitado ao Transcript que seja exibida a string ‘Olá Mundo’, através do método show: que recebe como parâmetro uma string. Quando você precisar passar várias mensagens para um objeto, é possível utilizar um ponto-e-vírgula separando as chamadas, como no exemplo abaixo:

Transcript clear; cr; show:'Olá Mundo'; cr.

Voltando ao comandos de controle na maioria das linguagens: o if do Java, em Smalltalk é ifTrue:, um método declarado na classe Boolean que recebe com parâmetro (veja o sinal de dois-pontos após o nome do método) um bloco de comandos, que em Smalltalk são comandos que estão dentro de colchetes [ ]. Já o whileTrue: é um método definido nas classes BlockClosure e BlockContext, portanto se o bloco for avaliado e retornar um valor True, então o bloco passado como parâmetro para o whileTrue: será avaliado. O exemplo abaixo já integra vários conceitos:

| i |
i := 9.
Transcript clear.
[ i > 0 ] whileTrue: [
	Transcript show: (i asString), ' -> ',
		(i odd ifTrue: ['Par'] ifFalse: ['Ímpar']);
		cr.
	i := i - 1.
].

Na primeira linha é definida a variável i, que em Smalltalk não precisa definir o tipo. Na segunda linha é realizado um comando de atribuição. A terceira linha declara um bloco [ i > 0 ] que ao ser avaliado retorna um True ou False, e este bloco recebe a chamada ao método whileTrue: que executará o outro bloco enquanto a condição for verdadeira. Agora a terceira linha vamos quebrar em partes para melhor entendê-la. Primeiro, concatenação de strings em Smalltalk é realizada através de vírgula, portanto a variável i está sendo convertida para string (i asString) e concatenada com a string ‘ -> ‘, que será então concatenada com a string ‘Par’ ou ‘Ímpar’. Para selecionar entre a string Par ou Ímpar é chamado o método odd para saber se o número é par, o resultado será um valor True ou False. Como o método ifTrue:ifFalse: está definido na classe Boolean, então podemos chamá-lo a partir do objeto retornado pelo método odd. Em Smalltalk um método que recebe mais de um parâmetro, possui o seu nome divido em partes, onde cada parte possui um símbolo de dois-pontos. Portanto, ifTrue:ifFalse: é um método que recebe dois parâmetros, no caso o bloco que contém a string ‘Par’ e o bloco que contém a string ‘Ímpar’. E para terminar, um comando de atribuição para diminuir o valor da variável i. A saída deste programa é a seguinte:

9 -> Par
8 -> Ímpar
7 -> Par
6 -> Ímpar
5 -> Par
4 -> Ímpar
3 -> Par
2 -> Ímpar
1 -> Par

Vejamos algo impressionante ao utilizar uma linguagem como o Smalltalk. Os testes a seguir daria trabalho para você conseguir implementá-lo em Java ou C:

Transcript clear.
1 to: 500 do: [:i |
	Transcript show: '2 elevado a ', (i asString), ' é ',
		(2 raisedTo: i) asString; cr.
].
Transcript clear.
Transcript show: 5000 factorial asString.

No primeiro trecho de código são impressos todos as potências de 2 entre 1 e 500, detalhe 2^500 gera um número com 151 dígitos (veja que já existe o método raisedTo: na classe Number). Agora, ao executar o segundo código, será impresso no Transcript o fatorial de 5000, que é um número com 16326 dígitos. Vai tentar fazer isto em Java!

Bom, para poder executar este programa é necessário utilizar uma IDE Smalltalk. Uma bastante conhecida é a Squeak! que possui o código aberto. Você pode baixá-la a partir do site oficial: http://squeak.org/, utilize o link da direita da tela para fazer o download, senão você terá que baixar separadamente, a máquina virtual, o código fonte e a imagem para poder começar a utilizá-la. Hoje, o link direto se você for um usário do sistema operacional Windows é:

http://ftp.squeak.org/3.10/win/Squeak3.10.2-7179-win32.zip.

Basta descompactar e executar o programa Squeak.exe.

O local para realizar alguns testes como os exemplos acima é o Workspace, no Squeak abra a aba Tools (encontra-se no canto superior direita da janela) clique no ícone que indica o Workspace e arraste-o para o meio da tela. Faça o mesmo com o Transcript para poder ver o resultado da execução do seu programa. Para executar um trecho de código, basta selecionar o código e apertar <CTRL+D> (ou clicar com o botão direito em cima da seleção e selecionar a opção do it).

Para aprender mais sobre Smalltalk vá em sites como:

3 Responses

  1. Pedro Henrique Guimaraes ARaujo
    Pedro Henrique Guimaraes ARaujo 8 de setembro de 2009 at 19:43 |

    oOOO trocio dificilll, mas eh isso ai

    Reply
  2. Marx Gentil
    Marx Gentil 10 de outubro de 2009 at 11:39 |

    Paulo, não sei se é tão difícil assim, é só uma questão de aprofundar mais na linguagem, acho que tudo é moda. Tem linguagem mais difícil e chata que Java? Pra mim Java é um saco, mas como virou moda, agente é forçado ao aprendizado e o que é difícil acaba ficando fácil com a prática. Isto serve para Smalltalk, Carlos Andreaza (professor da UNICAP) me falou uma vez que já trabalhou com Smalltalk e que gostava mais de programar nessa linguagem ao invés de Java. A minha pergunta é: Por quê umas linguagens pegam(viram moda) e outras não?

    Reply

Leave a Reply