IDEs para idiomas dinâmicos - até onde você pode chegar?

56

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 contrapartidas estáticas.

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

Até o momento, todas as combinações de idiomas dinâmicos do IDE +, que para ser justo, não são muito assim, eu tentei foram:

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

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

Então, minha pergunta é:

Algum IDEs específico (ou configurações menos all-in-one) alcançou um suporte totalmente excepcional a um idioma dinâmico, ou ainda é um problema "não resolvido"?

vemv
fonte
30
+1 Cada IDE PHP que experimentei foi horrível em comparação com o Visual Studio + C # / C ++.
Matěj Zábský
5
Não tenho certeza sobre a questão abrangente, mas você pode dar uma olhada nos IDEs do JetBrains. A abordagem deles é "já temos um ótimo IDE, vamos fazê-lo funcionar por $ LANGUAGE". O problema com os que você tentou pode ter adotado a seguinte abordagem: "$ LANGUAGE não tem um IDE, alguém deve fazer um".
millimoose
2
Na verdade, achei o IDEA maravilhoso, especialmente por trabalhar com Java e tarefas relacionadas ao projeto. Mas, quanto ao JavaScript, ele não parece reconhecer os 'métodos' definidos no espaço para nome ou em seus objetos contidos.
vemv
IntelliJ IDEA ou qualquer IDE específico da linguagem do JetBrains.
Sylvanaar
11
@FrustratedWithFormsDesigner Eu usei o Komodo. Tem um preenchimento automático muito melhor do que qualquer outro RoR IDE que eu já vi ... mas vi muito poucos IDEs para Ruby que tentam implementar o preenchimento automático. Dito isto, é melhor do que nada
Earlz

Respostas:

21

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

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

"Essencialmente impossível" em um sentido teórico, absolutista? Certo. Em um sentido prático? Na verdade não. Existem muitas maneiras de inferir o tipo de linguagens dinâmicas, estaticamente ( k-CFA , RoelTyper ), em tempo de execução ( PICs ) e outros métodos, como o uso do histórico 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 .

Frank Shearar
fonte
3
+1 de mim. Apesar de trabalhar no mundo Java atualmente, ainda lembro quanto você é mais produtivo no Smalltalk em comparação com qualquer outra linguagem que conheço. A integração do IDE e do código na sua imagem, tendo o código "vivo" o tempo todo (Smalltalkers saberá o que eu quero dizer), é simplesmente insuperável. Com Pharo e Seaside injetando nova vida no que muitas pessoas consideram uma "linguagem antiga", e tão bom quanto o Eclipse é como um IDE, eu volto a mexer no Smalltalk cada vez mais. As excelentes convenções de nomenclatura do Smalltalk definitivamente ajudam na conclusão preditiva do código.
Amos M. Carpenter
16

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

Hoje, as linguagens dinâmicas estão por trás das linguagens estáticas. Mas por que?

Até recentemente, pensava-se universalmente que a digitação estática era superior à digitação dinâmica. Muitos programadores mudaram de idéia mais recentemente sobre esse ponto. O foco nos IDEs para idiomas de tipo dinâmico 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 se aplica às linguagens dinâmicas.

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

Winston Ewert
fonte
2
No Squeak and Pharo, o RoelTyper faz um trabalho razoavelmente bom ao inferir o tipo de algo, observando as mensagens que você envia para ele. Caso contrário, o k-CFA da Shivers & Might fornece inferência de tipo ajustável, no sentido de que você pode trocar o custo pela precisão.
Frank Shearar
13
I think that the features for IDEs are less useful in dynamically typed languages- Engraçado, acho exatamente o oposto. Como muitas linguagens dinâmicas não exigem que você declare variáveis ​​com antecedência, escrever incorretamente uma variável é uma preocupação séria ... uma preocupação que é aliviada por um bom IDE. Enquanto isso, o restante dos principais recursos - cores de sintaxe, ferramentas de refatoração, recursos de depuração - são igualmente úteis em todos os idiomas.
BlueRaja - Danny Pflughoeft
2
@ Winston: Então você nunca fez um projeto em uma linguagem não declarativa com várias pessoas :) É especialmente irritante quando a linguagem diferencia maiúsculas de minúsculas. Exemplo de experiência pessoal: A palavra "Ordem de serviço" às vezes é escrita como uma palavra ("Ordem de trabalho"); portanto, ao criar uma variável, algumas pessoas escrevem workOrdere outras escrevem workorder. Estas são duas variáveis ​​separadas em Python> _ <
BlueRaja - Danny Pflughoeft
11
@ BlueRaja-DannyPflughoeft, pelo contrário, eu fiz projetos em Python com várias pessoas. Quando você diz que tem um problema: você executa e recebe uma exceção porque está fazendo referência a uma variável que não existe, seu código falha no teste inicial porque você armazena seus dados no local errado ou obtém erros não detectados que resultam em bugs código escapando para produção?
Winston Ewert
2
"Muitos programadores mudaram de idéia mais recentemente sobre esse ponto". Por que é isso?
Pubby
10

Eu encontrei 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 criei meus próprios plugins vim. Atualmente, acho que realmente tenho um ambiente melhor para o desenvolvimento que qualquer IDE que eu usei no passado.

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

  • patógeno
  • modo python, para integração de corda, pyflakes e pydoc
  • vimpdb para um depurador python
  • projeto para uma lista de arquivos em um projeto
  • lista de tags para o salto de tag
  • supertab para preenchimento de guias
  • snipmate para trechos
  • conqueterm para um shell integrado, prompt de comando, bash, python ou ipython

Existem outras coisas, mas ele tem todos os recursos que os IDE mais populares têm. Não me custou um centavo e aproveito todo o poder do vim. Divisões, comandos de movimento, registros, saltos, sendo capaz de executar todo o meu ambiente de desenvolvimento com o teclado ...

Spencer Rathbun
fonte
4

Algum IDEs específico (ou configurações menos all-in-one) alcançou um suporte totalmente excepcional a um idioma dinâmico,

Considerando que sua avaliação é difícil de entender ("totalmente extraordinário"? "Sem noção / entusiasta demais"?), É duvidoso que qualquer IDE possa corresponder ao padrão implícito.

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

ou isso ainda é um problema 'não resolvido'?

Não é bem assim.

Provavelmente é insolúvel. Seus requisitos ("falta de conclusão e outros recursos") dificultam a precisão.

Os idiomas dinâmicos 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 idiomas dinâmicos.

S.Lott
fonte
3

Eu acho que essa apresentação de Steve Yegge ainda é relevante. em uma casca de noz, existem alguns ids de scripts Java meio decentes (intelliJ IDEA), mas as linguagens dinâmicas em geral estão se atualizando, não porque haja algo inerentemente mais difícil em tornar essas ferramentas (ou mesmo linguagens), são apenas as linguagens estáticas toda a atenção primeiro.

jk.
fonte
De fato, a apresentação de Yegge foi a causa raiz da minha pergunta: se as heurísticas e outras técnicas descritas existem, onde estão todas as implementações legais? Em IntelliJ: ver o comentário que deixei no meu post original (e deixe-me saber se eu estiver errado)
vemv
2014 - ainda não é páreo para os melhores IDEs estáticos
Den
3

Programei o dia todo em javascript / php e ruby, trabalhando em aplicativos da Web, e o melhor IDE que encontrei para isso é o Aptana. Ele possui autocompletar código para todas as três linguagens (e python), pega meus vars locais e, além disso, ao trabalhar com html e css, pega id's no html para uso no css / javascript, e pega a função nomes para quando estou fazendo algo rápido e sujo e escrevendo javascript embutido (sei mal, mas às vezes é útil para a prova de conceito). Ele criou tarefas de rake e suporte integrado ao git e um console de linha de comando. Demorei um pouco para me levantar, mas uma vez que descobri que quase nunca saí do meu IDE durante a codificação e isso me economizou muito tempo.

Ryan
fonte
Por que o voto negativo em uma resposta que fala sobre desenvolvimento de linguagem de tipo dinâmico dentro de um IDE que obteve da minha experiência 'uma experiência totalmente extraordinária'. Qual é o que o op pediu?
Ryan
2

Eu descobri que o suporte do Wing IDE para Python é realmente excelente. Ele faz um bom trabalho com a conclusã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 é de buggy, lento ou sem noção. Eu nunca usei o Eclipse, por isso sou ignorante nesse ponto, mas acho que a grande questão é: existe alguma barreira inerente ao desenvolvimento de um IDE completo e que aprimore a 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.

Adam Crossland
fonte
2

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

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

F # (pronunciado F Sharp) é uma linguagem de programação com vários paradigmas, direcionada ao .NET Framework, que abrange a programação funcional e as disciplinas de programação imperativa e orientada a objetos. É uma variante do ML e é amplamente compatível com a implementação do OCaml.

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

A definição de uma linguagem dinâmica é ambígua porque tenta fazer distinções entre código e dados, bem como entre compilação e tempo de execução que não são universais. Máquinas virtuais, compilação just-in-time e a capacidade de muitas linguagens de programação em alguns sistemas modificarem diretamente o código da máquina tornam a distinção abstrata. Em geral, a afirmação de que um idioma é dinâmico é mais uma afirmação sobre a facilidade de uso de recursos dinâmicos do que uma afirmação clara dos recursos do idioma.

Não quero abrir uma lata de vermes aqui. Alguns sugerem que o F # é mais corretamente descrito como uma linguagem funcional do que 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, o F # é geralmente considerado o mais apropriado para a programação dinâmica do que o C # ou o VB.

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

JonnyBoats
fonte
4
Você pode explicar o que você quer dizer com "F # [...] é uma linguagem dinâmica" e como é mais dinâmico que, digamos, C #?
Arseni Mourzenko
11
Em segundo lugar, eu não consideraria o F # uma linguagem dinâmica. Caramba, o C # pode ser (não tenho certeza se o F # tem um equivalente prontamente disponível) "mais dinâmico" tendo sido dynamicincorporado até agora. Mas de qualquer maneira, nenhum dos dois é tipicamente dinamicamente digitado, e a maioria dos outros recursos (para não mencionar coisas culturais) associados às "linguagens dinâmicas" também estão ausentes.
2

A principal diferença entre idiomas tipicamente estatísticos e idiomas dinamicamente é que o sistema pode saber, com certeza, exatamente o que significa uma referência de símbolo em tempo de compilação.

Isso facilita muito a coleta das 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 de "edição" na maior parte).

Se você possui uma assinatura de método autônomo que apenas diz que o método possui uma "Coisa", como um editor pode ajudá-lo a saber o que enviar? Como isso pode ajudar a sugerir maneiras de usar a coisa?

A digitação com patos também não ajuda aqui - mesmo o editor mais inteligente possível não será capaz de dizer que, simplesmente porque seu objeto possui um método .executeFooOp (), ele pode concluir ".executeBarOp" nesse objeto. (Embora possa vasculhar o restante da base de código e fazer algumas suposições inteligentes).

Se você sabe que é uma "String" na assinatura, no entanto, conhece todos os métodos que poderá chamar nessa string E poderá sugerir essa variável quando esse usuário estiver no meio da digitação de uma chamada de método que exija um String como um parâmetro. Você pode até sugerir subclasses nas quais ele pode ser convertido, se você quiser.

A informação simplesmente não existe nas linguagens de tipo dinâmico, 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.

Bill K
fonte
11
"A principal diferença entre idiomas tipicamente estatísticos e idiomas dinamicamente é que o sistema pode saber, com certeza, exatamente o que significa uma referência de símbolo em tempo de compilação." - Sim, mas não precisa. Se o IDE funcionar em tempo de execução, em vez de em tempo de compilação, não precisará conhecer essas informações em tempo de compilação. Em tempo de execução, as informações estão disponíveis, caso contrário, o programa nem poderia ser executado.
Jörg W Mittag
11
O ide não pode funcionar em tempo de execução - ou, com mais precisão, só pode ser executado em uma ramificação possível por vez. O tempo de execução é situacional, um dado símbolo PODE significar uma coisa em uma passagem e outra em outra passagem; portanto, se o seu "Editor" estiver em execução (como isso funciona ???) em "Uma passagem", como isso ocorre? obter informações de "Outro passe" para concluir o texto? Nesse caso, e se você estiver escrevendo uma biblioteca que deve ser conectada a um módulo ainda não escrito?
Bill K
@ billk Na prática, o IDE funciona bem em tempo de execução. se você trabalha primeiro no teste, o tempo de execução conhece o objeto que você está esperando. Tente uma conversa pequena por um tempo.
21915 Stephan Stephangerger
0

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

/** @var $foo ClassA **/

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

ACNB
fonte
2
Então, você está dizendo que, se você digitar tudo o que uma linguagem compilada estaticamente exigiria que você digite, poderá encontrar as mesmas informações que você poderia com qualquer linguagem digitada estaticamente - é verdade, suponho, mas por que não pular a etapa extra e ir para uma linguagem de tipo estaticamente?
Bill K
Porque, pelo menos, o php faz alguma conversão automática para tipos simples. E também porque, ao fazer isso, uma linguagem dinâmica permite que você decida onde especificar um tipo. Com o desenvolvimento ágil, você pode adiar decisões como "Uso uma classe como tipo ou interface?"
ACNB 28/01/12
@ ACNB: Muitas linguagens "estáticas" também permitem a conversão automática e a dedução de tipos. Por exemplo, C ++, C # e similares.
Arafangion
0

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

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

Vale a pena tentar.

Lukasz Madon
fonte
Você pode apontar especificamente, de que maneira o VS for Python é melhor do que, vamos escolher um aleatoriamente, Hopscotch?
Jörg W Mittag