Python vs. Ruby para metaprogramação [fechado]


90

Atualmente, sou principalmente um programador de D e estou procurando adicionar outra linguagem à minha caixa de ferramentas, de preferência uma que suporte os hacks de metaprogramação que simplesmente não podem ser feitos em uma linguagem compilada estaticamente como D.

Eu li um pouco sobre o Lisp e adoraria encontrar uma linguagem que permita algumas das coisas legais que o Lisp faz, mas sem a sintaxe estranha, etc. do Lisp. Não quero iniciar um conflito de linguagem e tenho certeza de que Ruby e Python têm suas vantagens, então vou listar o que é importante para mim pessoalmente. Diga-me se Ruby, Python ou alguma outra linguagem seria o melhor para mim.

Importante:

  1. Boa metaprogramação. Capacidade de criar classes, métodos, funções, etc. em tempo de execução. De preferência, distinção mínima entre código e dados, estilo Lisp.
  2. Sintaxe agradável, limpa e sã e semântica consistente e intuitiva. Basicamente, uma linguagem moderna bem pensada e divertida de usar.
  3. Vários paradigmas. Nenhum paradigma é adequado para todos os projetos, ou mesmo para todos os pequenos subproblemas de um projeto.
  4. Uma linguagem interessante que realmente afeta a maneira como se pensa sobre programação.

Um pouco importante:

  1. Atuação. Seria bom se o desempenho fosse decente, mas quando o desempenho for uma prioridade real, usarei D em seu lugar.
  2. Bem documentado.

Não é importante:

  1. Tamanho da comunidade, disponibilidade de biblioteca, etc. Nenhuma dessas são características da linguagem em si e tudo pode mudar muito rapidamente.
  2. Disponibilidade de trabalho. Não sou um programador profissional em tempo integral. Eu sou um estudante de graduação e a programação é tangencialmente relevante para minha pesquisa.
  3. Quaisquer recursos que são projetados principalmente com projetos muito grandes trabalhados por um milhão de macacos de código em mente.

1
1 Para uma pergunta geralmente bem feita.
Triptych

Infelizmente, todas as respostas de alta classificação basicamente dizem "depende" e as respostas mais baixas são basicamente uma guerra de fogo Python vs Ruby.
Dan Burton

Você já considerou Clojure?
Mark Thomas

A resposta é Julia ! Simplesmente não existia naquela época: bit.ly/julia_meta ... alegrem-se! Julia cobre todos os pontos importantes listados por @dsimcha, além de desempenho e todos os outros pontos estão se tornando verdade conforme Julia continua amadurecendo.
SalchiPapa

Respostas:


15

Não há realmente uma grande diferença entre python e ruby, pelo menos em um nível ideológico. Na maior parte, eles são apenas sabores diferentes da mesma coisa. Portanto, eu recomendo ver qual deles combina mais com seu estilo de programação.


30
Definitivamente, não são a mesma coisa. Parecem semelhantes na superfície, mas quando você usa os recursos mais poderosos do Ruby, você entende que Python não é páreo. Por exemplo, tente escrever uma DSL em Ruby em vez de escrever um Python, ou criar funções, métodos, classes, etc. em tempo de execução. É muito mais simples em Ruby.
FelipeC

14
Não é raro que você precise fazer metaprogramação, é apenas raro que isso seja feito. Todos, exceto o programa mais trivial, têm padrões de repetição que não caem nas ferramentas de refatoração usuais, mas podem ser eliminados prontamente por metaprogramação.
Wayne Conrad

10
Ruby e Python são muito diferentes, mesmo nas ideias que regem seu design. Eles querem um Python e, com sorte, uma maneira óbvia de fazer as coisas. Isso geralmente torna a linguagem não tão expressiva quanto Ruby, mas a torna mais consistente. Ruby vem um pouco mais do modo Perl de fazer as coisas, onde existem muitas maneiras de fazer as coisas. Ruby também torna algumas coisas muito fáceis e realmente inclui a ideia de membros privados. Python, por outro lado, no máximo apenas torna algumas coisas mais difíceis de fazer, então você tem que ser mais explícito (como adicionar ou substituir o comportamento nas classes).
Sean Copenhaver

5
Você provavelmente deveria fazer um curso intensivo em ambos, mas para fácil metaprogramação, parece que Ruby é mais adequado. Eu não tenho muita experiência, então aceite isso com um grão de sal.
Sean Copenhaver

7
Ruby e Python são semelhantes apenas no fato de que pregam um "código bonito". Eles só têm visões totalmente diferentes sobre essa coisa de beleza (que IMO é bom)
Gabi Purcaru

69

Eu li um pouco sobre o Lisp e adoraria encontrar uma linguagem que permita algumas das coisas legais que o Lisp faz, mas sem a sintaxe estranha, etc. do Lisp.

Não seríamos todos nós.

distinção mínima entre código e dados, estilo Lisp

Infelizmente, a distinção mínima entre código e dados e sintaxe "estranha" são consequências uma da outra.

Se quiser uma sintaxe fácil de ler, você tem o Python. No entanto, o código não é representado em nenhuma das estruturas de dados internas comumente usadas. Ele falha - como acontece com a maioria dos idiomas - no item nº 1 de sua lista de 'importantes'. Isso torna difícil fornecer ajuda útil.

Você não pode ter tudo. Lembre-se de que você não é o primeiro a ter esse pensamento. Se algo como sua linguagem ideal existisse, todos nós estaríamos usando. Já que o mundo real fica aquém de seus ideais, você terá que priorizar novamente sua lista de desejos. A seção "importante" deve ser reorganizada para identificar o que é realmente importante para você.


3
Descobri que muitas linguagens implementam macros do tipo Lisp em sintaxes não Lispy e o que acaba acontecendo é que escrever macros ali é muito difícil, porque ninguém conhece naturalmente as estruturas de dados em que o código é representado, portanto, escrever macros fica muito difícil e ninguém faz isso.
pupeno

11
As pessoas acham o Lisp difícil de ler porque não estão familiarizadas com a sintaxe. Acho Lisp muito mais fácil de ler do que C # (mas mais difícil do que Python).
Jules

1
Eu concordo amplamente com o ponto, mas minha experiência com Ruby e Lisp mostra que o primeiro é tão bom para metaprogramação quanto possível sem os parênteses. Outras alternativas que se aproximam podem ser TCL e JavaScript, mas eu não os favoreceria por outros motivos.
inger

Long long long agi havia uma linguagem chamada Dylan que deveria ser exatamente isso.
Friedrich,

17

Honestamente, no que diz respeito aos recursos de metaprogramação, Ruby e Python são muito mais semelhantes do que alguns de seus adeptos gostam de admitir. Esta análise de ambos os idiomas oferece uma comparação / análise muito boa:

Portanto, basta escolher um com base em alguns critérios. Talvez você goste de Rails e queira estudar esse código. Talvez SciPy seja a sua praia. Observe o ecossistema de bibliotecas, comunidade, etc. e escolha uma. Você certamente não perderá algum nirvana da metaprogramação com base na sua escolha de qualquer um deles.


essa entrada do blog parece ter mais a ver com preferências pessoais (justo, mas a beleza está nos olhos de quem vê), em vez de metaprogramação - que era o ponto principal do OP.
inger

16

Isenção de responsabilidade: Eu apenas me envolvo em qualquer um dos idiomas, mas pelo menos escrevi pequenos programas de trabalho (não apenas scripts rápidos, para os quais uso Perl, bash ou GNU make) em ambos.

Ruby pode ser muito bom para os "paradigmas múltiplos" ponto 3, porque trabalha muito para facilitar a criação de linguagens de domínio específico. Por exemplo, navegue online e veja alguns bits do código Ruby on Rails e alguns bits do código Rake. Ambos são Ruby e você pode ver as semelhanças, mas eles não se parecem com o que você normalmente consideraria a mesma linguagem.

Python me parece um pouco mais previsível (possivelmente correlacionado ao ponto 2 'limpo' e 'são'), mas não sei realmente se é por causa da linguagem em si ou apenas porque é normalmente usado por pessoas com valores diferentes . Nunca tentei magia profunda em Python. Eu certamente diria que ambas as línguas são bem pensadas.

Ambos pontuam bem em 1 e 4. [Editar: na verdade, 1 é bastante discutível - há "eval" em ambos, como é comum em linguagens interpretadas, mas eles dificilmente são conceitualmente puros. Você pode definir fechamentos, atribuir métodos a objetos e outros enfeites. Não tenho certeza se isso vai tão longe quanto você deseja.]

Pessoalmente, acho Ruby mais divertido, mas em parte porque é mais fácil se distrair pensando em maneiras legais de fazer as coisas. Na verdade, usei mais o Python. Às vezes você não quer esfriar, você quer continuar, então é feito antes de dormir ...

Nenhum deles é difícil de entrar, então você pode simplesmente decidir fazer sua próxima tarefa menor em um e a seguinte no outro. Ou pegue um livro introdutório sobre cada um na biblioteca, leia os dois rapidamente e veja o que te chama a atenção.


15

Você já considerou Smalltalk? Ele oferece uma sintaxe muito simples, clara e extensível com recursos de refletividade e introspecção e um ambiente de desenvolvimento totalmente integrado que tira proveito desses recursos. Dê uma olhada em alguns dos trabalhos que estão sendo feitos no Squeak Smalltalk, por exemplo. Muitos pesquisadores que usam o Squeak frequentam a lista de discussão do Squeak e #squeak no freenode, para que você possa obter ajuda em questões complexas com muita facilidade.

Outros indicadores de sua relevância atual: ele roda em qualquer plataforma que você queira nomear (incluindo o iPhone ); Gilad Bracha está baseando seu trabalho em Novilíngua no Squeak; a equipe V8 começou a trabalhar em VMs Smalltalk ; e Dan Ingalls e Randal Schwartz voltaram recentemente ao trabalho em Smalltalk depois de anos no deserto.

Boa sorte com sua pesquisa - diga-nos o que você decidir no final.


14

Lisp satisfaz todos os seus critérios, incluindo desempenho, e é a única linguagem que não possui sintaxe (estranha). Se você o evita de forma tão espantosamente mal informado / equivocado e, conseqüentemente, perde a experiência de usar, por exemplo, Emacs + SLIME + CL, você estará prestando um grande desserviço a si mesmo.


4
Ou você pode tentar o Clojure, que acho muito bom.
pupeno

1
Concordo forte. Se você quer o poder do Lisp, é só mergulhar e tê-lo! Na verdade, é muito fácil se acostumar com os parênteses; eles não são um grande negócio como a maioria das pessoas os faz parecer.
Dan Burton

11

Seus 4 pontos "importantes" conduzem exatamente ao Ruby, enquanto os 2 pontos "um tanto importantes" regidos pelo Python. Que assim seja.


11

Você está descrevendo Ruby.

  • Boa metaprogramação. Capacidade de criar classes, métodos, funções, etc. em tempo de execução. De preferência, distinção mínima entre código e dados, estilo Lisp.

É muito fácil estender e modificar primitivos existentes em tempo de execução. Em Ruby, tudo é um objeto, strings, inteiros e até funções.

Você também pode construir atalhos para o açúcar sintático, por exemplo com class_eval .

  • Sintaxe agradável, limpa e sã e semântica consistente e intuitiva. Basicamente, uma linguagem moderna bem pensada e divertida de usar.

Ruby segue o princípio de menos surpresa e, ao comparar o código Ruby com o equivalente em outra linguagem, muitas pessoas o consideram mais "bonito".

  • Vários paradigmas. Nenhum paradigma é adequado para todos os projetos, ou mesmo para todos os pequenos subproblemas de um projeto.

Você pode seguir imperativo, orientado a objetos, funcional e reflexivo.

  • Uma linguagem interessante que realmente afeta a maneira como se pensa sobre programação.

Isso é muito subjetivo, mas do meu ponto de vista, a capacidade de usar muitos paradigmas ao mesmo tempo permite ideias muito interessantes.

Eu tentei Python e não se encaixa em seus pontos importantes.


11
-1 Estou usando Python e ele se encaixa perfeitamente, as diferenças entre Python e Ruby residem em outros aspectos. Fazedor de barulho fanboy, você é.
gorsky

6
Muita conversa, mas nenhuma caminhada. Importa-se de fornecer um exemplo em Python de adicionar um método dinamicamente para dizer, a classe String?
FelipeC

6
@john Esse é exatamente o meu ponto; é muito complicado e feio (para não mencionar impossível para a classe String). OTOH em Ruby é muito simples: "self.class.send (: define_method,: method_name) {method_code}"
FelipeC

2
Ruby pode tentar seguir o PoLS, mas eu não diria que sim . Por exemplo, o lambda/ Proc.newmess foi chamado de "comportamento surpreendente" e "altamente contra-intuitivo" aqui no SO. :-) Qualquer linguagem tão grande e complexa como Ruby pode ter essas áreas confusas.
Ken

2
@Token aqui está um exemplo de monkey-patching Stringem Ruby para fins de metaprogramação: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/… . Subclasses não serviriam; entretanto, uma função simples de dois argumentos faria.
P Shved

8

Compare exemplos de código que fazem a mesma coisa (junte com uma nova linha descrições não vazias de itens de uma myListlista) em idiomas diferentes (os idiomas são organizados em ordem alfabética reversa):

Ruby :

myList.collect { |f| f.description }.select { |d| d != "" }.join("\n")

Ou

myList.map(&:description).reject(&:empty?).join("\n")

Python :

descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions)) 

Ou

"\n".join(f.description() for f in mylist if f.description())

Perl :

join "\n", grep { $_ } map { $_->description } @myList;

Ou

join "\n", grep /./, map { $_->description } @myList;

Javascript :

myList.map(function(e) e.description())
      .filter(function(e) e).join("\n")

Io :

myList collect(description) select(!="") join("\n")

Aqui está um guia Io .


3
(format nil "~ {~ a ~ ^ ~% ~}" (remover nil (mapcar # 'description mylist)))
Rainer Joswig

bom, mas onde está a metaprogramação aqui? parece ser algum estilo ligeiramente funcional, remotamente relacionado à questão.
inger

6

Ruby seria melhor do que Lisp em termos de ser "mainstream" (seja lá o que isso realmente signifique, mas uma preocupação realista é como seria fácil encontrar respostas para suas perguntas sobre programação Lisp se você fosse com isso.) Em qualquer caso. , Achei Ruby muito fácil de aprender. No mesmo período de tempo que passei aprendendo Python (ou outras linguagens), logo comecei a escrever um código melhor com muito mais eficiência do que antes. Essa é apenas a opinião de uma pessoa; pegue com um grão de sal, eu acho. Eu sei muito mais sobre Ruby neste momento do que Python ou Lisp, mas você deve saber que eu era uma pessoa Python por um bom tempo antes de mudar.

Lisp é definitivamente muito bom e vale a pena dar uma olhada; como você disse, o tamanho da comunidade etc. pode mudar muito rapidamente. Dito isso, o tamanho em si não é tão importante quanto a qualidade da comunidade. Por exemplo, o #ruby-langcanal ainda está cheio de pessoas incrivelmente inteligentes. Lisp parece atrair algumas pessoas muito inteligentes também. Não posso falar muito sobre a comunidade Python, pois não tenho muita experiência em primeira mão, mas às vezes parece ser "grande demais". (Lembro-me de pessoas sendo muito rudes em seus canais de IRC e, pelo que ouvi de amigos que realmente gostam de Python, essa parece ser a regra, e não a exceção.)

De qualquer forma, alguns recursos que você pode achar úteis são:

1) A série Pragmatic Programmers Ruby Metaprogramming ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) - não gratuita, mas os episódios posteriores são bastante intrigantes. (O código é gratuito, se você quiser fazer o download e ver o que está aprendendo.)

2) On Lisp de Paul Graham ( http://www.paulgraham.com/onlisp.html ). É um pouco antigo, mas é um clássico (e pode ser baixado gratuitamente).


5

Estou usando Python para muitos projetos e acho que Python fornece todos os recursos que você solicitou.

importante:

  1. Metaprogramação: Python suporta metaclasses e geração de classe / método em tempo de execução, etc.
  2. Sintaxe: Bem, isso é de alguma forma subjetivo. Eu gosto da sintaxe do Python por sua simplicidade, mas algumas pessoas reclamam que o Python é sensível a espaços em branco.
  3. Paradigmas: Python suporta programação procedural, orientada a objetos e funcional básica.
  4. Eu acho que o Python tem um estilo muito prático, foi muito inspirador para mim.

Um pouco importante:

  1. Desempenho: Bem, é uma linguagem de script. Mas escrever extensões C para Python é uma prática de otimização comum.
  2. Documentação: Não posso reclamar. Não é tão detalhado quanto alguém pode saber do Java, mas é bom o suficiente.

Como você é um estudante de graduação, pode querer ler este artigo afirmando que Python é tudo o que um cientista precisa . Infelizmente não posso comparar Python com Ruby, já que nunca usei essa linguagem.

Atenciosamente, Dennis


3
Python não é sensível a espaços em branco. É sensível a indentação.
jfs

5

@Jason I discordo respectivamente. Existem diferenças que tornam o Ruby superior ao Python para metaprogramação - tanto filosófica quanto pragmática. Para começar, Ruby obtém herança certa com Herança Única e Mixins . E quando se trata de metaprogramação, você simplesmente precisa entender que tudo gira em torno do eu . A diferença canônica aqui é que em Ruby você tem acesso ao objeto self em tempo de execução - em Python você não tem!

Ao contrário do Python, em Ruby não há fase de compilação ou tempo de execução separada. Em Ruby, cada linha de código é executada em um objeto self particular . Em Ruby, cada classe herda tanto do objeto quanto de uma metaclasse oculta. Isso cria uma dinâmica interessante:

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

Usar self.name acessa o método de nome de metaclasse das classes Ninja para retornar o nome da classe Ninja. A metaprogramação é tão bonita em Python? Eu sinceramente duvido!


4

Bem, se você não gosta da sintaxe lisp, talvez assembler seja o caminho a percorrer. :-)

Certamente tem uma distinção mínima entre código e dados, é multiparadigma (ou talvez não seja nenhum paradigma) e é uma experiência de expansão da mente (se tediosa) tanto em termos de aprendizado quanto nos truques que você pode fazer.


Acho que fiz mais metaprogramação em linguagem assembly do que em qualquer outra linguagem. Código são dados e dados podem tentar ser códigos. E os dados não são assinados ou não, é o opcode que decide.
Nosredna

1
Eu tenho um código assembler que você pode reivindicar como OO. Tem coisas que parecem métodos - você chama aquele que depende da "classe".
justintime,

4

Io satisfaz todos os seus pontos "importantes". Não acho que haja uma linguagem melhor por aí para fazer meta-hackeagem maluca.


Obrigado por isso, não sabia. Parece divertido à primeira vista, talvez bastante (()), mas mesmo assim. Espero encontrar tempo para dar uma olhada, em breve.
flq

3

um que suporta os hacks de metaprogramação que simplesmente não podem ser feitos em uma linguagem compilada estaticamente

Eu adoraria encontrar uma linguagem que permitisse algumas das coisas legais que o Lisp faz

Lisp pode ser compilado.



3

Minha resposta seria nenhuma. Eu conheço as duas linguagens, fiz um curso de Ruby e programa em Python há vários anos. Lisp é bom em metaprogramação devido ao fato de que seu único propósito é transformar listas, seu próprio código fonte é apenas uma lista de tokens, então a metaprogramação é natural. As três linguagens que eu mais gosto para esse tipo de coisa são Rebol, Forth e Factor. Rebol é uma linguagem de dialetagem muito forte que pega o código de seu fluxo de entrada, executa uma expressão nele e o transforma usando regras escritas na linguagem. Muito expressivo e extremamente bom em dialeto. Factor e Forth são mais ou menos completamente divorciados da sintaxe e você os programa definindo e chamando palavras. Geralmente, eles são escritos em sua própria língua. Você não escreve aplicativos no sentido tradicional, você estende o idioma escrevendo suas próprias palavras para definir seu aplicativo específico. O Factor pode ser especialmente bom, pois tem muitos recursos que só vi em smalltalk para avaliar e trabalhar com código-fonte. Um espaço de trabalho muito bom, documentos interativos, etc.


2

Não há realmente muito para separar Python e Ruby. Eu diria que a comunidade Python é maior e mais madura do que a comunidade Ruby, e isso é muito importante para mim. Ruby é uma linguagem mais flexível, que tem repercussões positivas e negativas. No entanto, tenho certeza de que haverá muitas pessoas para entrar em detalhes nessas duas línguas, então vou colocar uma terceira opção no ringue. Que tal JavaScript?

JavaScript foi originalmente projetado para ser um esquema para a web e é baseado em protótipos, o que é uma vantagem sobre Python e Ruby no que diz respeito a multiparadigma e metaprogramação. A sintaxe não é tão boa quanto as outras duas, mas é provavelmente a linguagem mais amplamente implantada que existe, e o desempenho está melhorando a cada dia.


2

Se você gosta do conceito code-is-data no estilo lisp, mas não gosta da sintaxe Lispy, talvez Prolog seja uma boa escolha.

Se isso se qualifica como uma "linguagem moderna divertida de usar", deixarei para os outros julgarem. ;-)


2

Ruby é minha escolha depois de explorar Python, Smalltalk e Ruby.


2

E o OCaml?

Recursos do OCaml: um sistema de tipo estático, inferência de tipo, polimorfismo paramétrico, recursão de cauda, ​​correspondência de padrões, fechamentos lexicais de primeira classe, functores (módulos paramétricos), tratamento de exceções e coleta de lixo automática de geração incremental.

Acho que satisfaz o seguinte:

Importante:

  1. Sintaxe agradável, limpa e sã e semântica consistente e intuitiva. Basicamente, uma linguagem moderna bem pensada e divertida de usar.
  2. Vários paradigmas. Nenhum paradigma é adequado para todos os projetos, ou mesmo para todos os pequenos subproblemas de um projeto.
  3. Uma linguagem interessante que realmente afeta a maneira como se pensa sobre programação.

Um pouco importante:

  1. Atuação. Seria bom se o desempenho fosse decente, mas quando o desempenho for uma prioridade real, usarei D em seu lugar.
  2. Bem documentado.

OCaml permite que você crie classes / métodos em tempo de execução? Como isso funciona?
Jason Creighton

Acabei de ler sobre OCaml e talvez ele não possa criar coisas em tempo de execução, então eu o removi.
Robert Vuković

2

Eu usei Python um pouco, mas muito mais Ruby. No entanto, eu diria que ambos fornecem o que você pediu.

Se eu ver todos os seus quatro pontos, você pode pelo menos verificar: http://www.iolanguage.com/

E Mozart / Oz pode ser interessante para você também: http://mozart.github.io/

Atenciosamente Friedrich


1

Para sintaxe de estilo python e macros semelhantes a lisp (macros que são código real) e uma boa DSL, consulte convergir .


1

Não tenho certeza se Python atenderia a tudo o que você deseja (especialmente o ponto sobre a distinção mínima entre código e dados), mas há um argumento a favor do python. Há um projeto por aí que facilita a programação de extensões para python em D, para que você tenha o melhor dos dois mundos. http://pyd.dsource.org/celerid.html



1

Eu recomendo que você vá com Ruby.

Quando comecei a aprender, achei muito fácil de aprender.


1

Não misture a linguagem de programação Ruby com as implementações Ruby, pensando que threads POSIX não são possíveis no ruby.

Você pode simplesmente compilar com suporte a pthread, e isso já era possível no momento em que este tópico foi criado , com o perdão do trocadilho.

A resposta a esta pergunta é simples. Se você gosta de ceceio, provavelmente preferirá rubi. Ou o que você quiser.




0

Em relação ao seu ponto principal (metaprogramação): A versão 1.6 do Groovy tem a programação AST (Abstract Syntax Tree) embutida como um recurso padrão e integrado. Ruby tem RubyParser, mas é um complemento.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.