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.
programming-languages
esote
fuente
fuente
Respuestas:
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.
fuente
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.
fuente
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.
fuente
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í.
fuente
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()
questruct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ...
.fuente