IDEs para lenguajes dinámicos: ¿hasta dónde puede llegar?

56

Me resulta frustrante cómo la velocidad de desarrollo que deberían ofrecer los lenguajes dinámicos se ve significativamente comprometida por la falta de compleciones y otros activos que los IDE le darían en sus contrapartes estáticas.

No se trata solo de escribir menos: es el aumento de la productividad y la diversión que obtienes al explorar las API sin tener que consultar constantemente una documentación que no está integrada con el editor.

Hasta la fecha, todas las combinaciones de lenguaje dinámico IDE +, que para ser justos no son tanto, he intentado:

  • calesa
  • lento
  • despistado / demasiado entusiasta (como mostrar todas las terminaciones posibles)
  • o simplemente no tan completo como, por ejemplo, Eclipse + Java.

Soy consciente de que el análisis de código dinámico no es una tarea trivial. Pero uno no puede evitar preguntarse: ¿ es este código realmente tan difícil de entender ?

Entonces mi pregunta es:

¿Algún IDE en particular (o menos configuraciones todo en uno) ha logrado un soporte totalmente sobresaliente para un lenguaje dinámico, o esto sigue siendo un problema 'sin resolver'?

vemv
fuente
30
+1 Cada IDE PHP que he probado fue simplemente horrible en comparación con Visual Studio + C # / C ++.
Matěj Zábský
55
No estoy seguro acerca de la pregunta general, pero es posible que desee echar un vistazo a los IDE de JetBrains. Su enfoque es "ya tenemos un gran IDE, hagamos que funcione por $ LANGUAGE". El problema con los que probó podría haber sido adoptar el siguiente enfoque: "$ LANGUAGE no tiene un IDE, alguien debería crear uno".
millimoose
2
De hecho, encontré IDEA simplemente maravilloso, especialmente para trabajar con Java y tareas relacionadas con proyectos. Pero en cuanto a JavaScript, no parece reconocer los 'métodos' definidos en el espacio de nombres o sus objetos contenidos.
vemv
IntelliJ IDEA, o cualquiera de los IDE específicos del idioma de JetBrains.
sylvanaar
1
@FrustratedWithFormsDesigner He usado Komodo. Tiene un autocompletado mucho mejor que cualquier otro IDE de RoR que haya visto ... pero he visto muy pocos IDEs para Ruby que incluso intenten implementar el autocompletado. Dicho esto, es mejor que nada
Earlz el

Respuestas:

21

Smalltalk, un lenguaje muy dinámico, siempre ha tenido un IDE excelente, en el que pequeñas cosas como la refactorización automática, SUnit (el abuelo de todos los * marcos de la Unidad), "¿quién envía este mensaje?", "¿Quién implementa este método?" y similares fueron pioneros. Entonces, sí, los IDE pueden admitir lenguajes dinámicos a un nivel que, hasta hace muy poco, superó con creces los de los idiomas estáticamente tipados.

S. Lott dice que "los lenguajes dinámicos no pueden tener el mismo tipo de terminación de código que los lenguajes estáticos. Es esencialmente imposible".

¿"Esencialmente imposible" en un sentido teórico y absolutista? Seguro. En un sentido práctico? Realmente no. Hay muchas formas de inferir el tipo de lenguajes dinámicos, estáticamente ( k-CFA , RoelTyper ), en tiempo de ejecución ( PIC ) y otros métodos, como usar el historial reciente de un programador: "Cómo el historial del programa puede mejorar la finalización del código" .

Ciertamente, las comunidades Pharo y Squeak están muy contentas con sus herramientas de finalización de código .

Frank Shearar
fuente
3
+1 de mi parte A pesar de trabajar en el mundo Java en estos días, todavía recuerdo cuánto más productivo eres en Smalltalk en comparación con cualquier otro idioma que conozca. La integración de IDE y código en su imagen, teniendo el código "vivo" todo el tiempo (Smalltalkers sabrá a qué me refiero), simplemente no tiene igual. Con Pharo y Seaside inyectando una nueva vida en lo que mucha gente piensa como un "lenguaje ha sido", tan bueno como Eclipse es como un IDE, vuelvo a jugar con Smalltalk cada vez más. Las excelentes convenciones de nombres de Smalltalk definitivamente ayudan a completar el código predictivo.
Amos M. Carpenter
16

Casi todo lo que sabes de IDEs se desarrolló por primera vez en Smalltak, que es un lenguaje dinámico. Todo lo demás es solo copiarlos. Claramente, todas estas características son posibles en lenguajes dinámicos.

Hoy, los lenguajes dinámicos están detrás de los lenguajes estáticos. ¿Pero por qué?

Hasta hace poco, se pensaba universalmente que la escritura estática era superior a la escritura dinámica. Muchos codificadores han cambiado de opinión más recientemente sobre ese punto. Centrarse en IDEs para lenguajes de tipo dinámico no estaba allí.

Creo que las características para IDEs son menos útiles en lenguajes escritos dinámicamente. Cuando trabajo en Java u Objective-C, siento que el IDE es necesario para ayudarme a trabajar con el lenguaje, pero lo mismo no es cierto para los lenguajes dinámicos.

Algunas partes de la tarea son más fáciles en un lenguaje estático. Es sencillo descubrir el tipo de expresión. Hacer lo mismo en un lenguaje dinámico requiere un análisis completo del programa o registrar los tipos durante el tiempo de ejecución. Dado que mucho de lo que el IDE gira en torno a los tipos, eso tiene un efecto.

Winston Ewert
fuente
2
En Squeak y Pharo, RoelTyper hace un trabajo razonablemente bueno de inferir el tipo de algo mirando los mensajes que le envías. De lo contrario, el k-CFA de Shivers & Might proporciona inferencia de tipo ajustable, en el sentido de que puede compensar el costo con la precisión.
Frank Shearar
13
I think that the features for IDEs are less useful in dynamically typed languages- Divertido, pienso exactamente lo contrario. Dado que muchos lenguajes dinámicos no requieren que declare variables de antemano, escribir mal una variable es una preocupación seria ... una preocupación que se alivia con un buen IDE. Mientras tanto, el resto de las características principales (coloración de sintaxis, herramientas de refactorización, características de depuración) son igualmente útiles en todos los idiomas.
BlueRaja - Danny Pflughoeft
2
@ Winston: Entonces nunca has hecho un proyecto en un lenguaje no declarativo con varias personas :) Es especialmente molesto cuando el lenguaje distingue entre mayúsculas y minúsculas. Ejemplo de experiencia personal: la palabra "Orden de trabajo" a veces se deletrea como una palabra ("Orden de trabajo"), por lo que al crear una variable, algunas personas escribirán workOrdery otras escribirán workorder. Estas son dos variables separadas en Python> _ <
BlueRaja - Danny Pflughoeft
1
@ BlueRaja-DannyPflughoeft, por el contrario, he realizado proyectos en Python con varias personas. Cuando dice que tiene un problema: ejecuta y obtiene una excepción porque hace referencia a una variable que no existe, su código falla la prueba inicial porque almacena sus datos en el lugar incorrecto o obtiene errores no detectados que provocan errores. Cómo se escapa el código a la producción?
Winston Ewert
2
"Muchos programadores han cambiado de opinión más recientemente sobre ese punto". ¿Por qué es esto?
Pubby
10

Me encontré con ese problema con Python, más o menos. Quería vim como mi editor, pero eso significaba que no tendría un entorno IDE. Entonces, rodé el mío con los complementos vim. Actualmente, creo que tengo un mejor entorno de desarrollo que cualquier IDE que haya usado en el pasado.

Mi configuración está alojada en github , no dude en echar un vistazo y cuna lo que quiera. Para una descripción rápida de los complementos:

  • patógeno
  • Python-mode, para la integración de cuerda, copos de nieve y pydoc
  • vimpdb para un depurador de python
  • proyecto para una lista de archivos en un proyecto
  • taglist para saltar la etiqueta
  • supertab para completar pestañas
  • snipmate para fragmentos
  • conqueterm para un shell integrado, ya sea símbolo del sistema, bash, python o ipython

Hay algunas otras cosas, pero tiene todas las características que tienen los IDE más populares. No me costó ni un centavo, y puedo aprovechar todo el poder de vim. Splits, comandos de movimiento, registros, saltos, poder ejecutar todo mi entorno de desarrollo con el teclado ...

Spencer Rathbun
fuente
4

¿Alguna IDE en particular (o menos configuraciones todo en uno) ha logrado un soporte totalmente sobresaliente para un lenguaje dinámico,

Teniendo en cuenta que su evaluación es difícil de entender (¿"totalmente sobresaliente"?

Comparar trivialmente con Eclipse + Java es una tontería porque los lenguajes dinámicos no son Java.

¿o sigue siendo un problema "sin resolver"?

No exactamente.

Probablemente no tenga solución. Sus requisitos ("falta de terminaciones y otros activos") dificultan ser más precisos.

Los lenguajes dinámicos no pueden tener el mismo tipo de terminación de código que los lenguajes estáticos. Es esencialmente imposible.

Algunos IDE hacen un buen trabajo de adivinanzas. Eclipse, por ejemplo, tiene complementos para lenguajes dinámicos.

S.Lott
fuente
3

Creo que esta presentación de Steve Yegge sigue siendo relevante. en pocas palabras, hay algunas ideas de script Java decentes (intelliJ IDEA), pero los lenguajes dinámicos en general están poniéndose al día, no porque haya algo intrínsecamente más difícil al hacer estas herramientas (o de hecho lenguajes), son solo los lenguajes estáticos adquiridos Toda la atención primero.

jk.
fuente
De hecho, la presentación de Yegge fue la causa principal de mi pregunta: si las heurísticas y otras técnicas descritas están allí, ¿dónde están todas las implementaciones geniales? En IntelliJ: vea el comentario que dejé en mi publicación original (y avíseme si me equivoco)
vemv
2014 - todavía no coincide con los mejores IDE estáticos
Den
3

Programa todo el día en javascript / php y ruby ​​trabajando en aplicaciones web y el mejor IDE que he encontrado para esto es Aptana. Tiene código de finalización para los tres idiomas (y python), recoge mis variables locales y, además, cuando trabaja con html y css, recoge los identificadores en el html para usar en css / javascript, y recoge la función nombres para cuando estoy haciendo algo rápido y sucio y escribiendo JavaScript en línea (lo sé mal, pero a veces es útil como prueba de concepto). Ha incorporado tareas de rastrillo y soporte integrado para git y una consola de línea de comandos. Me tomó un poco levantarme, pero una vez que lo hice, descubrí que casi nunca dejo mi IDE al codificar y me ahorra mucho tiempo.

Ryan
fuente
¿Por qué la votación negativa sobre una respuesta que habla sobre el desarrollo del lenguaje de tipo dinámico dentro de un IDE que ha logrado desde mi experiencia "una experiencia totalmente excepcional"? ¿Qué es lo que pidió el operador?
Ryan
2

He descubierto que el soporte de Wing IDE para Python es realmente sobresaliente. Hace un buen trabajo con la finalización del código, y su depurador es tan poderoso como lo es Visual Studio para el C # no dinámico.

Puedo dar fe de que no tiene errores, es lento o despistado. Nunca he usado Eclipse, por lo que soy ignorante en ese punto, pero creo que la pregunta más importante es: ¿hay alguna barrera inherente para desarrollar un IDE completo y que mejore la productividad para lenguajes dinámicos. Dada mi experiencia con Python y Wing, me inclino a decir que ese no es el caso. Sin embargo, es ciertamente más difícil.

Adam Crossland
fuente
2

Visual Studio de Microsoft es un IDE que utilizan muchos programadores y es compatible con IronRuby , IronPython y F #. La mayoría consideraría que Ruby y Python son un lenguaje de programación dinámico, mientras que F # lo sería menos.

En respuesta al comentario, F # es un lenguaje de programación.

F # (pronunciado F Sharp) es un lenguaje de programación de paradigmas múltiples, dirigido a .NET Framework, que abarca la programación funcional, así como las disciplinas de programación imperativas y orientadas a objetos. Es una variante de ML y es ampliamente compatible con la implementación de OCaml.

Si bien la definición exacta de lo que define exactamente un "lenguaje dinámico" aún está en debate, la mayoría estaría de acuerdo en que JavaScript es más "dinámico" que C #, por ejemplo. De acuerdo con Wikipedia:

La definición de un lenguaje dinámico es ambigua porque intenta hacer distinciones entre código y datos, así como entre compilación y tiempo de ejecución que no son universales. Las máquinas virtuales, la compilación justo a tiempo y la capacidad de muchos lenguajes de programación en algunos sistemas para modificar directamente el código de la máquina hacen que la distinción sea abstracta. En general, la afirmación de que un lenguaje es dinámico es más una afirmación sobre la facilidad de uso de las características dinámicas que una declaración clara de las capacidades del lenguaje.

No quiero abrir una lata de gusanos aquí. Algunos sugerirían que F # se describe más correctamente como un lenguaje funcional en lugar de dinámico, y no me gustaría hacer una excepción. Lo que creo que sería justo decir que es de los diversos lenguajes .Net, F # es generalmente considerado como el más apropiado para la programación dinámica que C # o VB.

Es posible que desee ver: ¿Qué califica un lenguaje de programación como dinámico?

JonnyBoats
fuente
44
¿Puede explicar qué quiere decir con "F # [...] es un lenguaje dinámico" y cómo es más dinámico que, por ejemplo, C #?
Arseni Mourzenko
1
En segundo lugar, no consideraría F # un lenguaje dinámico. Demonios, C # podría ser (no estoy seguro si F # tiene un equivalente fácilmente disponible) "más dinámico" habiendo dynamicincorporado ahora. Pero de cualquier manera, ninguno de los dos está tipificado dinámicamente y la mayoría de las otras características (sin mencionar las cuestiones culturales) asociadas con los "lenguajes dinámicos" también faltan.
2

La principal diferencia entre los idiomas tipados estáticamente y los idiomas tipados dinámicamente es que el sistema puede saber, con certeza, qué significa una referencia de símbolo en tiempo de compilación.

Esto hace que sea realmente fácil recopilar la información que necesita para hacer un buen IDE directamente a partir de la información generada por el compilador en el momento de la compilación (que en su mayor parte se pasa al tiempo de "edición").

Si tiene una firma de método independiente que simplemente dice que el método toma una "Cosa", ¿cómo puede un editor ayudarlo a saber qué enviar? ¿Cómo puede ayudar a sugerir formas de usar la cosa?

La escritura de pato tampoco ayuda aquí, incluso el editor más inteligente posible no podrá decirte eso simplemente porque tu objeto tiene un método .executeFooOp () que puede codificar ".executeBarOp" en ese objeto. (Aunque podría rastrear el resto de la base de código y hacer algunas suposiciones inteligentes).

Sin embargo, si sabe que es una "Cadena" en la firma, conoce todos los métodos a los que puede llamar en esa cadena Y puede sugerir esa variable cuando ese usuario está en el medio de escribir una llamada a un método que requiere un Cadena como parámetro. Incluso podría sugerir subclases en las que podría integrarse si lo desea.

La información simplemente no está allí con lenguajes escritos dinámicamente a menos que pueda hacer un escaneo completo de toda la base de código con algo MUCHO más inteligente que su compilador típico.

Bill K
fuente
1
"La principal diferencia entre los idiomas tipados estáticamente y los tipados dinámicamente es que el sistema puede saber, con seguridad, lo que significa una referencia de símbolo en tiempo de compilación". - Sí, pero no tiene que ser así. Si el IDE funciona en tiempo de ejecución en lugar de en tiempo de compilación, entonces no necesita conocer esta información en tiempo de compilación. En tiempo de ejecución, la información está disponible; de ​​lo contrario, el programa ni siquiera podría ejecutarse.
Jörg W Mittag
1
El IDE no puede funcionar en tiempo de ejecución, o más exactamente solo podría ejecutarse en una rama posible a la vez. El tiempo de ejecución es situacional, un símbolo dado PUEDE significar una cosa en una pasada y otra cosa en otra pasada, así que si su "Editor" está "En ejecución" (¿Cómo funciona eso? ???) en "Una pasada", ¿cómo funciona? obtener información de "Otro pase" para completar el texto? Para el caso, ¿qué sucede si está escribiendo una biblioteca que se va a conectar a un módulo aún no escrito?
Bill K
@billk En la práctica, el IDE funciona bien en tiempo de ejecución. si trabaja primero en la prueba, su tiempo de ejecución conoce el objeto que espera. Prueba una pequeña conversación por un tiempo.
Stephan Eggermont
0

Al menos para PHP, muchos IDEs "entienden" algo como

/** @var $foo ClassA **/

Si documenta de manera estandarizada (en este caso phpDocumentor ), el IDE lo aprovechará al máximo.

ACNB
fuente
2
Entonces, está diciendo que si escribe todo lo que un lenguaje compilado estáticamente requeriría que escriba, puede encontrar la misma información que podría con cualquier idioma estáticamente escrito, supongo que es cierto, pero ¿por qué no omitir el paso adicional y ir a un idioma escrito estáticamente?
Bill K
Porque, de nuevo, al menos PHP realiza una conversión automática para tipos simples. Y también porque al hacerlo, un lenguaje dinámico le permite decidir dónde especificar un tipo. Con un desarrollo ágil, es posible que desee posponer decisiones como "¿Uso una clase como tipo o una interfaz?"
ACNB
@ACNB: Muchos lenguajes "estáticos" también permiten la conversión automática y la inferencia de tipos. Por ejemplo, C ++, C # y similares.
Arafangion
0

De todos los IDEs para lenguajes dinámicos (lenguajes que resuelven el tipo en tiempo de ejecución), el mejor es ... Visual Studio para Python

  • Información de tipo Bulling para Intellisense
  • Navegación
  • Depuración

Vale la pena intentarlo.

Lukasz Madon
fuente
¿Puede señalar específicamente, de qué manera VS para Python es mejor que, escojamos uno al azar, Rayuela?
Jörg W Mittag