IDE pour les langages dynamiques - jusqu'où pouvez-vous aller?

56

Je trouve frustrant de voir que la rapidité de développement des langages dynamiques devrait être considérablement compromise par le manque de complétions et d’autres ressources que les IDE vous donneraient dans leurs équivalents statiques.

Il ne suffit pas de moins taper au clavier: il s'agit d'améliorer votre productivité et de vous amuser en parcourant les API sans avoir à vous référer constamment à une documentation qui n'est pas intégrée à l'éditeur.

À ce jour, toutes les combinaisons de langues dynamiques IDE + - qui pour être juste ne sont pas si nombreuses - que j'ai essayées sont les suivantes:

  • petit chariot
  • lent
  • désemparés / trop enthousiastes (comme pour montrer toutes les finitions possibles)
  • ou tout simplement pas aussi complet que, par exemple, Eclipse + Java.

Je suis conscient que l'analyse de code dynamique n'est pas une tâche triviale. Mais on ne peut s'empêcher de se demander: est-ce que ce code est vraiment si difficile à comprendre ?

Donc ma question est:

Des IDE particuliers (ou des configurations moins complètes) ont-ils atteint un support totalement exceptionnel pour un langage dynamique, ou s'agit-il encore d'un problème «non résolu»?

vemv
la source
30
+1 Chaque IDE PHP que j'ai essayé était horrible par rapport à Visual Studio + C # / C ++.
Matěj Zábský
5
Pas sûr de la question globale, mais vous voudrez peut-être jeter un coup d'œil aux IDE JetBrains. Leur approche est "nous avons déjà un excellent IDE, faisons-le fonctionner pour $ LANGUAGE". Le problème avec ceux que vous avez essayés a peut-être été l’approche suivante: "$ LANGUAGE n’a pas d’IDE, il faut que quelqu'un le crée".
Millimoose
2
J'ai vraiment trouvé IDEA merveilleux, en particulier pour travailler avec Java et les tâches liées aux projets. Mais en ce qui concerne JavaScript, il ne semble pas reconnaître les «méthodes» définies dans l'espace de noms ou ses objets contenus.
mardi
IntelliJ IDEA, ou n’importe lequel des IDE spécifiques à la langue de JetBrains.
Sylvanaar
1
@FrustratedWithFormsDesigner J'ai utilisé Komodo. Il a une bien meilleure auto-complétée que n'importe quel autre IDE RoR que j'ai vu ... mais j'ai vu très peu d'IDE pour Ruby qui tentent même d'implémenter l'auto-complétion. Cela dit, c'est mieux que rien
Earlz

Réponses:

21

Smalltalk - un langage très dynamique - a toujours eu un superbe IDE, dans lequel de petites choses comme le refactoring automatique, SUnit (le grand-parent de tous les frameworks * Unit), "qui envoie ce message?", "Qui implémente cette méthode?" et similaires ont été lancés. Alors oui, les IDE peuvent en effet prendre en charge les langages dynamiques à un niveau qui, jusqu'à tout récemment, dépassait de loin ceux des langages statiques.

S. Lott déclare que "les langages dynamiques ne peuvent pas avoir le même type de complétion de code que les langages statiques. C'est essentiellement impossible."

"Essentiellement impossible" au sens théorique et absolutiste? Sûr. Dans un sens pratique? Pas vraiment. Il y a plusieurs façons de type déduisent pour les langages dynamiques, statiquement ( k-CFA , RoelTyper ), au moment de l' exécution ( PICs ), et d' autres méthodes, comme l' utilisation de l' histoire récente d'un programmeur - « Comment l' histoire du programme peut améliorer l' achèvement du code » .

Certes, les communautés Pharo et Squeak sont très satisfaites de leurs outils de complétion de code .

Frank Shearar
la source
3
+1 de moi. Bien que je travaille dans le monde Java ces derniers jours, je me souviens encore de votre productivité en Smalltalk, qui est beaucoup plus productive que toute autre langue que je connais. L'intégration de l'IDE et du code dans votre image, le code étant "toujours actif" (les Smalltalkers sauront ce que je veux dire), est tout simplement inégalée. Avec Pharo et Seaside insufflant une nouvelle vie à ce que beaucoup de gens considèrent comme un "langage fantasmagorique", et Eclipse est un IDE, je recommence à tripoter de plus en plus Smalltalk. Les excellentes conventions de dénomination de Smalltalk aident définitivement à l’achèvement de code prédictif.
Amos M. Carpenter le
16

Presque tout ce que vous savez des IDE a été développé pour la première fois en Smalltak, un langage dynamique. Tout le reste ne fait que les copier. Il est donc clair que toutes ces fonctionnalités sont possibles dans des langages dynamiques.

Aujourd'hui, les langages dynamiques sont derrière les langages statiques. Mais pourquoi?

Jusqu'à récemment, on pensait généralement que le typage statique était supérieur au typage dynamique. De nombreux codeurs ont changé d'avis plus récemment sur ce point. Le focus sur les IDE pour les langages typés de manière dynamique n'était pas là.

Je pense que les fonctionnalités pour les IDE sont moins utiles dans les langages à typage dynamique. Lorsque je travaille en Java ou en Objective-C, j'estime que l'IDE est nécessaire pour m'aider à travailler avec le langage, mais ce n'est pas le cas des langages dynamiques.

Certaines parties de la tâche sont plus faciles dans un langage statique. Il est facile de comprendre le type d'une expression. Faire la même chose dans un langage dynamique nécessite une analyse complète du programme ou la journalisation des types pendant l'exécution. Étant donné que beaucoup de ce que l'EDI tourne autour des types, cela a un effet.

Winston Ewert
la source
2
Dans Squeak et Pharo, RoelTyper fait un assez bon travail en déduisant le type de quelque chose en examinant les messages que vous lui envoyez. Dans le cas contraire, k-CFA de Shivers & Might fournit une inférence de type ajustable, dans le sens où vous pouvez faire des compromis sur les coûts avec la précision.
Frank Shearar le
13
I think that the features for IDEs are less useful in dynamically typed languages- C'est drôle, je pense exactement le contraire. Comme de nombreux langages dynamiques ne vous obligent pas à déclarer les variables à l’avance, mal orthographier une variable est une préoccupation sérieuse… une préoccupation qui est atténuée par un bon IDE. Pendant ce temps, les autres fonctionnalités principales - coloration syntaxique, outils de refactoring, fonctionnalités de débogage - sont également utiles dans toutes les langues.
BlueRaja - Danny Pflughoeft le
2
@ Winston: Alors vous n'avez jamais réalisé de projet dans un langage non déclaratif avec plusieurs personnes :) C'est particulièrement gênant lorsque le langage est sensible à la casse. Exemple d'expérience personnelle: le mot "Work-Order" est parfois orthographié en un mot ("Workorder"). Ainsi, lors de la création d'une variable, certaines personnes écrivent workOrderet d'autres écrivent workorder. Ce sont deux variables distinctes en Python> _ <
BlueRaja - Danny Pflughoeft le
1
@ BlueRaja-DannyPflughoeft, au contraire, j'ai réalisé des projets en Python avec plusieurs personnes. Lorsque vous dites que vous avez un problème, c’est cela: vous exécutez et obtenez une exception parce que vous faites référence à une variable qui n’existe pas, votre code échoue au test initial car vous stockez vos données au mauvais endroit, ou vous obtenez des erreurs non détectées qui entraînent un bug code échappant à la production?
Winston Ewert le
2
"De nombreux codeurs ont changé d'avis plus récemment sur ce point." Pourquoi est-ce?
Pubby
10

J'ai rencontré ce problème avec python, en quelque sorte. Je voulais vim en tant qu'éditeur, mais cela signifiait que je n'aurais pas d'environnement IDE. Je me suis donc lancé avec les plugins vim. Actuellement, je pense avoir un meilleur environnement de développement que n'importe quel IDE que j'ai utilisé par le passé.

Ma configuration est hébergée sur github , n'hésitez pas à jeter un coup d'œil et à écrire ce que vous aimez. Pour un aperçu rapide des plugins:

  • agent pathogène
  • mode python, pour l'intégration de corde, pyflakes et pydoc
  • vimpdb pour un débogueur python
  • projet pour une liste de fichiers dans un projet
  • taglist pour le saut de balise
  • Supertab pour la complétion
  • snipmate pour des extraits
  • conqueterm pour un shell intégré, soit invite de commande, bash, python ou ipython

Il y a quelques autres choses, mais il a toutes les fonctionnalités que les IDE les plus populaires ont. Cela ne m'a pas coûté un centime et je tire parti de toute la puissance de Vim. Fractures, commandes de mouvement, registres, sauts, capacité à exécuter tout mon environnement de développement avec le clavier ...

Spencer Rathbun
la source
4

Des IDE particuliers (ou moins de configurations tout-en-un) ont-ils obtenu un support tout à fait exceptionnel pour un langage dynamique,

Étant donné que votre évaluation est difficile à comprendre ("totalement remarquable"? "Sans intelligence / trop enthousiaste"?), Il est douteux qu'une IDE puisse correspondre à la norme implicite.

Trivialement comparer Eclipse + Java est ridicule, car les langages dynamiques ne sont pas Java.

ou est-ce toujours un problème «non résolu»?

Pas assez.

C'est probablement insoluble. Vos exigences ("manque d'achèvements et autres actifs") rendent difficile la précision.

Les langages dynamiques ne peuvent pas avoir le même type de complétion de code que les langages statiques. C'est essentiellement impossible.

Certains IDE font un bon travail de devinettes. Eclipse, par exemple, a des plugins pour les langages dynamiques.

S.Lott
la source
3

Je pense que cette présentation de Steve Yegge est toujours d'actualité. En résumé, il y a quelques ides de script Java décents (intelliJ IDEA), mais les langages dynamiques en général sont en train de rattraper leur retard, pas parce qu'il y a quelque chose de plus difficile à rendre ces outils (ou même des langages), ce sont juste les langages statiques obtenus toute l'attention en premier.

jk.
la source
En fait, la présentation de Yegge était la cause fondamentale de ma question: si les techniques heuristiques et autres techniques décrites sont présentes, où sont toutes les implémentations intéressantes? Sur IntelliJ: voir le commentaire que j'ai laissé sur mon message original (et laissez-moi savoir si je me trompe)
vemv
2014 - match toujours pas pour les meilleurs dIDE statiques
Den
3

Je programme toute la journée en javascript / php et ruby ​​travaillant sur des applications web et le meilleur IDE que j’ai trouvé pour cela est Aptana. Il a l'achèvement du code pour ces trois langues (et python), il récupère mes vars locaux et en plus, lorsque vous travaillez avec html et css, il récupère les identifiants en html pour une utilisation dans la fonction css / javascript, et récupère noms pour quand je fais quelque chose de rapide et sale et d'écrire du javascript en ligne (je sais mal, mais parfois utile pour la preuve de concept). Il a des tâches de rake intégrées et un support intégré pour git et une console de ligne de commande. Il m'a fallu un peu pour me lever, mais une fois que je l'ai fait, j'ai constaté que je ne quittais presque jamais mon IDE lors du codage, ce qui me faisait gagner beaucoup de temps.

Ryan
la source
Pourquoi le vote négatif sur une réponse qui parle de développement de langage à typage dynamique au sein d'une IDE qui a permis à mon expérience "une expérience tout à fait exceptionnelle". Qu'est-ce que l'op a demandé?
Ryan le
2

J'ai constaté que le support de Python par Wing IDE est vraiment exceptionnel. Il fait du bon travail avec l'achèvement du code et son débogueur est aussi puissant que Visual Studio pour le C # non dynamique.

Je peux attester que ce n'est pas buggy, lent ou désemparé. Je n'ai jamais utilisé Eclipse, je suis donc ignorant sur ce point, mais je pense que la plus grande question est la suivante: existe-t-il un obstacle inhérent au développement d'un IDE complet et améliorant la productivité pour les langages dynamiques? Compte tenu de mon expérience avec Python et Wing, je suis enclin à dire que ce n'est pas le cas. C'est cependant certainement plus difficile.

Adam Crossland
la source
2

Microsoft Visual Studio est un environnement de développement intégré utilisé par de nombreux programmeurs. Il prend en charge IronRuby , IronPython et F #. La plupart considèreraient Ruby et Python comme un langage de programmation dynamique, tandis que F # le serait moins.

En réponse au commentaire, F # est un langage de programmation.

F # (prononcé F Sharp) est un langage de programmation multi-paradigmes, ciblant le .NET Framework, qui englobe la programmation fonctionnelle ainsi que les disciplines de programmation impératives et orientées objet. C'est une variante de ML et est largement compatible avec l'implémentation d'OCaml.

Bien que la définition exacte de ce qui définit exactement un "langage dynamique" fasse encore l’objet d’un débat, la plupart des gens conviendraient que JavaScript est plus "dynamique" que C #, par exemple. Selon Wikipedia:

La définition d'un langage dynamique est ambiguë car elle tente de faire des distinctions entre code et données ainsi qu'entre compilation et exécution qui ne sont pas universelles. Les machines virtuelles, la compilation juste à temps et la capacité de nombreux langages de programmation sur certains systèmes à modifier directement le code machine rendent la distinction abstraite. En général, l'affirmation qu'un langage est dynamique est davantage une affirmation sur la facilité d'utilisation des fonctionnalités dynamiques qu'un énoncé clair des capacités du langage.

Je ne veux pas ouvrir une boîte de Pandore ici. Certains suggèrent que F # est plus correctement décrit comme un langage fonctionnel que dynamique, et je ne m'y opposerais pas. Ce que je pense serait juste de dire qu’il s’agit des différents langages .Net, F # est généralement considéré comme le plus approprié pour la programmation dynamique que le C # ou le VB.

Vous voudrez peut-être voir: Qu'est - ce qui qualifie un langage de programmation de dynamique?

JonnyBoats
la source
4
Pouvez-vous expliquer ce que vous entendez par "F # [...] est un langage dynamique" et en quoi est-il plus dynamique que, par exemple, le C #?
Arseni Mourzenko le
1
Appuyé, je ne considérerais pas F # comme un langage dynamique. Heck, C # pourrait être (je ne suis pas sûr si F # a un équivalent immédiatement disponible) "plus dynamique" ayant déjà dynamicintégré. Mais dans les deux cas, ni l'un ni l'autre n'est généralement typé de manière dynamique, et la plupart des autres fonctionnalités (sans parler des éléments culturels) associées aux "langages dynamiques" sont également absentes.
2

La principale différence entre les langages à typage statique et les langages à typage dynamique réside dans le fait que le système peut savoir, avec certitude, ce que signifie une référence de symbole au moment de la compilation.

Cela facilite vraiment la collecte des informations dont vous avez besoin pour créer un bon IDE directement à partir des informations générées par le compilateur au moment de la compilation (qui est simplement déplacé vers le temps "edit" pour la plupart).

Si vous avez une signature de méthode autonome qui indique simplement que la méthode prend une "chose", comment un éditeur peut-il vous aider à savoir quoi envoyer? Comment peut-il aider à suggérer des façons d'utiliser la chose?

Duck-typing n'aide pas non plus ici - même l'éditeur le plus intelligent possible ne pourra pas vous dire que, tout simplement parce que votre objet a une méthode .executeFooOp () qu'il peut coder en complétant ".executeBarOp" sur cet objet. (Bien qu'il puisse parcourir le reste de la base de code et faire des suppositions intelligentes).

Si vous savez qu'il s'agit d'une "chaîne" dans la signature, vous connaissez toutes les méthodes que vous pouvez appeler sur cette chaîne ET vous pouvez suggérer cette variable lorsque cet utilisateur est en train de taper un appel de méthode nécessitant un Chaîne en tant que paramètre. Vous pouvez même suggérer des sous-classes dans lesquelles il pourrait être lancé si vous le souhaitez.

Les informations ne sont tout simplement pas là avec les langages à typage dynamique, sauf si vous pouvez effectuer une analyse complète de la base de code avec quelque chose de BEAUCOUP plus intelligent que votre compilateur typique.

Bill K
la source
1
"La principale différence entre les langages à typage statique et les langages à typage dynamique est que le système peut savoir, à coup sûr, ce que signifie une référence de symbole au moment de la compilation." - Oui, mais ce n'est pas obligé. Si l'EDI fonctionne au moment de l' exécution plutôt qu'au moment de la compilation, il n'a pas besoin de connaître ces informations au moment de la compilation. Au moment de l'exécution, les informations sont disponibles, sinon le programme ne pourrait même pas s'exécuter.
Jörg W Mittag Le
1
L'ide ne peut pas fonctionner au moment de l'exécution - ou plus précisément, ne peut fonctionner que sur une branche possible à la fois. Le temps d'exécution est situationnel, un symbole donné PEUT signifier une chose sur une passe et une autre sur une autre passe, donc si votre "éditeur" est "en cours d'exécution" (comment ça marche même ???) sur "une passe", comment obtenir des informations de "Another Pass" pour compléter le texte? D'ailleurs, que se passe-t-il si vous écrivez une bibliothèque qui doit être connectée à un module non encore écrit?
Bill K
@billk En pratique, l'IDE fonctionne très bien à l'exécution. si vous travaillez d’abord à l’essai, votre exécution connaît l’objet que vous attendez. Essayez un petit dialogue pendant un moment.
Stephan Eggermont
0

Au moins pour PHP, de nombreux IDE "comprennent" quelque chose comme

/** @var $foo ClassA **/

Si vous documentez de manière normalisée (dans ce cas, phpDocumentor ), l'EDI en tirera le meilleur parti.

ACNB
la source
2
Vous dites donc que si vous tapez tout ce qu’un langage compilé de manière statique vous demanderait de taper, vous pourrez trouver la même information à son sujet que vous le pouvez avec n'importe quel langage de type statique - vrai, je suppose, mais pourquoi ne pas sauter l'étape supplémentaire et aller à un langage statiquement typé?
Bill K
Car encore une fois au moins php fait un casting automatique pour les types simples. Et aussi parce qu’un langage dynamique vous permet de décider où spécifier un type. Avec un développement agile, vous voudrez peut-être reporter des décisions du type "Dois-je utiliser une classe comme type ou interface?"
ACNB le
@ACNB: l'abondance de langages "statiques" permet également le transtypage automatique et l'inférence de type. Par exemple, C ++, C #, etc.
Arafangion
0

Parmi tous les IDE pour les langages dynamiques (ceux qui résolvent le type à l'exécution), le meilleur est ... Visual Studio for Python

  • Informations de type sur Bulling pour Intellisense
  • La navigation
  • Débogage

Cela vaut la peine d'essayer.

Lukasz Madon
la source
Pouvez-vous préciser en quoi VS for Python est meilleur que, choisissons-en un au hasard, Hopscotch?
Jörg W Mittag