Smalltalk

linguagem de programação

Smalltalk-80, ou simplesmente Smalltalk, é uma linguagem de programação orientada a objeto dinamicamente tipada.

Smalltalk
Paradigma Orientação a Objetos
Surgido em Início em 1969, tornou-se público em 1980
Criado por Alan Kay, Dan Ingalls, Adele Goldberg
Estilo de tipagem dinâmica
Principais implementações 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
Extensão do arquivo .st

Em Smalltalk tudo é objeto: os números, as classes, os métodos, blocos de código, etc. Não há tipos primitivos, ao contrário de outras linguagens orientadas a objeto; strings, números e caracteres são implementados como classes em Smalltalk, por isso esta linguagem é considerada puramente orientada a objetos. Tecnicamente, todo elemento de Smalltalk é um objeto de primeira ordem.

Os programadores definem classes de objetos em suas aplicações para imitar (ou simular) o mundo real. Estas classes de objeto são organizadas hierarquicamente, de modo que seja possível fazer novos objetos com características de outros objetos, com poucas mudanças.

Smalltalk é relativamente fácil de aprender comparado a linguagens como C++ e ADA. O código-fonte Smalltalk é fácil de ler, o que o torna a linguagem de programação ideal para iniciantes.

História

editar

O Smalltalk evoluiu através de várias iterações. Do Smalltalk-71 (que parecia um pouco com o Logo) e Smalltalk-72 (na qual muitas das funcionalidades de mídia foram implementadas, da capacidade de desenhar até programas de música e linguagens de programação icônicas) para chegar no Smalltalk-76, que foi o primeiro Smalltalk moderno. Dan Ingalls foi o principal implementador nessa época, e o criador do Smalltalk-76. Ted Kaehler foi outro implementador do equipe original do Learning Research Group, desenvolvendo o sistema de música para o Smalltalk-72, uma versão da tartaruga do Logo para Smalltalk, além da estrutura de memória orientada a objetos.

O Smalltalk-80 foi lançado para computadores de diversas companhias (Hewlett-Packard, DEC, Apple, IBM, Tektronix) como um teste de portabilidade do ambiente. Foi implementado como um compilador de bytecode. O código era de fato compilado, porém não para a linguagem de máquina nativa do computador que executava aplicação e, sim, compilado para uma linguagem de máquina de um computador que não existia: a máquina virtual. A vantagem desse esquema que foi criado com o Smalltalk-80 é que ele tornou-se extremamente portável.

O Smalltalk-80 tornou-se um padrão para as diversas versões de Smalltalk. Depois disso, a Xerox resolveu criar uma empresa chamada ParcPlace para cuidar do desenvolvimento do Smalltalk, gerando novas versões como ObjectWorks e, posteriormente, VisualWorks. Outras versões foram criadas por outras companhias, tais como: Smalltalk/V da Digitalk e o SmalltalkAgents da Quasar; todos com sintaxe e estruturas semelhantes, porém o código da interface gráfica era radicalmente diferente.

Sintaxe

editar

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

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

No exemplo abaixo, o método publish é formado de uma linha, onde se envia a mensagem show para o objeto Transcript, com o parâmetro Hello, world (que é um objeto).

publish
    Transcript show: 'Hello, world!'

Polimorfismo

editar

Em Smalltalk não há o Polimorfismo Universal Paramétrico nem o Ad-Hoc por Coerção. Sendo assim só há implementado o Universal por Inclusão e o Ad-Hoc por Sobrecarga. Exemplos:

  • Inclusão:
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 básicas da linguagem

editar
  • Tudo é representado como objetos. (De longe, a regra mais importante em Smalltalk).
  • Toda computação é disparada pelo envio de mensagens. Uma mensagem é enviada para um objeto fazer alguma coisa.
  • Quase todas as expressões são da forma <recebedor> <mensagem>.
  • Mensagens fazem com que métodos sejam executados, sendo que o mapeamento de mensagens para métodos é determinado pelo objeto recebedor. Os métodos são as unidades de código em Smalltalk, equivalente a funções ou procedimentos em outras linguagens.
  • Todo objeto é uma instância de alguma classe. 12 é uma instância da classe SmallInteger. 'abc' é uma instância da classe String. A classe determina o comportamento e os dados de suas instâncias.
  • Toda classe tem uma classe mãe, exceto a classe Object. A classe mãe define os dados e comportamento que são herdados por suas classes filhas. A classe mãe é chamada de superclasse e suas filhas, subclasses.

Exemplos de código

editar

Hello world

editar
Transcript show: 'Hello, world!!!'

Número Perfeito

editar
Integer extend [

  "Traduzido da versão 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
Object subclass: #MessagePublisher
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'Smalltalk Examples'

Métodos

editar
publish
    Transcript show: 'Hello, world!'

Invocação

editar
MessagePublisher new publish

Ver também

editar

Ligações externas

editar