Upload
internet
View
108
Download
3
Embed Size (px)
Citation preview
Smalltalk
Grupo 8
• Diogo Krejci• Frederico Argolo• Vitor Macedo
História
Criada por Alan Kay da Xerox - Palo Alto no início dos anos 70. Apresenta um ambiente de programação com menus pop-up, windows e mouse (modelo para Apple Macintosh).
História
Alan Kay criou Smalltalk na tentativa de desenvolver uma linguagem na qual as crianças pudessem programar
História
SmallTalk foi baseada na linguagem Silmula (1966), a qual introduziu o conceito de objeto
História
Mas foi em Smalltalk que os objetos deixam de ser– meros "dados" manipulados por
"programas" E passam a ser:
– "processadores idealizados" individuais e independentes, aos quais podem ser transmitidos comandos em forma de "mensagens".
Versões
Versões existentes: Versões Open Source & Livres
– Squeak Smalltalk – GNU Smalltalk – Little Smalltalk
Versões Comerciais– Dolphin Smalltalk – Object Connect's Smalltalk MT – Exept's Smalltalk/X
Versões Comerciais(cont.)
– Cincom's VisualWorks Smalltalk – Cincom's Object Studio Smalltalk – Cincom's Visual Smalltalk Enterprise (VSE) – IBM's Visual Age Smalltalk – Pocket Smalltalk – QKS Smalltalk Agents
Versão Escolhida
Cincom's VisualWorks Smalltalk
– Razões:• Site do fabricante com muitas informações• Possibilidade de baixar uma versão não
comercial• Bibliografia baseada nessa versão
Interface Visual Works
Interface Visual Works
Interface Eiffel
Interface Eiffel
Versões
Quais são as diferenças entre as versões existentes?
Diferenças
A Xerox, criou a ParcPlace Systems para comercializar Smalltalk-80
Cada fabricante tem nesta versão uma base para desenvolver as suas próprias versões
Diferenças
Não ficam especificados:
– Detalhes de implementação– Possíveis extensões– “Sintaxe”
Diferenças - Exemplos
Uma operação de potência no VisualWorks:– 3**2
Nas demais versões:– 3e2
Diferenças - Exemplos
O VisualWorks não aceita que números em ponto flutuante sejam definidos em uma base que não seja a decimal
Tal restrição não existe nas demais versões
Características de Smalltalk
Compatilibildade:– Solaris SPARC– HPUX HPPA– IRIX MIPS– AIX RS6000– Compaq Unix AXP– Linux Intel, Windows Intel, MacOS 9
Compatibilidade
Cada versão já incorpora centenas de métodos que juntos formam a:– Imagem Virtual (Virtual Image)
Compatibilidade
Por questões de performance existem implementações específicas para cada máquina
– Operações aritméticas
– Entrada e Saída Em conjunto formam a Máquina Virtual
Compatibilidade
Em Eiffel para se desenvolver implementações portáveis deve-se usar:– EiffelVision
– EiffelVision2
Compatibilidade
Para se desenvolver implementações específicas, e usar os recursos de janelas particulares de cada sistema deve-se usar:– WEL (Windows Eiffel Library) – Unix, Linux e VMS (GTK Eiffel Library)
Tipos
Como Smalltalk trata tipos?
Tipos
Smalltalk tem somente um tipo– objeto
Tudo no sistema são objetos
Portanto variáveis são referencias para objetos
Tipos
Eiffel apresenta tipificação estática.– O compilador restringe as possíveis
atribuições a uma variável Vantagens
– Segura– Eficiente
Desvantagem– Menos flexível
Garbage Collector
Assim como Eiffel, Smalltalk faz uso desse recurso
Vantagens:– O risco de vazamento de memória é
extremamente reduzido– O programador pode se concentrar no problema
de aplicação
Desvantagens:– Perda de eficiência
Classes
Em Smalltalk classes são objetos
Uma metaclasse é uma instância da classe Metaclasse.
Cada classe é uma instância de uma instância da Metaclasse.
Classes - Diagrama
Self e Super
Self retorna a referência para o objeto que recebe essa mensagem
O seu equivalente em Eiffel é current
Self e Super
Super não se refere na verdade a superclasse do objeto que está recebendo essa mensagem, mas se refere ao objeto que definiu o código que está sendo executado.
Self e Super
Colisão de Nomes devido à herança
Em Eiffel, no caso geral, a colisão de nomes obriga que se utilize uma cláusula especial de renomeação (rename) para mudar pelo menos um dos designadores do atributo ou operação em colisão.
Em Smalltalk esse problema não ocorre porque a herança múltipla não é suportada.
Polimorfismo de Operação
Em Smalltalk e Eiffel a implementação de uma operação pode ser alterada nos descendentes.
Porém em Eiffel existe a possibilidade adicional de mudar o nome a um membro herdado (operação ou atributo), ou mesmo cancelá-lo.
Visibilidade de Médotos
Em Smalltalk não existe o conceito de métodos públicos e privados, todos os métodos podem ser acessados por todos os objetos do sistema.
Visibilidade de Médotos
Tentativa de simular esse comportamento:– Acrescentar um prefixo “my” antes de
todos os métodos que teriam que ser privados
– Nada impede porém que um programador chame esse método
Métodos de Classe
Em Smalltalk pode-se definir métodos de classe
Eiffel não tem suporte a esse tipo de recurso
Mensagens
Não existem operadores em Smalltalk
Todos os objetos são ativados por meio de mensagens
Toda mensagem retorna algum objeto
Mensagens
Qual é o resultado da operação:
1+2*3
Tipos de Mensagens
Existem 3 tipos de mensagens:– Unárias
• Não têm parâmetros
– Exemplo• 345 sin• ‘abcd’ size
Tipos de Mensagens
– Binárias• Recebem apenas um parâmetro
– Exemplos:• 3+2• X>= 2
Tipos de Mensagens
– Palavras Chave• são mensagens com um ou mais argumentos
nas quais o seletor é composto por uma sequência de uma ou mais palavras-chave, cada uma delas terminando com o caracter ":“
– Exemplos:• 'vitor' copyFrom:2 to:5• O resultado é itor
Precedência de Mensagens
A avaliação é feita da esquerda para a direita
Mensagens unárias Mensagens binárias Mensagens com palavras chave
– Pode-se alterar a precedência usando parênteses
Resultado
Portanto 1+2*3 = 9 em Smalltalk
Para gerar o resultado normalmente esperado devemos usar:1+(2*3)
Regras de Precedência em Eiffel
Operadores Especiais. (O ponto (“.”) na chamada de expressões)
Operadores Unários– old strip not
Operadores Binários– ^* / // \\+
Operadores Relacionais – = /= < > <= >=
Operadores Logicos– and nor or
Controle de Erro (Eiffel)
Em Eiffel sempre que existe um contrato e este é quebrado, uma exceção é gerada. Esta pode ser originada basicamente devido a duas razões:– 1- violação das asserções, caso estas estejam
sendo monitoradas.– 2– Devido um sinal de hardware alertando
sobre alguma operação ilegal.
Controle de Erro (Eiffel)
Uma rotina pode tratar uma exceção através de sua cláusula rescue. Podendo terminar em:– retry o que faz com que rotina seja a
executada desde o início.– Ou não apresentar o retry no final, com
isso o método retorna para o quem o invocou.
Controle de Erro (Smalltalk)
Smalltalk apresenta um sistema de controle de erro similar ao existente em Eiffel
Controle de Erro (Smalltalk)
Controle de Erro (Smalltalk)
Seqüência de acontecimentos:– Gera-se uma exceção– Repassada sucessivamente a cada um dos
objetos– Caso nenhum objeto esteja preparado para lidar
com a exceção uma mensagem noHandlerSignal é enviada ao objeto Object
– Caso esta exceção não seja tratada o EmergencyHandler é invocado
Controle de Erro (Exemplo)MyRequest>>processYourself
| tape drive |MySignals appSignalhandle: [:ex | self myHandleFailure: ex]do:[self myCheckRequest.tape := self myReserveTape.drive := self myReserveDrive.tape mountYourselfOn: drive.self myRespondSuccess].self myReleaseTape: tape.self myReleaseDrive: drive
MyRequest>>myReserveTapeself tapeName isReserved ifTrue:[MySignals appSignal raiseWith: #tapeBusy].
...code to reserve the tape...
Controle de Erro (Smalltalk)
Existem diferentes maneiras de se criar uma exceção:– Raise
• Raise gera uma exceção passando-o para o objeto que chamou o método.
– RaiseWith: aParameter• Gera uma exceção, mas informa os
parâmetros recebidos pelo método.
Controle de Erro (SmallTalk)
– RaiseErrorString: aString• Gera uma exceção informando algum texto que se
queira transmitir.
– Existe uma regra para poder passar os textos:• Caso não tenha espaço no início, o antigo texto é
sobreescrito.• Caso tenha um espaço no início o novo texto é
acrescentado no final.
– RaiseWith: aParameter errorString: aString
• Gera uma exceção e desempenha o papel das duas anteriormente descritas.
Controle de Erro (Smalltalk)
Maneiras de se tratar um exceção: Return:
– Faz com que o bloco “handle” retorne nil. Exemplo:
– Transcript cr; show:(self errorSignalhandle: [:ex | ex return]do: [self errorSignal raise]) printString.
Controle de Erro(Smalltalk)
ReturnWith:– Permite que ao final do bloco
“handle” seja retornado algum objeto. Exemplo:
– Transcript cr; show:(self errorSignal
handle: [:ex | ex returnWith: 3]do: [self errorSignal raise])
printString.
Controle de Erro (Smalltalk) Restart
– Faz com que o método seja reiniciado ao final do bloco “handle”
Exemplo:self errorSignalhandle: [:ex |
Dialog warn: 'You divided by zero'.ex restart]
do: [| answer |answer := Dialog request: 'Divide 4 by what?' initialAnswer: ‘0'.
Arquitetura
Conclusão
Smalltalk é uma linguagem de programação completa e uma das mais puras linguagens orientadas a objeto existentes atualmente.