segunda-feira, 2 de dezembro de 2013

Ruby 1

Ruby


Ruby é uma linguagem de programação dinâmica 1 , reflexiva 2, orientada a objetos 3, e de uso geral. Encarna inspirado em Perl com características Smalltalk - como sintaxe e também foi influenciado por Eiffel e Lisp. 

Ela suporta múltiplos paradigmas de programação, incluindo o funcional 4, orientação a objetos, e imperativo. Também tem um sistema de tipo dinâmico e gerenciamento automático de memória. Portanto, é semelhante em diferentes graus a Smalltalk , Python, Perl, Lisp, Dylan, e CLU .

A partir de 2010 , há uma série de implementações alternativas completas ou próximos do Ruby, incluindo YARV, JRuby, Rubinius, IronRuby, MacRuby ( e sua contraparte iOS , RubyMotion), mruby, HotRuby, Topaz e Opal. Cada tem uma abordagem diferente, com IronRuby, JRuby, MacRuby e Rubinius fornecendo compilação just-in-time.

Características do Ruby

  • Completamente orientada a objetos com herança, mixins (classe que contem uma combinação de métodos de outras classes) e metaclasses (classe cujas instância são classes).
  • Tipagem dinâmica e 'duck typing'(não requer a declaração do tipo da variável).
  • Tudo é uma expressão (até mesmo declarações) e tudo é executado imperativamente (mesmo declarações)
  • Sintaxe sucinta e flexível que minimiza o ruído sintático e serve como base para linguagens específicas de domínio.
  • Reflexão dinâmica e alteração de objetos para facilitar a metaprogramação.
  • Fechamentos léxicos, 'iteration' (objeto que permite tratar com contêineres, como listas ) e 'generator' (rotina usada para controlar o comportamento de uma 'iteration' em um loop), com um único bloco sintático.
  • Notação literal para arrays, hashes , expressões regulares e símbolos
  • Incorporação de código em strings (interpolação)
  • argumentos defaults
  • Quatro níveis de alcance variável (global, classe, instância e local) denotado por sigil(símbolo junto dos nomes das variáveis mostrando o tipo ou escopo, um prefixo como $foo, %foo, @foo) ou a falta dele.
  • A coleta de lixo.
  • Continuações de primeira-classe.
  • Regras rígidas de coerção booleanos (tudo é verdadeiro, exceto false e nil [o ponteiro não aponta para objeto válido]).
  • A manipulação de exceção.
  • Sobrecarga de operadores.
  • O suporte integrado para os números racionais, números complexos e aritmética de precisão arbitrária
  • Comportamento de envio personalizado(através method_missing e const_missing )
  • Threads nativas e fibras cooperativas (threads de execuções leves )
  • O suporte inicial para Unicode e várias codificações de caracteres (não suporta ICU)
  • Plug-in API nativa em C.
  • Ruby Shell interativa  (um REPL [ read–eval–print loop (REPL) é um simples ambiente de programação interativo]).
  • Gerenciamento de pacotes centralizado através RubyGems
  • Implementado em todas as principais plataformas.
  • Grande biblioteca padrão.

Semântica do Ruby

Ruby é orientada a objetos: 
a cada valor é um objeto, incluindo classes e instâncias de tipos que muitas outras línguas designam como primitivas (como inteiros , booleanos , e "null").
  • Variáveis ​​sempre contêm referências a objetos.
  • Cada função é um método e métodos são sempre chamados em um objeto.
  • Métodos definidos no escopo de alto nível tornam-se membros da classe Object.
  • Uma vez que esta classe é um ancestral de todas as outras classes, tais métodos podem ser chamados em qualquer objeto. Eles também são visíveis em todos os âmbitos , efetivamente servindo como procedimentos "globais".
  • Rubi suporta herança com envio dinâmico, mixins e métodos singleton ( pertencentes a, e definidos para uma única instância em vez de ser definido na classe ).
  • Apesar de Ruby não suporta herança múltipla, classes podem importar módulos como mixins .
  • Rubi tem sido descrito como uma linguagem de programação multi-paradigma: permite programação procedural (definindo funções/ variáveis ​​fora das classes tornando as parte da raiz, 'self' Object), como orientação a objetos (tudo é um objeto) ou programação funcional (tem funções anônimas, fechamentos e continuações; declarações têm todos valores, e as funções retornam a última avaliação).
  • Ele tem suporte para a introspecção, reflexão e meta-programação, bem como suporte para threads baseadas em interpretação.
  • Ruby tem tipagem dinâmica, e suporta polimorfismo paramétrico .

Dinâmica  1 é uma classe de linguagens de programação de alto nível que, em tempo de execução, executar muitos comportamentos comuns que outras línguas pode realizar durante a compilação. Esses comportamentos podem incluir a extensão do programa, através da adição de um novo código, estendendo objetos e definições, ou modificando o sistema de tipos, todos durante a execução do programa. Esses comportamentos podem ser emulado em quase qualquer linguagem de complexidade suficiente, mas linguagens dinâmicas fornecem ferramentas diretas para fazer uso deles.

A maioria das linguagens dinâmicas também são 'typed' de forma dinâmica, mas nem todos são. As linguagens dinâmicas podem ser (mas não sempre), frequentemente referido como "linguagens de script", no entanto, que poucos artigos se referem a linguagens específicas de um determinado ambiente.

Reflexiva 2 é a capacidade de um programa de computador de analisar e modificar a estrutura e o comportamento (especificamente os valores, meta-dados, propriedades e funções) de um objeto em tempo de execução.

A reflexão é mais comumente usado em alto nível linguagens de programação da máquina virtual, como linguagens de script e também em linguagens de programação manifestamente digitados ou de tipagem estática.

Pode ser usada para observar e / ou modificar a execução do programa durante a execução. Um componente de programa orientado a reflexão pode monitorar a execução de um corpo de código e pode modificar-se de acordo com um objetivo desejado relacionada a esse código. Isso normalmente é realizado através da atribuição dinamicamente código do programa em tempo de execução .

Em linguagens de programação orientadas a objeto como Java, a reflexão permite inspeção de classes, interfaces, campos e métodos em tempo de execução sem saber os nomes das interfaces, campos, métodos em tempo de compilação. Ele também permite a instanciação de novos objetos e invocação de métodos.

Reflexibilidade também pode ser utilizada para adaptar dinamicamente um programa a diferentes situações. Por exemplo, considere um aplicativo que usa duas classes diferentes X e Y de forma intercambiável para executar operações similares. 

Sem programação orientada a reflexão, o aplicativo deve ser rigidamente codificado para chamar nomes de métodos de classe X e  classe Y. No entanto, utilizando o paradigma de programação orientada a reflexão, o aplicativo poderia ser concebido e escrito para utilizar reflexão para invocar métodos em classes X e Y, sem nomes de métodos rígidos de codificação.

Programação orientada a reflexão quase sempre requer conhecimento adicional, estrutura, mapeamento relacional e relevância objeto, a fim de aproveitar a execução de código mais genérico. Rigidez de codificação pode ser evitada com o uso de programação orientada a reflexão.

A reflexão é muitas vezes usado como parte de testes de software, tais como o tempo de execução para a criação / instanciação de objetos simulados. A reflexão é também uma estratégia fundamental para metaprogramação.

Uma linguagem de apoio reflexão fornece uma série de recursos disponíveis em tempo de execução que seriam muito difíceis de realizar em uma linguagem de baixo nível. Algumas destas características são as habilidades:
  • Descobrir e modificar construções de código fonte (como blocos de código, classes, métodos, protocolos, etc) como um objeto de primeira-classe em tempo de execução .
  • Converte uma string correspondente ao nome simbólico de uma classe ou função em uma referência ou invocação de que classe ou função.
  • Executa uma string como se fosse uma declaração de código-fonte em tempo de execução .
  • Criar um novo intérprete de bytecode da linguagem para dar um novo significado ou propósito para a construção de programação .
Estas características podem ser aplicadas de diferentes maneiras .

Os seguintes trechos de código cria uma instância foo da classe  FOO, e invocar o seu método hello(). Para cada linguagem de programação, as sequências normais e baseado em reflexão de chamadas são mostrados.

Ruby

# sem reflexão
obj = Foo.new
obj.hello
 
# com reflexão
class_name = "Foo"
method = :hello
obj = Kernel.const_get(class_name).new
obj.send method
 
# com eval
eval "Foo.new.hello"

Java
// sem reflexão
Foo foo = new Foo();
foo.hello();
 
// com reflexão
Object foo = Class.forName("complete.classpath.and.Foo").newInstance();
Method m = foo.getClass().getDeclaredMethod("hello", new Class<?>[0]);
m.invoke(foo);


Programação orientada a objetos (OOP) 3 é um paradigma de programação que representa conceitos como "objetos" que têm campos de dados (atributos que descrevem o objeto) e procedimentos associados, conhecidos como métodos. Objetos, que geralmente são instâncias de classes, são usados ​​para interagir uns com os outros para projetar aplicativos e programas de computador. C++, Objective-C, Smalltalk, Java, C #, Perl, Python e PHP são exemplos de objeto orientada linguagens de programação.

Funcional 4 é um paradigma de programação, um estilo de construção da estrutura e elementos de programas, que trata a computação como a avaliação de funções matemáticas e evita estados e dados mutáveis ​. A programação funcional enfatiza funções que produzem resultados que dependem apenas de suas entradas, e não sobre o estado do programa - funções matemáticas ou seja, puras.

É um paradigma de programação declarativa, o que significa que a programação é feita com expressões. No código funcional, o valor de uma função de saída depende apenas dos argumentos que são entrada para a função, por isso chamada de uma função f duas vezes com o mesmo valor para um argumento x irá produzir o mesmo resultado f (x) duas vezes.

 Eliminando os efeitos colaterais, ou seja, mudanças de estado que não dependem das entradas da função, pode torná-lo muito mais fácil de compreender e prever o comportamento de um programa, que é uma das principais motivações para o desenvolvimento de programação funcional.

A programação funcional tem suas raízes no cálculo lambda, um sistema formal desenvolvido na década de 1930 para investigar computabilidade, o problema Entscheidungs, definição de função, aplicação de função, e recursão.

 Muitas linguagens de programação funcionais podem ser vistas como elaborações sobre o cálculo lambda. No outro bem conhecido paradigma de programação declarativa, programação lógica , as relações estão na base das respectivas linguagens.

Nenhum comentário:

Postar um comentário