Smalltalk

Origem: Wikipedia, a enciclopedia livre.
Smalltalk
Paradigma Orientacao a Objetos
Surgido em Inicio em 1969 , tornou-se publico em 1980
Criado por Alan Kay , Dan Ingalls , Adele Goldberg
Estilo de tipagem dinamica
Principais implementacoes Squeak, GNU Smalltalk, VisualWorks
Dialetos: Squeak
Influenciada por Lisp , Simula , Logo , Sketchpad
Influenciou Objective-C , Self , Java , Dylan , AppleScript , Lisaac , D , NewtonScript , Python , Ruby , Scala , Perl 6 , CLOS , Falcon , Io , Ioke
Extensao do arquivo : .st

Smalltalk-80 , ou simplesmente Smalltalk , e uma linguagem de programacao orientada a objeto dinamicamente tipada .

Em Smalltalk tudo e objeto: os numeros, as classes, os metodos, blocos de codigo, etc. Nao ha tipos primitivos, ao contrario de outras linguagens orientadas a objeto; strings, numeros e caracteres sao implementados como classes em Smalltalk , por isso esta linguagem e considerada puramente orientada a objetos. Tecnicamente, todo elemento de Smalltalk e um objeto de primeira ordem.

Os programadores definem classes de objetos em suas aplicacoes para imitar (ou simular) o mundo real. Estas classes de objeto sao organizadas hierarquicamente, de modo que seja possivel fazer novos objetos com caracteristicas de outros objetos, com poucas mudancas.

Smalltalk e relativamente facil de aprender comparado a linguagens como C++ e ADA . O codigo-fonte Smalltalk e facil de ler, o que o torna a linguagem de programacao ideal para iniciantes.

Historia [ editar | editar codigo-fonte ]

O Smalltalk evoluiu atraves de varias iteracoes. Do Smalltalk-71 (que parecia um pouco com o Logo ) e Smalltalk-72 (na qual muitas das funcionalidades de midia foram implementadas, da capacidade de desenhar ate programas de musica e linguagens de programacao iconicas) para chegar no Smalltalk-76 , que foi o primeiro Smalltalk moderno. Dan Ingalls foi o principal implementador nessa epoca, e o criador do Smalltalk-76. Ted Kaehler foi outro implementador do equipe original do Learning Research Group, desenvolvendo o sistema de musica para o Smalltalk-72, uma versao da tartaruga do Logo para Smalltalk , alem da estrutura de memoria orientada a objetos.

O Smalltalk-80 foi lancado para computadores de diversas companhias (Hewlett-Packard, DEC, Apple, IBM, Tektronix) como um teste de portabilidade do ambiente. Ele foi implementado como um compilador de bytecode . O codigo era de fato compilado, porem nao para a linguagem de maquina nativa do computador que executava aplicacao e, sim, compilado para uma linguagem de maquina de um computador que nao existia: a maquina virtual . A vantagem desse esquema que foi criado com o Smalltalk-80 e que ele tornou-se extremamente portavel.

O Smalltalk-80 tornou-se um padrao para as diversas versoes de Smalltalk . Depois disso, a Xerox resolveu criar uma empresa chamada ParcPlace para cuidar do desenvolvimento do Smalltalk, gerando novas versoes como ObjectWorks e, posteriormente, VisualWorks. Outras versoes foram criadas por outras companhias, tais como: Smalltalk/V da Digitalk e o SmalltalkAgents da Quasar; todos com sintaxe e estruturas semelhantes, porem o codigo da interface grafica era radicalmente diferente.

Sintaxe [ editar | editar codigo-fonte ]

A sintaxe de Smalltalk-80 e bastante diferente das linguagens tradicionais.

Ao inves do que e usado na maioria das linguagens tradicionais, em Smalltalk utiliza-se sempre a ordem <objeto recebedor> <mensagem>.

No exemplo abaixo, o metodo publish e formado de uma linha, onde se envia a mensagem show para o objeto Transcript , com o parametro Hello, world (que e um objeto).

publish

    Transcript
 show:
 'Hello, world!'

Polimorfismo [ editar | editar codigo-fonte ]

Em Smalltalk nao ha o Polimorfismo Universal Parametrico nem o Ad-Hoc por Coercao. Sendo assim so ha implementado o Universal por Inclusao e o Ad-Hoc por Sobrecarga. Exemplos:

  • Inclusao:
Numeros
 subclass:
 #Primos

 instanceVariableNames:
 ''

 classVariableNames:
 ''

 poolDictionaries:
 ''

 category:
 'Numeros'


Initialize

 super
 initialize
.


verificaSeEPrimo:
 temp
 "a funcao isPrime ja existe na classe Integer"

 Transcript
 show:
 temp
 isPrime
.


imprime

 Transcript
 show:
'sobrescrevi o metodo imprime da classe pai(Numeros). Isso mostra que Smalltalk suporta

polimorfismo universal por inclusao'
.

  • Sobrecarga:
Object
 subclass:
 #Numeros

 instanceVariableNames:
 'val'

 classVariableNames:
 ''

 poolDictionaries:
 ''

 category:
 'Numeros'


Initialize

 super
 initialize
.

 val
 :=
 0
.


getVal

 ^
 val
.


setVal:
 aValor

 val
 :=
 aValor
.


verificaSeEMembro:
 aInteger

 ^
Transcript
 show:
 self
 class
 ==
 aInteger
 class


imprime

 Transcript
 show:
 val
.


imprime:
 aValor


"temos aqui uma sobrecarga do metodo imprimir na mesma classe, o que prova que smalltalk suporta polimorfismo Ad-Hoc

por sobrecarga"


Transcript
 show:
 aValor
.

Regras basicas da linguagem [ editar | editar codigo-fonte ]

  • Tudo e representado como objetos. (De longe, a regra mais importante em Smalltalk ).
  • Toda computacao e disparada pelo envio de mensagens. Uma mensagem e enviada para um objeto fazer alguma coisa.
  • Quase todas as expressoes sao da forma <recebedor> <mensagem>.
  • Mensagens fazem com que metodos sejam executados, sendo que o mapeamento de mensagens para metodos e determinado pelo objeto recebedor. Os metodos sao as unidades de codigo em Smalltalk , equivalente a funcoes ou procedimentos em outras linguagens.
  • Todo objeto e uma instancia de alguma classe. 12 e uma instancia da classe SmallInteger. 'abc' e uma instancia da classe String. A classe determina o comportamento e os dados de suas instancias.
  • Toda classe tem uma classe mae, exceto a classe Object. A classe mae define os dados e comportamento que sao herdados por suas classes filhas. A classe mae e chamada de superclasse e suas filhas, subclasses.

Exemplos de codigo [ editar | editar codigo-fonte ]

Hello world [ editar | editar codigo-fonte ]

Transcript
 show:
 'Hello, world!!!'

Numero Perfeito [ editar | editar codigo-fonte ]

Integer
 extend
 [

  
"Traduzido da versao em C"

  isPerfectC
 [ 
|
tot
|
 tot
 :=
 1
.

     (
2
 to:
 (
self
 sqrt
) 
+
 1
) 
do:
 [ 
:
i
 |

        (
self
 rem:
 i
) 
=
 0

        ifTrue:
 [ 
|
q
|

                  tot
 :=
 tot
 +
 i
.

                  q
 :=
 self
 //
 i
.

                  q
 >
 i
 ifTrue:
 [ 
tot
 :=
 tot
 +
 q
 ]
        ]
     ]
.

     ^
 tot
 =
 self

  ]

  
"Outra maneira"

  isPerfect
 [
     
^
 ( ( ( 
2
 to:
 self
 //
 2
 +
 1
) 
select:
 [ 
:
a
 |
 (
self
 rem:
 a
) 
=
 0
 ] )
         
inject:
 1
 into:
 [ 
:
a
 :
b
 |
 a
 +
 b
 ] ) 
=
 self

  ]
]
.

Classes [ editar | editar codigo-fonte ]

Object
 subclass:
 #MessagePublisher

    instanceVariableNames:
 ''

    classVariableNames:
 ''

    poolDictionaries:
 ''

    category:
 'Smalltalk Examples'

Metodos [ editar | editar codigo-fonte ]

publish

    Transcript
 show:
 'Hello, world!'

Invocacao [ editar | editar codigo-fonte ]

MessagePublisher
 new
 publish

Ver tambem [ editar | editar codigo-fonte ]

Ligacoes externas [ editar | editar codigo-fonte ]