Ruby

Integrantes:

  • Rubens Junio Humberto Barbosa Peres
  • Alvaro Joan Gonçalves dos Santos

Características:

Ruby é uma linguagem de programação interpretada e orientada à objetos pura, implementada por Yukihiro Matsumoto. Yukihiro é um dos grandes nomes do software livre no Japão. A linguagem possui recursos nativos para programação com os mais diversos tipos de aplicativos (processamento de arquivos texto, aplicações multithreaded e aplicações que utilizam sockets são alguns exemplos). A linguagem Ruby é uma linguagem free, mesmo para uso comercial. A existência de muitas bibliotecas torna a programação simples. Além disso, existe uma compatibilidade entre todas as versões da linguagem, desde o seu início.

Estrutura Geral:

  • Ruby é uma linguagem interpretada. Sendo assim, não é necessário recompilar os programas para executá-los novamente, basta executá-lo através do interpretador. Isto pode ser bom do ponto de vista da facilidade do programador na hora da implementação e fase de testes, mas diminui a performance de um programa complexo, devido à interpretação do código fonte cada vez que alguma instrução é chamada.
  • Como o Ruby é uma linguagem orientada à objetos pura, seu criador decidiu trabalhar somente com objetos, ou seja, tudo na linguagem é tratado como objetos. Inteiros, strings, estruturas de decisão, blocos de controle, loops, tudo é feito através de mensagens entre objetos, assim como na linguagem Smalltalk.
  • A sintaxe do Ruby é fortemente influenciada pela sintaxe da linguagem Eiffel. Do ponto de vista do aprendizado, isto facilita muito a vida do programador, pois como a sintaxe é muito simples você escreve programas mais legíveis de uma forma mais elegante e fica fácil de outro programador fazer manutenção de código posteriormente.
  • Expressões regulares podem ser utilizadas para o processamento de textos, exatamente como é feito na linguagem Perl. Grandes facilidades neste sentido tornam a vida do programador que não se adaptou às bizarras expressões regulares em Perl trabalhar com elas facilmente utilizando Ruby.
  • Ruby é altamente portável, isto significa que um programa Ruby executa sem nenhuma mudança em qualquer plataforma. É claro que isto somente é verdade se você não estiver utilizando modulos específicos de uma plataforma, como algumas GUIs para UNIX ouWinGKR (Win32 GUI Kit for Ruby). Isto traz como vantagens um menor custo, porque apenas um programa deve ser gerenciado e uma maior distribuição do programa, além dele poder ser executado em várias plataformas.

Orientação à Objetos:

  • Características básicas de linguagem orientadas à objetos como o conceito de herança, classes, métodos, polimorfismo e encapsulamento são implementadas em sua totalidade na linguagem Ruby.
  • Somente herenças simples podem ser feitas na linguagem Ruby (apesar disto, existe um conceito de compartilhamento de métodos entre classes, permitindo desta maneira uma herença múltipla forçada).
  • O encapsulamento é feito através de três construções básicas: private, protected e public. Um método private somente pode ser chamado na sua classe de definição. Um método protected pode ser chamado somente pela sua classe de definição e suas subclasses. Um método public é acessado por qualquer método. Algo que deve ser mencionado aqui é que estas verificações são feitas dinamicamente em tempo de execução. Isto leva programadores menos experientes à run-time errors mais freqüentemente.
  • Outro recurso interessante é a possibilidade de dinamicamente expandir os parâmetros formais de um método através de um array. Como arrays são heterogêneos, os parâmetros adicionados dinamicamente podem ser de qualquer tipo.

Métodos e Variavéis:

  • Métodos são os subprogramas das linguagens orientadas à objetos. Seus parâmetros formais são chamados de protocolos, mas a forma de implementação não difere muito entre os dois paradigmas.
  • Na linguagem Ruby, a procura por um método chamado para ser executado é realizada de forma dinâmica. Isto significa que quando um método não é encontrado em sua classe atual, o próximo lugar a ser procurado será a sua classe pai, e assim sucessivamente, até chegarmos na superclasse.
  • Os métodos conseguem retornar somente um objeto, não importando que tipo de objeto. Isto significa que um método pode retornar qualquer coisa, devido à capacidade dos arrays serem heterogêneos.
  • Variáveis são somente referências para objetos. Nada mais. Não existem ponteiros. Apesar desta lacuna, aliasses de objetos podem ser feitos, como em Java.
  • As variáveis na linguagem Ruby não possuem tipo, assim como em Smalltalk, BASIC Ou Python. Isto significa que conforme as variáveis são utilizadas no programa elas vão tendo o seu tipo atribuído. No contexto de Linguagens de Programação isto é chamado de atribuição de tipos dinâmica. Conseqüentemente, as verificações de tipos de variáveis durante a interpretação do código são minimizadas, tornando assim a linguagem não fortemente tipificada.
  • As variáveis não precisam ser declaradas antes de serem utilizadas. Conforme o nome da variável o interpretador sabe qual o escopo da variável utilizada. No contexto de linguagens de programação, estas variáveis são chamadas de variáveis heap-dinâmicas implícitas. Na seção 3.1 você pode ver uma tabela que explica como controlar o escopo de variáveis através do seu nome.
  • A atribuição de valores à variáveis é feita através de referências à objetos. Isto significa que ao atribuir um valor (lembre-se de que um valor também é um objeto na linguagem Ruby) à um objeto, este valor não precisa ser copiado e instanciado novamente, somente uma referência para o valor que está sendo atribuído é criada.

Gerenciamento de Memória:

  • O gerenciamento de memória do Ruby é todo feito automaticamente pelo próprio interpretador. Periodicamente, a linguagem Ruby aloca pequenos blocos de memória para que nunca falte memória para um script que esteja rodando, automatizando assim o processo de alocação de memória. Um garbage collector encarrega-se de todos objetos que não são referenciados à bastante tempo, facilitando assim a vida do programador, que não precisa desalocar blocos de memórias para objetos.
  • Apesar disto, instruções específicas de alocação/desalocação implementadas nativamente possibilitam ao programador gerenciar casos específicos aonde o gerenciamento automático não se aplica.
  • Uma grande vantagem do garbage collector é que desaparecem os memory leak, acontecem poucos erros ou travamentos. Isto torna a programação mais rápida e menos complicada, porque não é necessário fazer o gerenciamento de memória manual. Infelizmente perde-se velocidade (aproximadamente 10%), mas como Ruby é uma linguagem interpretada 10% torna-se uma quantia insignificativa.

Ferramentas de Desenvolvimento:

  • A distribuição padrão de Ruby contém ferramentas úteis junto com o interpretador e as bibliotecas padrão: depuradores, “profilers”, “irb (espécie de um interpretador interativo)” e um ruby-mode para Emacs. Estas ferramentas ajudam você a depurar e melhorar seus programas Ruby.
  • Caso seja necessário acessar banco de dados (como PostgreSQL ou MySQL) ou utilizar um toolkit GUI não padrão como Qt, Gtk, FOX, etc., você pode buscar recursos no Arquivo de Aplicações Ruby (RAA).

Exemplos da linguagem Ruby:

def sayHello(name)

result = “Hello, ” + name

return result

end

# Hello World!

puts sayGoodnight(“World”)


if count > 10

puts “Tente novamente”

elsif tries == 3

puts “Você perdeu”

else

puts “Digite um número”

end


# calculate Fibonacci(20)

def fib(n)

-if n<2

n

else

fib(n-2)+fib(n-1)

end

end

print(fib(20), “\n”);


 
ruby-1-trabalho.txt · Last modified: 2012/03/19 00:01 by clp · [Old revisions]