¿A qué desea que presten atención los diseñadores de idiomas? [cerrado]

38

El propósito de esta pregunta no es reunir una lista exhaustiva de características del lenguaje de programación sin las cuales no puede vivir o que desearía estar en su idioma principal de elección. El propósito de esta pregunta es sacar a la luz los rincones del diseño en lenguaje que la mayoría de los diseñadores de idiomas podrían no pensar. Entonces, en lugar de pensar en la característica X del lenguaje, piense un poco más filosóficamente.

Uno de mis prejuicios, y quizás podría ser controvertido, es que el lado más suave de la ingeniería, los por qué y para qué, son muchas veces más importantes que el lado más concreto. Por ejemplo, Ruby fue diseñado con el objetivo declarado de mejorar la felicidad del desarrollador. Si bien sus opiniones pueden ser mixtas sobre si se cumplió o no, el hecho de que fuera un objetivo significa que algunas de las opciones en el diseño del lenguaje fueron influenciadas por esa filosofía.

Por favor no publiques:

  • La sintaxis llama guerras. Seamos realistas, tenemos nuestras preferencias, y la sintaxis es importante en lo que respecta al diseño del lenguaje. Solo quiero evitar batallas épicas de la naturaleza de emacs vs. VI (de las cuales una gran cantidad de personas en la actualidad no saben nada).
  • Los comentarios de tipo "Cualquier lenguaje que no tenga la característica X no merece existir". Hay al menos una razón para que existan todos los lenguajes de programación: buenos o malos.

Por favor, haga mensaje:

  • Ideas filisóficas que los diseñadores de idiomas parecen perder.
  • Conceptos técnicos que parecen estar mal implementados la mayoría de las veces. Proporcione un ejemplo del dolor que causa y si tiene alguna idea de cómo preferiría que funcionara.
  • Las cosas que deseas estar en la biblioteca común de la plataforma, pero rara vez lo están. De la misma manera, las cosas que generalmente están en una biblioteca común que desearías no estaban.
  • Las características conceptuales, como la compatibilidad integrada con el manejo de prueba / afirmación / contrato / error que desea que todos los lenguajes de programación se implementen correctamente y definan correctamente.

Espero que este sea un tema divertido y estimulante.

Editar: se aclaró lo que quiero decir con Syntax Flame Wars. No estoy tratando de evitar toda discusión sobre la sintaxis, particularmente porque la sintaxis es una parte fundamental del diseño del lenguaje del programa.

Berin Loritsch
fuente
Decir que la sintaxis es solo un detalle de implementación es simplemente incorrecto. El diseño de sintaxis es una parte fundamentalmente importante del diseño de un lenguaje. Y muchos de los puntos que qué quieren ver publicado en realidad puede implicar la sintaxis. Lástima. Parecía una pregunta interesante.
Konrad Rudolph
Lo que quiero evitar es la guerra de las llamas. Si puede discutir la sintaxis sin comenzar una guerra de llamas, hágalo.
Berin Loritsch

Respuestas:

49

Soporte Unicode por defecto

Hoy en día, los programas se están desarrollando para ser utilizados internacionalmente, o bajo el supuesto de que podrían usarse internacionalmente. Ellos deben proporcionar soporte para sus conjuntos de caracteres o hacer que los programas escritos en esa lengua inútil.

Malfist
fuente
2
+1 De hecho, el lenguaje en sí mismo debería permitirle usar cualquier carácter para sus identificadores. No todos somos ingleses.
Berin Loritsch
13
@Berin: En realidad, aunque soy francés, prefiero los programas de inglés. El problema es de comunicación, si escribes programas con identificadores húngaros, españoles o portugueses, no esperes que pueda intervenir ... en un contexto de internacionalización, es extremadamente importante que los desarrolladores puedan comunicarse entre ellos , y eso implica usar un lenguaje común para identificadores, comentarios y documentación. El inglés es la lengua franca de los desarrolladores.
Matthieu M.
11
Añadiría que el soporte Unicode debería ser natural cuando se usa el lenguaje. Si es posible, no debería tomar ningún esfuerzo adicional "agregarlo", debería "simplemente funcionar" (cuando sea razonable).
RHSeeger
44
De manera relacionada, el lenguaje debe hacer una distinción fundamental entre datos de texto (secuencia de caracteres) y binarios (secuencia de bytes). C # hace esto bien con stringy byte[]. Al igual que Python 3.x con stry bytes. C (++) charse equivoca terriblemente.
dan04
1
@RHSeeger - de hecho! Incluso en Python tienes que escribir u'My Unicode Štring'. Desearía que pudieras olvidar qué tipo de cadena estás tratando y un maldito código de escritura.
orokusaki 01 de
25

Tengo un par:

  • Genéricos / plantillas. Por ejemplo, los genéricos de Java son potentes, pero no necesariamente flexibles. Además, debido a que usan borrado de tipo, he visto problemas para implementarlos de manera abstracta, especialmente en las interfaces. Y el compilador no debería advertir cuando se usa un genérico no específico (Me gusta en Hashmaplugar de Hashmap<String, int>). Creo que podrían mejorarse significativamente. Una buena plantilla es muy útil, pero a menudo se descuida.

  • Buena fecha de soporte en la biblioteca estándar. Me refiero a poder sumar y restar fechas, horas y minutos, y no tener que lidiar con la cantidad de milisegundos desde el 1 de enero de 1970.

Michael K
fuente
2
¡Sin embargo, el "soporte para una buena cita" es un requisito bastante elevado! ¿y eso que significa? Creo que las fechas y los horarios son una de esas cosas en las que no se puede obtener todo bien. o lo haces simple e incorrecto, o lo haces correcto e impío complicado. es REALMENTE difícil alcanzar un buen término medio.
sara
@kai El punto es que el soporte de fechas suele ser bastante terrible. El viejo java.util.Datetiene casi todas las posibles trampas y problemas. Conozco solo una parte del nuevo java.time.*paquete, pero es limpio, fácil de usar y AFAICT sin errores. Los usuarios más avanzados pueden encontrar problemas, pero es una gran mejora. +++ El problema parece ser que es un problema complicado y la primera versión está apurada y rota.
maaartinus
24

Haga que su idioma sea analizable / auditable para las personas de seguridad informática.

La gente de seguridad necesita poder encontrar vulnerabilidades en un programa antes de que se envíe. Idealmente, nos llaman temprano y podemos comentar sobre la base de código a medida que se desarrolla, pero a menudo no.

Cuando sale una nueva versión del idioma o las bibliotecas principales, las cosas que antes eran seguras pueden dejar de ser:

  1. las bibliotecas pueden volverse más potentes: por ejemplo, la biblioteca de URL ahora admite javascript:
  2. puede haber nuevas formas de convertir cadenas o bytes en código: por ejemplo, evalbibliotecas de deserialización
  3. las técnicas de reflexión del lenguaje pueden volverse más poderosas: por ejemplo, exponer variables locales

Cualquiera de estos cambios puede aumentar la cantidad de autoridad abusiva que tiene un programa, pero dado que la cantidad de autoridad que usa el programa (cuando se trata con clientes no maliciosos) no ha cambiado, es difícil presionar a la gente de seguridad sin que sea intensiva volver a auditar.

Por lo tanto, piense en nosotros al diseñar y versionar el idioma. A continuación hay algunos consejos:

Defina algunas primitivas en las que se puede descomponer un programa.

HTML5 es particularmente malo de esta manera. Tienen obviamente poner un montón de pensamiento en la seguridad y tienen algunas personas muy inteligentes, pero en lugar de especificar nuevos elementos del programa como <video>en términos de los antiguos, o la creación de una abstracción comunes que los nuevos <video>y viejos <img>tanto se puede especificar en términos de, <video>es todavía otro elemento único del programa con sus propias consecuencias de seguridad.

Haga que su lenguaje sea susceptible al análisis estático (incluso si no está estáticamente escrito).

La gente de seguridad a menudo usa el análisis estático para encontrar patrones y para tratar de descartar partes de un programa para que puedan enfocarse en las partes realmente difíciles.

Debería ser obvio qué identificadores son variables locales y cuáles no.

Por ejemplo, no cometa el mismo error que las versiones anteriores de JavaScript, lo que hizo imposible saber si se xtrata de una referencia de variable local en el siguiente (según una lectura literal de una versión anterior de la especificación):

if (Math.random() > 0.5) {
  Object.prototype.x = 0;
}

function f() {
  var x = 1;
  (function () {
    alert(x);  // Might alert 0, might alert 1.
  })();
}

Permitir seguridad descomponible

Muchos sistemas seguros están diseñados en torno a un núcleo seguro que conserva las propiedades de seguridad, de modo que la gente de seguridad pueda centrar sus esfuerzos en analizar una pequeña cantidad de código y liberar a la mayoría de los programadores de tener que lidiar con gente de seguridad {molesta, pedante, paranoica} .

Debería ser posible escribir dicho núcleo en su idioma. Si una de las propiedades de seguridad de su idioma es que solo se recuperará un cierto subconjunto de URL, ¿pueden los escritores del kernel hacer algo para canalizar todas las recuperaciones de URL a través de su código? O las comprobaciones de compilación estáticas (como mirar las importaciones) cumplen la misma función.

Algunos lenguajes como Newspeak usan un modelo de capacidades de objeto. Eso es increíble y una excelente manera de obtener seguridad descomponible.

Pero si no puede hacer eso, hacer que el gráfico del módulo sea un artefacto analizable estáticamente puede brindarle un gran beneficio. Si puedo demostrar que un módulo no puede alcanzar el módulo de E / S de archivo (excepto llamando al código en un módulo en el TCB), entonces puedo descartar clases completas de problemas de ese módulo.

Limite la autoridad de los lenguajes de script incrustados

Muchos sistemas útiles están organizados como un núcleo estático que inicia una gran cantidad de código escrito en lenguajes dinámicos (incluso funcionales).

Y la incorporación de lenguajes de secuencias de comandos puede hacer que un sistema sea mucho más extensible.

Pero un lenguaje de secuencias de comandos no debería tener toda la autoridad de la VM.

Si elige permitir los lenguajes de secuencias de comandos incrustados, facilite al invocador limitar lo que puede hacer. Un modelo de capacidades de objeto (ver comentario en Newspeak arriba) es muy apropiado aquí; entonces, al evaluar el código en un lenguaje de scripting, la persona que llama debe pasar el código para ejecutar y todas las variables globales para ese código.

Tratar evalcomo un lenguaje incrustado como un lenguaje de script

Si su idioma puede invocar su propio compilador para convertir una cadena en código, entonces permita que esté en modo sandbox de la misma manera que lo haría con cualquier lenguaje de script incorporado.

Use un modelo de concurrencia simple

A las personas de seguridad no nos gusta tener que preocuparnos por las condiciones de carrera cuando intentamos averiguar si se mantiene una propiedad de seguridad.

Considere alternativas al subproceso antes de establecer subprocesos como una opción predeterminada casi imposible de proteger.

Una simple es la concurrencia de bucles de eventos como la que se encuentra en E, Verilog y JavaScript.

No aliente la confusión de citas

Algunos idiomas son idiomas de pegamento y terminan tratando con cadenas en muchos idiomas diferentes.

Por ejemplo, JavaScript a menudo compone cadenas de HTML, CSS, XML, JSON e incluso JavaScript. Es muy difícil para los programadores recordar codificar correctamente cadenas de texto sin formato cuando se combinan para crear cadenas en otros idiomas, por lo que los programas JS, como era de esperar, tienen todo tipo de problemas de confusión: XSS es el peor.

Si desea incluir características de composición de cadenas, intente reducir la carga de seguridad del programador. Las DSL, las macros higiénicas y los lenguajes de plantillas integrados pueden ser una excelente manera de hacerlo al trasladar la carga de escapar adecuadamente a los desarrolladores de bibliotecas o idiomas y alejarlos del desarrollador final.

Mike Samuel
fuente
Hermoso desglose.
Qix
23

Algunos de los mejores idiomas fueron diseñados por personas que querían hacer un idioma por sí mismos.

Así que creo que los diseñadores de idiomas deberían prestar menos atención a sus usuarios. No puedes complacer a todos, tampoco deberías intentarlo.

dan_waterworth
fuente
44
Eso puede ser cierto hasta cierto punto. Sin embargo, si nunca escucha a sus usuarios, nunca sabrá el dolor que les inflige cuando intentan usar a su hijo cerebral. Sin escuchar / sentir ese dolor, nunca se te ocurrirá la próxima gran idea que resuelva ese problema y otros. Ningún hombre es una isla. El dolor puede ser un gran motivador para la innovación.
Berin Loritsch
55
@Berin: No creo que el punto sea que nunca debas escuchar a tus usuarios, pero no escuches a los usuarios que quieren usar el idioma para algo para lo que no fue diseñado. Si diseñó un lenguaje para resolver un conjunto o problemas específicos, entonces debe atender a los usuarios que también necesitan resolver esos problemas. Sin embargo, abordas el extremo y, a veces, un idioma puede encontrar un nicho en un nuevo dominio, por lo que +1.
Jeremy Heiler
2
@Jeremy, sí, eso es exactamente lo que digo, pero creo que es raro que un idioma funcione bien en un dominio para el que no fue diseñado.
dan_waterworth
@dan_waterworth: Los idiomas exitosos generalmente funcionan, a menudo bien, en dominios para los que no fueron diseñados.
David Thornley
8
En lugar de "no escuchar a los usuarios", el consejo está mejor redactado como "no escuches a los usuarios que no tienes".
chrisaycock
16

Solo se pasa del 5 al 10% del tiempo escribiendo código. Los diseñadores de idiomas deben prestar atención a las dificultades de hacer que el software funcione, lo que significa corregir errores y errores.

Eso significa que desde el principio debería haber un buen depurador. No es una herramienta con sintaxis arcana y comandos de teclado que sea solo un poco mejor que toneladas de declaraciones de impresión.

como se llame
fuente
2
+1. La depuración es uno de los lugares donde algunos idiomas son mejores que otros, y algunos IDE marcan la diferencia entre un idioma utilizable y uno que se interpone en su camino.
Berin Loritsch
2
Agregaré un poco a esto y diré, cuando sea posible, rastros útiles de la pila. Si hay un error (o una excepción no detectada o lo que sea, dependiendo de su idioma), quiero poder ver toda la pila de llamadas que lo recibió, junto con los valores de los argumentos utilizados. Tcl hace esto excepcionalmente bien ... pero, para ser justos, todo es una cadena en Tcl, por lo que puede imprimir el valor de todo con relativa facilidad.
RHSeeger
1
No solo depuración, sino que dificulta la escritura de errores. Estaba tan contento cuando Java introdujo la verificación automática de límites en las matrices ... pero aquí estamos, 15 años después, todavía cometiendo esos errores en otros idiomas.
Alex Feinman el
3
¿No sería mejor tener un lenguaje que encuentre los errores en tiempo de compilación? Por ejemplo, cuando uso Ada pasa mucho menos tiempo en el depurador que cuando uso C o C ++.
Martin
12

Creo que deberían prestar atención a Python, que hace más cosas bien que cualquier otro lenguaje que haya encontrado (y eso incluso si no le gustan algunas de las características). Eso no significa que deberían emular Python, pero es importante saber qué hizo Python correctamente, incluso si no desea crear un lenguaje como Python.

En cuanto a las ideas filosóficas que son relevantes allí, estas son las más importantes del Zen de Python:

  • Explícito es mejor que implícito.
  • La legibilidad cuenta.
  • Los casos especiales no son lo suficientemente especiales como para romper las reglas.
  • Aunque la practicidad supera la pureza.
  • Debe haber una, y preferiblemente solo una, forma obvia de hacerlo.
  • Si la implementación es difícil de explicar, es una mala idea.
  • Los espacios de nombres son una gran idea, ¡hagamos más de eso!

Creo que un lenguaje que sigue estas reglas necesariamente debe estar bastante bien, pero solo conozco uno que haga esto, y ese es Python. Para todas las similitudes con, por ejemplo, Ruby en la implementación, Ruby se pierde en cosas como la legibilidad y lo invita a hacer golf en código, lo cual es divertido, pero no es útil en un entorno profesional.

La única característica técnica que extraño en Python es una declaración "hasta" (como while, pero no prueba la expresión la primera vez). Luego, hay muchas cosas en Python y en otras bibliotecas estándar de idiomas que podrían mejorarse, pero eso no es estrictamente idiomas , por lo que esa es una pregunta diferente. :-)

Lennart Regebro
fuente
44
Considero otras dos cosas más importantes, especialmente a nivel de diseño de lenguaje: "Los casos especiales no son lo suficientemente especiales como para romper las reglas". porque un lenguaje con mil casos especiales o reglas arcanas es difícil de usar, junto con "Aunque la practicidad supera la pureza". porque de lo contrario te sumerges en el reino de las lonas de Turing.
15
Si explícito es mejor que implícito, ¿por qué no es necesario que declares variables? Cuando un error tipográfico simple puede causar errores difíciles de depurar (a diferencia de los errores que se detectan en el momento de la compilación o los errores de tiempo de ejecución que son obvios y fáciles de depurar), se trata de un ataque importante contra el lenguaje IMO.
Mason Wheeler
44
@Mason Wheeler: La única razón por la que tiene que declarar variables en otros idiomas es que tiene que declarar de qué tipo son. Python es dinámico, por lo que no se necesita declaración de tipo y, por lo tanto, no se necesita declaración. No veo cómo eso tiene algo que ver con lo implícito / explícito. Los tipos en Python son explícitos. Así son las variables. Después de diez años, un error tipográfico nunca ha causado un error difícil de depurar. De hecho, son triviales para depurar.
Lennart Regebro
8
+1 para la lista, -1 para fanboy-ness. Prestar atención a todos los idiomas que han obtenido un éxito significativo e intentar incorporar, o al menos analizar, la aplicabilidad de esos elementos parece el enfoque más pragmático.
Steven Evers
3
@Lennart: Diría que es bueno poder (pero no es obligatorio, ver la regla 4) establecer explícitamente los tipos de funciones. Es similar al diseño por contrato. Ese es el punto que quiero hacer.
Theo Belaire
11

La capacidad de modificar el idioma para satisfacer sus necesidades es muy importante para mí. Para Lisp que se hace con macros, para Tcl con nivel superior. En menor medida, Ruby usa lambdas y similares. Solo quiero la capacidad de agregar nuevas estructuras de control que se adapten al problema en lugar de moldear mis problemas en torno a las estructuras de control disponibles. Como ejemplo simple, la construcción "hacer ... hasta" que existe en algunos idiomas pero no en otro es una forma más limpia de manejar algunos casos que "while", es extremadamente útil poder agregar nuevas estructuras para resolver otros casos.

En el sentido más general, esto es metaprogramación ... pero la uso principalmente para construir nuevas estructuras de control.

RHSeeger
fuente
Interesante. Un buen soporte de meta programación puede ser difícil de lograr, pero muy poderoso cuando lo es. He escuchado de personas a las que les gusta Lisp que la implementación de Lisp es una de las mejores, pero lo dicen sobre todo en Lisp. ¿Algún ejemplo de lo que crees que es la meta programación bien hecha?
Berin Loritsch
La "metaprogramación bien hecha" debe ser donde es simple hacer lo correcto (bueno, para una actividad simple razonable) y donde el resultado final se siente como una parte natural del lenguaje.
Donal Fellows
1
No solo modificable, sino modificable descifrable. Si ha reasignado algo en el idioma, yo, como lector, debería poder resolverlo rápidamente. Las anotaciones u otros marcadores extrínsecos podrían ayudar con esto.
Alex Feinman
Creo que Mata-Lua o Template Haskell hacen un buen trabajo al proporcionar esto. (No es tan agradable como la macro de Scheme, pero eso es lo que paga por usar más que parens en un idioma)
Theo Belaire
10

Lo más importante es que su idioma debe tener un "estilo". Por ejemplo, llamaría a C un lenguaje de programación de sistemas basado en punteros. Llamaría a Erlang un lenguaje de programación funcional altamente concurrente. Algunos otros lenguajes (como C ++ y posiblemente Java) son lo que Allan Kay llamó lenguajes "aglutinantes": los lenguajes de Frankenstein consistían en un conjunto de características unidas entre sí.

El siguiente punto más importante es que los cambios en el lenguaje en sí deberían ser el último recurso. Incluso el sonido más benigno puede volverse complejo cuando se combina con las otras características del lenguaje. Diría que para poner una nueva función en un idioma, debe:

  1. Demuestre que es realmente necesario.
  2. Probar que no se puede hacer en una biblioteca.
  3. Demuestra que pertenece al idioma.
Jason Baker
fuente
2
En otras palabras, el lenguaje debe tener un principio de diseño general, y el lenguaje debe ser coherente con ese principio. Los comentarios sobre la evolución del lenguaje están garantizados (he visto esto fallido varias veces).
Berin Loritsch
1
Me recuerda a mi cita favorita de C ++ ... Un pulpo hecho clavando patas adicionales en un perro.
ocodo
44
Probar que no se puede hacer en una biblioteca . +1
Qix
2
Me gusta el tidbit de la biblioteca. Es genial cómo los lenguajes como haskell no tienen elementos de flujo de control integrados como bucles, excepciones o continuaciones. son realmente fáciles de definir dentro del lenguaje, manteniendo la sintaxis realmente limpia y promoviendo la extensibilidad y la capacidad de compilación sobre la creación de un montón de características inteligentes del lenguaje.
sara
10

Gracias por una gran pregunta Estás obteniendo algunas respuestas bastante buenas.

No es un esmalte sobre tus ojos, pero veo a un programador como un canal de información. Las ideas / conceptos / requisitos van en un extremo y el código sale en el otro.

Si toma un conjunto de requisitos (no importa cómo se establezcan) y el conjunto de código en una enorme pizarra, y dibuja líneas que mapean cada requisito al código que lo implementa, la complejidad de ese gráfico dependerá de qué tan bien el código expresa los requisitos Idealmente, debería ser bastante directo y uno a uno, pero eso es difícil de practicar.

Mido la especificidad de dominio de un lenguaje como la medida en que simplifica ese gráfico. Esa es una propiedad extremadamente deseable, y puede abordarse de muchas maneras, desde definir las clases / rutinas correctas (sustantivos / verbos), hasta macros, hasta escribir su propio analizador e intérprete / compilador.

Permítanme dar un ejemplo de lo que quiero decir. Para el problema de crear interfaces de usuario de diálogo flexibles, esta técnica elimina la necesidad de escribir controladores de eventos, movimiento de datos, la mayoría de las cosas que normalmente se hacen en las IU. También da como resultado una reducción del código fuente de aproximadamente un orden de magnitud. El metalenguaje es realmente solo unas pocas rutinas y macros en C / C ++ / Lisp, y también lo he hecho en lenguajes sin macros.

Si la implementación de un requisito se puede hacer con ediciones de 5 puntos en el código, o con 10, hacerlo con 5 no solo es menos código, sino menos posibilidades de perder un paso y poner un error. Por lo tanto, cuanto más específico es el dominio de un idioma, más pequeño, más fácil de mantener y más libre de errores es el código. Creo que necesitamos saber cómo conducir hacia eso. Lo hace , no significa que el código es más legible, a no ser que el lector ha invertido en la curva de aprendizaje para entender la técnica.

Mike Dunlavey
fuente
9

Tipos enteros delimitados y distintos como en Pascal y Ada. Honestamente: ¿con qué frecuencia necesita el rango completo de cualquier número entero? Creo que hay mucho que mejorar en los tipos primitivos para representar mejor el mundo real.

Martín
fuente
2
Los tipos enteros acotados como C, C ++, D, Java, C #, etc. tienen su lugar seguro. A algunos tipos de programación no les importa y simplemente necesitan la distinción de entero y punto flotante. Incluso entonces, ¿tal vez solo necesitemos un tipo de número y nos preocupemos por la parte integral del número más adelante? En resumen, la programación empresarial es menos sensible al tipo de entero específico que al hecho de que un número es un entero. Cuando implementa un protocolo en un nivel bajo, las reglas cambian drásticamente.
Berin Loritsch
2
Lo que pensé era que los tipos en Ada, donde puedes decir type Date_Of_Month is 1 .. 31;y dejar decisiones como 16 o 32 bits para el optimizador. Pero lo más importante es que asignar 32 o 0 o -5 a una variable del tipo le da un RANGE_ERROR.
Martin
Los rangos funcionan bien para cosas como Date_Of_Month(o Month_Of_Year) donde hay un rango obvio para usar, pero muchos, probablemente la mayoría de los casos, son confusos. type Persons_Age is 0..120? ¿Qué pasa si alguien rompe el récord de longevidad? type Year is 0..9999? ¿Qué pasa si eres egiptólogo?
dan04
Si usted es egiptólogo, lo necesita sin darse cuenta type Egyptian_Year is -9999 .. 300;. En mi experiencia, puede encontrar límites útiles para enteros la mayor parte del tiempo. A este respecto, debe considerar type Scrolls_Found is array Egyptian_Year of Natural;No puede / no debe tener un tipo ilimitado como índice de matriz. Es solo un vector de ataque para hackers. Por cierto: Ada permite que los límites de rango se calculen en tiempo de ejecución.
Martin
1
@kai nadie dijo que esta característica particular de los sistemas de tipo se debe usar en todas partes sin excepciones. Estoy seguro de que Ada también permite que uno use tipos numéricos "regulares". Y los tipos numéricos acotados son ciertamente útiles para algunos problemas (bastante comunes).
Sarge Borsch
8

Hay características que hacen que los lenguajes de programación sean fáciles de usar una vez que los aprende, y hay características que los hacen fáciles de aprender a usar. Dado que los usuarios de un idioma idealmente tienen una relación a largo plazo con él, la optimización para facilitar su uso es mejor que la optimización para facilitar el aprendizaje. No haga las cosas más difíciles de lo necesario, pero no sacrifique la expresividad (poder escribir un pequeño código que haga mucho) para facilitar la lectura a aquellos que no están familiarizados con el idioma. Por otro lado, el lenguaje no debería leerse como ruido de línea para las personas que han estado trabajando con él durante años; eso no sería fácil de usar o aprender.

Larry Coleman
fuente
8

Convenciones de nomenclatura (te estoy mirando PHP)

Malfist
fuente
Sin embargo, no es un problema de diseño de lenguaje. Claro, siempre tiene que estar atento a lo que ingresa a la biblioteca estándar, pero los diseñadores de idiomas no pueden imponer las convenciones de nomenclatura;)
3
Puede para la biblioteca estándar.
Malfist
3
Ni siquiera menciones PHP. El peor lenguaje comúnmente utilizado. No fue diseñado por un informático, solo un tipo que quería plantillas y se agregaron esteroides.
Keyo
@delnan: algunos idiomas, como Mercury o Eiffel, imponen convenciones de nomenclatura (todos los nombres de clase mayúscula, variables que comienzan con mayúscula, etc.) y el compilador las aplica. Fortran dijo que las variables que comienzan con i, j, k son enteras (de ahí el uso tradicional como variables de bucle en la mayoría de los idiomas ...). Y así. De alguna manera molesto si no te gusta la convención, pero bueno para la consistencia de los códigos fuente, al menos.
PhiLho
@PhiLho: Sin embargo, eso es muy limitado. No puede imponer, solo un ejemplo, el uso consistente y significativo (para los lectores humanos) de las mayúsculas o guiones bajos (podría intentarlo, pero podría poner en riesgo la cordura de los programadores en el proceso).
7

Integración de primera clase con entornos de desarrollo.

Hoy en día, la codificación se realiza en un entorno rico. Para HTML / CSS / JS, tenemos Firebug y otras herramientas interactivas. Para Java, Eclipse e IDEA y otros IDEs verdaderos. Etcétera. Existe una ecología de herramientas, que comienza con el editor pero no termina allí:

  • Organización del código dentro y entre archivos
  • Resaltado inteligente
  • Finalización inteligente / mecanografía predictiva
  • Depuración estática (sintaxis de marcado, errores semánticos y estilísticos)
  • Creación y uso de plantillas y macros.
  • Control de versiones (versionado, fusión, ramificación, ...)
  • Desarrollo distribuido con múltiples autores (comentarios, documentos en línea, anotaciones, ...)
  • Depuración en tiempo de ejecución (seguimientos de pila, pasos, relojes, ...)
  • Depuración interactiva "en vivo" (como Firebug: comportamiento de edición de un sistema en vivo)
  • ... Ni siquiera sé qué sigue.

Los idiomas deben construirse para brindar apoyo a estas actividades. Se han realizado algunos progresos: anotaciones en Java para ayudar a otros desarrolladores a comprender la intención del código, por ejemplo.

Pero en su mayoría son cosas pirateadas, como usar $ Id $ en un comentario para que la fuente controlada por CVS pueda contener un número de versión. ¿Por qué no puedo hacer algo así desde el lenguaje mismo?

Alex Feinman
fuente
¿Te refieres a algo como ASIS (ISO / IEC 15291: 1999 “Especificación de interfaz de semántica de Ada”)? ASIS no cubre todo lo que quiere, sino mucho. A menudo he deseado algo como ASIS para otros lenguajes de programación. Ver sigada.org/wg/asiswg para más detalles.
Martin
Algunas de estas cosas son relativamente baratas de hacer, o vienen gratis desde su IDE: organización de código, resaltado de sintaxis, plegado de código, control de versiones, plantillas / macros. Otros requieren mucho más esfuerzo: depuración en tiempo de ejecución, depuración estática, finalización inteligente / tipeo predictivo, refactorización, etc. Aunque a menudo se descuida, diseñar un lenguaje coherente es mucho más difícil cuando también tiene que preocuparse por los complementos IDE.
Berin Loritsch
6

Computación Distribuida

El almuerzo gratis ha terminado. Hoy en día uno necesita programas que se ejecuten en múltiples núcleos / procesadores múltiples (y en circunstancias especiales múltiples computadoras).

Desafortunadamente, escribir código multiproceso es difícil desde el punto de vista conceptual, por lo que realmente no hay necesidad de agregar el idioma como barrera.

C ++ 0x uso del futuro es ciertamente interesante, por todo lo que trae como biblioteca y no lo libera de los problemas de sincronización reales (ya sabe, aquellos que son tan fáciles de resolver ...)

Me gusta mucho ir el enfoque de sobre el problema: el subprocesamiento múltiple está incorporado, y el enfoque adoptado (canales y gorutinas) establece una mentalidad mucho más fácil que los enfoques tradicionales de semáforo / mutex / bloqueo. Sin embargo, todavía es fácil acceder a una estructura no sincronizada simultáneamente (Go tiene punteros) o al punto muerto (ciclo de espera en los canales ...)

Creo que los idiomas que favorecen la inmutabilidad de los datos, como los lenguajes funcionales, pueden tener el derecho de hacerlo (aunque me gusta la experiencia allí).

Además, el modelo de actor puede ser nuestro próximo objetivo. También estaba destinado a la informática distribuida.

Matthieu M.
fuente
Otro ejemplo sería Erlang. Un tema común entre los idiomas de este tipo es un enfoque de nada compartido , donde el estado se pasa esencialmente junto con el mensaje. El enfoque se adapta bien.
Berin Loritsch
@Berin: Tienes razón, aunque no cité a Erlang en el mensaje porque sé poco de él, recuerdo que implementa correctamente el modelo de actor.
Matthieu M.
6

Llámame loco, pero una de las características del lenguaje más importantes para mí es la disponibilidad de una buena referencia en línea, junto con ejemplos. Sé que puedo encontrar buenos resultados de búsqueda para cualquier idioma, pero realmente me gusta el sitio de MSDN y API de Java. Hacen la programación mucho más fácil para una persona que no tiene mucha experiencia en el lenguaje específico.

apoorv020
fuente
JavaDoc, CppDoc, RubyDoc, etc. han sido un gran activo para comprender las bibliotecas estándar, así como las bibliotecas que crea. No todos son iguales y algunos son más fáciles de navegar que otros.
Berin Loritsch
De acuerdo, el sitio API de Java es un excelente activo. Es genial tener un formato estándar para crear documentación API también. Las ganancias de productividad al usar un IDE con soporte incorporado para analizar JavaDoc (netbeans) es sorprendente. Aunque tengo un recuerdo horrible, probablemente me beneficie más que otros.
toc777
6

Más capacidad para ayudar al compilador a verificar su código.

Al ser un programador de sistemas embebidos, siempre uso C. Pero siempre deseo tener más / mejores formas de decirle al compilador qué espero de mi código para que pueda verificarlo.

Por ejemplo, puedo tener una función

f(int x)

pero preferiría

f(int range[-5..25] x)

Por ejemplo, me gustaría poder escribir aserciones sobre funciones utilizando algún tipo de lenguaje funcional de nivel superior como Lisp o Haskell. Estos no se compilarían en código, pero podrían usarse para análisis estáticos o dinámicos.

Rocketmagnet
fuente
¿Esencialmente una forma eficiente de verificar los límites? Eso sería genial. Sin embargo, al menos me gustaría que se incluyera para la verificación del tiempo de ejecución y la verificación del tiempo de compilación. Cuando extrae información de una base de datos o de la interfaz de usuario, siempre garantiza que el valor será válido. Si esta fuera una característica del lenguaje, me gustaría usarla también para estos fines.
Berin Loritsch
3
Deberías usar Pascal. Puede definir un tipo que cubra un rango arbitrario de números, como -5..25, que el compilador puede verificar en tiempo de compilación. (Siempre y cuando solo asignes constantes, por supuesto).
Mason Wheeler
1
@ Kugel: ¿Qué más que una característica del compilador es afirmar? Y la prueba unitaria no verificará el código en producción. Y no registrar la producción es como sacar los botes vivos después del viaje inaugural. Para ahorrar combustible y hacer que el barco sea más rápido.
Martin
1
Usaría Ada, excepto que la plataforma en la que estoy trabajando no tiene un compilador Ada. Solo tiene un compilador de C, por lo que todo esto es académico de todos modos.
Rocketmagnet
1
Ya uso muchas afirmaciones, pero sería aún mejor tener esta y otras cosas como características del lenguaje.
Rocketmagnet
5

Sintaxis pequeña con la menor cantidad de palabras clave posible porque la sintaxis detallada es difícil de aprender y no ayuda a la legibilidad.

El peor ejemplo es Ada:

procedure Hello is
begin
  Put_Line("Hello World!");
end Hello;

Las palabras de relleno como is, as, .. no tienen sentido para los lenguajes de programación.

Brainlag
fuente
44
Creo que el peor ejemplo son los idiomas donde dices public static void.
Joey Adams
1
La Idea no es nueva y ya se implementa en la forma de SmallTalk, que no tiene palabras clave en absoluto. Por lo tanto, debería haber utilizado SmallTalk como ejemplo positivo para su reclamo. Por cierto: si no sabe para qué ISsirve, entonces no ha entendido Ada (¿alguna vez programó Ada?): ISSepara la declaración del procedimiento de la declaración de variables locales y también distingue una especificación de la implementación. Por supuesto, solo notaría al comparar la especificación y la implementación de una función para ver que IStiene mucho sentido y no es un relleno en absoluto.
Martin
1
Olvidé mencionar: la sintaxis SmallTalk también se ajusta al reverso de una postal. Por lo tanto, también cumplirá su deseo de "pequeño". Por supuesto, la mayoría de las ideas aquí ya están implementadas en algún idioma en algún lugar y la mayoría de los carteles aquí usan esos idiomas como ejemplo positivo en lugar de hacer un ejemplo negativo defectuoso . Te rechazaría si tuviera suficiente reputación. No porque tu idea sea mala, sino por usar un ejemplo negativo.
Martin
77
Las palabras de relleno realmente pueden tener un propósito si ayudan a desambiguar la sintaxis. Por ejemplo, me gusta mucho más if x then …a if (x) …. Hemos cambiado un par de paréntesis por una palabra clave contextual. Esto tiene sentido porque la condición xpuede ser una expresión compleja con sus propios paréntesis. Eliminar el par más externo puede aumentar drásticamente la legibilidad. Una alternativa, por supuesto, es usar dos puntos aquí, como en Python. De hecho, creo que la mayoría de los rellenos tan ambiguos podrían ser reemplazados por dos puntos. No estoy seguro de qué método prefiero.
Konrad Rudolph
3
@Konrad: Si disambguates la sintaxis, es no una carga. El is es un relleno porque Ada podría haber permitido procedure Hello begin ... endsin ambigüedad.
dan04
4

Me gustaría ver más idiomas de aprendizaje . No solo idiomas para principiantes absolutos con restricciones más santas que tú, como requerir un espacio entre cada token , sino idiomas para personas que ya conocen la programación y quieren aprender nuevos conceptos o mejorar la programación en general.

Para mí, Haskell es un gran ejemplo de lo que quiero decir con un "lenguaje de aprendizaje" (aunque también ha crecido en popularidad y utilidad general a lo largo de los años). Al abandonar la sintaxis familiar de C y tener operadores de composición de funciones hacia atrás (por ejemplo, (+2) . (*3)es una función que se multiplica por 3, luego agrega 2), Haskell me enseñó a escribir funciones más cortas. Su despiadado verificador de tipos me ayudó a aprender el idioma más rápido y mejoró mi capacidad de pensar lógicamente sobre el código. Ambos beneficios se han extendido a otros idiomas, incluso el ensamblaje.

Los objetivos de aprender idiomas y los de los idiomas de uso general a menudo están en conflicto. Un lenguaje de aprendizaje debe ser desafiante y gratificante de aprender, y debe imponer un estilo particular, incluso si ese estilo no es el mejor para muchas aplicaciones. Un lenguaje de propósito general debe ser bueno para hacer cosas, y el uso de abstracciones debe medirse cuidadosamente y "tener sentido". Por ejemplo, al arreglar un sitio web, aprender sobre mónadas sería lo último en la mente de un programador. En el otro lado de la moneda, cuando alguien está aprendiendo a programar, no debería tener que meterse en tonterías de "vacío público estático" si aún no se han enterado de las funciones.

Si es diseñador de idiomas, decida si su idioma es un idioma de aprendizaje o un idioma aplicado. Esto determinará en qué medida querrá emplear la pureza en su diseño.

Joey Adams
fuente
2
¿Cómo es la composición de la función de Haskell de alguna manera al revés? Es una traducción directa de (f ∘ g)(x) = f(g(x)).
Jon Purdy
@ Jon Purdy: Significa que tienes que escribir las funciones en orden inverso a su aplicación. En ambas formas,g se aplica primero al argumento, seguido de f. Si desea ordenar una lista, agruparla y obtener el primer elemento de esas listas, escriba (map head . group . sort) listo map head $ group $ sort listo map head (group (sort list)). En todos los casos, terminas escribiendo las operaciones al revés. Por cierto, importar le Control.Arrowpermite decir (sort >>> group >>> map head) list, pero el >>>operador me parece bastante incómodo y detallado.
Joey Adams
2
No sé, todavía creo que el de derecha a izquierda tiene sentido. (map head . group . sort) listse lee como "el primer elemento de cada grupo en una especie de list", lo cual es bastante natural, y, para mi oído, más funcional que (sort >>> group >>> map head) list, que se lee de manera imperativa y hacia atrás como "ordenar, luego agrupar y luego tomar el primer elemento de cada grupo". .. list".
Jon Purdy
@JoeyAdams: el >>>operador se ve bastante incómodo y detallado : algunos lenguajes funcionales más recientes han comenzado a usarse |>como operador de encadenamiento de izquierda a derecha, lo que quizás sea un poco más fácil para los ojos ...
Julio
4

Desde que estamos en 2011,

  • Una especificación absolutamente completa. sin agujeros dependientes de la arquitectura como en C
  • soporte multihilo; no solo funciones de sincronización (bloqueos), sino también funciones de lenguaje que hacen que el subprocesamiento múltiple sea tan fácil como escribir un bucle:

    all (o en myCollection) {o.someMethod ()}

  • multi-paradigma; permítame, el programador, decidir si quiero la seguridad en tiempo de compilación de un lenguaje estático o la brevedad de un lenguaje dinámico, caso por caso; dame características orientadas a objetos, características funcionales, etc.

  • consistencia (sé que está pidiendo un poco tanto por consistencia como por paradigma múltiple ...)

usuario281377
fuente
Estoy contigo 100% para una especificación completa. El paradigma múltiple y la coherencia definitivamente serán un acto de equilibrio. Puede especificar un conjunto de comportamientos para un paradigma dinámico como un subconjunto de los comportamientos para la comprobación estática, pero creo que estos dos enfoques pueden prestarse a estilos de programación muy diferentes. Realmente deben ser idiomas separados en ese momento. ¿Quizás un par de idiomas consistentes con compatibilidad 100% sería lo que está buscando?
Berin Loritsch
Los idiomas como Scala (y quizás Haskell, no lo sé lo suficiente) tienen un sistema de tipos estático fuerte y conciso, gracias a la inferencia de tipos y a las implicidades.
PhiLho
2
Las características dependientes de la arquitectura están bien cuando un lenguaje permite que un programador especifique qué es o no importante. Lo que hace que C sea horrible es que no hay forma de declarar "tipo numérico que envuelve el módulo 65536"; incluso si una plataforma implementa uint16_t, el estándar requiere que algunas implementaciones consideren la diferencia entre dos uint16_tvalores como firmada, y que otras consideren la diferencia como no firmada; no proporciona forma para que el programador especifique qué comportamiento se desea.
supercat
No estoy de acuerdo con multiparadigm; eso deja demasiado margen de maniobra para codificar batallas de estilo. La Biblioteca A está escrita con un montón de paradigmas dinámicos . La Biblioteca B está escrita con un montón de paradigmas estáticos . Bueno, ahora la Biblioteca A necesita hablar con la Biblioteca B; ¿Dónde está el término medio? Si tiene que escribir pegamento entre dos piezas de código en el mismo idioma, el idioma es inherentemente imperfecto IMO.
Qix
3

Procesos ligeros

Me gustaría tener procesos ligeros como en Erlang. Es principalmente un problema para el tiempo de ejecución. Esto falta en JVM y .NET CLR. LWP ayuda a crear software masivamente concurrente. Idealmente, no debería ser más costoso crear un proceso, ya que es crear un objeto en un lenguaje. Me gustaría crear millones de procesos en mis aplicaciones.

Se implementa como un grupo de subprocesos con programación preventiva, por lo que una sola tarea no bloquea la otra tarea, y las tareas se pueden programar en cualquier cpu-core disponible.

Soporte para la recursividad de la cola.

Me gustaría tener soporte para la recursividad de cola. Esto también puede ser un problema para el entorno de tiempo de ejecución. Por ejemplo, JVM no tiene soporte para la recursión de cola.

Programación distribuida fácil

Me gustaría tener soporte para enviar ( ! ) Y recibir primitivas a partes de la aplicación que se ejecutan en otras máquinas en la misma red que en Erlang. Esto facilita la creación de aplicaciones escalables, por ejemplo, almacenes de datos distribuidos. Además de esa serialización incorporada en el lenguaje, también es muy útil como en erlang. Y no como en Java, tengo que hacerlo manualmente.

Jonas
fuente
Recursión de cola: c2.com/cgi/wiki?TailRecursion
Berin Loritsch
Scala tiene una recursión de cola y se compila en la JVM. El compilador de IBM Java también puede hacer una recursión de cola, a veces.
Martin
3

Facilitar la metaprogramación.

limitar formas especiales

En Python no hay una buena razón por la cual imprimirlo no sea una función integrada. Se ve y actúa como una función, excepto por no querer tener nada que ver con los padres.

¿Es realmente necesario for, foreach,while y similares cada uno como su propia forma especial. ¿Qué tal una construcción de bucle y algunas macros predeterminadas para proporcionar el azúcar sintáctico de las formas de bucle variantes?

metaprogramación para formas especiales

form['if'](test-fn, body-fn)

dietbuddha
fuente
Ruby tiene "formas especiales" para hacer un bucle, al menos en el sentido de que los objetos iterables generalmente tienen un método como eachese que toma un bloque de código como argumento. (Ruby también tiene fory whilebucles, pero ningún programador de Ruby que los respete realmente los usa.)
mipadi
@mipadi: Soy un gran admirador de los bloques de Ruby y los modismos asociados.
dietbuddha
tal vez piensan: dispararás a los ojos. :) Supongo que fue la asociación de todos ustedes poderosos "Python" y "no hay una buena razón por qué". Sin embargo, la metaprogramación es un problema de diseño de lenguaje válido que a menudo se descuida. Es por esa razón que votaré esto.
Berin Loritsch
@Berin: Realmente uso, y soy fanático de Python, lo que lo hace más divertido.
dietbuddha
Un tipo de bucle haría que el flujo de código fuera oscuro. Por ejemplo, ¿cómo se vería un do..whileciclo si hubiera un tipo de ciclo que tuviera la evaluación en la parte superior? No parecería un bucle do.. while en absoluto.
Qix
2

Capacidades de red

Un lenguaje que se envía sin algún soporte de red es bastante aburrido en el mundo de hoy.

La mayoría de las aplicaciones del mundo real necesitan comunicarse a través de algún tipo de red:

  • Actualización automática
  • acceso a la base de datos
  • servicios web

También es una piedra angular del soporte de computación distribuida / en la nube, por supuesto.

Matthieu M.
fuente
8
Pero puede ser una característica de biblioteca estándar bien.
Donal Fellows
@Donal: Nunca dije lo contrario (o al menos no lo pensé), la pregunta está abierta a las funciones de idioma y biblioteca. Lo que quiero decir es que si recibes un paquete de idioma y no hay capacidad de red allí, llenarás el dolor más temprano que tarde :)
Matthieu M.
3
La biblioteca estándar es realmente parte de la experiencia del lenguaje, y debe tratarse con el mismo cuidado y respeto. También estoy de acuerdo con este requisito para una biblioteca estándar.
Berin Loritsch
1

Me gusta un lenguaje de programación que sea fácil de aprender y fácil de combinar para crear cosas nuevas.

Por ejemplo, si bien es atractivo tener muchas formas de escribir algo, creo que es mejor tener solo una o dos formas de escribirlo. De esa manera, el programa es más fácil de mantener.

Un lenguaje cuyos conceptos pueden aplicarse a todos los elementos es muy útil (creo que esto se llama ortogonalidad). Por lo tanto, la próxima vez que se enfrente a una nueva característica del lenguaje, puede deducir cómo usarla.

Entiendo que a veces la sintaxis del lenguaje debe interponerse para lograr un mejor desempeño en la fase de compilación / interpretación, pero a veces siento que el diseñador del lenguaje difiere este trabajo al desarrollador. Por ejemplo, cadenas multilínea en Java o Javascript.

Finalmente, la sintaxis del lenguaje es su interfaz de usuario y, como tal, debe ser clara, concisa, intuitiva, fácil de usar y debe respetar sus hábitos.

OscarRyz
fuente
Ortogonal significa que cada característica hace algo diferente. Mira herramientas como grep o awk. Hacen una cosa, bueno. Luego los conecta en diferentes órdenes para hacer lo que necesite.
Theo Belaire
1
  • Legibilidad : cuanto menor / menor sean los símbolos utilizados en la gramática, más limpio y mejor.
  • Tipos orientados a objetos : métodos, no funciones.
  • Comprensibilidad : interfaces fluidas incorporadas, nombres completos y cortos para clases / interfaces de biblioteca y otros.
dukeofgaming
fuente
1
Lo siento, pero tengo que darte un -1 por estar completamente equivocado en esto. La brevedad ayuda a escribir código más rápido, pero definitivamente no hace que el código sea más legible, más allá de un cierto mínimo. Un cierto nivel de verbosidad hace que el código sea mucho más fácil de leer, porque esas palabras y símbolos adicionales significan algo e imparten información significativa al programador, especialmente si fue escrito originalmente por otra persona y no tienes la ventaja de tener modelo de ello en tu cabeza.
Mason Wheeler
Para mí, el código limpio es un código legible. También dije el más pequeño: tener ":" en lugar de "=>" en matrices PHP, o tener "." en lugar de "->", sin duda sería una mejora (y ya disfruto de PHP).
dukeofgaming
44
@Mason: Yo y muchos buenos escritores técnicos (por ejemplo, William Zinsser) no estoy de acuerdo. La verbosidad es el enemigo de la legibilidad, no de la brevedad.
Konrad Rudolph el
2
Voy por una forma de brevedad que se define en términos de símbolos . Sin embargo, estoy bastante contento con los símbolos de varios caracteres, siempre que sean cosas que el lector trata naturalmente como un solo símbolo (por ejemplo, una palabra es un símbolo).
Donal Fellows
1
Su primer punto entra directamente en conflicto con sus dos últimos.
Qix
1

Agregar una función a un lenguaje de programación existente. Entonces, el nuevo idioma B es el antiguo lenguaje A más la función X.

Ejemplos existentes:

  1. C agregando clases => C ++
  2. Java agregando algunas cosas => C #
umlcat
fuente
2
Esta es una gran simplificación excesiva. Un ejemplo mucho mejor sería la diferencia entre C y Objective-C.
Jon Purdy
0

Cuando se trata de tecnología / plataforma / idioma / base de datos, etc., la mayoría de las veces se trata de rendimiento. En el futuro, muchos softwares actuales pueden diseñarse utilizando un lenguaje gráfico, ya que tenemos más poder computacional.

Espero el día en que tengamos poder computacional y un lenguaje en el que diseñe su aplicación y no tenga que preocuparse por los detalles del idioma .

Actualización: envío un enlace a dicho lenguaje LabView

Actualización: debería explicar más lo que quiero decir con "poder computacional". El rendimiento del software compilado puede no ser tan potente como el software compilado basado en el lenguaje de sintaxis. Estoy pensando en la programación gráfica como un mayor nivel de programación y puede haber más sobrecarga. Las computadoras de hoy pueden ejecutar y lo hacen fácilmente lenguajes de programación gráficos.

Amir Rezaei
fuente
3
Las computadoras ya son lo suficientemente potentes como para hacer esto. Simplemente no es práctico, ya que tendrá que profundizar en el código por alguna razón u otra .
Jeremy Heiler
2
Sigue siendo una especie de lenguaje. Ha habido más de un intento de hacer esto realidad. Las herramientas UML generarán una cierta cantidad de código, pero cuando el modelo esté lo suficientemente detallado como para producir un producto que funcione, ya no será útil entender el código. Creo que había algo en el entorno de Unix para el cableado gráfico de las aplicaciones, pero requería mucha configuración para hacerlo correcto. Los motores de flujo de trabajo utilizan esta metáfora para permitir que los no programadores diseñen el flujo de trabajo.
Berin Loritsch
1
En resumen, aunque dudo seriamente de la utilidad de este enfoque en términos generales, hay aplicaciones específicas donde se usa actualmente y funciona bien para esa aplicación. Re: sus puntos ... 1. Las computadoras tienen el poder computacional, el aspecto técnico no es el problema. 2. El problema es proporcionar un lenguaje visual que sea lo suficientemente expresivo como para hacer el trabajo en sentido general sin perderse en los detalles. Fuera de las aplicaciones de nicho, el texto parece ser una representación mucho más compacta de un programa. He votado porque es aplicable a la pregunta planteada.
Berin Loritsch
1
@Amir: Entonces, ¿por qué las computadoras deben ser más potentes para que la "programación gráfica" impulse el desarrollo de software?
Jeremy Heiler
77
@Amir: Estás confundiendo una limitación técnica con una más fundamental. La razón por la que no tenemos muchos lenguajes gráficos de computadora es que no sabemos cómo hacerlo bien (y no sabemos si se pueden hacer bien). Soy consciente de LabView, y he escuchado suficientes quejas sobre hacer cosas complicadas en él o cambiar cosas simples. Tampoco necesitamos computadoras más potentes para diseñar dicho lenguaje, así que adelante e intente esbozar algunos programas de muestra en un lenguaje tan hipotético.
David Thornley