IDEs para linguagens dinâmicas - até onde você pode chegar?

55

Acho frustrante como a velocidade de desenvolvimento que as linguagens dinâmicas devem oferecer fica significativamente comprometida pela falta de conclusões e outros ativos que os IDEs dariam a você em suas contrapartes estáticas.

Não se trata apenas de digitar menos - é o aumento de produtividade e diversão simples que você obtém navegando nas APIs sem precisar consultar constantemente uma documentação que não está integrada ao editor.

Até o momento, todas as combinações de idiomas IDE + dinâmicas - que, para ser justo, não são muito -, tentei:

  • buggy
  • lento
  • sem noção / entusiasmado (como em mostrar todas as conclusões possíveis)
  • ou simplesmente não tão completo quanto, digamos, Eclipse + Java.

Estou ciente de que a análise de código dinâmico não é uma tarefa trivial. Mas não se pode deixar de pensar - este pedaço de código é realmente tão difícil de descobrir?

Então, minha pergunta é:

Algum IDEs em particular (ou menos configurações all-in-one) alcançou um suporte totalmente excelente para uma linguagem dinâmica, ou ainda é um problema 'não resolvido'?

    
por vemv 24.01.2012 / 13:08
fonte

11 respostas

21

Smalltalk - uma linguagem altamente dinâmica - sempre teve um excelente IDE, no qual pequenas coisas como refatoração automática, SUnit (o avô de todos os frameworks Unit), "quem envia esta mensagem?", "quem implementa esse método? " e semelhantes foram pioneiros. Então, sim, os IDEs podem de fato suportar linguagens dinâmicas a um nível que, até muito recentemente, superou em muito as linguagens estaticamente tipadas.

S. Lott diz que "as linguagens dinâmicas não podem ter o mesmo tipo de completamento de código que as linguagens estáticas fazem. É essencialmente impossível".

"Essencialmente impossível" em um sentido teórico e absolutista? Certo. Em um sentido prático? Na verdade não. Existem muitas maneiras de inferir o tipo para linguagens dinâmicas, estaticamente ( k-CFA , RoelTyper ), em tempo de execução ( PICs ), e outros métodos, como o uso da história recente de um programador - " Como o histórico do programa pode melhorar a conclusão do código ".

Certamente, as comunidades Pharo e Squeak estão muito felizes com suas ferramentas de conclusão de código .

    
por 24.01.2012 / 17:15
fonte
16

Praticamente tudo o que você sabe de IDEs foi desenvolvido primeiramente em Smalltak, que é uma linguagem dinâmica. Tudo o resto é apenas copiá-los. Então, claramente, todos esses recursos são possíveis em linguagens dinâmicas.

Hoje, os idiomas dinâmicos estão por trás dos idiomas estáticos. Mas por que?

Até recentemente, pensava-se que a tipagem estática era superior à tipagem dinâmica. Muitos codificadores mudaram de ideia mais recentemente nesse ponto. O foco nos IDEs para idiomas dinamicamente tipados não estava lá.

Eu acho que os recursos para IDEs são menos úteis em linguagens dinamicamente tipadas. Ao trabalhar em Java ou Objective-C, sinto que o IDE é necessário para me ajudar a trabalhar com a linguagem, mas o mesmo não acontece com as linguagens dinâmicas.

Algumas partes da tarefa são mais fáceis em um idioma estático. É simples descobrir o tipo de uma expressão. Fazer o mesmo em uma linguagem dinâmica requer análise de todo o programa ou registro dos tipos durante o tempo de execução. Como muito do que a IDE gira em torno dos tipos, isso tem um efeito.

    
por 24.01.2012 / 16:02
fonte
10

Eu corri para esse problema com python, mais ou menos. Eu queria o vim como meu editor, mas isso significava que eu não teria um ambiente IDE. Então, eu rolei meu próprio com plugins vim. Atualmente, acho que realmente tenho um ambiente melhor para o desenvolvimento que qualquer IDE que usei no passado.

Minha configuração está hospedada no github , sinta-se à vontade para dar uma olhada e criar o que quiser. Para uma rápida visão geral dos plugins:

  • patógeno
  • modo python, para integração com corda, flocos e pydoc
  • vimpdb para um depurador python
  • projeto para uma lista de arquivos em um projeto
  • taglist para tag jumping
  • supertab para conclusão de tabulação
  • snipmate para snippets
  • conqueterm para um shell integrado, prompt de comando, bash, python ou ipython

Há outras coisas, mas tem todos os recursos que os IDE mais populares têm. Não me custou um centavo, e eu aproveito todo o poder do vim. Divide, movimenta comandos, registra, pula, podendo executar todo o meu ambiente de desenvolvimento com o teclado ...

    
por 24.01.2012 / 16:10
fonte
4

Have any particular IDEs (or less all-in-one setups) achieved a totally outstanding support for a dynamic language,

Considerando que sua avaliação é difícil de entender ("totalmente notável"? "sem clareza / entusiasmada"?) é duvidoso que qualquer IDE possa corresponder ao padrão implícito.

A comparação trivial contra o Eclipse + Java é tola porque as linguagens dinâmicas não são Java.

or is this still an 'unsolved' problem?

Não é bem assim.

É provavelmente insolúvel. Suas necessidades ("falta de conclusões e outros ativos") dificultam a precisão.

Linguagens dinâmicas não podem ter o mesmo tipo de conclusão de código que os idiomas estáticos. É essencialmente impossível.

Alguns IDE fazem um bom trabalho de adivinhação. O Eclipse, por exemplo, possui plugins para linguagens dinâmicas.

    
por 24.01.2012 / 15:55
fonte
3

Eu programo o dia todo em javascript / php e ruby trabalhando em aplicações web e o melhor IDE que eu encontrei para isso é Aptana. Ele tem completamento de código para todas as três dessas linguagens (e python) ele pega meus vars locais e, além disso, quando trabalha com html e css ele pega id's no html para uso no css / javascript, e pega nomes de função para quando eu estou fazendo algo rápido e sujo e escrevendo in-line javascript (eu sei mal, mas às vezes útil para prova de conceito). Ele foi construído em tarefas rake e construído em suporte para o git e um console de linha de comando. Demorei um pouco para me levantar, mas uma vez eu descobri que quase nunca saio da IDE quando estou codificando e isso me poupa muito tempo.

    
por 24.01.2012 / 21:39
fonte
2

Eu descobri que o suporte do Wing IDE para Python é realmente excelente. Ele faz um bom trabalho com a complementação de código, e seu depurador é tão poderoso quanto o do Visual Studio para o C # não dinâmico.

Eu posso atestar que não é buggy, lento ou sem noção. Eu nunca usei o Eclipse, então sou ignorante nesse ponto, mas acho que a grande questão é: existe alguma barreira inerente ao desenvolvimento de um IDE completo e de aprimoramento de produtividade para linguagens dinâmicas. Dada a minha experiência com Python e Wing, estou inclinado a dizer que não é o caso. É, no entanto, certamente mais difícil.

    
por 24.01.2012 / 14:22
fonte
2

O Visual Studio da Microsoft é um IDE que é usado por muitos programadores e suporta IronRuby , IronPython e F #. A maioria consideraria o Ruby e o Python como uma linguagem de programação dinâmica, enquanto o F # seria menos.

Em resposta ao comentário, F # é uma linguagem de programação.

F# (pronounced F Sharp) is a multi-paradigm programming language, targeting the .NET Framework, that encompasses functional programming as well as imperative and object-oriented programming disciplines. It is a variant of ML and is largely compatible with the OCaml implementation.

Embora a definição exata do que exatamente define uma "linguagem dinâmica" ainda esteja em debate, a maioria concorda que o JavaScript é mais "dinâmico" que o C #, por exemplo. Segundo a Wikipedia:

The definition of a dynamic language is ambiguous because it attempts to make distinctions between code and data as well as between compilation and runtime which are not universal. Virtual machines, just-in-time compilation, and the ability of many programming languages on some systems to directly modify machine code make the distinction abstract. In general, the assertion that a language is dynamic is more an assertion about the ease of use of dynamic features than it is a clear statement of the capabilities of the language.

Eu não quero abrir uma lata de worms aqui. Alguns sugeririam que o F # é descrito mais corretamente como uma linguagem funcional em vez de dinâmica, e eu não faria exceção a isso. O que eu acredito que seria justo dizer que é das várias linguagens .Net, F # é geralmente considerado como o mais apropriado para a programação dinâmica do que C # ou VB.

Você pode querer ver: O que qualifica uma linguagem de programação como dinâmica?

    
por 24.01.2012 / 15:48
fonte
2

A principal diferença entre linguagens tipadas estaticamente e linguagens tipificadas dinamicamente é que o sistema pode saber, com certeza, o que significa uma referência de símbolo em tempo de compilação.

Isso torna muito fácil reunir as informações necessárias para criar um bom IDE diretamente das informações geradas pelo compilador no momento da compilação (que é simplesmente movido para o tempo "editar" na maior parte das vezes).

Se você tem uma assinatura de método independente que diz apenas que o método usa uma "Coisa", como um editor pode ajudar você a saber o que enviar? Como isso pode ajudar a sugerir maneiras de usar a coisa?

A digitação de pato também não ajuda - até mesmo o editor mais inteligente possível não será capaz de lhe dizer isso simplesmente porque seu objeto tem um método .executeFooOp () que pode completar o código ".executeBarOp" sobre esse objeto (embora possa vasculhar o resto da base de código e fazer algumas suposições inteligentes).

Se você sabe que é uma "String" na assinatura, no entanto, você conhece todos os métodos que você pode chamar nessa cadeia E você é capaz de sugerir essa variável quando esse usuário está no meio da digitação de uma chamada de método isso requer um String como um parâmetro. Você poderia até sugerir subclasses que poderiam ser lançadas se você quisesse.

A informação simplesmente não existe com linguagens dinamicamente tipificadas, a menos que você possa fazer uma varredura completa de toda a base de código com algo MUITO mais inteligente que o seu compilador típico.

    
por 24.01.2012 / 22:27
fonte
0

Pelo menos para o PHP, muitos IDEs "entendem" algo como

/** @var $foo ClassA **/

Se você documentar de forma padronizada (neste caso, phpDocumentor ), o IDE aproveitará ao máximo isso.

    
por 24.01.2012 / 13:31
fonte
0

De todos os IDEs para linguagens dinâmicas (idiomas que resolvem o tipo em tempo de execução), o melhor é ... Visual Studio para Python

  • Informações do tipo Bulling para o Intellisense
  • Navegação
  • Depuração

Vale a pena tentar.

    
por 24.01.2012 / 19:37
fonte