¿Los lenguajes mecanografiados dinámicos merecen todas las críticas? [cerrado]

35

He leído algunos artículos en Internet sobre la elección del lenguaje de programación en la empresa. Recientemente, muchos lenguajes de tipo dinámico han sido populares, es decir, Ruby, Python, PHP y Erlang. Pero muchas empresas aún se quedan con lenguajes tipados estáticos como C, C ++, C # y Java.

Y sí, uno de los beneficios de los lenguajes tipados estáticos es que los errores de programación se detectan antes, en tiempo de compilación, en lugar de en tiempo de ejecución. Pero también hay ventajas con los lenguajes de tipo dinámico. ( más en Wikipedia )

La razón principal por la cual las empresas no comienzan a usar lenguajes como Erlang, Ruby y Python, parece ser el hecho de que son de tipo dinámico. Esa también parece ser la razón principal por la cual las personas en StackOverflow deciden en contra de Erlang. Vea ¿Por qué decidió "en contra" de Erlang ?

Sin embargo, parece haber una fuerte crítica contra el tipeo dinámico en las empresas, pero realmente no entiendo por qué es tan fuerte.

Realmente, ¿por qué hay tanta crítica contra la tipificación dinámica en las empresas? ¿Realmente afecta tanto el costo de los proyectos o qué? Pero tal vez me equivoque.

Jonas
fuente
3
Creo que la escritura estática con inferencia de tipos y la posible escritura de pato es la mejor manera posible de hacer las cosas. También es muy complicado
Casebash
2
Acabo de echar un vistazo al tipeo de pato de C # (no uso el lenguaje), y aunque parece completar la definición de tipeo de pato, la verbosidad requerida parece vencer el propósito. Sin embargo, eso no quiere decir que ocasionalmente no sea útil.
Chinmay Kanchi
3
¿Soy solo yo o hay más críticas de los lenguajes tipados estáticamente que los tipados dinámicamente? Además, en mi experiencia, las opciones de idiomas / tecnología de las grandes "empresas" parecen estar dictadas por las tendencias actuales / opciones seguras en lugar de cualquier mérito técnico real.
MAK
2
@ChinmayKanchi: Verbosidad? Simplemente declaras algo como dynamicy comienzas a usarlo. No es más detallado que las llamadas a métodos normales o las sobrecargas de operadores.
Joey
44
No puedo contar la cantidad de horas que he perdido en los errores de depuración de mi empresa actual en el código Groovy on Grails, que el compilador habría detectado de inmediato si hubiéramos utilizado Java.
WKS

Respuestas:

46

Sí, creo que lo hacen.

Hay algunas razones que deben considerarse en la selección de un idioma para un nuevo proyecto:

  • Velocidad de tiempo de ejecución. En comparación con C / C ++ / Fortran, Perl y Python son tan lentos que es divertido.
  • Velocidad de inicialización. En comparación con los lenguajes rápidos anteriores, Java se cae y llora mientras la JVM sigue cargando y cargando y ... while(1)...
  • Capacidad de prototipo. Examinar exhaustivamente y hacer el trabajo de declaración / definición requerido para C ++ o Java aumenta el LOC, que es la única métrica conocida que se correlaciona de manera confiable con los recuentos de errores. También lleva mucho tiempo. También requiere pensar un poco más sobre los tipos y las conexiones.
  • Fiddlability interno. Jugar dinámicamente con tus componentes internos es genial hasta que comiences a depurar tu código de auto modificación . (Python, Lisp, Perl)
  • Verificación de corrección. Un compilador puede proporcionar un paso rápido de semi-corrección de su código en C ++, y esto puede ser realmente agradable.
  • Detalles de análisis estático. C y Java tienen bastante buen análisis estático. Perl no es completamente analizable estáticamente a nivel teórico (posiblemente Python también). Estoy razonablemente seguro de que Lisp tampoco.
  • Las plataformas extrañas solo toman C, en general.
  • Cadena de soporte. Si puede tener un contrato en el que revisará y trabajará sus errores, eso es enorme .

Si puede suponer que la organización con la que está trabajando tiene un principio de "Avanzar" (Hay un término contable para esto), y no decidirá al azar no trabajar en el software, entonces tiene un caso mucho mejor para utilizando el software Dado que no hay ventas de grandes empresas (lo que implica asumir la responsabilidad de mantenerlo) Python / Perl / $ dynamic_language, reduce considerablemente el riesgo.

En mi experiencia, los mantenedores de código abierto a menudo tienen un problema con asumir la responsabilidad total de las correcciones de errores y lanzar actualizaciones. "¡Es gratis, TÚ trabajas en ello!" no es una respuesta aceptable para la mayoría de las empresas (no son sus competencias básicas, entre otras cosas).

Por supuesto, no estoy hablando del mundo de las aplicaciones web / startup, que tiende a jugar con reglas de alto riesgo / alta recompensa y está muy abierto a mantenerse en el borde de la tecnología.

Paul Nathan
fuente
16
"¡Es gratis, TÚ trabajas en ello!" <- El mayor problema con F / OSS en general, haría +1 pero no tengo votos :(
Billy ONeal
44
Buen resumen Voy a agregar que los tipos bien construidos transmiten un significado semántico (puedo ver un tipo y entender lo que hace, cómo se puede usar) y se puede usar para imponer la corrección (puedo construir un tipo que solo acepte inpus limitado ), y yo no lo entiendo errores tontos de los errores tipográficos (odio declaración de auto-variable)
Smithco
44
Puede obtener soporte comercial para cualquier proyecto importante de código abierto. Las grandes compañías usan PL con tipeo dinámico para partes grandes (seguramente las adecuadas), Facebook usa PHP (UI) y Erlang (chat), Twitter usa Ruby (UI), Google usa Python (no sé para qué) y Lisp y Python son siendo utilizado en muchos proyectos de investigación sofisticados. Nota: Soy un desarrollador de C # (casi) nunca utilicé un lenguaje de tipo dinámico; Sin embargo, estos puntos no son válidos en gran medida.
Kaveh Shahbazian
44
Me gusta tu respuesta, pero Java no se escribe dinámicamente ...
Mehrdad
2
@PaulNathan: Estás pensando demasiado. La pregunta era acerca de los lenguajes escritos dinámicamente, y esta respuesta menciona a Java como si estuviera escrito dinámicamente.
Mehrdad
24

Le está dando demasiado crédito técnico a los tomadores de decisiones empresariales. Hay un viejo dicho, "Nadie fue despedido por comprar IBM". Si tomas una ruta diferente y las cosas se ponen difíciles (siempre lo hacen), nadie quiere arriesgarse a ser culpado. Cumplir con los estándares y culpar a alguien más.

Hay muchas compañías más jóvenes que eventualmente se convertirán en las empresas del mañana y usarán esos idiomas.

¡Y no olvidemos las miles de líneas de código escritas en VBA!

JeffO
fuente
1
+1 para "... las empresas del mañana [y] usarán esos idiomas".
rdmueller
66
"Hay muchas compañías más jóvenes que eventualmente se convertirán en las empresas del mañana y usarán esos idiomas".: Parece implicar que los lenguajes dinámicos son bastante nuevos y necesitan más tiempo para ser adoptados por más compañías. Por otro lado, los lenguajes dinámicos han existido durante mucho tiempo.
Giorgio
17

La razón por la cual las empresas usan C, C ++, C # y Java no se debe a que estén tipadas estáticamente (al menos no directamente). Los encargados de tomar decisiones empresariales no están haciendo este tipo de elecciones sobre la base de una comparación objetiva de los sistemas de tipos, se lo aseguro.

Las empresas hacen cuidado acerca de:

  • Costos de mantenimiento a largo plazo : ¿puede esperar razonablemente que las cosas sigan funcionando bien en 10 años? En realidad, es bueno que la evolución del lenguaje sea conservadora y compatible con versiones anteriores (como con Java). La escritura estática es útil aquí porque detecta un tipo importante de errores en tiempo de compilación antes de que entren en sus sistemas de producción .....
  • Disponibilidad de talento : ¿podrá encontrar desarrolladores para mantener su nuevo y brillante sistema? ¿Qué pasa si el desarrollador original se va, todos los demás entenderán el código? Esto plantea un gran obstáculo en la introducción de cualquier lenguaje "nuevo" (especialmente si también crea nuevos requisitos para la implementación, sistemas de compilación, soporte operativo, etc.). Esto ofrece enormes ventajas a los lenguajes que se usan ampliamente (C, C ++, C # y Java)
  • Costos de integración : ¿es fácil conectarse / integrarse con otras tecnologías que ya tiene implementadas o que es probable que adquiera? Si ya tiene una pila de sistemas J2EE heredados, entonces necesita integrarse con ellos. Es probable que una nueva solución Java EE sea mucho más práctica para esto que, por ejemplo, Python.
  • Previsibilidad / bajo riesgo : ¿está probada la plataforma / lenguaje y puedo estar seguro de que funcionará? Esto suele ser más importante que la simple productividad. Es mucho más fácil para un gerente persuadir a su jefe para que le dé un gran presupuesto de mano de obra para construir un nuevo sistema que para que él regrese más tarde y diga que no ha funcionado .....
  • Respaldo / soporte empresarial : ¿las principales organizaciones internacionales están comprometidas a apoyar el lenguaje y la plataforma? ¿Firmarán un contrato para apoyarme para que pueda llamar a alguien si las cosas salen mal?
  • Neutralidad del proveedor / independencia de la plataforma : ¿voy a quedar encerrado en un solo proveedor? ¿O tengo una amplia gama de opciones de proveedores futuros / rutas de transición disponibles? No querrás estar atrapado en un callejón sin salida arquitectónico, incapaz de avanzar mientras tus competidores almuerzan. Si está haciendo su trabajo correctamente como arquitecto empresarial, debe pensar con al menos 5-10 años de anticipación en estas cosas.

Personalmente, creo que si desea utilizar lenguajes dinámicos en la empresa, su mejor oportunidad es utilizar algo que se apoye en un ecosistema empresarial existente. Los más notables son los nuevos lenguajes dinámicos de JVM: por ejemplo, JRuby, Groovy, Clojure. En lo que respecta a la gestión de TI, estas son opciones de lenguaje dinámico "seguras" porque operan dentro y juegan muy bien con el resto del ecosistema empresarial de Java.

mikera
fuente
1
No puedo creer que nadie haya votado tu respuesta todavía.
Sebastian N.
11

La razón principal por la cual las empresas no comienzan a usar lenguajes como Erlang, Ruby y Python, parece ser el hecho de que son de tipo dinámico.

Creo que esta es solo su principal excusa. La verdadera razón es que las empresas realmente no los toman tan en serio y sienten que tal vez son demasiado aficionados. Java y .NET son "nombres de grandes empresas", tienen buen marketing comercial, atención al cliente comercial y, por lo tanto, se los toma muy en serio.

Es lamentable que prácticamente no exista un lenguaje de tipo estático que sea tan popular como los nombres de las grandes empresas. ¿Por qué los entornos de programación de código abierto / software libre casi siempre se escriben dinámicamente? Esto podría indicar que un lenguaje de tipo estático en realidad no es tan fácil de hacer, y que el tipeo dinámico es un "truco de hombre perezoso". Si ese es el caso, las empresas que deciden en contra de los idiomas de tipo dinámico podrían realmente tener un punto.

Timwi
fuente
8
De Verdad? Lo último que vi fue que Google había aportado bastante peso y un esfuerzo de desarrollo sustancial detrás de Python, incluida la contratación del creador de Python y permitirle pasar el 50% de su tiempo trabajando en el idioma. Google también contribuye con una buena cantidad de código a Python, especialmente ahora que la deglución sin carga se ha fusionado en el árbol fuente de Python 3. Eso hace de Python un "gran nombre comercial" para mí.
Chinmay Kanchi
13
@Chinmay Kanchi: Interesante cómo sacas tu conclusión de una estadística con un tamaño de muestra de 1.
Timwi
66
Touché Sin embargo, algunas de sus conclusiones también son erróneas. La implementación adecuada de un lenguaje dinámico es mucho más difícil que la implementación de un lenguaje de tipo estático. La escritura dinámica ciertamente no es un "truco del hombre perezoso", como usted lo dice. Permite a los desarrolladores ser flojos, pero no la persona que escribe el compilador / intérprete. De hecho, la optimización de un lenguaje de tipo dinámico es tan difícil que solo puedo pensar en un idioma que, en los últimos tiempos, haya recibido este tratamiento ampliamente (JavaScript), aunque hay proyectos de optimización / JIT para otros idiomas (Python, PHP).
Chinmay Kanchi
2
Además, si cree que los lenguajes de tipo dinámico son los más utilizados en entornos de código abierto, esto está lejos de ser claro. Dependiendo de la métrica que elija, esto podría ser cierto, pero a menudo no lo es. Midiendo líneas de código, C gana por asomo. Si mide qué lenguajes se usan en proyectos de código abierto, incluidos los de varios idiomas, los lenguajes más populares son JavaScript, C, C ++ y PHP en ese orden. Si solo mide el idioma principal, los idiomas más populares son Perl, Java, C # y JavaScript. bit.ly/C6xTB
Chinmay Kanchi
77
Por supuesto, escribir un optimizador para lenguajes de tipo dinámico es difícil, pero no un intérprete : puede eliminar todas las verificaciones de tipo, y el resto es lo mismo. Ningún creador de idiomas aficionado piensa en escribir un optimizador. - Con respecto al último bit, no quise decir que la mayoría del software de código abierto esté escrito en un lenguaje de programación de tipo dinámico, sino que la mayoría de los lenguajes de programación de código abierto (dije "entornos" porque estoy hablando de compiladores / intérpretes, IDEs, etc.) se escriben dinámicamente.
Timwi
9
  • Los idiomas escritos dinámicamente tienden a ser más lentos que sus primos escritos estáticamente.
  • Los errores son más difíciles de detectar y pueden ser más difíciles de depurar
  • El compilador / intérprete tiende a ser mucho menos exigente con lo que puede y no puede hacer. es decir, solo detecta errores de sintaxis en la etapa de compilación
  • Si no tiene mucho cuidado con el diseño de un lenguaje escrito dinámicamente, termina con Javascript, que es el lenguaje de los olores de código

EDITAR: Debo mencionar que mi lenguaje de programación principal en este momento es Python, que se escribe dinámicamente. Personalmente, me encanta la libertad que conlleva no tener que declarar previamente las variables, pero a veces, sería bueno especificar (por ejemplo) qué tipo de parámetros toma una función para detectar errores temprano en lugar de tarde.

Chinmay Kanchi
fuente
1
Si bien es cierto que el compilador no es fastidioso, el intérprete generalmente lo es. En su mayor parte, el intérprete detecta situaciones problemáticas y señala errores.
Winston Ewert
17
¡Me encanta la escritura dinámica pero odio no tener que predeclarar variables! Muchas veces termino introduciendo accidentalmente una nueva variable porque escribí mal el nombre de una variable.
Frank Shearar
1
@ Frank: Me encanta que Perl tenga una configuración para forzar la declaración de variables. Es una de las ventajas de Perl, en mi opinión.
Paul Nathan
8

Los lenguajes tipados dinámicamente son percibidos (por algunos programadores / jefes) para producir código que no funciona tan bien. El hecho de que un programa escrito dinámicamente compila le dice muy poco acerca de su corrección. El hecho de que un lenguaje estáticamente compilado te dice mucho más. (Por otro lado, todavía hay un largo camino entre las compilaciones y hace lo correcto, por lo que esto podría ser menos significativo de lo que parece)

Los lenguajes de tipo dinámico se perciben como lenguajes de secuencias de comandos. Nunca escribirías una aplicación en bash o en un archivo por lotes. Todos los idiomas escritos dinámicamente tienden a agruparse en esa categoría (injustamente).

Los idiomas escritos dinámicamente son más lentos que los idiomas escritos estáticamente. (Pero veremos qué tan bien el trabajo en JIT cambia eso)

Winston Ewert
fuente
2
"Son percibidos por" algunos programadores. Cuando tengo discusiones con los programadores sobre el tipeo dinámico, generalmente terminan admitiendo que nunca han usado ese tipo de lenguaje.
Frank Shearar
1
@ Frank, ¿estás diciendo que las personas que defienden la inferioridad del tipeo dinámico generalmente no lo han usado?
Winston Ewert
2
@ Frank: He usado ese tipo de lenguaje, y la mayoría de las veces el resultado ha sido un desastre imposible de mantener. (Para ser justos, era PHP, y PHP tiene otros problemas además del tipeo dinámico)
Billy ONeal
@ Billy: Creo que esto es común. Estuve deprimido en la escritura dinámica durante años debido a mi experiencia con VB; cuando finalmente me di cuenta de que esta implementación esquizofrénica terrible de la escritura dinámica no era típica, mi opinión cambió drásticamente.
Shog9
@ Winston: Estoy diciendo que las personas con las que he discutido no lo han hecho. Ha sido un caso, para mí, "la escritura dinámica no puede funcionar" ... pero felizmente usarán muchas técnicas desarrolladas primero en, por y para lenguajes dinámicos (IDEs, refactorización, fuera de mi cabeza). Además, preguntas como esta: stackoverflow.com/questions/2317579 indican que, aunque probablemente no sea universal, mi caso de discutir con los programadores de "no puedo trabajar pero no he probado" no está aislado. (Yo, creo que ambos enfoques tienen valor.)
Frank Shearar
8

Nota: esto es principalmente subjetivo y se basa en mis experiencias e impresiones.

Los idiomas escritos dinámicamente son muy diferentes de los idiomas escritos estáticamente. Estas diferencias probablemente se vuelven más importantes en el software empresarial pesado que en la mayoría de las otras aplicaciones.

Los lenguajes de tipo estático tienden a ser muy prescriptivos. Un método solo tomará datos que coincidan exactamente con su firma. Los niveles de acceso tienden a ser muy importantes y las interfaces se definen explícitamente, con restricciones detalladas pero inequívocas para aplicar esas definiciones.

Los lenguajes escritos dinámicamente, por otro lado, son muy pragmáticos. Las conversiones de tipos a menudo suceden implícitamente, las funciones incluso pueden jugarse si proporciona el tipo de entrada incorrecto siempre que se comporte lo suficientemente similar. En lenguajes como Python, incluso los niveles de acceso se basarán en el contrato en lugar de las restricciones técnicas (es decir, solo privateporque le dicen que no lo use y tiene un nombre curioso).

Muchos programadores prefieren lenguajes dinámicos porque (posiblemente) permiten la creación rápida de prototipos. El código a menudo termina más corto (aunque solo sea por la falta de declaraciones de tipo) y si quiere violar el protocolo adecuado porque necesita una solución rápida y sucia o quiere probar algo, eso es fácilmente posible.

Ahora, la razón por la que las empresas "empresariales" a menudo prefieren los idiomas de tipo estático es exactamente que son más restrictivas y más explícitas sobre esas restricciones. Aunque en la práctica, incluso el código escrito estáticamente puede ser roto por idiotas con un compilador, muchos problemas serán mucho más visibles mucho antes en el proceso (es decir, antes del tiempo de ejecución). Esto significa que incluso si la base de código es grande, monolítica y compleja, se pueden detectar muchos errores fácilmente, sin tener que ejecutar el código o enviarlo al departamento de control de calidad.

La razón de que el beneficio no supere las desventajas para muchos programadores fuera de ese entorno es que estos son errores que a menudo se detectarán fácilmente mediante una inspección exhaustiva del código o incluso al intentar ejecutarlo. Especialmente cuando se sigue una metodología basada en pruebas, estos errores a menudo se vuelven triviales y fáciles de solucionar. Además, con muchas de estas compañías que tienen un ciclo de lanzamiento mucho más corto, la productividad es a menudo más importante que la rigidez y los desarrolladores mismos están realizando muchas pruebas (básicas).

La otra razón por la que las corporaciones empresariales no usan mucho los idiomas escritos dinámicamente es el código heredado. Por tonto que nos parezca a los nerds, las grandes corporaciones a menudo se apegarán a soluciones que funcionen, incluso si ya han pasado su vida útil. Esta es la razón por la cual tantas compañías importantes aplican Internet Explorer 6 y son tan lentas para actualizar sus sistemas operativos. Esta es también la razón por la que a menudo escriben código nuevo en lenguajes "antiguos" (por ejemplo, versiones antiguas de Java): es mucho más fácil agregar algunas líneas de código a un software que no está vivo que obtener la aprobación para una reescritura completa en un nuevo idioma.

tl; dr: los lenguajes estáticos se parecen más a la burocracia, por lo que a los gerentes empresariales les gustan más.

Alan ciruela
fuente
3
Los idiomas con reglas de escritura imprecisas crean muchas oportunidades para que las cosas que están mal funcionen. En JavaScript, por ejemplo, pasar un número al código que espera una cadena a menudo se comportará como si uno hubiera pasado una representación de cadena de ese número, pero no siempre. Intentar, por ejemplo, agregar 456 a 123 no producirá 123456, sino que generará 579. A menos que esté claro quién es responsable de la conversión de número a cadena, puede hacerse de forma redundante o no hacerlo.
supercat
1
@supercat, creo que PHP y JavaScript son buenos ejemplos de las dos formas de lidiar con ese problema (con respecto a los operadores): en PHP los operadores son inequívocos: +toma números y los agrega, si desea concatenación necesita usar .; en JS, ambas operaciones comparten el mismo operador: si no sabe cómo se comportarán sus valores, se espera que los convierta explícitamente. Por supuesto, esto también tiene que ver con la escritura suelta frente a la escritura estricta (Python es aún más estricto), pero básicamente debe asegurarse de que sus valores tengan el tipo correcto o hacer que sus operaciones impongan los tipos esperados.
Alan Plum
1
No estoy muy familiarizado con PHP, pero parece que usa lo que yo llamaría el enfoque "correcto". Javascript es en mi humilde opinión abominable de muchas maneras, pero creo que el comportamiento de "+" es uno de los peores. En realidad, no estoy convencido de que el tipeo dinámico vago tenga mucha ventaja sobre un sistema de tipos más fuerte que permita que una interfaz declare que las cosas de otra clase o tipo de interfaz deben considerarse como implementadas o derivadas de él, con reglas específicas sobre cómo se priorizarían las reclamaciones. La gran limitación que conozco con los actuales marcos estructuralmente tipificados es que ...
supercat
1
... si dos personas desarrollan de forma independiente interfaces similares, no hay forma de que un tercero escriba código que pueda usarlas indistintamente. Si un tercero pudiera definir una nueva interfaz y declarar que las implementaciones de una o ambas de las existentes deberían implementar automáticamente la nueva (utilizando envoltorios suministrados en la nueva interfaz si es necesario), creo que eso manejaría el 99% de lo que es semánticamente bueno acerca de la escritura dinámica.
supercat
3

No, no creo que los lenguajes mecanografiados dinámicamente merezcan todas las críticas. (O, si lo prefiere, se merecen tanta crítica como los lenguajes estáticamente escritos).

En mi experiencia (y no intento intentar generalizar esta afirmación), los programadores que critican los lenguajes dinámicos no los han usado. La conversación suele ser "pero con la escritura estática, el compilador detecta tantos errores". y digo "bueno, eso no es un problema, en mi experiencia". (Por lo general, los otros programadores son de Java, Delphi o antecedentes similares; no conozco a ningún programador de Haskell o ML).

La única cosa que realmente me se queja es cuando las reclamaciones alguien que la técnica no pueden Foo posiblemente pueden hacer (o podrían ser muy difícil de hacer) en un lenguaje de tipos dinámicos ... cuando esa técnica fue inventada en, por y para un tipo dinámico idioma. IDEs? Charla. Refactorización automática? Charla. Llamadores de / implementadores de? Charla.

Frank Shearar
fuente
No quería saturar mi respuesta con mi postura personal, que es esta: la herramienta adecuada para el trabajo correcto. Cualquier tipo de lenguaje que use es más adecuado para algunas tareas, y peor para otras, que otro tipo de lenguaje.
Frank Shearar
66
Cuando el otro programador proviene de Haskell, él / ella ya sabe que es el lenguaje superior tanto a Java como a los lenguajes dinámicos;)
Andres F.
0

Las empresas simplemente no están adoptando nuevos lenguajes y herramientas lo suficientemente rápido y hay buenas razones para ello. Pero, cuando una de las herramientas principales como C # implementa algunas de estas características, se introducirán en las empresas principales ...

aggietech
fuente
No sé por qué esto fue rechazado, pero es una declaración perspicaz. Las empresas son lentas y conservadoras. Las personas también prefieren el cambio gradual (como la palabra clave dinámica en C # que le permite ocasionalmente usar la escritura dinámica en un lenguaje de escritura estática) al cambio repentino (como Ruby).
Vaddadi Kartick