Self (linguagem de programação)

Origem: Wikipédia, a enciclopédia livre.
Self
Logo
Paradigma orientação a objeto
Surgido em 1986
Última versão 4.5.0 (12 de janeiro de 2014)
Criado por David Ungar, Randall Smith
Estilo de tipagem forte, dinâmica
Influenciada por Smalltalk
Influenciou NewtonScript, JavaScript, Io, Cel, Agora, Squeak, Lisaac, Lua, Factor, REBOL
Página oficial selflanguage.org

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[editar | editar código-fonte]

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[editar | editar código-fonte]

Linguagens tradicionais OO baseada em classe se baseiam em uma dualidade arraigada:

  1. Classes definem as qualidades básicas e os comportamentos dos objetos.
  2. 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[editar | editar código-fonte]

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",

   myPerson nome

retorna o valor em nome, e

   myPerson nome:'foo'

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[editar | editar código-fonte]

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:

   'Alô, Mundo!' print.

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.

Ver também[editar | editar código-fonte]

Ligações externas[editar | editar código-fonte]