it-swarm-es.com

¿Qué es un lenguaje "poderoso"?

A menudo he visto personas peleándose por que su idioma favorito es más "poderoso" que otros. Cuando se trata de describir un lenguaje de programación, puedo entender qué es un lenguaje orientado a objetos o qué es un lenguaje dinámico, pero aún no puedo entender qué es exactamente un lenguaje "poderoso". ¿Cuáles son tus pensamientos?

22
craftsman

No podemos definir qué es un lenguaje "poderoso" sin primero definir la palabra "poderoso".

La definición de poder ¡literal sería "potencia", y creo que todos podemos estar de acuerdo en que la gran mayoría de los compiladores, e incluso muchos intérpretes que no están completos en Turing, hacen un trabajo igualmente bueno trabajo de hacer que el procesador ejecute sus instrucciones. En cuanto a la definición literal, la respuesta a la pregunta sería "casi cualquier idioma".

Prácticamente, realmente deberíamos parar allí; definir un "lenguaje poderoso" es un poco como definir una "buena persona" o un "producto de calidad". Hay absolutamente ninguna definición objetiva de estas palabras que podría hacer que todos, o incluso la mayoría de los expertos, estén de acuerdo, y la mayoría de las definiciones simplemente terminan pidiendo la pregunta . Dependiendo de con quién hable, el poder podría ser cualquiera de los siguientes:

  • Un rico marco de uso general o biblioteca para realizar una amplia variedad de tareas comunes
  • Una sintaxis sofisticada específica del dominio que "hace una cosa y lo hace bien"
  • Acceso directo a las funciones de la máquina, es decir, la capacidad de escribir código de bajo nivel
  • Resumiendo conceptos de nivel de máquina, es decir, la capacidad de escribir código de alto nivel
  • Un sistema de tipo rico muy que permite estrategias avanzadas como reflexión, DI y análisis estático
  • Un sistema de tipo muy suelto que permite a los programadores simplemente ¡hacerlo (coerción de tipo, etc.)
  • La capacidad de tratar todo como un objeto , que ofrece verificación conceptual
  • La capacidad de tratar todo como una función , que ofrece verificación matemática
  • Gestión automática de memoria y recursos (GC, RAII) que conduce a menos errores
  • Memoria manual y gestión de recursos, lo que puede conducir a un rendimiento optimizado
  • Una cantidad mínima de ruido sintáctico, lo que mejora la legibilidad
  • Una sintaxis más similar al inglés , que ofrece una curva de aprendizaje más superficial
  • La capacidad de escribir código muy conciso (es decir, operador ternario, fusión nula, extensión nula)
  • El ¡incapacidad para escribir código potencialmente confuso (es decir no operadores ternarios, etc.)

¿Todos ven lo que está pasando aquí? Virtualmente ¡todos la característica de punto de viñeta se puede interpretar como un signo de "poder", ¡y también puede ser exactamente lo contrario

Alguien, en algún lugar, obviamente pensó que variables variables era una idea increíble que haría que el lenguaje fuera muy ¡poderoso. No voy a juzgar; No soy un PHP chico.

Propongo que en lugar de todas estas tonterías de la guerra santa, todos usemos esta Definición Realmente Simple:

El lenguaje más poderoso es el que le permite enviar el producto de mayor calidad al menor costo en el menor tiempo posible

¿Vago? Puedes apostar. Es por eso que cualquiera que quiera llamarse a sí mismo profesional debe comprender tanto los conceptos de programación como el dominio del proyecto. Esa es la única forma en que podrá decidir qué es "poderoso" para usted.

De lo contrario, podrías llevar un cuchillo realmente grande a un tiroteo.

32
Aaronaught

Tal vez soy parcial porque soy un programador de sistemas. Creo que un lenguaje de programación utilizado para toda la programación de kernel, sistema, servidor y aplicaciones, o que admite múltiples paradigmas de programación, o ambos, puede llamarse "poderoso".

C, C++, D son poderosos, pero obviamente esta es solo mi humilde opinión.

11
grokus

Hay algunas definiciones de poder más allá de la integridad de Turing. Mark ha citado lo que tiendo a pensar como "la definición de Paul Graham". Es una definición bastante buena, con un defecto grave: está mal. Teóricamente es una muy buena definición del poder del lenguaje, pero ya sabes lo que dicen sobre la diferencia entre teoría y práctica ...

Si todos fueran capaces de escribir código perfecto, no solo perfectamente libre de errores, sino también a prueba de futuro, de manera consistente, entonces la definición de Paul Graham sería correcta. Pero ese obviamente no es el caso. En el mundo real, la mayor parte del tiempo y el esfuerzo que se dedica a la ingeniería de software no se dedica a la creación inicial del producto, sino al mantenimiento posterior. Dependiendo de las estadísticas que escuche (y probablemente varía bastante de un proyecto a otro), el mantenimiento puede representar entre el 60% y el 90% del esfuerzo total que se dedica a un programa.

El mantenimiento a menudo lo realizan personas distintas de la persona que escribió el código inicialmente, y con frecuencia meses o incluso años después de la escritura inicial del código, lo que significa que incluso para el codificador original también podría ser "código de otras personas". punto. Si desea ser productivo durante el mantenimiento, debe poder determinar rápidamente la intención original del código al leerlo.

Por lo tanto, un lenguaje más poderoso es uno que hace que el código sea más fácil de leer rápidamente, no uno que hace que el código sea más fácil de escribir rápidamente. Suele haber una buena cantidad de superposición entre los dos, pero los conceptos a menudo también tienen propósitos cruzados, ya que la sintaxis breve a menudo omite detalles que un compilador/intérprete puede inferir mucho más fácilmente que un programador de mantenimiento.

EDITAR: Hay otro punto importante en la descripción del poder de un lenguaje: la gama de conceptos que puede expresar y la facilidad con la que puede alcanzar ambos extremos. A Paul Graham le gusta evaluar este nivel de nivel de abstracción que puede alcanzar, pero eso es solo la mitad. Cualquier lenguaje que imponga un límite inferior de abstracción, por debajo del cual no se puede ir cuando sea necesario, está paralizado porque los detalles que se están abstrayendo están allí por una razón. Esta es la diferencia entre un lenguaje de juguete fácil de leer como COBOL y un lenguaje potente y fácil de leer: COBOL no tiene punteros ni acceso al ensamblaje en línea, donde puede expresar cualquier cálculo, incluso aquellos para los que COBOL no es adecuado.

COBOL tampoco es particularmente bueno para alcanzar el extremo superior del espectro de abstracción. Según Wikipedia, "no tiene tipos definidos por el usuario ni funciones definidas por el usuario", lo que hace que sea muy difícil crear algoritmos y estructuras de datos.

5
Mason Wheeler

Esto se ha debatido repetidamente en gran medida (por ejemplo, en comp.lang.LISP, varias veces). No creo que a nadie se le ocurra una respuesta "correcta", pero mucha gente ha encontrado respuestas que me parecen obviamente erróneas.

En las respuestas que veo aquí, permítanme elegir la respuesta de Mason Wheeler. Por un lado, los problemas que cubre son importantes, pero por el otro, no puedo imaginar llamarlos en absoluto relacionados con el "poder". Es un poco como si dijera que su mini furgoneta Honda es más poderosa que una dragster de combustible superior porque es más segura, más silenciosa, tiene un mejor manejo, más espacio para pasajeros y una conducción mucho más cómoda. Todo esto es absolutamente cierto, y todo es importante. Esos factores (entre muchos otros) hacen que la minivan sea mucho más práctica y razonable para la mayoría de las personas, pero no cambian el hecho de que el motor de la minivan produce solo unos 250 HP, mientras que el dragster produce en algún lugar alrededor de 8000 HP.

El problema, por supuesto, es que con los vehículos hay una definición clara de lo que constituye "potencia" y lo que no. Con los lenguajes de programación, me parece que la discusión termina siendo equivalente a tratar el manejo, la comodidad, la velocidad, la capacidad de carga y el rango de crucero como parte de la "potencia". El resultado tiende a ser hilos que se ejecutan sin fin, generando mucho más calor que luz. La mayoría de las preguntas que surgen básicamente se reducen al grado de importancia que le da a las características ortogonales y completamente no relacionadas, por ejemplo, es la capacidad de programar el MMU en lenguaje ensamblador más o menos "poderoso" ¿"que la capacidad de crear funciones de nivel superior en Haskell? Al menos en la OMI, no hay una manera significativa de comparar las dos, y no hay una respuesta significativa a cuál es" más poderoso ", o implica más poder, o algo por el estilo.

Como tal, por mucho que odio, tengo que decir que en este caso, la única respuesta significativa es básicamente una relativista: un lenguaje poderoso es el que encuentras que te ayuda a lograr lo que quieres. Las diferencias en los objetivos de las personas hacen que la mayoría de las mediciones "absolutas" del poder no tengan sentido en el mejor de los casos.

4
Jerry Coffin

El equilibrio correcto de brevedad y flexibilidad.

Gran pregunta Dado que muchos idiomas son "completos de Turing", podemos ponerlos a todos en igualdad de condiciones con respecto a lo que son teóricamente capaces de hacer. Pero no hacemos eso porque los idiomas obviamente difieren entre sí. ¿Y cual es la diferencia?

La diferencia es la capacidad de decir muchas cosas diferentes con muy poco . Si pudiéramos saltar directamente a los extremos, podría crear un lenguaje que sea el mejor lenguaje para inicializar automáticamente un sistema de administración de contenido utilizando solo un carácter, 'c'. Pero, ¿cuál sería el punto de eso? Claro, es poderoso en un sentido de ser muy breve, pero no es flexible. Lo que quieres es un lenguaje que te permita decir muchas cosas complejas diferentes sin ser demasiado detallado. Sin ser como una Asamblea, capaz de todo bajo el sol, infinitamente flexible pero extremadamente detallado.

Un lenguaje poderoso es un lenguaje que le permite decir muchas cosas diferentes con la menor cantidad de longitud posible.

3
Mark Canlas

Una vez que llegas a Turing completo (y es fácil para un idioma hacer esto), "poder" no significa mucho, en el sentido de que todo lo que puedes decir en un idioma completo de Turing lo puedes decir en otro. Respuesta de Mark Canlas lo clava: la brevedad y la flexibilidad hacen la diferencia.

Dicho esto, el artículo de Matthias Felleisen Sobre el poder expresivo de los lenguajes de programación es una lectura interesante. En él intenta formalizar la noción de expresividad en los idiomas.

1
Frank Shearar

Parece haber un gran desacuerdo sobre lo que constituye el poder lingüístico. ¿Es brevedad, legibilidad, adaptabilidad o simplemente la integridad de Turing? Creo que todos estos factores entran en juego, por lo que quizás la mejor manera de verlo es en términos de estadísticas. Sí, estoy hablando de RPG de lápiz y papel, aquí.

La idea es que cada idioma tenga (aproximadamente) el mismo número de "puntos", que se pueden distribuir arbitrariamente en varias categorías. Para fines de discusión, digamos que los únicos factores son brevedad, legibilidad y flexibilidad. Un lenguaje puede ser extremadamente conciso y flexible, pero en consecuencia muy difícil de leer; o muy legible y flexible, pero extremadamente detallado.

(Podría decirse que la cantidad de puntos que un idioma debe distribuir está definida por la habilidad del diseñador y el implementador, pero supongamos que todos los diseñadores de idiomas son igualmente buenos en lo que hacen).

Cuando un diseñador de idiomas decide aumentar la fuerza de un idioma en una categoría, lógicamente le quita una fracción de esa fuerza potencial a todas las demás categorías. Es por eso que a menudo se dice que el diseño del lenguaje de programación tiene que ver con compensaciones. Desde este punto de vista, el poder general de un idioma es aún no definible, y tenemos que volver al método probado y verdadero de categorizar idiomas basados en sus fuerzas relativas. ¿No es satisfactorio? Demasiado.

Puede argumentar de dos maneras: que un lenguaje poderoso es uno con una distribución de puntos relativamente uniforme (jack of all trades, master of none), o con tantos puntos como sea posible en un área sin dejar otros desatendidos (especialista). No existe el lenguaje de "hombre renacentista", con dominio perfecto en numerosos campos. Y si esa es su definición del lenguaje más poderoso posible, entonces simplemente no tiene suerte.

Para leer más, este artículo (casualmente también por Paul Graham, quien parece tener opiniones encontradas) toca la idea de que, aunque difícil puede ser determinar cómo , los lenguajes de programación varían en potencia. Él argumenta de manera bastante persuasiva que es muy fácil ver cómo un lenguaje es menos poderoso que el preferido (le falta la característica X), pero es muy difícil ver cómo un lenguaje genuinamente más poderoso es, de hecho, es básicamente equivalente al lenguaje X, pero con un montón de otras cosas arrojadas. Te dejo con una cita de ese periódico:

Por inducción, los únicos programadores que están en condiciones de ver todas las diferencias de poder entre los distintos idiomas son aquellos que entienden el más poderoso. (Esto es probablemente lo que Eric Raymond quiso decir sobre que LISP lo convierte en un mejor programador). No puede confiar en las opiniones de los demás, debido a la paradoja de Blub: están satisfechos con el lenguaje que usan, porque dicta el cómo piensan sobre los programas.
1
Jon Purdy

Los lenguajes de programación son herramientas, nada más y nada menos. Algunas herramientas son extremadamente especializadas y adecuadas para fines particulares; otros se generalizan y simplifican hasta el punto de casi inutilidad.

Yo diría que el lenguaje más "poderoso" es el que le permite alcanzar sus objetivos con una inversión mínima de tiempo, energía y otras investigaciones; es decir, el lenguaje que proporciona el mayor ROI. En algunas situaciones podría ser C; en otros, Java; en otros más, Haskell.

Lo mejor sería familiarizarse con una amplia variedad de idiomas y para qué son útiles. Luego, cuando llegue el momento de comenzar un nuevo proyecto, puede tomar una decisión informada sobre cuál sería el más apropiado.

0