# Self (linguagem de programação)

Self é uma linguagem de programação orientada a objeto , com base no conceito de prototipagem. Foi usada principalmente como um sistema de teste experimental para o projeto de linguagens nos anos 1980 e 1990. Em 2006, Self ainda estava sendo desenvolvida como parte do projeto Klein, que era uma máquina virtual Self escrita inteiramente em Self. A última versão principal é a 4.3, que foi lançada em julho de 2006. Em 2007, o projeto Klein deixou de estar ativo.
Várias técnicas de compilação just-in-time foram pioneiras ou melhoradas na pesquisa da linguagem Self pois estas eram necessárias para se permitir linguagem orientada a objetos de nível bastante elevado para executar até a metade da velocidade de um código C otimizado. Estas técnicas foram implantadas depois na máquina virtual HotSpot da linguagem de programação Java.

## História

Self foi projetada principalmente por David Ungar e Randall Smith, em 1986, enquanto trabalhavam na Xerox PARC. O seu objetivo era fazer avançar o estado da arte em pesquisa de linguagem de programação orientada a objeto, uma vez que a Smalltalk-80 fora lançada pelos laboratórios e havia começado a ser levada a sério pela indústria. Eles se mudaram para a Universidade de Stanford e continuaram a trabalhar sobre a linguagem, construindo o primeiro compilador Self funcional em 1987. Nesse ponto, o foco mudou para tentar se trazer todo um sistema para a Self, e não somente a linguagem.
A primeira versão pública foi lançada em 1990, e no ano seguinte a equipe desenvolvedora se mudou para a Sun Microsystems onde continuou a trabalhar na linguagem. Vários novas versões se seguiram, até ficar em grande parte adormecida, em 1995, na versão 4.0. A versão mais recente, 4.3, foi lançada em 2006 e roda em Mac OS X e Solaris. A nova versão está sendo desenvolvida para Mac OS X e Linux por um grupo de programadores independentes, que levou o projeto alguns meses atrás, e eles estão prestes a lançar uma versão 4.4 que agora está na fase de beta 4.
Self também inspirou uma série de linguagens baseadas em seus conceitos. Mais notável, talvez, foi a linguagem NewtonScript para o Apple Newton e a linguagem JavaScript utilizada principalmente para páginas da web dinâmicas em todos os navegadores modernos, e mais recentemente em servidores utilizando o ambiente node. Outros exemplos incluem a Io, a Cel, a Lisaac e a Agora. O sistema de objetos distribuídos da IBM Tivoli Framework, desenvolvido em 1990, foi, no nível mais baixo, um protótipo de sistema baseados em objetos inspirado pela Self.

## Linguagens de programação baseadas em protótipos

Linguagens tradicionais OO baseada em classe se baseiam em uma dualidade arraigada:
* Classes definem as qualidades básicas e os comportamentos dos objetos.
* Instâncias de objetos são manifestações particulares de uma classe.
Por exemplo, suponha que os objetos da classe Veiculo tem um nome e a capacidade de realizar várias ações, tais como dirigir ao trabalho e entregar materiais de construção. Carro de João é uma instância particular (objeto) da classe Veiculo com o nome "Carro de João". Em teoria, pode-se então enviar uma mensagem para Carro de João, dizendo a ele para entregar materiais de construção.
Este exemplo mostra um dos problemas com esta abordagem: o carro de Bob, é um carro desportivo, e, portanto, não deveria ser capaz de transportar e entregar materiais de construção (em qualquer sentido), mas esta é uma função que Veículos foram modelados para ter. Um modelo mais útil resulta da utilização de subclassing para criar especializações de Veículos; por exemplo Carros esporte e Caminhão aberto. Somente objetos da classe Caminhão aberto precisam fornecer um mecanismo para entrega de materiais de construção; carros esporte, que são mal adaptados para esse tipo de trabalho, só precisam andar rápido. No entanto, este modelo mais a fundo requer maior perspicácia, que só surge a medida que os problemas aparecem.
Esta questão é um dos fatores que motivam protótipos. A menos que se possa prever com certeza quais as qualidades um conjunto de objetos e classes terão no futuro distante, não se pode criar uma hierarquia de classe adequadamente. Muito frequentemente o programa acabaria por ter necessidade adicional de comportamentos, e as seções do sistema teriam de ser re-projetadas (ou refatoradas) para quebrar os objetos de uma forma diferente.
Em Self, e outras linguagens baseadas em protótipos, a dualidade entre as classes e instâncias de objeto é eliminada. Em vez de ter uma "instância" de um objeto que é baseado em alguma "classe", em Self se faz uma cópia de um objeto existente, e se efetua mudanças nela. Então carro de Bob seria criado como uma cópia de um objeto "veículo" existente e, em seguida adicionando-se o método dirigir mais rápido, modelando o fato de que ocorre ser um Porsche 911. Objetos básicos que são usados principalmente para fazer cópias são conhecidos como protótipos. Esta técnica é reivindica simplificar bastante o dinamismo. Se um objeto existente (ou conjunto de objetos) prova ser um modelo inadequado, um programador pode simplesmente criar um objeto modificado com o comportamento correto, e utilizá-lo. Códigos que usam os objetos existentes não são alterados.

## Descrição da linguagem

Objetos Self são um conjunto de "slots". Slots são métodos de acesso que retornam valores, e colocando dois pontos (":") após o nome de um slot se define o seu valor. Por exemplo, um slot chamado "nome",
retorna o valor em nome, e
o define.
Self, como Smalltalk, usa blocos para o controle de fluxo e outras funções. Métodos são objetos que contêm código, além de slots (que usam de argumentos e valores temporários), e podem ser colocados em um slot Self, tal como qualquer outro objeto: um número, por exemplo. A sintaxe é a mesma nos dois casos.
Note que não há distinção em Self entre campos e métodos: tudo é um slot. Uma vez que acessar slots através de mensagens constitui a maioria da sintaxe em Self, muitas mensagens são enviadas para "self", e "self" pode ser deixado de fora (daí o nome).

### Sintaxe básica

A sintaxe para acessar slots é semelhante à de Smalltalk. Três tipos de mensagens estão disponíveis:

#### unária

    receiver slot_name

#### binária

    receiver + argument

#### palavra chave

    receiver keyword: arg1 With: arg2
Todas as mensagens retornam resultados, de modo que o receptor (se houver) e os argumentos podem ser eles mesmas o resultado de outras mensagens. Seguir uma mensagem por um ponto (".") significa que Self irá descartar o valor retornado. Por exemplo:
Esta é a versão Self do programa Alô mundo. A sintaxe ' indica um objeto string literal. Outros literais incluem números, blocos e objetos em geral.
Agrupamentos podem ser forçados usando-se parênteses. Na ausência de agrupamentos explícitos, as mensagens unárias são considerados como tendo a precedência mais alta seguido pelas binárias (agrupando da esquerda para a direita) e as palavras-chave com os mais baixos. O uso de palavras-chave para a atribuição levaria a alguns parênteses extras, onde expressões também teriam mensagens-chave, de modo a evitar que Self exigisse que a primeira parte de uma nova mensagem de palavra-chave seletora iniciasse com uma letra minúscula, e suas partes posteriores começassem com uma letra maiúscula.