Smalltalk foi a primeira linguagem concebida para tornar a programação orientada a objetos uma prática popular entre os programadores de software. Diferente de C++ e ADA que dão suporte a múltiplos paradígmas, Smalltalk (assim como Eiffeil) é o caso mais próximo de linguagem voltada ao paradígma de orientação a objeto. Diferente de Eiffeil, Smalltalk é uma linguagem totalmente dinâmica: cada objeto carrega o seu tipo em tempo de execução. O tipo de uma variável é determinado pelo tipo do objeto a qual ela se refere em tempo de execução. No decorrer do trabalho iremos prover uma breve introdução aos conceitos iniciais da linguagem Smalltalk, sem no entanto executar uma cobertura completa da mesma.
Aspectos Teóricos da Linguagem de Programação Smalltalk
1. Aspectos Teóricos da Linguagem de Programação
Smalltalk
Ailton Félix de Lima Filho
Bruno Normande Lins
Michel Alves dos Santos 1
Março de 2010
1Bacharelandos em Ciência da Computação, Universidade Federal do Estado de Ala-
goas(UFAL). E-mails: afdlf2@gmail.com, normandelins@gmail.com, michel.mas@gmail.com. Dis-
ciplina: Teoria e Paradigmas de Linguagens de Programação. Docente Responsável: Alcino
Dall’Igna Júnior.
2. Resumo
O ambiente Smalltalk foi desenvolvido pela equipe do Grupo de Pesquisas do Palo Alto
Research Center da Xerox (XeroxPARC) no início da década de 70[Kay93]. As principais
idéias do Smalltalk são creditadas a Alan Curtis Kay[Wik10a][Wik10b][Int10][Gas10]; mui-
tas delas baseadas no Simula, LISP e SketchPad. Dan Ingalls, seu companheiro de trabalho,
escreveu as primeiras janelas sobrepostas e menus pop-up opacos, muito comuns hoje em
dia em plataformas mais populares, como o Microsoft Windows. Uma segunda versão do
Smalltalk (Smalltalk/V) foi desenvolvida pela Digitalk em Los Angeles(Califórnia), com
os fundadores da Ollivetti. Antes de ser comprada pela ParcPlace Systems Inc., a Digitalk
era a líder de vendas deste produto. Logo em seguida, a IBM desenvolveu o VisualAge
Smalltalk em colaboração com a Object Technology International Inc. atual ObjectShare
(antiga ParcPlace-Digitalk). Atualmente a IBM continua sendo um dos principais distri-
buidores do ambiente de desenvolvimento Smalltalk. Para o acesso do público em geral,
existem verdadeiras soluções completas que se destacam plena simplicidade, leveza e pu-
reza de conceitos como é o caso dos ambientes Squeak(um ícone no meio educacional) e
Pharo(esse último, um fork da plataforma Squeak). Vale lembrar que Smalltalk não parou
no tempo. Mesmo não tendo o forte apelo comercial de linguagens como COBOL, Clipper
e Java (entre outras) a plataforma mantêm uma comunidade fiel e atuante[Com10], cen-
tenas de fontes de consulta, grupos de usuários[Gro10], fóruns, livros oficiais, ferramentas
para desenvolvimento web, servidores de aplicação, eventos internacionais e vem crescendo
impulsionada pelo espírito colaborativo que une pessoas ao redor do globo, situação seme-
lhante ao fenômeno do Código Aberto.
Palavras-Chave: Linguagens de Programação, Tipagem Dinâmica, Smalltalk, Vincula-
ções, Verificação de Tipos, Variáveis, Compatibilidade de Tipos.
5. Capítulo 1
Introdução
1.1 Sobre Smalltalk
Smalltalk foi a primeira linguagem concebida para tornar a programação orientada
a objetos uma prática popular entre os programadores de software. Diferente de C++ e
ADA que dão suporte a múltiplos paradígmas, Smalltalk (assim como Eiffeil) é o caso
mais próximo de linguagem voltada ao paradígma de orientação a objeto. Diferente de
Eiffeil, Smalltalk é uma linguagem totalmente dinâmica: cada objeto carrega o seu tipo
em tempo de execução. O tipo de uma variável é determinado pelo tipo do objeto a qual
ela se refere em tempo de execução.
No decorrer do trabalho iremos prover uma breve introdução aos conceitos iniciais da
linguagem Smalltalk, sem no entanto executar uma cobertura completa da mesma.
1.2 O Ambiente Smalltalk
Smalltalk foi desenvolvido para a escrita de aplicações em um ambiente/estação de
trabalho pessoal de alta interatividade. A linguagem é estritamente acoplada com o seu
ambiente, o que prové um estilo de interaçõa orientado a objeto. O usuário que utiliza
Smalltalk estará interagindo em um ambiente onde os objetos estarão realmente “vivos“
e esses poderão ser de qualquer natureza: desde de documentos que estão sendo editados
até elementos de tela como botões e barras de rolagem. É possível enviar mensagens
para um determinado objeto apenas selecionando com o mouse e especificando a requirida
operação através de um menu em cascata, o que mostra a versatilidade do ambiente. As
ferramentas do ambiente Smalltalk são escritas em Smalltalk. O resultado disso é que a
linguagem e o ambiente podem ser personalizados e estendidos de acordo com a necessidade
dos usuários[GJ97].
3
6. 1.2.1 Smalltalk e a Orientação ao Objeto
Em se tratando da linguagem Smalltalk, a mesma é puramente orientada a objeto.
Smalltalk foi a primeira línguagem para tornar a programação orientada a objeto popular
entre os profissionais de software [GJ97].
Várias versões da linguagem Smalltalk foram lançadas no decorrer de sua existência
como o Smalltalk-71, Smalltalk-72, Smalltalk-76, Smalltalk-80 (Atualmente a versão mais
utilizada) e a ANSI Smalltalk que foi ratificada em 1998 e representa a versão padrão do
Smalltalk, que por sua vez é fortemente baseado no padrão Smalltalk-80. As análises
feitas neste texto levarão em consideração as características da implementação Smalltalk-
80 servindo como ferramenta de campo a aplicação Squeak que é uma versão rápida,
open source e altamente portátil de Smalltalk possuindo uma máquina virtual inteiramente
escrita em Smallatlk[Squ10][Wik10c].
4
7. Capítulo 2
Nomes, Vinculação, Checagem de
Tipos e Escopos
2.1 Formas de Nomes
Um nome, ou identificador em Smalltalk é uma cadeia de caracteres iniciada por uma
letra e seguida de letras ou dígitos, onde o caracter inicial deve ser uma letra qualquer
do alfabeto (maíuscula ou minúscula) e o restante do identificador pode conter os dígitos
correpondentes aos números de 0 a 9 ou outras letras. Em expressão regular teríamos :
Identificador letra(letra + digito)*
As implementações baseadas em Smalltalk-80 são sensíveis ao caso, ou seja, diferem
caracteres maiúsculos de minúsculos.
2.1.1 Caracteres Reservados
Smalltalk também possui alguns caracteres reservados. São eles:
• := (ou ), que indica atribuição;
• ^ (ou ), que indica o retorno de um método;
• |var1 var2 var3|, declaração de variáveis temporárias (Ver seção Variáveis);
• $a, caractere a;
• #(abc 123), array contendo dois literais: o símbolo ‘abc’ e o número 123;
• . (ponto), fim de expressão;
• ; , mensagem em cascata;
• [ ], bloco de código (que também é visto como um objeto);
5
8. • "“, comentários;
• ‘’, cadeia de caracteres.
2.2 Palavras Especiais
A implementação Smalltalk-80 possui seis pseudo-variáveis que funcionam como pala-
vras reservadas.[BDNP07] São elas:
• nil, instância singleton da Classe UndefinedObject;
• true, instância singleton da Classe True;
• false, instância singleton da Classe False;
• self, o objeto atual, recebedor da mensagem correspondente;
• super, referencia o mesmo objeto que self, mas, quando uma mensagem é enviada
a super, a busca por um método se inicia na classe pai daquela a qual super foi
chamada;
• thisContext, o contexto de execução ativo, ou o ambiente de execução corrente,
(usando os métodos MethodContext ou BlockContext).
2.3 Variáveis
Em Smalltalk-80, variáveis podem ser privadas ou compartilhadas, possuindo diferen-
tes tipos:
• Variáveis de instância, que representam objetos (instâncias das classes);
• Variáveis temporárias, que existem apenas durante alguma atividade, ou seja, no
decorrer da execução de um método.
• Variáveis de classe, que são compartilhadas por todas as instâncias de uma deter-
minada classe.
• Variáveis globais, que são compartilhadas por todas as intâncias de todas as classes,
ou seja, compartilhadas por todos os objetos do ambiente.
• Variáveis pool, que são compartilhadas por todas as intâncias de algumas classes
(pré-determinadas).
6
9. 2.3.1 Nomes
Os nomes de variáveis seguem as mesmas regras discutidas anteriormente. Exceto
as variáveis privadas que devem iniciar-se com letras minúsculas. Já as compartilhadas
devem iniciar-se com maiúsculas. Vale lembrar que tal padrão é seguido apenas a título
de convenção.
2.3.2 Apelidos
Todas as variáveis em Smalltalk são referenciadas: “Smalltalk enxerga variáveis uni-
formemente como referências para objetos”[GJ97]. Dessa maneira, nenhuma variável ar-
mazena o objeto em sí, mas sim uma referência ao mesmo. Com as atribuições e passagem
de parâmetros sendo feitas por referência apenas. Os apelidos (aliases) passam a ser parte
integral da linguagem.
2.3.3 Tipos
Em Smalltalk as variáveis não possuem tipo a priori, pois são automaticamente inici-
alizadas com uma instância da classe UndefinedObject, dessa forma podem armazenar
uma referência a qualquer objeto.
2.3.4 Valores
O valor de uma variável em Smalltalk é sempre uma referência a um objeto.
2.4 Vinculação de Atributos para Variáveis
2.4.1 Vinculação de Tipos
As implementações baseadas em Smalltalk-80 exigem que toda variável seja decla-
rada antes de seu uso, dessa maneira a linguagem evita erros comuns, como a criação de
variáveis indesejadas por acidente ou descuido. Apesar disso, em algumas implementações
de Smalltalk não é necessário declarar o tipo da variável.
Na verdade, as variáveis em Smalltalk são inicializadas como uma instância da classe
UndefinedObject, dessa forma, toda variável deixa de ser vinculada a um tipo específico
a priori e pode guardar a referência a um objeto de qualquer classe.
2.4.2 Vinculação de Armazenamento e Tempo de Vida
Variáveis em Smalltalk não possuem tipo a priori (são inicializadas com Undefi-
nedObject), assim qualquer variável pode apontar para um objeto, que pode ser uma
instância de qualquer classe, por esse motivo afirmamos que as variáveis em Smalltalk são
7
10. dinamicamente tipadas. Todas são alocadas no heap implicitamente no momento em que
um valor é atribuído a mesma.
Apesar disso, todas as variáveis precisam ser declaradas antes de seu uso, o que evita
erros como a criação de variáveis indesejadas a partir de erros de digitação. Uma variável
é alocada assim que sua declaração é encontrada. Inicialmente toda variável aponta para
o objeto nil, e continua assim até o momento em que é feita uma atribuição. Toda de-
salocação é executada implicitamente pelo garbage collector do sistema, quando identifica
uma variável que não está mais sendo usada.
2.5 Verificação de tipos
A verificação de tipos em Smalltalk é dinâmica pois a mesma é realizada em tempo de
execução[Wik10d].
2.6 Escopo e Tempo de Vida
Smalltalk possui escopo dinâmico pois é dinamicamente tipada.
2.7 Ambiente referêncial
Como em Smalltalk todo o processamento se dá por meio do envio de mensagens a partir
de métodos definidos em classes, o que nos interessa saber é qual o ambiente referencial de
tais métodos. As variáveis que um método em uma classe pode acessar são classificadas em
cinco diferentes tipos[GR83]. Dois deles são as variáveis privadas, disponíveis apenas para
um único objeto, que são subdivididas em: variáveis de instância e variáveis temporárias.
Os outros três tipos podem ser acessados por mais de um objeto, são elas: as variáveis
de classe, as variáveis globais e as variáveis de pool. Assim, o ambiente referencial de
um determinado método é definido pelo conjunto de tais variáveis definidas na classe do
mesmo, e no próprio método.
2.8 Constantes com Nome
Smalltalk não possui uma sintaxe especial para distinguir constantes de variáveis [BDNP07].
Na verdade, variáveis em Smalltalk são tratadas como ‘constantes’, devido a natureza de
manipulação de referências a objetos e não valores primitivos dos mesmos.
2.9 Inicialização de Variáveis
Toda variável em Smalltalk é atribuída inicialmente e de maneira automática com o
objeto nil, assim, qualquer variável dentro do ambiente sempre irá se referir a um objeto.
8
11. Referências Bibliográficas
[BDNP07] Andrew P. Black, Stéphane Ducasse, Oscar Nierstrasz, and Damien Pollet.
Squeak by Example, chapter 2.6, page 37. Square Bracket Associates, Switzer-
land, first edition, September 2007.
[Com10] Smalltalk Community. Welcome to Smalltalk.org - Community and industry
meet inventing the future.TM
. http://www.smalltalk.org/main/, 2010. [On-
line; accessed 17-April-2010].
[Gas10] Scott Gasch. Biography Alan Curtis Kay. http://ei.cs.vt.edu/~history/
GASCH.KAY.HTML, 2010. [Online; accessed 17-April-2010].
[GJ97] Carlo Ghezzi and Mehdi Jazayeri. Programming Language Concepts. John
Wiley & Sons, Inc., New York, NY, USA, 1997.
[GR83] Adele. Goldberg and David. Robson. Smalltalk-80 : the language and its im-
plementation / Adele Goldberg and David Robson. Addison-Wesley, Reading,
Mass. :, 1983.
[Gro10] European Smalltalk User Group. European Smalltalk User Group. http:
//www.esug.org/, 2010. [Online; accessed 17-April-2010].
[Int10] Intelius. Intelius People Search - Alan Curtis Kay. http://search.intelius.
com/Alan-Kay, 2010. [Online; accessed 17-April-2010].
[Kay93] Alan C. Kay. The early history of smalltalk. In HOPL-II: The second ACM
SIGPLAN conference on History of programming languages, pages 69–95, New
York, NY, USA, 1993. ACM.
[Squ10] Squeak. Squeak. http://www.squeak.org/, 2010. [Online; accessed 10-May-
2010].
[Wik10a] Wikipedia. English Wikipedia - Alan Curtis Kay. http://en.wikipedia.org/
wiki/Alan_Kay, 2010. [Online; accessed 17-April-2010].
[Wik10b] Wikipedia. Portuguese Wikipedia - Alan Curtis Kay. http://pt.wikipedia.
org/wiki/Alan_Kay, 2010. [Online; accessed 17-April-2010].
9