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.
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.
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!'
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:
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'
.
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
.
- 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.
Transcript
show:
'Hello, world!!!'
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
]
]
.
Object
subclass:
#MessagePublisher
instanceVariableNames:
''
classVariableNames:
''
poolDictionaries:
''
category:
'Smalltalk Examples'
publish
Transcript
show:
'Hello, world!'
MessagePublisher
new
publish