En su opinión, ¿qué lenguaje le permite al programador promedio generar funciones con la menor cantidad de errores difíciles de encontrar? Por supuesto, esta es una pregunta muy amplia, y estoy interesado en respuestas y conocimientos muy amplios y generales.
Personalmente, encuentro que paso muy poco tiempo buscando errores extraños en los programas Java y C #, mientras que el código C ++ tiene su conjunto distintivo de errores recurrentes, y Python / similar tiene su propio conjunto de errores comunes y tontos que serían detectados por el compilador en otros idiomas
También me resulta difícil considerar lenguajes funcionales a este respecto, porque nunca he visto un programa grande y complejo escrito en un código completamente funcional. Su aporte por favor.
Editar: Aclaración completamente arbitraria del error difícil de encontrar: tarda más de 15 minutos en reproducirse, o más de 1 hora para encontrar la causa y corregirlo.
Perdóname si esto es un duplicado, pero no encontré nada sobre este tema específico.
fuente
Respuestas:
Cuanto más poderoso sea el sistema de tipos del lenguaje, más errores se detectarán en el momento de la compilación.
La siguiente figura compara algunos de los lenguajes de programación bien conocidos en términos de potencia, simplicidad y seguridad de sus sistemas de tipos. [ Fuente ]
* Factoring en la capacidad de usar construcciones inseguras.
fuente
(let ((itbe '())) ... )
...En mi opinión, Haskell te ayuda a evitar algunas fuentes comunes de errores:
null
no es parte de las definiciones de tipo de valor: con esto evitas el error de mil millones de dólaresfuente
null
, existeundefined
un miembro de todos los tipos)Tradicionalmente, los errores más difíciles de encontrar son las condiciones de carrera en aplicaciones de subprocesos múltiples, ya que son
Por lo tanto, necesita idiomas que manejen el paralismo por usted de la manera más sencilla y discreta posible. Estos aún no son convencionales. Java hace algo, pero te deja con la parte difícil.
Según tengo entendido, necesita un lenguaje funcional ya que "sin efectos secundarios" es lo que, en primer lugar, hace que desaparezcan las dos viñetas. He visto que el trabajo está en curso para hacer que Haskell sea un lenguaje eficiente de múltiples hilos, y creo que Fortress está diseñado desde cero para ser un lenguaje paralelo eficiente.
Editar: en Java
Executors
maneja aún más partes duras. Debe hacer que las tareas individuales se ajusten a laCallable
interfaz.fuente
Ada está diseñado para que se capture todo lo posible en tiempo de compilación en lugar de tiempo de ejecución. Lo que esto significa es que a menudo toma alrededor de 10 veces más tiempo para que un programa en Ada se compile de lo que lo haría el equivalente en Java, pero cuando lo hace, puede estar mucho más seguro de que no se manifestarán clases enteras de errores cuando el programa correr.
fuente
Primero una definición: un error difícil de encontrar, según tengo entendido, es un error que se puede reproducir pero la causa es difícil de encontrar.
Probablemente el aspecto más importante es lo que yo llamaría estrechez , es decir, qué tan lejos puede escapar un error, qué tan grande es el alcance que puede influir un error. En lenguajes como C, un error, por ejemplo, un índice de matriz negativo o un puntero no inicializado, puede afectar literalmente todo en todas partes en todo el programa, por lo que en el peor de los casos, debe verificar todo en todas partes para encontrar la fuente de su problema.
Los buenos idiomas en ese sentido admiten modificadores de acceso y los aplican de una manera que hace que sea difícil o imposible eludirlos. Los buenos lenguajes lo alientan a limitar el alcance de sus variables, en lugar de hacer que sea demasiado fácil tener variables globales (por ejemplo, "todo lo que no se declara explícitamente es una variable global con un tipo y valor predeterminados").
El segundo aspecto importante es la concurrencia . Las condiciones de carrera son generalmente difíciles de reproducir y, por lo tanto, difíciles de encontrar. Los buenos idiomas ofrecen mecanismos de sincronización fáciles de usar, y sus bibliotecas estándar son seguras para subprocesos cuando sea necesario.
Esto ya completa mi lista; otras cosas, como la tipificación fuerte, ayudan a detectar errores en el momento de la compilación, pero esos errores probablemente no serían difíciles de encontrar más adelante.
Teniendo en cuenta todo eso, diría que Java y C #, y muchos otros lenguajes en el mundo JVM y .net, son adecuados para evitar errores difíciles de encontrar.
fuente
Dado que Excel es el DSL más utilizado, iré con Excel. (excluyendo VBA, por supuesto)
Se ajusta a la factura:
fuente
123
oABC
) o una función (=SUM(A2:A5)
). Excel luego evalúa todas las variables, determinando el orden para resolver las dependencias, etc. Ciertamente no se trata solo de datos.Esta es una pregunta difícil porque la mayoría de los errores no son culpa del lenguaje en sí, sino que son culpa de los desarrolladores que cometen errores en la forma en que usan el lenguaje.
Creo que hay varios aspectos de las características del lenguaje que afectan la probabilidad de errores:
Interactividad : los lenguajes dinámicos con REPL fomentan la interacción / experimentación con programas en ejecución y ciclos de código / prueba mucho más pequeños. Si cree que la iteración es una buena manera de descubrir soluciones simples y limpias y detectar / eliminar errores, esto tenderá a favorecer los lenguajes interactivos.
Expresividad : si el código es más corto y tiene menos complejidad / complejidad incidental, entonces es más fácil ver errores / errores lógicos.
Tipo de seguridad : cuanto más tiempo se compruebe el tiempo de compilación, el compilador detectará más errores, por lo que, en general, la seguridad de tipo es algo bueno. Sin embargo, estos errores no suelen ser difíciles de encontrar , incluso en un lenguaje completamente dinámico, el tipo incorrecto en una estructura de datos generalmente causará un error de tiempo de ejecución muy obvio, y TDD casi siempre detecta este tipo de errores.
Inmutabilidad : muchos errores duros se deben a interacciones complejas de estado mutable. Los idiomas que enfatizan la inmutabilidad (Haskell, Clojure, Erlang) tienen una enorme ventaja al evitar la mutabilidad
Programación funcional: los enfoques funcionales para escribir código tienden a ser más "demostrablemente correctos" que el código orientado a objetos con secuencias complejas de efectos / interacciones. Mi experiencia es que FP ayuda a evitar errores difíciles: creo que hay algunas investigaciones académicas en algún lugar que actualmente no puedo encontrar que respalden esto.
Soporte de concurrencia: los problemas de concurrencia son particularmente difíciles de detectar y depurar, por eso es tan importante. Cualquier cosa que requiera un bloqueo manual está condenada al fracaso (y esto incluye casi todos los enfoques orientados a objetos de concurrencia). El mejor lenguaje que conozco a este respecto es Clojure: tiene un enfoque único para administrar la concurrencia que combina la memoria transaccional de software con estructuras de datos inmutables para obtener un marco de concurrencia novedoso, confiable y composable. Consulte http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey para obtener más información
fuente
Cuanto menos poderoso es un idioma, menos opciones le ofrece para disparar su propio pie.
Los lenguajes de alto nivel como Java y C # producirán menos errores que los lenguajes de bajo nivel como C ++.
Dicho esto, creo que Java es más seguro que C #. Java está limitado artificialmente para que un programador promedio sin conocimientos avanzados pueda dominarlo y producir programas estables.
fuente
En mi opinión, Delphi. Al estar basado en Pascal, el lenguaje es lo suficientemente simple e intuitivo como para que el programador promedio (o incluso los codificadores inexpertos) lo descubra fácilmente, y su rica herramienta y soporte de biblioteca hacen que la mayoría de los errores sean fáciles de encontrar.
if (alert = RED) {LaunchNukes;}
, por ejemplo, no se compilará).fuente
var I: Integer; Pointer(I)^ := $00;
Una cosa a tener en cuenta es el tiempo de respuesta.
Durante los últimos cinco años más o menos, he desarrollado principalmente aplicaciones web en Java (JSF, Seam, etc.). Recientemente obtuve un nuevo trabajo y estamos usando Perl (con Catalyst y Moose).
Soy mucho más productivo en Perl que en Java.
No es necesario compilar e implementar (en caliente), es una de las razones. También encuentro que escribir casos de uso es más fácil, ya que se puede hacer de una manera más iterativa. Y los marcos en Java parecen ser innecesariamente complejos, al menos para los proyectos en los que he estado involucrado.
Supongo que la cantidad de errores en mi código Perl es más o menos igual a la cantidad de errores en mi código Java, incluso podría ser mayor. Pero, encuentro y más fácil y rápido encontrar y corregir estos errores.
fuente
Quizás estudiar una cantidad de herramientas disponibles para el análisis de código estático y dinámico para cada lenguaje de programación podría dar una idea. Cuantas más herramientas para un idioma, es más probable que el idioma sea muy popular entre los usuarios o muy popular en la generación de errores difíciles de encontrar. Pero no puedo lograr que Google me señale ningún estudio realizado sobre este tema. También se debe tener en cuenta que algunos lenguajes como C se pueden usar para solucionar los errores de hardware subyacentes, así como para evitar el desgaste del hardware a medida que envejece.
fuente
En lugar de hablar sobre idiomas, ¿qué hay de hablar sobre las características del lenguaje?
fuente