IDEs für dynamische Sprachen - wie weit kommen Sie?

56

Ich finde es frustrierend, wie die Geschwindigkeit der Entwicklung, die dynamische Sprachen bieten sollten, durch das Fehlen von Vervollständigungen und anderen Vorteilen, die IDEs in ihren statischen Entsprechungen bieten würden, erheblich beeinträchtigt wird.

Es geht nicht nur darum, weniger zu tippen - es ist der Produktivitätsschub und der Spaß, den Sie durch das Durchsuchen von APIs erhalten, ohne ständig auf eine Dokumentation verweisen zu müssen, die nicht in den Editor integriert ist.

Bis jetzt habe ich alle IDE + dynamischen Sprachkombinationen - die fairerweise nicht so viel sind - ausprobiert:

  • Buggy
  • schleppend
  • ahnungslos / überinteressiert (wie es immer möglich ist, alle Abschlüsse zu zeigen)
  • oder einfach nicht so vollständig wie beispielsweise Eclipse + Java.

Mir ist bewusst, dass die dynamische Code-Analyse keine triviale Aufgabe ist. Aber man muss sich fragen - ist dieser Code wirklich so schwer herauszufinden ?

Meine Frage lautet also:

Haben bestimmte IDEs (oder weniger All-in-One-Setups) eine hervorragende Unterstützung für eine dynamische Sprache erreicht, oder ist dies immer noch ein ungelöstes Problem?

vemv
quelle
30
+1 Jede einzelne PHP-IDE, die ich ausprobiert habe, war im Vergleich zu Visual Studio + C # / C ++ einfach schrecklich.
Matěj Zábský
5
Sie sind sich der übergeordneten Frage nicht sicher, möchten sich jedoch die JetBrains-IDEs ansehen. Ihr Ansatz ist "Wir haben bereits eine großartige IDE, lasst es uns für $ LANGUAGE funktionieren". Das Problem mit denen, die Sie ausprobiert haben, könnte stattdessen folgender Ansatz gewesen sein: "$ LANGUAGE hat keine IDE, jemand sollte eine machen".
Millimoose
2
Ich fand IDEA in der Tat einfach wunderbar, besonders für die Arbeit mit Java und projektbezogenen Aufgaben. Bei JavaScript scheint es die im Namespace definierten 'Methoden' oder die darin enthaltenen Objekte nicht zu erkennen.
Vemv
IntelliJ IDEA oder eine der sprachspezifischen IDEs von JetBrains.
Sylvanaar
1
@FrustratedWithFormsDesigner Ich habe Komodo verwendet. Es hat eine viel bessere automatische Vervollständigung als jede andere RoR-IDE, die ich gesehen habe ... aber ich habe nur sehr wenige IDEs für Ruby gesehen, die sogar versuchen, die automatische Vervollständigung zu implementieren. Das heißt, es ist besser als nichts
Earlz

Antworten:

21

Smalltalk - eine hochdynamische Sprache - hatte schon immer eine hervorragende IDE, in der kleine Dinge wie automatisches Refactoring, SUnit (der Großelternteil aller * Unit-Frameworks), "Wer sendet diese Nachricht?", "Wer implementiert diese Methode?" und dergleichen waren Pioniere. Also ja, IDEs können in der Tat dynamische Sprachen auf einem Niveau unterstützen, das bis vor kurzem das Niveau statisch typisierter Sprachen bei weitem übertrifft.

S. Lott sagt: "Dynamische Sprachen können nicht dieselbe Art von Code-Vervollständigung haben wie statische Sprachen. Das ist im Grunde unmöglich."

"Im Grunde unmöglich" im theoretischen, absolutistischen Sinne? Sicher. Im praktischen Sinne? Nicht wirklich. Es gibt viele Möglichkeiten, Typen für dynamische Sprachen statisch ( k-CFA , RoelTyper ), zur Laufzeit ( PICs ) und mit anderen Methoden abzuleiten , z. B. mit dem jüngsten Verlauf eines Programmierers - "Wie der Programmverlauf die Codevervollständigung verbessern kann" .

Sicherlich sind die Pharo- und Squeak-Communitys mit ihren Code-Vervollständigungs-Tools sehr zufrieden .

Frank Shearar
quelle
3
+1 von mir. Obwohl ich heutzutage in der Java-Welt arbeite, erinnere ich mich immer noch daran, wie viel produktiver Sie in Smalltalk sind als in jeder anderen Sprache, die ich kenne. Die Integration von IDE und Code in Ihr Image, wobei der Code die ganze Zeit "lebendig" ist (Smalltalker werden wissen, was ich meine), ist einfach unübertroffen. Mit Pharo und Seaside, die dem, was viele Leute als "bisherige Sprache" bezeichnen, neues Leben einhauchen, und Eclipse als IDE, beschäftige ich mich mehr und mehr mit Smalltalk. Die hervorragenden Namenskonventionen von Smalltalk helfen definitiv bei der Vorhersage der Code-Vervollständigung.
Amos M. Carpenter
16

Fast alles, was Sie von IDEs wissen, wurde zuerst in Smalltak entwickelt, einer dynamischen Sprache. Alles andere kopiert sie nur. Somit sind alle diese Funktionen in dynamischen Sprachen möglich.

Dynamische Sprachen stehen heute hinter statischen Sprachen. Aber wieso?

Bis vor kurzem wurde allgemein angenommen, dass statisches Schreiben dynamischem Schreiben überlegen sei. Viele Programmierer haben in jüngerer Zeit ihre Meinung zu diesem Punkt geändert. Der Fokus auf IDEs für dynamisch typisierte Sprachen war nicht vorhanden.

Ich denke, dass die Funktionen für IDEs in dynamisch getippten Sprachen weniger nützlich sind. Bei der Arbeit mit Java oder Objective-C ist die IDE meines Erachtens erforderlich, um mit der Sprache arbeiten zu können, bei den dynamischen Sprachen ist dies jedoch nicht der Fall.

Einige Teile der Aufgabe sind in einer statischen Sprache einfacher. Es ist einfach, den Typ eines Ausdrucks zu bestimmen. Dasselbe in einer dynamischen Sprache zu tun, erfordert entweder eine vollständige Programmanalyse oder die Protokollierung der Typen zur Laufzeit. Da sich vieles in der IDE um die Typen dreht, hat das einen Effekt.

Winston Ewert
quelle
2
In Squeak und Pharo macht RoelTyper einen einigermaßen guten Job, um auf den Typ einer Nachricht zu schließen, indem er sich ansieht, welche Nachrichten Sie an sie senden. Andernfalls bietet der k-CFA von Shivers & Might eine abstimmbare Typinferenz in dem Sinne, dass Sie die Kosten gegen die Genauigkeit austauschen können.
Frank Shearar
13
I think that the features for IDEs are less useful in dynamically typed languages- Komisch, ich denke genau das Gegenteil. Da Sie in so vielen dynamischen Sprachen keine Variablen deklarieren müssen, ist die falsche Schreibweise einer Variablen ein ernstes Problem ... ein Problem, das durch eine gute IDE gelindert wird. Die restlichen Hauptfunktionen - Syntax-Coloring, Refactoring-Tools und Debugging-Funktionen - sind in allen Sprachen gleichermaßen nützlich .
BlueRaja - Danny Pflughoeft
2
@ Winston: Dann haben Sie noch nie ein Projekt in einer nicht deklarativen Sprache mit mehreren Personen durchgeführt :) Es ist besonders ärgerlich, wenn zwischen Groß- und Kleinschreibung unterschieden wird. Beispiel aus persönlicher Erfahrung: Das Wort "Arbeitsreihenfolge" wird manchmal als ein Wort geschrieben ("Arbeitsreihenfolge"). Wenn also eine Variable erstellt wird, schreiben manche Leute workOrderund manche schreiben workorder. Dies sind zwei separate Variablen in Python> _ <
BlueRaja - Danny Pflughoeft
1
@ BlueRaja-DannyPflughoeft, im Gegenteil, ich habe Projekte in Python mit mehreren Leuten gemacht. Wenn Sie sagen, Sie haben ein Problem: Sie führen eine Ausnahme aus und erhalten eine Ausnahme, weil Sie auf eine nicht vorhandene Variable verweisen, Ihr Code die ersten Tests nicht besteht, weil Sie Ihre Daten an der falschen Stelle speichern, oder Sie erhalten unentdeckte Fehler, die zu Fehlern führen Code, der in die Produktion flüchtet?
Winston Ewert
2
"Viele Programmierer haben in jüngerer Zeit ihre Meinung zu diesem Punkt geändert." Warum ist das?
Pubby
10

Ich bin auf dieses Problem mit Python gestoßen. Ich wollte vim als Editor, aber das bedeutete, dass ich keine IDE-Umgebung haben würde. Also habe ich meine eigenen mit Vim-Plugins gerollt. Derzeit denke ich, dass ich tatsächlich eine bessere Entwicklungsumgebung habe als jede andere IDE, die ich in der Vergangenheit verwendet habe.

Mein Setup wird auf Github gehostet. Schauen Sie sich das an und krippen Sie , was Ihnen gefällt. Für einen schnellen Überblick über die Plugins:

  • Erreger
  • Python-Modus für die Integration von Seilen, Pyflakes und Pydoc
  • vimpdb für einen Python-Debugger
  • Projekt für eine Liste von Dateien in einem Projekt
  • Tagliste für Tag Jumping
  • Supertab für Tab-Vervollständigung
  • Snipmate für Schnipsel
  • conqueterm für eine integrierte Shell, entweder Eingabeaufforderung, Bash, Python oder Ipython

Es gibt einige andere Dinge, aber es hat alle Funktionen, die die beliebtesten IDEs haben. Es hat mich keinen Cent gekostet, und ich kann die ganze Kraft von vim nutzen. Splits, Bewegungsbefehle, Register, Springen, meine gesamte Entwicklungsumgebung mit der Tastatur ausführen können ...

Spencer Rathbun
quelle
4

Haben bestimmte IDEs (oder weniger All-in-One-Setups) eine hervorragende Unterstützung für eine dynamische Sprache erreicht?

Angesichts der Tatsache, dass Ihre Bewertung schwer zu verstehen ist ("völlig hervorragend"? "Ahnungslos / überfordert"?), Ist es zweifelhaft, ob eine IDE dem implizierten Standard entsprechen könnte.

Trivialer Vergleich mit Eclipse + Java ist albern, weil dynamische Sprachen nicht Java sind.

oder ist das noch ein "ungelöstes" problem?

Nicht ganz.

Es ist wahrscheinlich unlösbar. Ihre Anforderungen ("Mangel an Fertigstellungen und anderen Ressourcen") machen es schwierig, genauer zu sein.

Dynamische Sprachen können nicht dieselbe Art der Code-Vervollständigung aufweisen wie statische Sprachen. Es ist im Grunde unmöglich.

Einige IDEs raten sehr gut. Eclipse verfügt beispielsweise über Plugins für dynamische Sprachen.

S.Lott
quelle
3

Ich denke, diese Präsentation von Steve Yegge ist immer noch relevant. Kurz gesagt, es gibt einige halbwegs anständige Java-Skript-IDs (IntelliJ IDEA), aber dynamische Sprachen spielen im Allgemeinen eine Aufholjagd, nicht weil es von Natur aus schwieriger ist, diese Tools (oder Sprachen) so zu gestalten, dass es nur um die statischen Sprachen geht die ganze Aufmerksamkeit zuerst.

jk.
quelle
Tatsächlich war Yegges Präsentation die Hauptursache für meine Frage: Wenn die Heuristiken und andere beschriebenen Techniken vorhanden sind, wo sind dann all die coolen Implementierungen? Zu IntelliJ: siehe den Kommentar, den ich in meinem ursprünglichen Beitrag hinterlassen habe (und lass es mich wissen, wenn ich mich irre)
vemv
2014 - immer noch kein Spiel für die besten statischen IDEs
Den
3

Ich programmiere den ganzen Tag in Javascript / PHP und Ruby und arbeite an Webanwendungen. Die beste IDE, die ich dafür gefunden habe, ist Aptana. Es hat Code-Vervollständigung für alle drei dieser Sprachen (und Python), es nimmt meine lokalen Variablen auf und zusätzlich, wenn es mit HTML und CSS arbeitet, nimmt es IDs in HTML zur Verwendung in CSS / Javascript auf und übernimmt die Funktion Namen, wenn ich etwas schnelles und schmutziges mache und Inline-Javascript schreibe (ich weiß schlecht, aber manchmal nützlich für den Proof of Concept). Es hat Rake-Tasks und Unterstützung für Git und eine Befehlszeilenkonsole eingebaut. Es hat ein bisschen gedauert, bis ich aufgestanden bin, aber als ich es einmal tat, stellte ich fest, dass ich meine IDE beim Codieren kaum verlassen habe, und das spart mir jede Menge Zeit.

Ryan
quelle
Warum stimmen die Absteiger über eine Antwort ab, die von einer dynamisch getippten Sprachentwicklung in einer IDE spricht, die aus meiner Erfahrung heraus "eine absolut herausragende Erfahrung" gemacht hat? Um was hat die Operation gebeten?
Ryan
2

Ich habe festgestellt, dass Wing IDE Python wirklich hervorragend unterstützt. Es leistet gute Arbeit mit der Code-Vervollständigung, und sein Debugger ist so leistungsfähig wie der von Visual Studio für das nicht dynamische C #.

Ich kann bestätigen, dass es nicht fehlerhaft, langsam oder ahnungslos ist. Ich habe Eclipse noch nie verwendet, daher bin ich in diesem Punkt unwissend, aber ich denke, dass die größere Frage lautet: Gibt es ein inhärentes Hindernis für die Entwicklung einer vollständigen und produktivitätssteigernden IDE für dynamische Sprachen? Aufgrund meiner Erfahrung mit Python und Wing bin ich geneigt zu sagen, dass dies nicht der Fall ist. Es ist jedoch sicherlich schwieriger.

Adam Crossland
quelle
2

Microsoft Visual Studio ist eine IDE, die von vielen Programmierern verwendet wird und IronRuby , IronPython und F # unterstützt. Die meisten würden Ruby und Python als dynamische Programmiersprache betrachten, F # dagegen weniger.

Als Antwort auf den Kommentar ist F # eine Programmiersprache.

F # (ausgesprochen F Sharp) ist eine Programmiersprache mit mehreren Paradigmen, die auf das .NET Framework abzielt und funktionale Programmierung sowie imperative und objektorientierte Programmierdisziplinen umfasst. Es ist eine Variante von ML und weitgehend kompatibel mit der OCaml-Implementierung.

Während die genaue Definition dessen, was genau eine "dynamische Sprache" definiert, noch zur Debatte steht, stimmen die meisten darin überein, dass JavaScript "dynamischer" ist als beispielsweise C #. Laut Wikipedia:

Die Definition einer dynamischen Sprache ist nicht eindeutig, da versucht wird, zwischen Code und Daten sowie zwischen Kompilierung und Laufzeit zu unterscheiden, die nicht universell sind. Virtuelle Maschinen, eine Just-in-Time-Kompilierung und die Fähigkeit vieler Programmiersprachen auf einigen Systemen, Maschinencode direkt zu ändern, machen die Unterscheidung abstrakt. Im Allgemeinen ist die Behauptung, dass eine Sprache dynamisch ist, eher eine Behauptung über die Benutzerfreundlichkeit dynamischer Funktionen als eine klare Aussage über die Fähigkeiten der Sprache.

Ich möchte hier keine Dose Würmer öffnen. Einige würden vorschlagen, dass F # eher als funktionale als als als dynamische Sprache beschrieben wird, und ich würde keine Ausnahme machen. Was ich glaube, wäre fair zu sagen, dass es sich um die verschiedenen .Net-Sprachen handelt. F # wird im Allgemeinen als das geeignetere Programm für die dynamische Programmierung angesehen als C # oder VB.

Vielleicht möchten Sie sehen: Was qualifiziert eine Programmiersprache als dynamisch?

JonnyBoats
quelle
4
Können Sie erklären, was Sie mit "F # [...] ist eine dynamische Sprache" meinen und wie es dynamischer ist, wenn Sie sagen, C #?
Arseni Mourzenko
1
Zweitens würde ich F # nicht als dynamische Sprache betrachten. Heck, C # könnte sein (ich bin nicht sicher, ob F # ein sofort verfügbares Äquivalent hat) "dynamischer", nachdem dynamices mittlerweile eingebaut ist. In beiden Fällen ist keines der beiden Elemente in der Regel dynamisch typisiert, und die meisten anderen Merkmale (von kulturellen Dingen ganz zu schweigen), die mit "dynamischen Sprachen" zusammenhängen, fehlen ebenfalls.
2

Der Hauptunterschied zwischen statisch typisierten Sprachen und dynamisch typisierten Sprachen besteht darin, dass das System mit Sicherheit weiß, was eine Symbolreferenz zur Kompilierungszeit bedeutet.

Dies macht es wirklich einfach, die Informationen, die Sie für eine gute IDE benötigen, direkt aus den Informationen zu sammeln, die der Compiler zur Kompilierungszeit generiert (die zum größten Teil einfach auf "Bearbeitungszeit" angehoben wird).

Wenn Sie eine eigenständige Methodensignatur haben, die lediglich besagt, dass die Methode eine "Sache" erfordert, wie kann Ihnen ein Editor dabei helfen, zu wissen, was zu senden ist? Wie kann es helfen, Möglichkeiten zur Verwendung des Dings vorzuschlagen?

Duck-Typing hilft auch hier nicht weiter - selbst der intelligenteste Editor wird Ihnen nicht sagen können, dass Ihr Objekt die .executeFooOp () -Methode besitzt, mit der es ".executeBarOp" für dieses Objekt codieren kann (Obwohl es den Rest der Codebasis durchforsten und einige intelligente Vermutungen anstellen könnte).

Wenn Sie jedoch wissen, dass es sich um eine "Zeichenfolge" in der Signatur handelt, kennen Sie alle Methoden, die Sie möglicherweise für diese Zeichenfolge aufrufen, UND Sie können diese Variable vorschlagen, wenn dieser Benutzer gerade einen Methodenaufruf eingibt, für den ein erforderlich ist String als Parameter. Sie können sogar Unterklassen vorschlagen, in die es gegossen werden kann, wenn Sie möchten.

Die Informationen sind bei dynamisch getippten Sprachen nur dann vorhanden, wenn Sie einen vollständigen Scan der gesamten Codebasis mit etwas VIEL Intelligenterem als Ihrem typischen Compiler durchführen können.

Bill K
quelle
1
"Der Hauptunterschied zwischen statisch getippten und dynamisch getippten Sprachen besteht darin, dass das System mit Sicherheit weiß, was eine Symbolreferenz zur Kompilierungszeit bedeutet." - Ja, muss aber nicht. Wenn die IDE nicht zur Kompilierungszeit, sondern zur Laufzeit ausgeführt wird, müssen diese Informationen zur Kompilierungszeit nicht bekannt sein. Zur Laufzeit die Information ist verfügbar, sonst könnte das Programm nicht einmal laufen.
Jörg W Mittag
1
Das ide kann nicht zur Laufzeit ausgeführt werden - oder genauer gesagt, es kann immer nur ein möglicher Zweig gleichzeitig ausgeführt werden. Die Laufzeit ist situationsabhängig. Ein bestimmtes Symbol KANN bei einem Durchgang eine Sache und bei einem anderen Durchgang eine andere bedeuten. Wenn Ihr "Editor" bei "One Pass" "Running" (Wie funktioniert das überhaupt ???) ist, wie funktioniert es dann? Informationen von "Another Pass" abrufen, um den Text fertigzustellen? Was ist im Übrigen, wenn Sie eine Bibliothek schreiben, die in ein noch nicht geschriebenes Modul gesteckt werden soll?
Bill K
@billk In der Praxis funktioniert die IDE zur Laufzeit einwandfrei. Wenn Sie test-first arbeiten, kennt Ihre Laufzeit das Objekt, das Sie erwarten. Probieren Sie ein kleines Gespräch für eine Weile.
Stephan Eggermont
0

Zumindest für PHP "verstehen" viele IDEs so etwas

/** @var $foo ClassA **/

Wenn Sie standardisiert dokumentieren (in diesem Fall phpDocumentor ), wird die IDE das Beste daraus machen.

ACNB
quelle
2
Wenn Sie also alles eingeben, was für eine statisch kompilierte Sprache erforderlich ist, finden Sie die gleichen Informationen, die Sie für jede statisch getippte Sprache benötigen - ich nehme an, aber warum überspringen Sie nicht einfach den zusätzlichen Schritt und in eine statisch typisierte Sprache wechseln?
Bill K
Denn zumindest PHP macht wieder ein automatisches Casting für einfache Typen. Außerdem können Sie in einer dynamischen Sprache entscheiden, wo ein Typ angegeben werden soll. Bei einer agilen Entwicklung möchten Sie möglicherweise Entscheidungen wie "Benutze ich eine Klasse als Typ oder Schnittstelle?" Verschieben.
ACNB
@ACNB: Viele "statische" Sprachen ermöglichen auch das automatische Casting und die Typ-Inferenz. ZB C ++, C # und dergleichen.
Arafangion
0

Von allen IDEs für dynamische Sprachen (Sprachen, die den Typ zur Laufzeit auflösen) ist die beste ... Visual Studio für Python

  • Bulling-Typ-Informationen für Intellisense
  • Navigation
  • Debuggen

Es lohnt sich zu versuchen.

Lukasz Madon
quelle
Können Sie konkret darauf hinweisen, inwiefern VS für Python besser ist, als Hopscotch, einen zufällig auszuwählen?
Jörg W Mittag