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.
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.
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.
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.
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.
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).
A Ceylon incorpora um conjunto tradicional de tipos implementados como classes comuns. Esses tipos são:
Natural. Números inteiros sem sinal, incluindo zeroInteger. Números inteiros com sinalFloat. Ponto flutuanteWhole. Números inteiros com sinal de precisão arbitráriaDecimal. 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.
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.
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).
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.
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.
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).
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.
Aprender
- A apresentação original de Gavin King sobre a linguagem Ceylon pode ser vista neste vídeo de 30 minutos intitulado Introducing the Ceylon Project Video. Há duas apresentações de Ceylon com King, incluindo a apresentação introdutória e aquela intitulada The Ceylon Type System, que abrange alguns de seus recursos mais avançados.
- Gavin King fornece uma série em 11 partes que descreve a linguagem Ceylon. Como se vê nos comentários em cada item da série, há uma quantidade considerável de feedback e um ajuste dinâmico da linguagem para solucionar problemas encontrados. Essa série se encontra no blog de King.
- Para acompanhar (e participar) a construção de Ceylon em tempo real, veja a lista de e-mails da equipe principal de Ceylon .
-
ANTLR é uma ferramenta e estrutura de linguagem usada para desenvolver compiladores, intérpretes, tradutores e reconhecedores a partir de uma descrição gramatical. ANTLR vem da Universidade de San Francisco, baseada no trabalho de Terence Parr.
- Este artigo tratou de alguns recursos de programação funcional implementados em Ceylon. Veja as introduções sobre funções de primeira classe, funções de ordem mais alta e encerramentos na Wikipédia.
-
Na zona Linux do developerWorks,
você encontra centenas de artigos e tutoriais de instruções além de downloads, fóruns de discussão e vários outros recursos para desenvolvedores e administradores de Linux.
-
Fique por dentro dos eventos técnicos e webcasts do developerWorks com foco em uma variedade de produtos da IBM e tópicos do segmento de mercado de TI.
-
Participe de um briefing ao vivo e gratuito do developerWorks para se atualizar rapidamente sobre produtos e ferramentas IBM, bem como tendências do segmento de mercado de TI.
-
Acompanhe Demos on demand do developerWorks
que abrangem desde demos de instalação e configuração de produtos para iniciantes até funcionalidades avançadas para desenvolvedores experientes.
-
Siga o DeveloperWorks no Twitter ou inscreva-se para receber tweets sobre Linux no developerWorks.
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.

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.