SequenceL es un lenguaje de programación funcional de propósito general y un compilador y conjunto de herramientas de paralelización automática ( computación paralela ) [ 2 ] cuyos principales objetivos de diseño son el rendimiento en hardware de procesador multinúcleo , la facilidad de programación, la portabilidad/optimización de la plataforma y la claridad y legibilidad del código. Su principal ventaja es que puede usarse para escribir código directo que explota automáticamente todo el poder de procesamiento disponible, sin que los programadores necesiten identificar paralelismos , especificar la vectorización , evitar condiciones de carrera y otros desafíos de los métodos de programación manual basados en directivas como OpenMP .
Los programas escritos en SequenceL se pueden compilar a código multihilo que se ejecuta en paralelo, sin indicaciones explícitas del programador sobre cómo o qué paralelizar. A partir de 2015Las versiones del compilador SequenceL generan código paralelo como una representación intermedia en C++ u OpenCL , lo que permite su compatibilidad con la mayoría de los lenguajes de programación más populares, como C , C++, C# , Fortran , Java y Python . Un entorno de ejecución específico de la plataforma gestiona los hilos de forma segura, proporcionando automáticamente un rendimiento paralelo en función del número de núcleos disponibles. Las arquitecturas de conjunto de instrucciones compatibles incluyen ARM , x86 y POWER8 .
Historia
SequenceL se desarrolló inicialmente a lo largo de un período de 20 años, a partir de 1989, principalmente en la Universidad Tecnológica de Texas . La financiación principal provino de la NASA , que originalmente quería desarrollar un lenguaje de especificación que fuera "autoverificable"; es decir, una vez escritos, los requisitos podrían ejecutarse y los resultados verificarse comparándolos con el resultado deseado.
El investigador principal del proyecto fue inicialmente Daniel Cooke, [ 3 ] a quien pronto se unieron Nelson Rushton (otro profesor de Texas Tech) y más tarde Brad Nemanich (entonces estudiante de doctorado bajo la dirección de Cooke). El objetivo de crear un lenguaje lo suficientemente simple como para ser legible, pero lo suficientemente inequívoco como para ser ejecutable, llevó a los inventores a optar por un enfoque de lenguaje funcional y declarativo , donde el programador describe los resultados deseados, en lugar de los medios para lograrlos. El lenguaje entonces tiene libertad para resolver el problema de la manera más eficiente que pueda encontrar.
A medida que el lenguaje evolucionó, los investigadores desarrollaron nuevos enfoques de computación, incluyendo consumir-simplificar-producir (CSP). [ 4 ] En 1998, la investigación comenzó a aplicar SequenceL a la computación paralela . Esto culminó en 2004 cuando tomó su forma más completa con la adición de la semántica normalizar-transponer (NT) , [ 5 ] [ 6 ] que coincidió con los principales proveedores de unidades centrales de procesamiento (CPU) haciendo un cambio importante a procesadores multinúcleo en lugar de continuar aumentando las velocidades de reloj. NT es el caballo de batalla semántico, que se utiliza para simplificar y descomponer estructuras, basado en una estrategia de ejecución tipo flujo de datos similar a GAMMA [ 7 ] y NESL. [ 8 ] La semántica NT logra un objetivo similar al de la eliminación de la plantilla repetitiva de Lämmel y Peyton-Jones. [ 9 ] [ 10 ] Todas las demás características del lenguaje se pueden definir a partir de estas dos leyes, incluyendo la recursión , las estructuras de subíndices, las referencias a funciones y la evaluación de cuerpos de funciones. [ 11 ] [ 12 ]
Aunque no era la intención original, estos nuevos enfoques permitieron que el lenguaje paralelizara una gran parte de las operaciones que realizaba, de forma transparente para el programador. En 2006, se desarrolló un prototipo de compilador autoparalelizable en la Universidad Tecnológica de Texas. En 2009, la Universidad Tecnológica de Texas cedió la propiedad intelectual a Texas Multicore Technologies (TMT) [ 13 ] para su posterior desarrollo comercial. En enero de 2017, TMT lanzó la versión 3, que incluye la edición comercial Professional Edition, y añadió una edición gratuita Community Edition para su descarga [ 14 ] .
Diseño
SequenceL está diseñado para ser lo más sencillo posible de aprender y usar, centrándose en el código algorítmico donde aporta valor; por ejemplo, los inventores optaron por no reinventar la E/S, ya que C la gestionaba bien. Como resultado, la referencia completa del lenguaje SequenceL tiene solo 40 páginas, con numerosos ejemplos, y su gramática formal cuenta con unas 15 reglas de producción. [ 5 ]
SequenceL es estrictamente evaluable (como Lisp ), estático tipado con inferencia de tipos (como Haskell ) y utiliza una combinación de operadores infijos y prefijos que se asemejan a la notación matemática estándar e informal (como C , Pascal , Python , etc.). Es un lenguaje puramente declarativo, lo que significa que un programador define funciones, en el sentido matemático, sin dar instrucciones para su implementación. Por ejemplo, la definición matemática de la multiplicación de matrices es la siguiente:
- El producto de la matriz m × p A con la matriz p × n B es la matriz m × n cuya entrada ( i , j ) es
La definición de SequenceL refleja esa definición más o menos exactamente:
matmul(A(2), B(2)) [i,j] := sea k := 1...tamaño(B); en suma( A[i,k] * B[k,j] );
Los subíndices que siguen a cada parámetro A y B en el lado izquierdo de la definición indican que A y B son estructuras de profundidad 2 (es decir, listas de listas de escalares), que aquí se consideran matrices. A partir de esta definición formal, SequenceL infiere las dimensiones del producto definido a partir de la fórmula para su entrada ( i , j ) (como el conjunto de pares ( i , j ) para los que se define el lado derecho) y calcula cada entrada mediante la misma fórmula que en la definición informal anterior. Nótese que no hay instrucciones explícitas para la iteración en esta definición, ni para el orden en que se deben realizar las operaciones. Debido a esto, el compilador SequenceL puede realizar operaciones en cualquier orden (incluido el orden paralelo) que satisfaga la ecuación de definición. En este ejemplo, el cálculo de coordenadas en el producto se paralelizará de manera que, para matrices grandes, escale linealmente con el número de procesadores.
Como se mencionó anteriormente, SequenceL no cuenta con construcciones integradas para entrada/salida (E/S), ya que fue diseñado para funcionar de forma aditiva con otros lenguajes de programación. La decisión de compilarlo a C++ multihilo y admitir más de 20 lenguajes del Generador de Interfaz y Envoltorio Simplificado ( SWIG ) (C, C++, C#, Java, Python, etc.) facilita su integración en flujos de diseño, capacitación y herramientas existentes. Puede utilizarse para mejorar aplicaciones existentes, crear bibliotecas multinúcleo e incluso crear aplicaciones independientes mediante la vinculación del código resultante con otro código que realice tareas de E/S. Las funciones de SequenceL también pueden consultarse desde un intérprete con entradas específicas, al igual que Python y otros lenguajes interpretados.
Normalizar-transponer
La principal construcción no escalar de SequenceL es la secuencia, que es esencialmente una lista. Las secuencias pueden anidarse a cualquier nivel. Para evitar el uso rutinario de la recursión, común en muchos lenguajes puramente funcionales, SequenceL utiliza un método denominado normalizar-transponer (NT), en el que las operaciones escalares se distribuyen automáticamente sobre los elementos de una secuencia. [ 15 ] Por ejemplo, en SequenceL tenemos
Esto no resulta de la sobrecarga del operador '+', sino del efecto de NT que se extiende a todas las operaciones, tanto integradas como definidas por el usuario. Como otro ejemplo, si f() es una función de 3 argumentos cuyos argumentos son escalares, entonces para cualquier x y z apropiados tendremos
La construcción NT se puede utilizar para múltiples argumentos a la vez, como por ejemplo:
También funciona cuando el argumento esperado es un no escalar de cualquier tipo T, y el argumento real es una lista de objetos de tipo T (o, en mayor generalidad, cualquier estructura de datos cuyas coordenadas sean de tipo T). Por ejemplo, si A es una matriz y X s es una lista de matrices [X 1 , ..., X n ], y dada la definición anterior de multiplicación de matrices, en SequenceL tendríamos
matmul(A,X s ) = [matmul(A,X 1 ),...,matmul(A,X n )]
Por regla general, los NT eliminan la necesidad de iteración, recursión u operadores funcionales de alto nivel para
- hacer lo mismo a cada miembro de una estructura de datos, o a
- procesar conjuntamente las partes correspondientes de estructuras de forma similar.
Esto suele explicar la mayoría de los usos de la iteración y la recursión.
Ejemplo: números primos
Un buen ejemplo que demuestra los conceptos anteriores sería encontrar números primos , que se definen como
- Un número entero mayor que 1, sin divisores positivos aparte de sí mismo y 1.
Así, un entero positivo z es primo si ningún número entre 2 y z - 1, ambos inclusive, es divisible de forma exacta. SequenceL permite programar este problema transcribiendo literalmente la definición anterior al lenguaje.
En SequenceL, una secuencia de los números desde 2 hasta z -1, ambos inclusive, es simplemente (2...( z -1)), por lo que se puede escribir un programa para encontrar todos los números primos entre 100 y 200:
prime(z) := z cuando ninguno(z mod (2...(z-1)) = 0);
Lo cual, en inglés, simplemente dice:
- ...devuelve el argumento si ninguno de los números entre 2 y 1 menor que el propio argumento, lo divide de manera uniforme.
Si no se cumple esa condición, la función no devuelve nada. Como resultado, ejecutar este programa produce
cmd:>prime(17) 17 cmd:>prime(18) vacío
La cadena "entre 100 y 200" no aparece en el programa. Normalmente, un programador la pasa como argumento. Dado que el programa espera un valor escalar como argumento, pasarle una secuencia de números hará que SequenceL realice la operación automáticamente en cada elemento de la secuencia. Como la función devuelve un valor vacío para los valores que no cumplen la condición, el resultado será la secuencia de entrada, pero filtrada para devolver solo aquellos números que satisfacen el criterio de ser primos.
cmd:>prime(100...200) [101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199]
Además de resolver este problema con un programa muy corto y legible, la evaluación de las secuencias anidadas por parte de SequenceL se realizaría completamente en paralelo.
Componentes
Los siguientes componentes de software están disponibles y cuentan con el soporte de TMT para su uso en la escritura de código SequenceL. Todos los componentes están disponibles en plataformas x86 que ejecutan Windows , macOS y la mayoría de las variantes de Linux (incluidas CentOS , RedHat , openSUSE y Ubuntu ), y en plataformas ARM e IBM Power que ejecutan la mayoría de las variantes de Linux .
Intérprete
Un intérprete de línea de comandos permite escribir código directamente en la consola o cargarlo desde archivos de texto preescritos. Este código se puede ejecutar y los resultados se pueden evaluar para comprobar su corrección o encontrar una solución rápida. También está disponible a través del popular entorno de desarrollo integrado (IDE) Eclipse . El código ejecutado en el intérprete no se ejecuta en paralelo; se ejecuta en un único hilo.
Compilador
Un compilador de línea de comandos lee el código de SequenceL y genera código C++ altamente paralelizado y vectorizado , y opcionalmente OpenCL, que debe vincularse con la biblioteca de tiempo de ejecución de SequenceL para su ejecución.
Tiempo de ejecución
El entorno de ejecución es un conjunto de bibliotecas precompiladas que trabaja con el código C++ paralelizado compilado para ejecutarse de forma óptima en la plataforma de destino. Se basa en Intel Threaded Building Blocks (TBB) [ 16 ] y gestiona aspectos como la optimización de la caché, la gestión de la memoria, el robo de colas de trabajo y la monitorización del rendimiento.
Complemento para el IDE de Eclipse con depurador
Un complemento del entorno de desarrollo integrado Eclipse proporciona funciones de edición estándar (agrupación de funciones, codificación cromática, etc.) y un entorno de depuración de SequenceL. Este complemento se ejecuta con el intérprete de SequenceL, por lo que no puede utilizarse para depurar el código multihilo; sin embargo, al proporcionar paralelización automática, la depuración del código SequenceL paralelo consiste en verificar la corrección del código SequenceL secuencial. Es decir, si se ejecuta correctamente de forma secuencial, debería ejecutarse correctamente en paralelo; por lo tanto, la depuración en el intérprete es suficiente.
Bibliotecas
Se incluyen diversas bibliotecas de funciones matemáticas y otras funciones estándar como código fuente de SequenceL para simplificar el proceso de programación y servir como ejemplos de buenas prácticas. Estas se pueden importar de forma similar a como se incluyen las bibliotecas de C o C++.
Véase también
Referencias
- ↑ "Licencias de SequenceL" . Texas Multicore Technologies, Inc. 25 de mayo de 2016. Archivado del original el 2 de febrero de 2017. Consultado el 26 de enero de 2017 .
- ↑ Andersen, Per H. (agosto de 2002). Un compilador paralelo para SequenceL . Bibliotecas de la Universidad Tecnológica de Texas (tesis doctoral). Lubbock, Texas, Estados Unidos . Recuperado el 27 de abril de 2026 .
{{cite thesis}}: CS1 mantenimiento: estado de la URL ( enlace ) - ↑ "Dr. Daniel Cooke en Texas Multicore Technologies" . Archivado del original el 4 de marzo de 2016. Consultado el 24 de febrero de 2016 .
- ↑ "Consumir-simplificar-producir (CSP)" (PDF) . Archivado del original (PDF) el 2 de febrero de 2017. Consultado el 26 de enero de 2017 .
- 1 2 Nemanich, Brad; Cooke, Daniel; Rushton, Nelson (2010), SequenceL: Transparencia y paralelismos multinúcleo (PDF) , Actas de DAMP '10 del 5.º taller ACM SIGPLAN sobre aspectos declarativos de la programación multinúcleo, Nueva York, NY, EE. UU.: ACM, págs. 45–52 , archivado del original (PDF) el 2 de febrero de 2017 , consultado el 26 de enero de 2017
- ↑ Cooke, Daniel; Rushton, Nelson; Nemanich, Brad; Watson, Robert G.; Andersen, Per (marzo de 2008), "Normalizar, transponer y distribuir: un enfoque automático para manejar números no escalares", ACM Transactions on Programming Languages and Systems , 30 (2): 1–49 , doi : 10.1145/1330017.1330020 , S2CID 6833254
- ↑ Banater, JP; Le Metayer, D. (enero de 1993), "Programación mediante transformación de multiconjuntos" (PDF) , Communications of the ACM , 36 (1): 98–111 , doi : 10.1145/151233.151242 , S2CID 17076396
- ↑ Blelloch, Guy (marzo de 1996), "Programación de algoritmos paralelos", Communications of the ACM , 39 (3): 85–97 , CiteSeerX 10.1.1.141.5884 , doi : 10.1145/227234.227246 , S2CID 12118850
- ↑ Lämmel, Ralf; Peyton-Jones, Simon (2003), "Descarta tu código repetitivo: un patrón de diseño práctico para la programación genérica", Actas de TLDI 2003
- ↑ Lämmel, Ralf; Peyton-Jones, Simon (2004), "Eliminar más código repetitivo: reflexión, zips y conversiones generalizadas", Actas de ICFP 2004
- ↑ Cooke, Daniel; Rushton, Nelson (enero de 1993), "Diseño de algoritmos iterativos y paralelos a partir de trazas de lenguajes de alto nivel", Actas de la 5.ª Conferencia Internacional sobre Ciencias Computacionales de ICCS'05 , vol. Parte III, págs. 891–894 , doi : 10.1007/11428862_132 , ISBN 978-3-540-26044-8
- ↑ Cooke, Daniel; Rushton, Nelson (27-30 de junio de 2005), "SequenceL: una visión general de un lenguaje sencillo", Actas de la Conferencia Internacional de 2005 sobre Lenguajes de Programación y Compiladores, PLC 2005
- ↑ Texas Multicore Technologies, Inc.
- ↑ Norton, Doug (16 de enero de 2017). "Texas Multicore Technologies anuncia el lanzamiento de una versión importante de SequenceL con paralelización automática" . PR Newswire . Cision US . Consultado el 27 de abril de 2026 .
{{cite web}}: CS1 mantenimiento: estado de la URL ( enlace ) - ↑ Cooke, Daniel; Rushton, Nelson (27-30 de junio de 2005), "SequenceL: una visión general de un lenguaje sencillo", Actas de la Conferencia Internacional de 2005 sobre Lenguajes de Programación y Compiladores, PLC 2005
- ↑ Intel Threaded Building Blocks (TBB)
Enlaces externos
- Sitio web oficial de Texas Multicore Technologies
- Por qué funciona SequenceL
- OpenMP comparado con SequenceL
- Características de SequenceL
- Descripción general: Paralelización automática patentada en SequenceL
- YouTube: Tecnologías Multicore de Texas
- Descargas gratuitas
- Recursos y formación para programadores
- Normalizar, transponer y distribuir: un enfoque automático para el manejo de variables no escalares.
- Patente estadounidense 8,839,212, Método, aparato y producto de programa informático para generar automáticamente un programa informático utilizando semántica de consumo, simplificación y producción con operaciones de normalización, transposición y distribución.
- Ejemplos de SequenceL en la wiki de Rosetta Code
- Lenguajes de programación de alto nivel
- Computación paralela
- lenguajes de programación de matrices
- Software multiplataforma
- lenguajes de programación declarativos
- Programación funcional
- Lenguajes funcionales
- Lenguajes de programación de tipado estático
- Computación heterogénea
- Lenguajes de programación concurrentes
- Software matemático
- Software de análisis numérico para Windows
- Software de análisis numérico para macOS
- Software de análisis numérico para Linux
- Álgebra lineal numérica
- Lenguajes de programación numérica
- Software numérico
- Software científico para Windows
- Software científico para macOS
- Software científico para Linux
- GPGPU