Ruby (linguagem de programação) - Ruby (programming language)

Rubi
Ruby logo.svg
Paradigma Multi-paradigma : funcional , imperativo , orientado a objetos , reflexivo
Projetado por Yukihiro Matsumoto
Desenvolvedor Yukihiro Matsumoto, et al.
Apareceu pela primeira vez 1995 ; 26 anos atrás ( 1995 )
Versão estável
3.0.2  Edite isso no Wikidata / 7 de julho de 2021 ; 3 meses atrás ( 7 de julho de 2021 )
Disciplina de digitação Pato , dinâmico , forte
Alcance Lexical, às vezes dinâmico
Linguagem de implementação C
SO Plataforma cruzada
Licença Licença Ruby
Extensões de nome de arquivo .rb
Local na rede Internet www .ruby-lang .org
Implementações principais
Ruby MRI , TruffleRuby , YARV , Rubinius , MagLev , JRuby , MacRuby , RubyMotion , Mruby , IronRuby
Influenciado por
Ada , Basic , C ++ , CLU , Dylan , Eiffel , Lisp , Lua , Perl , Python , Smalltalk
Influenciado
Clojure , CoffeeScript , Crystal , D , Elixir , Groovy , Ioke , Julia , Mirah , Nu , Ring, Rust , Swift

Ruby é uma linguagem de programação interpretada , de alto nível e de propósito geral . Ele foi projetado e desenvolvido em meados da década de 1990 por Yukihiro "Matz" Matsumoto no Japão .

Ruby é tipado dinamicamente e usa coleta de lixo e compilação just-in-time . Ele oferece suporte a vários paradigmas de programação , incluindo programação procedural , orientada a objetos e funcional . De acordo com o criador, Ruby foi influenciado por Perl , Smalltalk , Eiffel , Ada , BASIC e Lisp .

História

Conceito inicial

Matsumoto disse que Ruby foi concebido em 1993. Em uma postagem de 1999 na lista de discussão ruby-talk , ele descreve algumas de suas primeiras idéias sobre a linguagem:

Eu estava conversando com meu colega sobre a possibilidade de uma linguagem de script orientada a objetos. Eu conhecia Perl (Perl4, não Perl5), mas não gostei muito, porque tinha cheiro de linguagem de brinquedo (ainda tem). A linguagem orientada a objetos parecia muito promissora. Eu conhecia Python então. Mas não gostei, porque não achei que fosse uma verdadeira linguagem orientada a objetos - os recursos OO pareciam ser um complemento da linguagem. Como maníaco por linguagem e fã de OO por 15 anos, eu realmente queria uma linguagem de script genuína, orientada a objetos e fácil de usar. Procurei, mas não consegui encontrar. Então eu decidi fazer isso.

Matsumoto descreve o design do Ruby como sendo uma linguagem simples do Lisp em seu núcleo, com um sistema de objetos como o do Smalltalk, blocos inspirados por funções de ordem superior e utilidade prática como o do Perl.

O nome "Ruby" se originou durante uma sessão de bate-papo online entre Matsumoto e Keiju Ishitsuka em 24 de fevereiro de 1993, antes que qualquer código fosse escrito para a linguagem. Inicialmente foram propostos dois nomes: " Coral " e " Ruby ". Matsumoto escolheu o último em um e-mail posterior para Ishitsuka. Matsumoto mais tarde observou um fator na escolha do nome "Ruby" - era a pedra de nascimento de um de seus colegas.

Lançamentos iniciais

O primeiro lançamento público do Ruby 0.95 foi anunciado nos grupos de notícias domésticos japoneses em 21 de dezembro de 1995. Subseqüentemente, mais três versões do Ruby foram lançadas em dois dias. O lançamento coincidiu com o lançamento da lista de discussão ruby list em japonês , que foi a primeira lista de discussão para o novo idioma.

Já presentes neste estágio de desenvolvimento estavam muitos dos recursos familiares em versões posteriores do Ruby, incluindo design orientado a objetos , classes com herança, mixins , iteradores , encerramentos , tratamento de exceções e coleta de lixo .

Após o lançamento do Ruby 0.95 em 1995, várias versões estáveis ​​do Ruby foram lançadas nos anos seguintes:

  • Ruby 1.0: 25 de dezembro de 1996
  • Ruby 1.2: dezembro de 1998
  • Ruby 1.4: agosto de 1999
  • Ruby 1.6: setembro de 2000

Em 1997, o primeiro artigo sobre Ruby foi publicado na web. No mesmo ano, Matsumoto foi contratado pela netlab.jp para trabalhar em Ruby como desenvolvedor em tempo integral.

Em 1998, o Ruby Application Archive foi lançado por Matsumoto, junto com uma página inicial simples em inglês para Ruby.

Em 1999, a primeira lista de mala direta em inglês, ruby-talk , começou, o que sinalizou um crescente interesse pelo idioma fora do Japão. Nesse mesmo ano, Matsumoto e Keiju Ishitsuka escreveram o primeiro livro sobre Ruby, The Object-oriented Scripting Language Ruby (オ ブ ジ ェ ク ト 指向 ス ク リ プ ト 言語 Ruby), que foi publicado no Japão em outubro de 1999. Ele seria seguido no início de 2000 por cerca de 20 livros sobre Ruby publicados em japonês.

Em 2000, Ruby era mais popular do que Python no Japão. Em setembro de 2000, o primeiro livro em inglês Programming Ruby foi impresso, que mais tarde foi liberado gratuitamente para o público, ampliando ainda mais a adoção do Ruby entre os falantes de inglês. No início de 2002, a lista de discussão ruby-talk em inglês estava recebendo mais mensagens do que a lista de ruby ​​em japonês , demonstrando a popularidade crescente de Ruby no mundo não-japonês.

Ruby 1.8 e 1.9

Ruby 1.8 foi lançado inicialmente em agosto de 2003, permaneceu estável por um longo tempo e foi retirado em junho de 2013. Embora obsoleto, ainda há código baseado nele. Ruby 1.8 é apenas parcialmente compatível com Ruby 1.9.

Ruby 1.8 tem sido o assunto de vários padrões da indústria. As especificações de linguagem para Ruby foram desenvolvidas pelo Centro de Promoção de Padrões Abertos da Agência de Promoção de Tecnologia da Informação (uma agência governamental japonesa ) para submissão ao Comitê de Padrões Industriais Japoneses (JISC) e então à Organização Internacional de Padronização (ISO). Foi aceito como um padrão industrial japonês (JIS X 3017) em 2011 e um padrão internacional ( ISO / IEC 30170 ) em 2012.

Por volta de 2005, o interesse pela linguagem Ruby aumentou junto com Ruby on Rails , um framework da web escrito em Ruby. Rails é frequentemente creditado com o aumento do conhecimento sobre Ruby.

Efetivo com Ruby 1.9.3, lançado em 31 de outubro de 2011, Ruby mudou de uma licença dupla sob a Licença Ruby e a GPL para uma licença dupla sob a Licença Ruby e a licença BSD de duas cláusulas. A adoção do 1.9 foi retardada por mudanças do 1.8 que exigiram que muitas joias populares de terceiros fossem reescritas. Ruby 1.9 apresenta muitas mudanças significativas na série 1.8. Exemplos incluem:

  • variáveis locais de bloco (variáveis ​​que são locais para o bloco em que são declaradas)
  • uma sintaxe lambda adicional :f = ->(a,b) { puts a + b }
  • uma sintaxe literal Hash adicional usando dois pontos para chaves de símbolo:{symbol_key: "value"} == {:symbol_key => "value"}
  • codificações de caracteres por string são suportadas
  • nova API de soquete ( suporte IPv6 )
  • require_relative segurança de importação

Ruby 2

O Ruby 2.0 foi projetado para ser totalmente compatível com as versões anteriores do Ruby 1.9.3. A partir do lançamento oficial 2.0.0 em 24 de fevereiro de 2013, havia apenas cinco incompatibilidades conhecidas (menores). Ruby 2.0 adicionou vários novos recursos, incluindo:

  • argumentos de palavra-chave do método,
  • um novo método, Module#prependpara estender uma classe,
  • um novo literal para criar uma série de símbolos,
  • nova API para a avaliação preguiçosa de Enumerables, e
  • uma nova convenção de uso de #to_h para converter objetos em Hashes.

A partir do 2.1.0, a política de versão do Ruby mudou para ser mais semelhante ao controle de versão semântico .

Ruby 2.2.0 inclui acelerações, correções de bugs e atualizações de biblioteca e remove algumas APIs obsoletas. Mais notavelmente, Ruby 2.2.0 introduz mudanças no manuseio de memória - um coletor de lixo incremental, suporte para coleta de lixo de símbolos e a opção de compilar diretamente no jemalloc. Ele também contém suporte experimental para usar vfork (2) com system () e spawn (), e suporte adicionado para a especificação Unicode 7.0. Desde a versão 2.2.1, o desempenho do Ruby MRI no PowerPC64 foi melhorado. Os recursos que se tornaram obsoletos ou removidos incluem callcc, a biblioteca DL, Digest :: HMAC, lib / rational.rb, lib / complex.rb, GServer, Logger :: Application, bem como várias funções C API.

Ruby 2.3.0 inclui muitas melhorias de desempenho, atualizações e correções de bugs, incluindo mudanças na chamada Proc #, uso de Socket e IO de palavras-chave de exceção, manipulação de nome de Thread #, conexões passivas padrão Net :: FTP e Rake sendo removido de stdlib. Outras mudanças notáveis ​​em incluem:

  • A capacidade de marcar todos os literais de string como congelados por padrão com um aumento consequentemente grande de desempenho nas operações de string.
  • Comparação de hash para permitir a verificação direta de pares de chave / valor em vez de apenas chaves.
  • Um novo operador de navegação segura &. que pode facilitar o manuseio de nada (por exemplo, em vez de , podemos usar ).if obj && obj.foo && obj.foo.barif obj&.foo&.bar
  • A gem did_you_mean agora é empacotada por padrão e necessária na inicialização para sugerir automaticamente correspondências de nomes semelhantes em um NameError ou NoMethodError .
  • Hash # dig e Array # dig para extrair facilmente valores profundamente aninhados (por exemplo , dado , o valor Foo Baz agora pode ser recuperado por ).profile = { social: { wikipedia: { name: 'Foo Baz' } } }profile.dig(:social, :wikipedia, :name)
  • .grep_v(regexp) que corresponderá a todos os exemplos negativos de uma determinada expressão regular, além de outros novos recursos.

Ruby 2.4.0 inclui melhorias de desempenho para tabela de hash, Array # max, Array # min e acesso a variáveis ​​de instância. Outras mudanças notáveis ​​incluem:

  • Binding # irb: iniciar uma sessão REPL semelhante a binding.pry
  • Unifique Fixnum e Bignum na classe Integer
  • String suporta mapeamentos de caso Unicode, não apenas ASCII
  • Um novo método, Regexp # match ?, que é uma versão booleana mais rápida de Regexp # match
  • A detecção de deadlock de thread agora mostra threads com seu backtrace e dependência

Algumas mudanças notáveis ​​no Ruby 2.5.0 incluem as instruções de resgate e garantia usam automaticamente um bloco do-end circundante (menos necessidade de blocos extras de início e fim ), encadeamento de método com yield_self , suporte para cobertura de ramificação e medição de cobertura de método e mais fácil Transformações de hash com Hash # slice e Hash # transform_keys Além disso, vêm muitas melhorias de desempenho, como passagem de bloco mais rápida (3 vezes mais rápida), Mutexes mais rápidos, modelos de ERB mais rápidos e melhorias em alguns métodos de concatenação.

Algumas mudanças notáveis ​​no Ruby 2.6.0 incluem um compilador experimental just-in-time (JIT) e RubyVM :: AbstractSyntaxTree (experimental).

Algumas mudanças notáveis ​​no Ruby 2.7.0 incluem correspondência de padrão (experimental), melhorias REPL, compactação GC e separação de argumentos posicionais e de palavras-chave.

Ruby 3

Ruby 3.0.0 foi lançado no dia de Natal em 2020. É conhecido como Ruby 3x3. Um de seus principais objetivos era mudar o interpretador para um Compilador Just-In-Time, para tornar os programas mais rápidos.

O Ruby 3.1 está planejado para ser lançado no dia de Natal de 2021.

Tabela de versões

Versão Última versão pequenininha Data de lançamento inicial Fim da fase de suporte Fim da fase de manutenção de segurança
Versão antiga, não mais mantida: 1.0 N / D 25/12/1996 N / D N / D
Versão antiga, não mais mantida: 1.8 1.8.7-p375 04/08/2003 2012-06 01-07-2014
Versão antiga, não mais mantida: 1,9 1.9.3-p551 25/12/2007 23/02/2014 23/02/2015
Versão antiga, não mais mantida: 2.0 2.0.0-p648 24/02/2013 24/02/2015 24/02/2016
Versão antiga, não mais mantida: 2,1 2.1.10 25/12/2013 30/03/2016 31-03-2017
Versão antiga, não mais mantida: 2,2 2.2.10 25/12/2014 28-03-2017 31/03/2018
Versão antiga, não mais mantida: 2,3 2.3.8 25/12/2015 20/06/2018 31/03/2019
Versão antiga, não mais mantida: 2,4 2.4.10 25/12/2016 01/04/2019 01-04-2020
Versão antiga, não mais mantida: 2,5 2.5.9 25/12/2017 2021-04-05 2021-04-05
Versão mais antiga, mas ainda mantida: 2,6 2.6.8 25/12/2018 2021-04-05 2022-04-05
Versão mais antiga, mas ainda mantida: 2,7 2.7.4 25/12/2019 TBA TBA
Versão estável atual: 3,0 3.0.2 2020-12-25 TBA TBA
Versão futura: 3,1 3.1.0 2021-12-25 TBA TBA
Lenda:
Versão antiga
Versão mais antiga, ainda mantida
Última versão
Versão de visualização mais recente
Lançamento futuro

Semântica e filosofia

Yukihiro Matsumoto , o criador do Ruby

Matsumoto disse que Ruby foi projetado para produtividade e diversão do programador, seguindo os princípios de um bom design de interface de usuário . Em uma Google Tech Talk em 2008, Matsumoto afirmou ainda: "Espero ver Ruby ajudar todos os programadores do mundo a serem produtivos, a desfrutar da programação e a serem felizes. Esse é o objetivo principal da linguagem Ruby." Ele enfatiza que o projeto de sistemas precisa enfatizar as necessidades humanas, em vez de computacionais:

Freqüentemente, as pessoas, especialmente os engenheiros de computação, se concentram nas máquinas. Eles pensam: "Ao fazer isso, a máquina funcionará mais rápido. Ao fazer isso, a máquina funcionará com mais eficácia. Ao fazer isso, a máquina fará algo, algo, alguma coisa." Eles estão se concentrando nas máquinas. Mas, na verdade, precisamos nos concentrar nos humanos, em como os humanos se preocupam em fazer a programação ou operar a aplicação das máquinas. Nós somos os mestres. Eles são os escravos.

Matsumoto disse que seu objetivo principal de design era fazer uma linguagem que ele próprio gostasse de usar, minimizando o trabalho do programador e possíveis confusões. Ele disse que não aplicou o princípio do mínimo espanto (POLA) ao design do Ruby; em uma discussão de maio de 2005 no newsgroup comp.lang.ruby, Matsumoto tentou distanciar Ruby do POLA, explicando que, como qualquer escolha de design será surpreendente para alguém, ele usa um padrão pessoal para avaliar a surpresa. Se esse padrão pessoal permanecer consistente, haveria poucas surpresas para aqueles que estão familiarizados com o padrão.

Matsumoto definiu desta forma em uma entrevista:

Todo mundo tem uma formação individual. Alguém pode vir do Python, alguém pode vir do Perl e pode ser surpreendido por diferentes aspectos da linguagem. Então, eles vêm até mim e dizem: 'Fiquei surpreso com essa característica da linguagem, então Ruby viola o princípio da menor surpresa.' Esperar. Esperar. O princípio da menor surpresa não é apenas para você. O princípio da menor surpresa significa princípio do menor a minha surpresa. E isso significa o princípio da menor surpresa depois de aprender Ruby muito bem. Por exemplo, eu era um programador C ++ antes de começar a projetar Ruby. Eu programei em C ++ exclusivamente por dois ou três anos. E depois de dois anos de programação C ++, ainda me surpreende.

Ruby é orientado a objetos : todo valor é um objeto, incluindo classes e instâncias de tipos que muitas outras linguagens designam como primitivos (como inteiros , booleanos e " nulos "). As variáveis ​​sempre contêm referências a objetos. Cada função é um método e os métodos são sempre chamados em um objeto. Os métodos definidos no escopo de nível superior tornam-se métodos da classe Object. Como essa classe é ancestral de todas as outras classes, esses métodos podem ser chamados em qualquer objeto. Eles também são visíveis em todos os escopos, servindo efetivamente como procedimentos "globais". Ruby suporta herança com envio dinâmico , mixins e métodos singleton (pertencentes a, e definidos para, uma única instância ao invés de serem definidos na classe). Embora Ruby não suporte herança múltipla , as classes podem importar módulos como mixins.

Ruby foi descrito como uma linguagem de programação multiparadigma : permite a programação procedural (definir funções / variáveis ​​fora das classes torna-as parte da raiz, 'self' Object), com orientação a objetos (tudo é um objeto) ou programação funcional (é tem funções anônimas , encerramentos e continuações ; todas as instruções têm valores e as funções retornam a última avaliação). Possui suporte para introspecção , reflexão e metaprogramação , bem como suporte para threads baseadas em intérpretes . Ruby apresenta tipagem dinâmica e suporta polimorfismo paramétrico .

De acordo com o FAQ do Ruby, a sintaxe é semelhante ao Perl e a semântica é semelhante ao Smalltalk , mas é muito diferente do Python .

Recursos

Sintaxe

A sintaxe do Ruby é amplamente semelhante à do Perl e do Python . As definições de classe e método são sinalizadas por palavras-chave, enquanto os blocos de código podem ser definidos por palavras-chave ou chaves. Em contraste com o Perl, as variáveis ​​não são obrigatoriamente prefixadas com um sigilo . Quando usado, o sigilo muda a semântica do escopo da variável. Para fins práticos, não há distinção entre expressões e declarações . As quebras de linha são significativas e consideradas como o final de uma instrução; um ponto-e-vírgula pode ser usado de forma equivalente. Ao contrário do Python, o recuo não é significativo.

Uma das diferenças de Python e Perl é que Ruby mantém todas as suas variáveis de instância completamente privadas para a classe e só expõe-los através de métodos de acesso ( attr_writer, attr_reader, etc.). Ao contrário dos métodos "getter" e "setter" de outras linguagens como C ++ ou Java , os métodos de acesso em Ruby podem ser criados com uma única linha de código por meio de metaprogramação ; no entanto, os métodos de acesso também podem ser criados na forma tradicional de C ++ e Java. Como invocação destes métodos não requer o uso de parênteses, é trivial para mudar uma variável de instância em uma função cheia, sem modificar uma única linha de código de chamada ou ter que fazer qualquer refatoração alcançar funcionalidade semelhante para C # e VB.NET propriedade membros.

Os descritores de propriedade do Python são semelhantes, mas apresentam uma compensação no processo de desenvolvimento. Se alguém começa em Python usando uma variável de instância exposta publicamente e, posteriormente, altera a implementação para usar uma variável de instância privada exposta por meio de um descritor de propriedade, o código interno da classe pode precisar ser ajustado para usar a variável privada em vez da propriedade pública . O design de Ruby força todas as variáveis ​​de instância a serem privadas, mas também fornece uma maneira simples de declarar sete getmétodos. Isso está de acordo com a ideia de que em Ruby, nunca se acessa diretamente os membros internos de uma classe de fora da classe; em vez disso, passa-se uma mensagem para a classe e recebe uma resposta.

Implementações

Intérprete de Ruby de Matz

O intérprete Ruby original é freqüentemente referido como o intérprete Ruby de Matz ou MRI. Esta implementação é escrita em C e usa sua própria máquina virtual específica para Ruby .

A implementação padronizada e aposentada do Ruby 1.8 foi escrita em C , como uma linguagem interpretada de passagem única .

Começando com Ruby 1.9 e continuando com Ruby 2.xe acima, o interpretador Ruby oficial foi YARV ("Yet Another Ruby VM"), e esta implementação substituiu a máquina virtual mais lenta usada em versões anteriores de MRI.

Implementações alternativas

Em 2018, havia uma série de implementações alternativas de Ruby, incluindo JRuby , Rubinius e mruby . Cada um tem uma abordagem diferente, com JRuby e Rubinius fornecendo compilação just-in-time e mruby também fornecendo compilação antecipada .

Ruby tem três principais implementações alternativas:

  • JRuby , uma implementação combinada de Java e Ruby que é executada na máquina virtual Java . JRuby atualmente tem como alvo o Ruby 2.5.
  • TruffleRuby , uma implementação Java usando a estrutura de implementação da linguagem Truffle com GraalVM
  • Rubinius , uma máquina virtual de bytecode C ++ que usa LLVM para compilar o código de máquina em tempo de execução. O compilador de bytecode e a maioria das classes principais são escritos em Ruby puro. O Rubinius atualmente tem como alvo o Ruby 2.3.1.

Outras implementações Ruby incluem:

  • MagLev , um Smalltalk aplicação que roda em GemTalk Sistemas ' GemStone / S VM
  • mruby , uma implementação projetada para ser embutida no código C, em uma linha semelhante a Lua . Atualmente está sendo desenvolvido por Yukihiro Matsumoto e outros
  • RGSS , ou Ruby Game Scripting System, uma implementação proprietária usada pela série RPG Maker de software para design de jogo e modificação do motor RPG Maker
  • julializer , um transpiler (parcial) de Ruby para Julia . Ele pode ser usado para um grande aumento de velocidade, por exemplo, em implementações Ruby ou JRuby (pode ser útil apenas para código numérico).
  • Topaz , uma implementação Ruby escrita em Python
  • Opal , um interpretador baseado na web que compila Ruby para JavaScript

Outras implementações de Ruby agora extintas foram:

A maturidade das implementações Ruby tende a ser medida por sua capacidade de executar o framework Ruby on Rails (Rails), porque é complexo de implementar e usa muitos recursos específicos do Ruby. O ponto em que uma determinada implementação atinge esse objetivo é chamado de "singularidade do Rails". A implementação de referência, JRuby e Rubinius são todos capazes de executar Rails sem modificações em um ambiente de produção.

Suporte de plataforma

Matsumoto desenvolveu originalmente o Ruby no Sony NEWS-OS 3.x baseado no 4.3BSD , mas depois migrou seu trabalho para o SunOS 4.x, e finalmente para o Linux .

Em 1999, Ruby era conhecido por trabalhar em muitos sistemas operacionais diferentes , incluindo NEWS-OS, SunOS, AIX , SVR4 , Solaris , NEC UP-UX , NeXTSTEP , BSD, Linux, Mac OS , DOS , Windows e BeOS .

Versões e implementações modernas de Ruby estão disponíveis em muitos sistemas operacionais, como Linux, BSD, Solaris, AIX, macOS , Windows, Windows Phone , Windows CE , Symbian OS , BeOS, OpenVMS e IBM i .

A linguagem de programação Ruby é compatível com várias plataformas de hospedagem em nuvem, como Jelastic , Heroku , Google Cloud Platform e outras.

Repositórios e bibliotecas

RubyGems é o gerenciador de pacotes do Ruby. Um pacote Ruby é chamado de "gem" e pode ser instalado através da linha de comando. A maioria das gemas são bibliotecas, embora existam algumas que são aplicativos, como IDEs . Existem mais de 10.000 joias de Ruby hospedadas em RubyGems.org .

Muitas bibliotecas Ruby novas e existentes são hospedadas no GitHub , um serviço que oferece hospedagem de repositório de controle de versão para Git .

O Ruby Application Archive, que hospedava aplicativos, documentação e bibliotecas para programação Ruby, foi mantido até 2013, quando sua função foi transferida para RubyGems.

Veja também

Referências

Leitura adicional

links externos