Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ceylon: Avanço de verdade ou apenas outra linguagem?

Programação orientada a objetos e funcional para as massas

M. Tim Jones, Platform Architect, Intel
author photo - M. Tim Jones
M. Tim Jones é arquiteto de firmware integrado e autor de Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (atualmente em sua segunda edição), AI Application Programming (em sua segunda edição) e BSD Sockets Programming from a Multilanguage Perspective. Seu conhecimento em engenharia varia do desenvolvimento de kernels para naves espaciais geossíncronas até a arquitetura de sistemas embarcados e o desenvolvimento de protocolos de rede. Tim trabalha na Intel e reside em Longmont, Colorado.

Resumo:  A estrada das linguagens na ciência da computação está repleta de carcaças daquelas que deveriam ser um linguagem revolucionária. E embora muitas linguagens de nicho acabem sendo adotadas em aplicativos de script ou especializados, as linguagens C (e seus derivados) e Java são difíceis de substituir. Mas a Ceylon da Red Hat parece ser uma combinação interessante de recursos de linguagem, usando uma conhecida sintaxe em estilo C, mas com suporte a orientação a objetos e aspectos funcionais úteis, além de ênfase em ser sucinta. Explore a Ceylon e descubra se essa futura linguagem de VM pode vir a ter um lugar no desenvolvimento de software corporativo.

Data:  11/Jul/2011
Nível:  Intermediário Também disponível em :   Inglês
Atividade:  1219 visualizações
Comentários:  


Linux e software livre são comumente associados com a vanguarda do design de linguagem. Pode ser as ferramentas disponíveis que suportam o desenvolvimento de linguagem ou a abertura da plataforma que dá origem ao avanço no design de linguagem. Ou talvez seja que as linguagens abertas (como a família GNU Compiler Collection, Ruby, Python e Perl), com base em tecnologias de software livre, são ótimas porque convidam e incentivam a experimentação e o uso (para não falar que a Red Hat é a empresa por trás da Ceylon). Seja qual for o motivo, os desenvolvedores Linux têm acesso a uma grande variedade de linguagens, das linguagens históricas menos utilizadas às ofertas de ponta mais recentes.

Ceylon não é Java

"Ceylon não é Java, é uma nova linguagem profundamente influenciada por Java, projetada por pessoas que são fãs incondicionais de Java. Java não vai morrer em breve, ou seja, ninguém está tentando matá-la." — Gavin King

Mas em um mundo de linguagens C/C++, Java™ , Scala, Ruby, Python, Perl, Erlang, Lua, Scheme, e tantas outras, deveríamos nos interessar pelolançamento de uma nova linguagem focada no desenvolvimento de software corporativo orientado a negócios? Em muitos casos, a resposta é não, mas vamos explorar a futura oferta de linguagem da Red Hat, chamada Ceylon, para ver se ela pode vir a ingressar no grupo das linguagens mais populares de hoje.

Apresentando Ceylon

Ceylon é um novo projeto da Red Hat liderado por Gavin King. King é o fundador do projeto Hibernate, uma solução de persistência dentro da linguagem Java. Embora King seja fã da tecnologia Java — ela foi uma das primeiras linguagens adequadas para desenvolvimento em grande escala — ele é citado como tendo uma série de frustrações com a linguagem (incluindo complexidades da linguagem, como genéricos, o Standard Edition SDK, obscuro e projetado às pressa, uma sintaxe de anotação desajeitada, estrutura de blocos partida, dependência de XML, e muito mais).

Assim, King perguntou: como seria uma linguagem que aplicasse as lições aprendidas com as vantagens e desvantagens da linguagem Java e SDK? Sua resposta foi a Ceylon, uma linguagem tipada estaticamente, que retém algumas das melhores características da linguagem Java (e é executada em JVM), mas melhora a legibilidade da linguagem, sua modularidade integrada e a incorporação de recursos de linguagem funcional, como de funções de alta ordem. Ceylon também incorpora recursos de C e Smalltalk. Muito semelhante à linguagem Java, essa nova linguagem se concentra em computação de negócios, mas também é flexível e útil em outros domínios.

Alguns chamaram a Ceylon de "matadora de Java" (talvez devido às questões sobre o futuro da linguagem Java), mas a Ceylon na verdade é executado na JVM, por isso, é uma extensão da tecnologia Java, em vez de uma substituição. Usar a JVM para suportar a execução de Ceylon é o modelo ideal, visto que significa que a Ceylon (como Java) é transportável entre uma infinidade de arquiteturas que atualmente suportam a JVM.


Recursos da linguagem Ceylon

A maioria das linguagens de hoje desafia uma categorização simples e, em vez disso, representam uma variedade de estilos de programação. Ceylon não é diferente. Ceylon é uma linguagem tipada estaticamente (ou seja, a verificação de tipo é executada no momento da compilação, em comparação com as linguagens de tipo dinâmico como Lisp, onde a verificação de tipo é executada no tempo de execução). Ceylon é uma linguagem orientada a objetos, como a linguagem Java, e também suporta funções de ordem superior (o que significa que as funções podem receber funções como entrada ou saída) com um estilo de sintaxe típico da linguagem C. As funções de ordem superior não são suportadas diretamente na linguagem Java, de modo que essa funcionalidade representa uma diferença exclusiva entre as duas linguagens.

Às vezes, porém, as melhorias são mais a respeito do que uma linguagem removeu do que o que ela acrescentou. A Ceylon simplifica e elimina elementos da linguagem Java, substituindo-os por um esquema mais simples. Um exemplo de simplificação é a remoção das palavras-chave public, protected e private . Em vez disso, a Ceylon simplesmente inclui a anotação shared , que define que elementos de uma classe são visíveis externamente. Ceylon também remove a capacidade de sobrecarga, mas oferece algumas soluções alternativas para essa funcionalidade (como parâmetros padrão e sequenciados) com sintaxe mais simples.

A Ceylon inclui suporte a herança, sequências (array ou lista de construção), genéricos, argumentos nomeados, e muito mais. Ela inclui recursos o gerenciamento de tipo no tempo de execução (vamos explorar um exemplo disso na próxima seção). A linguagem está em desenvolvimento ativo, de modo a o recurso final permanece em aberto.


Ceylon ilustrada

Embora na época em que este texto é escrito um compilador publicamente utilizável ainda não exista, a estrutura da linguagem Ceylon está definida, permitindo o desenvolvimento de aplicativos de amostra para explorar e raciocinar sobre sua utilização e legibilidade. Esta seção analisa alguns aplicativos de amostra em Ceylon que ilustram sua estrutura.

Hello World

Usarei o programa "Hello World" para ilustrar a criação de um programa simples para emitir uma cadeia de caractere de texto simples a ser exibida. O exemplo mostrado na Listagem 1 apresenta um método de nível superior chamado hello que usa o método writeLine para emitir uma cadeia de caractere para a saída padrão.


Listagem 1. Programa Hello World em Ceylon

doc "Hello World Program"
by "Gavin King"
void hello() {
  writeLine( "Hello World." );
}

Note também a anotação usada para a documentação da API (similar a ferramentas como doxygen), permitindo especificar o método e o autor (as anotações doc e by , respectivamente).

Tipos em Ceylon

A Ceylon incorpora um conjunto tradicional de tipos implementados como classes comuns. Esses tipos são:

  • Natural. Números inteiros sem sinal, incluindo zero
  • Integer. Números inteiros com sinal
  • Float. Ponto flutuante
  • Whole. Números inteiros com sinal de precisão arbitrária
  • Decimal. Decimais de escala e precisão arbitrárias

Por padrão, os tipos Natural, Integer e Float são de 64 bits, mas é possível anotá-los com small para especificar uma precisão de 32 bits.

Classe em Ceylon

Visto que Ceylon é uma linguagem orientada a objetos, escreva o código usando o conceito de classes. Uma classe é um tipo em Ceylon que encapsula um conjunto de operações (chamadas de métodos) e estado, além de uma definição de como o estado é inicializado quando um objeto da classe é inicializada (o inicializador de classe, similar ao construtor).

Uma classe simples ajudará a entender a abordagem da Ceylon. A Listagem 2 fornece uma classe simples para uma classe de contador. A Linha 2 define a classe com um valor opcional, o que significa que o usuário pode fornecê-lo ou não, o que é indicado pelo padrão Type? . Em vez de um construtor, o corpo da classe contém o inicializador de classe. Esse código define a variável privada (nada é visível a menos que seja anotado como compartilhado), e então a lógica de inicialização. Comece verificando se a variável de início existe. Se não existir, ela é usada como valor inicial para sua contagem. Seu primeiro método, anotado como shared e, portanto, visível externamente à classe, define o incrementador. Quando chamado, esse método simplesmente incrementa seu contador.

Finalmente, define-se um método getter que retorna o valor atual do contador para o usuário e um método setter que define o valor atual do contador com aquele fornecido pelo responsável pela chamada. Observe o uso da palavra-chave assign aqui para criar um atributo variável para definir o valor do contador. Além de lidar com construtores de maneira diferente (código integrado à classe), não há desconstrutor e não há maneira de implementar vários construtores (apenas uma das diferenças em relação à linguagem Java).


Listagem 2. Classe simples em Ceylon
	
01    doc "Simple Counting Class"
02    class Counter( Natural? start ) {
03    
04      doc "Class Initializer"
05      variable Natural count := 0;
06      if (exists start) {
07        count := start;
09      }
10    
11      doc "The incrementer"
12      shared void increment() {
13        count++;
14      }
15    
16      doc "The getter"
17      shared Natural currentValue {
18        return count;
19      }
20
21      doc "The setter"
22      shared assign currentValue {
23        count := currentValue;
24      }
25
26    }

Com sua classe simples definida, vejamos como usar a classe em Ceylon. A Listagem 3 fornece um bloco de código que usa sua classe Counter . Ele começa com a instanciação da classe para o objeto cnt . Note que não há palavra-chave new em Ceylon. Com seu novo objeto Counter definido, chame o método increment e emita o valor Counter usando seu método getter. Observe que os operadores = e := são diferentes em Ceylon: usa-se o especificador = apenas para valores imutáveis, enquanto a designação variável é executada com o operador := .


Listagem 3. Usando a classe Counter

01    Counter cnt = Counter(1);
02    cnt.increment();
03    writeLine( c.currentValue );

Ceylon incentiva o uso de atributos imutáveis sempre que possível. Isso significa que um objeto é inicializado com um valor e não é redesignado. Para especificar que um valor nomeado é mutável (pode ser alterado após a inicialização), ele deve ser anotado com variable, como mostrado na Listagem 2 , linha 5.

Um elemento final a explorar é a diferença principal nas estruturas de controle em Ceylon. Note que, em muitas linguagens, os colchetes {}) podem ser omitidos após uma expressão condicional, como quando aparece um único statement :

if (cnt > 10) statement();

A Ceylon proíbe essa sintaxe e exige a presença dos colchetes. Isso significa que o código de amostra encontrado acima deve ser escrito em Ceylon desta forma:

if (cnt > 100) { statement(); }

Visto que esse é um dos erros mais comuns em C, é uma boa inclusão para forçar esse tipo de estilo adequado.

Funções de ordem mais alta

A Ceylon inclui o estilo funcional de programação chamado funções de primeira ordem. Isso significa simplesmente que as funções são tratadas como objetos de primeira classe e podem ser usadas como parâmetros para funções, além de poderem ser retornadas de funções. Veja o exemplo da apresentação de King da definição do método repeat (veja a Listagem 4). Nesse caso, ele assume dois argumentos: Natural para o número de vezes a repetir e o argumento de método para a função a chamar. No corpo do método repeat , basta criar um loop for (usando uma operação de intervalo) e chamar o método como passado como parâmetro funcional.


Listagem 4. Funções de ordem mais alta em Ceylon

01    void repeat( Natural times, void hfunction() ) {
02      for (Natural n in 1..times) {
03        hfunction();
04      }
05    }

Usar esse método é simples, como mostrado na linha 7 da Listagem 5. Como mostrado, o nome do método é usado sem argumentos.


Listing 5. Using higher-order functions in Ceylon

01    void sayhello() {
02      writeLine( "Hello World." );
03    }
04
05    ...
06
07      repeat( 10, sayhello );

A o contrário de outras linguagens com suporte funcional, a Ceylon não suporta funções anônimas (funções sem nome que aparecem diretamente em expressões). Ela inclui suporta a encerramentos (que são essencialmente funções que podem fazer referência a um estado em outra função).

Estreitamento de tipo

Ceylon não inclui o operador instanceof encontrado na linguagem Java; nem inclui a alteração de tipos de dados, como encontrado em C. Em vez disso, a Ceylon implementa o chamado estreitamento de tipo, usado para testar e estreitar o tipo de uma referência a objeto em uma única etapa. Considere o seguinte segmento de código na Listagem 6. Esse código usa uma construção especial (is ... ) para testar uma referência a objeto em relação a determinado tipo. Depois que o tipo é identificado, o método específico do tipo é utilizado. Essa construção é semelhante a (exists ...) que vimos antes na Listagem 2 para parâmetros opcionais.


Listagem 6. Estreitamento de tipo em Ceylon
	
01    Object obj = <some object>;
02    
03    switch (obj)
04    
05      case (is Counter) {
06        obj.increment();
07      }
08      case (is ComplexCounter) {
09        obj.incrementBy(1);
10      }
11      else {
12        stream.writeLine("Unknown object");
13      }

Ceylon inclui outra construção similar, definida como (nonempty ...), que pode ser aplicada a sequências (arrays ou listas) para determinar se a sequência não contém nenhum elemento e, portanto, não pode ter operações de sequência aplicadas a ela.

Por fim, note a sintaxe das instruções switch em Ceylon, que é diferente das linguagens C e Java. Onde essas duas linguagens podem ser propensas a erros, a Ceylon força uma estrutura de bloco aos casos e remove o caso default em preferência a um bloco else . Ceylon também garante (no momento da compilação) que a instrução switch contenha uma lista completa de testes de instância ou, no mínimo, uma cláusula else para fornecer cobertura completa. O compilador verifica automaticamente essas instruções switch e gera um erro se uma instância não for coberta.

Outras estruturas de controle

Ceylon implementa instruções tradicionais if...else , como seria de esperar, e também implementa recursos de manipulação de exceção da linguagem Java (try, catch, finally). Ceylon também cria o que é chamado de bloco fail , usado com loops for para identificar quando eles se rompem prematuramente. Veja o exemplo mostrado na Listagem 7.


Listagem 7. Ilustrando o bloco fail em Ceylon

01    for (Instrument i in instruments) {
02      if (i.failing()) {
03        break;
04      }
05    }
06    fail {
07      // Take some action...
08    }

Esse é um padrão de design comum a C e à linguagem Java e, portanto, um acréscimo útil à Ceylon.


Futuro de Ceylon

Como disse King, Ceylon é um esforço da comunidade e, portanto, precisa de engenheiros de software e testadores para ajudar a projetar, desenvolver e validar a linguagem e SDK. Essa chamada pode encorajar o feedback dos usuários da linguagem Java para que ajudem a apoiar sua migração dessa linguagem para Ceylon. King tem mantido certo segredo sobre estado atual de Ceylon, dizendo apenas que a especificação da linguagem existe, bem como a gramática ANTLR (Another Tool for Language Recognition).


Avançando

Embora alguns contestem a necessidade de uma nova linguagem, outra forma de encarar as linguagens é como um conjunto de ferramentas que pode ser usado para resolver problemas. Nem toda a linguagem é adequada ou ideal para determinado problema, mas algumas se prestam muito bem para domínios de solução específica; portanto, a disponibilidade de diversas linguagens é uma bênção, não uma maldição. Visto que Ceylon ainda está em desenvolvimento, não se sabe se ela alcançará um lugar entre as linguagens mais populares em uso. Mas a linguagem chama a atenção por seus recursos interessantes que serão divertidos de explorar adicionalmente quando ela finalmente estiver disponível.


Recursos

Aprender

Obter produtos e tecnologias

  • Avalie produtos IBM da maneira que for melhor para você: faça download da versão de teste de um produto, avalie um produto on-line, use-o em um ambiente de nuvem ou passe algumas horas na SOA Sandbox aprendendo a implementar a Arquitetura Orientada a Serviços de modo eficiente.

Discutir

  • Participe da comunidade do My developerWorks. Entre em contato com outros usuários do developerWorks, enquanto explora os blogs, fóruns, grupos e wikis orientados ao desenvolvedor.

Sobre o autor

author photo - M. Tim Jones

M. Tim Jones é arquiteto de firmware integrado e autor de Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (atualmente em sua segunda edição), AI Application Programming (em sua segunda edição) e BSD Sockets Programming from a Multilanguage Perspective. Seu conhecimento em engenharia varia do desenvolvimento de kernels para naves espaciais geossíncronas até a arquitetura de sistemas embarcados e o desenvolvimento de protocolos de rede. Tim trabalha na Intel e reside em Longmont, Colorado.

Ajuda para Relatar Abuso

Relatar abuso

Obrigado. Esta entrada foi sinalizada para atenção do moderador.


Ajuda para Relatar Abuso

Relatar abuso

Falha no envio do Relatório de abuso. Tente novamente mais tarde.


developerWorks: Registre-se


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Selecione seu nome de exibição

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

(Deve possuir de 3 a 31 caracteres.)


Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Classificar este artigo

Comentários

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux, Software livre
ArticleID=722194
ArticleTitle=Ceylon: Avanço de verdade ou apenas outra linguagem?
publish-date=07112011
author1-email=mtj@mtjones.com
author1-email-cc=

Conheça a IBM da sua cidade

Virtual Branch Office Brasil

A IBM está mais perto do que você imagina!


Tags

Help
Use o campo de pesquisa para encontrar todos os tipos de conteúdo no My developerWorks com essa tag.

Use a barra de rolagem para ver mais ou menos tags.

Tags populares mostra as principais tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Minhas tags mostra suas tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Use o campo de pesquisa para localizar todos os tipos de conteúdo no Meu developerWorks com essa tag. Tags populares mostra as tags principais para essa zona de conteúdo particular (por exemplo, tecnologia Java, Linux, WebSphere). My tags shows your tags for this particular content zone (for example, Java technology, Linux, WebSphere). Minhas tags mostra as suas tags para essa zona de conteúdo em particular (por exemplo, tecnologia Java, Linux, WebSphere).