SELF
O poder da simplicidade
Agenda
● Motivação ● História ● Linguagem ● Semântica ● DemonstraçãoMotivação
Motivação
Peter Wegner● Classes ● Objetos ● Herança
História
Em 1986, Randall Smith fez o Alternate Reality Kit
● Simulações gráficas para crianças aprenderem física ● Não havia cores nem 3D nos computadores
● Vários conceitos que depois apareceram em Self
● Uniformidade
● Estado e comportamento unificados ● Protótipos
● Reflexão
História
● Criado por David Ungar e Randall Smith na Xerox PARC em 1986
● Randall foi para Londres, Ungar continuou o projeto em Stanford a partir de 1987
● Randall voltou, ambos trabalharam com o projeto na Sun de 1991 até 1995
História
● Segundo Ungar, “Sun não entendeu o que tinha em mãos”
● Dois dos principais desenvolvedores da VM criaram startup, portaram código para Java
● Alguns anos depois, Sun comprou a tecnologia dessa VM de volta por dezenas de milhões de dólares
História
O legado e a influência de Self incluem
● NewtonScript, linguagem para o Apple Newton (1993); adaptação de Self mais rápida, leve e textual
● JavaScript, assim como Self, é baseada em protótipos, não em classes
● Lua não tem classes, POO usa protótipos; novos objetos são clonados ou feitos com método Fábrica ● GUI Morphic de Self foi portada para Smalltalk
Linguagem
Conceitos gerais
● Tipagem dinâmica (distinção interna entre tipos abstratos e concretos)
● Não há classes nem variáveis; metáfora de protótipos ● Acesso ao estado é unificado com envio de
mensagens; para acessar, se usa mensagens
Linguagem
Conceitos
● Mensagens no fundo: envio de mensagens é a operação fundamental
● Economia conceitual/minimalismo: tudo é objeto, pode fazer papel de instância ou de repositório para
compartilhar informação
● Concretude: tentar representar as coisas da forma mais concreta possível
Linguagem
Experiência
● Programadores vivem no mundo real, respondem a sentidos, não só pensamentos racionais
● Humanos interagem com objetos físicos; para ter uniformidade, Self é composta apenas por objetos ● Protótipos permitem manipulação direta dos objetos
● Implementação, linguagem e interface trabalham juntas para criar uma experiência unificada
Linguagem
Protótipos
● Objetos em Self têm slots que guardam estado e comportamento
● Slots com objetos pais permitem herança (compartilhar
comportamento)
● Objeto tem características próprias, pai tem as compartilhadas
Linguagem
Vantagens dos protótipos
● Relações mais simples: “é um” e “é tipo de” X “herda de”
● Criação pela cópia: basta copiar para criar, sem ter que interpretar informações de formato
● Exemplos: protótipos são exemplos típicos de objetos; mais fáceis de entender, encorajam reutilização
Linguagem
Classe carro:
Atributos: Comportamento: motor frente ano ré modelo abrirPorta portas fecharPortaLinguagem
Ressalvas sobre protótipos
● Com protótipos e herança, próximo passo seria guardar comportamento no protótipo; mudar tudo facilmente
● Mas protótipos perderiam o que têm de especial; solução: objetos de traits, pais até do protótipo ● Mudança no protótipo só afeta ele mesmo
Linguagem
Misturando estado e comportamento
● Acesso de dados em slots é por envio de mensagem ● Acessar estado por mensagens deixa herança mais
flexível
● Compartilhamento de estado fica mais fácil
● Distinção entre acesso e comportamento diminuiria o poder das mensagens
Linguagem
Interface de usuário
● GUI Morphic, criada por Randall Smith e John Maloney ● Assim como na linguagem, os elementos gráficos são
todos objetos diretamente manipuláveis
● Objetivo é fazer a experiência ficar o mais simples possível
● Dois conceitos principais: reificação estrutural e edição instantânea
Linguagem
Interface de usuário: Reificação estrutural
● Estrutura fundamental são os morphs (grego: coisa/forma)
● Hierarquia de morphs: no topo, o protótipo; todos são visíveis
● Todo morph pode ter submorphs; composição se dá “colando” um no outro
● Layout determinado por objetos de layout, também visíveis, mostrando seu funcionamento diretamente
Linguagem
Interface de usuário: Edição instantânea
● A qualquer momento, objetos podem ser diretamente modificados e mostram mudanças instantaneamente ● Meta-menus permitem manipulações gráficas
● Menu outliner mostra informações sobre o morph no nível da linguagem (slots, edição)
● Slots podem ser editados mesmo com objeto na tela
Sintaxe/Semântica
Literais
● Inteiros. Ex.: 17, 2r10000, 16rFF ● Floats. Ex.: 3.14159, -3e6, 5.0
● Strings. Ex.: 'Hello world!', 'Quebra\n linha' ● Comentários ficam dentro de aspas duplas
● Palavras reservadas são self e resend
● Identificadores podem ter letras, números e underline e têm que começar com letra minúscula
Sintaxe/Semântica
Mensagens
● Unárias. Ex.: 3.14 sin, atom mass
● Binárias. Ex.: 3 + 4, 23 @ 47, 'bla ' , 'bla' ● Com palavras-chave. Ex.: vec at: 2 Put: 50,
x > y ifTrue: 1 False: 0
● Precedência: unárias -> binárias -> palavras-chave ● Mensagens binárias têm precedência sempre igual
Sintaxe/Semântica
Objetos
● Objetos planos: lista de slots. Ex.: (| x. y. z |) é um objeto com 3 slots (getters/setters automáticos)
● Slot constante tem que ser inicializado com = e um
valor. Ex.: (| x = 3. y = 4 |)
● Slot variável é inicializado com <- e um valor (ou sem
nada). Ex.: (| x <- 5. y <- 6 |)
● Slots de pais têm asterisco após nome.
Sintaxe/Semântica
Métodos
● São objetos, podem ter código além de slots
● Slots de métodos servem como variáveis locais
● Retornam resultado da última expressão de código (ou retorno explícito com ^)
● Argumentos podem ficar na lista de slots. Ex.:
Sintaxe/Semântica
Blocos
● Parecem métodos, mas ficam entre [] e seu código só é executado quando recebem mensagem value
● Similares a funções anônimas/lambdas
● Podem ter argumentos (value:, value:With:, value:With:With:)
● Permitem criação de estruturas de controle
● Ex.: x != 0 ifTrue: [1/x] False: [0] [i < j] whileTrue: [i: i * 2]
Sintaxe/Semântica
Resends
● Equivalente ao super de outras linguagens
● Método de pai ou escolher entre pais diferentes
● Ex.: (|pai* = (|foo = (x + y)|). x <- 8. y <- 9. foo = (resend.foo - 1)|)
Sintaxe/Semântica
Operadores e objetos especiais
● Operadores aritméticos: +, -, *, /, /+, /-, %, square, squareRoot, sin, cos, tan, negate ● Operadores lógicos: =, ==, &&, ||, not
● true, false e nil são Singletons
● Ao serem "copiados", na verdade retornam self
● Slots que não recebem nem um valor inicial nem um
Sintaxe/Semântica
Coleções
● Vetores (tamanho fixo, ordenados, começam em zero); métodos at:Put:, first, last etc.
● Strings são vetores, podem ser mutáveis ou não; imutáveis usam padrão Flyweight
● Conjuntos e dicionários são desordenados, elementos comparáveis e retornam inteiro como valor hash;
Sintaxe/Semântica
Coleções
● do: recebe bloco e o aplica a cada elemento (e chave, se houver) da coleção
● mapBy:, filterBy: e outros mapeiam e filtram os elementos da coleção
● asDictionary, asVector, asList convertem
● Listas de coletores formadas pelo método & podem ser convertidas para coleções.
Referências
● UNGAR, David e SMITH, Randall B. - Self: The Power of Simplicity, Lisp
and Symbolic Computation 4(3), Kluwer Academic Publishers, June, 1991.
Disponível em: http://bibliography.selflanguage.org/_static/self-power.pdf
● UNGAR, David e SMITH, Randall B. - Programming as an Experience:
The Inspiration for Self, ECOOP ‘95 Conference Proceedings, Aarhus,
Denmark, August, 1995. Disponível em: http://bibliography.selflanguage.
org/_static/programming-as-experience.pdf
● http://www.selflanguage.org (em especial os dois vídeos)
● http://handbook.selflanguage.org/4.5/
● http://www.self-support.com