Smalltalk

 Smalltalk

Grupo: Guilherme Povala e Lívia Amaral

Nome Smalltalk
Versão estável Smalltalk-80 version 2 (1980)
Ano Desenvolvido desde 1969, tornou-se público em 1972
Criado por Alan Kay, Dan Ingalls, Adele Goldberg
Desenvolvedores Alan Kay, Dan Ingalls, Adele Goldberg, Ted Kaehler, Diana Merry, Scott Wallace, Peter Deutsch and Xerox PARC
Paradigma Orientação a Objetos
Tipagem Dinâmica
Compiladores Pharo, Squeak, GNU Smalltalk, VisualWorks, Dolphin Smalltalk, Smalltalk/X, VA Smalltalk
Dialetos Squeak
Influenciada Por Lisp, Simula, Logo, Sketchpad
Influenciou Objective-C, Self, Java, PHP 5, Dylan, AppleScript, Lisaac, D, NewtonScript, Python, Ruby, Scala, Perl 6, Common Lisp Object System (CLOS), Falcon, Io, Ioke
Sistema Operacional Multi-Plataforma

Índice

Introdução

Smalltalk-80, ou apenas Smalltalk, é uma linguagem de programação orientada a objeto com tipagem dinâmica. Smalltalk foi a primeira linguagem de programação com suporte completo à programação orientada a objetos. Trouxe, também, o conceito de interação com os usuários através de janelas. Nunca foi amplamente utilizada em comparação a outras linguagens, porém, a programação orientada a objetos é, atualmente, o caso da maioria das linguagens imperativas populares como Java e C++.
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

Smalltalk foi desenvolvida pelo Xerox Palo Alto Research Center no ínicio dos anos 70. Foi baseada em linguagens como Simula, Logo, Sketchpad e Lisp.
No final dos anos 60, Alan Kay vislumbrou a disponibilidade futura de computadores de mesa, que seriam usados por usuários não programadores e assim, precisariam de uma grande capacidade de interação humano-computador, ou seja, os computadores deveriam ser altamente interativos e usar interfaces gráficas.
Inicialmente, Kay pensou em um sistema chamado Dynabook, na qual o usuário interagiria com várias janelas, tanto por meio de um teclado, quanto tocando a tela com seus dedos. Quando Kay apresentou suas ideias sobre o Dynabook na Xerox, foi contratado e levado a ajudar no nascimento do Xerox Learning Research Group. O objetivo do grupo era projetar uma linguagem para suportar o paradigma de programação de Kay e implementá-lo no melhor computador pessoal possível. Assim surgiu um Dynabook composto do hardware Xerox Alto e do software Smalltalk-72.
Vários projetos de pesquisa foram conduzidos com esse sistema, incluindo experimentos para ensinar programação para crianças. Com os experimentos feitos, vieram desenvolvimentos que culminaram no Smalltalk-80.

Visão da Linguagem

Em Smalltalk, os números, as classes, os métodos, e etc, são todos objetos. Ou seja, toda a computação feita em Smalltalk é feita pela mesma técnica: envia-se uma mendagem a um objeto para invocar um de seus métodos. Uma resposta a uma mensagem é um objeto, o qual retorna a informação requisitada ou notifica o chamador que o processamento solicitado foi completado.
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.
A diferença entre uma chamada e uma chamada a subprograma é que uma mensagem é enviada para um objeto de dados, especificamente para um dos métodos definidos para o objeto. O método chamado é então executado, geralmente modificando os dados do objeto para a qual a mensagem foi enviada; uma chamada a subprograma é uma mensagem ao código de um subprograma.
A sintaxe de Smalltalk é diferente de todas as outras linguagens, não se parecendo com nenhuma. Em grande parte por causa do uso de mensagens, em vez de expressões lógicas e aritméticas e sentenças de controle convencionais.

Avaliação

Smalltalk teve uma grande papel na promoção de dois aspectos separados da computação: interfaces gráficas com o usuário e programação orientada a objetos. O sistema de janelas que é agora o método dominante de interfaces com o usuário em sistemas de software cresceu a partir do Smalltalk. Atualmente, as metodologias de projeto de software e as linguagens mais significativas são orientadas a objetos. Apesar de algumas das ideias das ideias originais de linguagens orientadas a objetos serem do Simula 67, elas alcançaram a maturidade apenas em Smalltalk. O impacto do Smalltalk no mundo da computação é extenso e terá vida longa.

Comandos

timesRepeat

Executa um bloco de instruções um número específico de vezes.

anInteger timesRepeat: [bloco_instruções]
  • anInteger - número de vezes a repetir
  • bloco_instruções - bloco de instruções a repetir

Exemplo

4 timesRepeat: [quantia := quantia + 10]

to... do e to... by

Executa um bloco múltiplas vezes baseado em um valor de início e um de final.

anInteger1 to: anInteger2 do: [bloco_instruções]
anInteger1 to: anInteger2 by: anInteger3 do: [bloco_instruções]
  • anInteger1 - valor inicial de contagem
  • anInteger2 - valor de parada
  • anInteger3 - passo da contagem
  • bloco_instruções – bloco de instruções a repetir

Exemplo

|anArray|
anArray:=(#1 2 3).
1 to: anArray size by: i do: [:i| anArray at: i put: 0

ifTrue e ifFalse

Executa um bloco de instruções caso uma condição booleana seja atendida (ou não).

condição_booleana ifTrue: [bloco_instruções]
condição_booleana ifFalse: [bloco_instruções]
condição_booleana
    ifTrue: [bloco_instruções_se_verdadeiro]
    ifFalse: [bloco_instruções_se_falso]
condição_booleana
    ifFalse: [bloco_instruções_se_falso]
    ifTrue: [bloco_instruções_se_verdadeiro]

Para se obter uma condição booleana, basta enviar uma mensagem de comparação (=, <, >, ⇐, >=, ~=, ==, ~~) a um objeto.

Exemplo

a=b
    ifTrue: [a:=b+1. b:=b-2]
    ifFalse: [b:=a]

whileTrue e whileFalse

Executa o código enquanto a condição for satisfeita.

[bloco_receptor] whileTrue: [bloco_argumento]

No caso da mensagem whileTrue, o ciclo funciona da seguinte forma: o bloco receptor recebe a mensagem value. Se a resposta a esta mensagem é true, então a mensagem value é enviada ao bloco de argumento. O ciclo repete-se até que o bloco receptor retorne false.

[bloco_receptor] whileFalse: [bloco_argumento]

A mensagem whileFalse funciona de forma contrária. Em alguns casos, todo o trabalho útil é feito no bloco receptor e o bloco de argumentos pode ser dispensado. Nestes casos, omite-se o argumentBlock.

Exemplos

Hello world

Transcript show: 'Hello, world!!!'

Instrução FOR

1 to:10 do:[:i|
    Transcript show: (i asString).
].

Número Perfeito

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

Object subclass: #MessagePublisher
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'Smalltalk Examples'

Métodos

publish
    Transcript show: 'Hello, world!'

Invocação

MessagePublisher new publish

Polígonos Equiláteros

"Uma definição de classe, instanciações que podem desenhar polígonos equiláteros de qualquer número de lados"
class name			Polygon
superclass			Object
instance variable names		ourPen
numSides
sideLenght
"Métodos de Classe"
"Cria uma instância"
new
    ^ super new getPen
 
"Obtém uma caneta para desenhar o polígono"
getPen
ourPen <- Pen new defaultNib: 2
"Métodos de instância"
"Desenha um polígono"
draw
    numSides timesRepeat: [ourPen go: sideLenght; turn: 360 // numSides]
"Configura o tamanho dos lados"
length: len
    sideLenght <- len
"Configura o número de lados"
sides: num
    numSides <- num

Fontes e Links

 
smalltalk-1-trabalho.txt · Last modified: 2012/03/19 11:23 by adenauer · [Old revisions]