¿Qué hace que un lenguaje esté "optimizado" para una tarea específica?

15

A menudo hay lenguajes de programación especializados para tareas específicas. Algunos lenguajes de programación son excelentes en la aritmética de matrices (como las matrices y el uso de matrices multidimensionales), sin embargo, algunos son mucho mejores en matemáticas de nivel superior que son difíciles de reproducir en otros lenguajes (pero aún así es posible).

¿Qué pasa con un idioma que lo hace mejor para una tarea específica o un objetivo final que otros idiomas, dado que la mayoría simplemente se compila para ensamblar?

Estoy hablando de los idiomas completos de Turing, que son equivalentes de Turing.

esote
fuente
1
Esta es una pregunta enciclopédica. Sugiero que lo desgloses de alguna manera, que sea más específico.
André Souza Lemos
55
¿Sería un error decir "marketing"?
corsiKa
2
@corsiKa Sí, creo que es más que una cuestión de marketing.
Jeremy West

Respuestas:

18

Hay algunas cosas a considerar:

  • Abstracción: ¿qué trata el lenguaje como "especial"? ¿Las matrices son valores de primera clase, como en Matlab, o los codifica usando tipos más simples como matrices, como en C? C te hace pensar en cómo se implementan las matrices, Matlab no.

    Del mismo modo, si tiene un sistema complicado de comunicaciones asíncronas, es probable que desee funciones de primera clase para poder realizar devoluciones de llamada.

    Cuantas más funciones se agreguen, más complejo se vuelve el lenguaje. Entonces, si bien hay algunos lenguajes "multi-paradigmáticos" como C ++ y D, la mayoría de los lenguajes escogen un nicho, eligen las cosas que son importantes para ese nicho y priorizan esos como sus abstracciones principales.

  • Rendimiento: toda abstracción tiene un costo, ya sea en tiempo de compilación o en tiempo de ejecución. Algunos lenguajes se limitan de una manera que los hace menos abstractos pero más dinámicos.

    Los primeros Fortran no permitían los punteros o la recursividad, por lo que fue excelente para el cálculo de números, más rápido que un lenguaje como C, donde ejecutaba muchos bucles. Pero fue terrible codificar grandes estructuras de datos, como árboles, donde necesitabas punteros para la indirección. (Tenga en cuenta que no sé mucho sobre Fortran moderno).

Esencialmente, siempre hay compensaciones. Más abstracto significa tiempo de ejecución más lento o más complejidad en tiempo de compilación. Más características significan un lenguaje más complejo. Algunas características hacen que ciertas cosas sean rápidas y otras lentas, como punteros y recursividad. No hay un idioma perfecto, por lo que cada idioma alcanzará una especie de máximo local en el espacio de las cualidades del idioma.

jmite
fuente
8

Las restricciones de algunos lenguajes facilitan la implementación de un código más rápido (por ejemplo, Fortran vs C y el alias de punteros) que es una compensación entre el rendimiento y las posibilidades listas para usar).

El lenguaje no está "optimizado" para tareas específicas, pero la implementación, los compiladores y las restricciones que facilitan la comprensión del código por compilador lo hacen. El verdadero negocio se trata de bibliotecas específicas, los algoritmos implementados para acelerar el proceso con interruptores dependiendo de la longitud del problema lo hacen óptimo.

Por ejemplo, la multiplicación usa varios casos (ver multiplicación GMP .

Cuando el lenguaje especifica las operaciones matemáticas de nivel superior, su implementación es óptima (eficiente en este caso), pero esa no es la parte de la especificación del lenguaje.

Eche un vistazo al cálculo de rango de matriz en Matlab, Mathematica y Maple (no puedo realizar todas las pruebas por mí mismo en este momento, pero estas son consistentes con mis pruebas). Todos estos lenguajes (entornos) implementan la misma operación de nivel superior, pero los detalles de implementación difieren, lo que da varias veces.

Cuando alguna tarea específica del dominio (aquí también el lenguaje específico del dominio) se orienta a cálculos particulares, se mejoran y optimizan (a lo largo de los años) para el público objetivo. Pero ser óptimo no siempre es el caso. Por ejemplo, Perl tiene una larga historia de manejo de cadenas, pero PCRE (aquí simplemente las expresiones regulares de Perl) no son las más rápidas existentes (y usan mucha memoria), pero son extremadamente expresivas y poderosas.

Las restricciones del lenguaje hacen una diferencia en el proceso de compilación, el alias de puntero mencionado evita la posibilidad de reordenamiento del código y obliga a recargar las variables.

Mal
fuente
99
La mayoría de los idiomas son Turing completos por especificación, ya que no todos especifican tamaños de direcciones fijas en sus especificaciones. Y es bastante limitante perder la distinción entre cosas como C, que son el tamaño de dirección del módulo Turing Complete, y cosas como Coq, Agda o System F, que no son Turing Complete en absoluto.
jmite
1
@jmite gracias. Espero que esto ya no esté ocultando las diferencias
Evil
@ Mal: ​​Bueno, creo que su afirmación acerca de los idiomas que no están optimizados para tareas es incorrecta. estás viendo la palabra optimizar desde el punto de vista de la computadora. Pero algunos lenguajes están diseñados para facilitarlo solo para el programador y dejar que los implementadores descubran cómo hacerlo funcionar.
theDoctor
Esto es desde el ángulo de eficiencia, por lo que no está mal, solo tomé este ángulo, podría considerar el otro (optimizado, lo que significa que es más fácil escribir algunas tareas específicas en él). "¿Qué pasa con un idioma que lo hace mejor para una tarea específica o un objetivo final que otros idiomas [...]", estoy seguro de que: más fácil de escribir, más rápido, más barato, etc. podría incluirse en el "mejor". El autor no aceptó alguna respuesta ni incluyó aclaraciones o comentarios de que alguna de las respuestas dadas no se trata de lo que se preguntó. Además de eso, es uno de los factores, para algunas personas más importantes que para otras
Evil
5

En mi opinión, esto puede formularse con bastante precisión: una herramienta (por ejemplo, un lenguaje de programación junto con sus bibliotecas estándar) es la herramienta óptima para una clase particular de problemas cuando minimiza, sobre todas las herramientas posibles que podrían emplearse, costo esperado de obtener una solución lo suficientemente correcta y eficaz, donde la expectativa se toma sobre alguna distribución de probabilidad dada sobre todos los problemas en la clase de problema. En su mayoría, este costo viene en forma de tiempo de programador e incluye el tiempo de diseño esperado, el tiempo de depuración esperado, el tiempo esperado necesario para educar a alguien que aún no está familiarizado con la herramienta, etc.

En la práctica, casi ninguna de estas cantidades puede medirse realmente. Aún así, creo que es la forma correcta de pensar sobre el problema.

j_random_hacker
fuente
4

Es una excelente pregunta y no es fácil de responder. ¿Hay algo sobre el lenguaje Erlang que lo haga adecuado para aplicaciones de telecomunicaciones en tiempo real? ¿O es algo sobre el compilador de Erlang? ¿O es algo sobre la comunidad y el ecosistema de Erlang? ¿Quizás es que las personas que saben cómo escribir aplicaciones de telecomunicaciones son expertas en Erlang, y las personas que conocen a Erlang son expertas en aplicaciones de telecomunicaciones? Sospecho que todos estos factores juegan un papel importante.

Probablemente hay dos características en Erlang que lo hacen adecuado para tales aplicaciones (advertencia: nunca he usado el lenguaje yo mismo): tiene un buen soporte para la concurrencia y soporte para la actualización dinámica del software. Esas características también serían útiles en muchas otras áreas, pero los ingenieros de telecomunicaciones son fanáticos del tiempo de actividad. Quizás si las personas que construyen sitios web estuvieran tan preocupadas por la alta disponibilidad como las personas que construyen centrales telefónicas, Erlang también sería popular allí.

Michael Kay
fuente
3

Las otras respuestas pierden el punto de optimizar un lenguaje para una tarea específica: no se trata solo de lo que hace que el código se ejecute más rápido en un hardware dado; se trata de cuán clara y sucintamente un lenguaje en particular le permite expresar la solución a un problema. Eso depende en gran medida del dominio del problema, y ​​(junto con el bombo publicitario, la ignorancia de las soluciones existentes y el viaje del ego de escribir un nuevo idioma) es la razón por la que tenemos múltiples idiomas: el objetivo es que el programador escriba menos código, lo que es menos propenso a errores y más fácil de leer / comprender / corregir / mejorar para el próximo programador.

Por ejemplo, tanto C como C ++ se pueden usar para la programación orientada a objetos, y de hecho, la biblioteca GObject es un buen ejemplo de OO C. La estructura AC que contiene punteros de función puede servir para el mismo propósito que los métodos virtuales en una clase C ++, y puede realizar mejor; la penalización de desarrollo es el código de pegamento para asignar memoria, inicializar los punteros de función y elegir una estrategia para llamar a los métodos 'principales'. La mayoría de las veces es más claro / seguro escribir Class klass * = new class()que struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ....

Phil Lello
fuente
Bueno, la respuesta de jmite proporciona puntos que faltan. Escribí sobre tareas específicas del dominio que están optimizadas para este asunto. Me gusta C, sé cosas como OCC, pero no hace que C Object Oriented (el compilador no ayuda con esto y se evitan muchas optimizaciones, no hay recolector de basura, etc.). No puede sobrecargar las funciones de C como en C ++, pero, por supuesto, puede emular cualquier comportamiento (jmite escribió sobre esto también). No veo cómo responde esto a la pregunta planteada.
Mal
2
@Evil: la programación orientada a objetos y el lenguaje de programación orientado a objetos son dos conceptos diferentes. La programación orientada a objetos no requiere un lenguaje orientado a objetos. Podría decirse que solo requiere la existencia de papel o pizarras blancas para que pueda hacer su diseño UML.
slebetman
@Slebetman No lo vi venir. Podría decirse que no necesita el papel y la pizarra, solo puede imaginar objetos, y según algunas personas, así es como pensamos, pero esto no se acerca más al soporte del lenguaje de los conceptos de OOP. Lo siento, pero esta es una disputa que no quiero elegir.
Mal
@ Mal: ​​no estoy tan seguro de poder hacer un seguimiento mental de todo esto sin alguna abstracción para ayudarte. Mi primer trabajo recibió un gran código C que parecía todos los arreglos con punteros de función (me tomó un tiempo entender qué significaba la sintaxis extraña, no google en ese entonces) y tuve problemas con eso hasta que comencé a ver un patrón y me di cuenta de que esas matrices eran objetos y esos punteros de función eran métodos. Me compré una pequeña pizarra y utilicé mucho papel A4, pero finalmente logré entender el código
slebetman el
1
@slebetman Dado que la programación orientada a objetos es anterior a UML por al menos 20 años, su afirmación de que los diseños UML son necesarios para la orientación de objetos parece ser completamente falsa.
David Richerby el