Los lenguajes funcionales como Haskell, LISP o Scheme permiten que un programador trabaje rápidamente utilizando el paradigma de programación funcional . Tienen sus ineficiencias , pero mi aplicación pone más énfasis en la eficiencia del programador que en la eficiencia del programa en sí.
Me gustaría usar la programación funcional en un microcontrolador para controlar la máquina, etc.
¿Qué limitaciones existen, como los recursos mínimos del sistema?
¿Qué implementaciones de ejemplo de estos lenguajes están disponibles?
ARMPIT SCHEME es un intérprete para el lenguaje Scheme (dialecto de Lisp con alcance léxico) que se ejecuta en microcontroladores RISC con núcleo ARM. Se basa en la descripción del Informe revisado sobre el esquema de lenguaje algorítmico (r5rs), con algunas extensiones (para E/S) y algunas omisiones (para caber en la memoria de MCU). Además, está diseñado para soportar multitarea y multiprocesamiento. Se espera que Armpit Scheme se adapte bien a entornos educativos, incluidos proyectos de estudiantes en cursos sobre control e instrumentación, o cursos de diseño final donde se necesitan microcontroladores. Está destinado a enriquecer el espectro de lenguajes interpretados disponibles para MCU (p. ej., BASIC y FORTH) y puede ser una alternativa a los intérpretes de bytecode basados en MCU (p. ej., para Scheme o Java) y a los lenguajes compilados (p. ej., C).
http://armpit.sourceforge.net/
Tu dices:
Usar C, C++, ensamblaje, etc. es bastante ineficiente en comparación con lenguajes como Haskell, LISP o Scheme
El uso de lenguajes de alto nivel es un uso más eficiente del tiempo del programador, pero a menudo puede ser un uso menos eficiente de los recursos informáticos. Para los sistemas integrados fabricados en volumen, el costo y el rendimiento suelen ser una prioridad mayor que el esfuerzo de desarrollo.
También puede programar controladores AVR con Haskell usando Atom/Copilot, por ejemplo http://leepike.wordpress.com/2010/12/18/haskell-and-hardware-for-the-holidays/
C, C++ y Assembly están muy cerca del lenguaje de máquina. Al usar un lenguaje de nivel superior, está agregando una sobrecarga adicional a cambio de un desarrollo más rápido/más fácil/etc.
He estado programando una placa ARM en Python recientemente y creo que es genial. No es bueno para el control en tiempo real, pero estoy haciendo más cosas relacionadas con la web, lo que es mucho más agradable en un lenguaje de alto nivel que en C.
La mayoría de los microcontroladores siguen siendo dispositivos de 8 y 16 bits (aunque esto está cambiando lentamente). Las dos instancias de lenguajes de nivel superior (Scheme y Python) mencionados en otras respuestas hasta ahora se ejecutan en núcleos ARM de 32 bits. Los dispositivos más pequeños de 8 y 16 bits (que pueden costar solo un par de dólares) no tienen suficiente RAM para admitir los idiomas que se mencionan; por lo general, solo tienen unos pocos KB de RAM.
Además, estos lenguajes de alto nivel no están diseñados para escribir controladores de interrupción de baja latencia y similares. No es inusual que un controlador de interrupciones de microcontrolador sea llamado cientos o miles de veces por segundo, y cada vez se requiera que realice su tarea en decenas de microsegundos o menos.
Es posible hacer algo de programación funcional con el lenguaje Lua. Realmente, Lua es un lenguaje multiparadigma; Wikipedia afirma que es un lenguaje 'scripting, imperativo, funcional, orientado a objetos, basado en prototipos'. El lenguaje no impone un solo paradigma, sino que es lo suficientemente flexible como para permitir que el programador implemente cualquier paradigma aplicable a la situación. Ha sido influenciado por Scheme.
Las características de Lua incluyen funciones de primera clase , alcance léxico y cierres y rutinas , que son útiles para la programación funcional. Puede ver cómo se utilizan estas características en la wiki de usuarios de Lua, que tiene una página dedicada a la programación funcional . También encontré este proyecto de Google Code , pero no lo he usado (afirma estar influenciado por Haskell, otro idioma que mencionaste).
eLua es una implementación que está disponible configurada para varias placas de desarrollo para las arquitecturas ARM7TMDI, Cortex-M3, ARM966E-S y AVR32, y es de código abierto para que pueda configurarla para su propia plataforma. Lua está implementado en ANSI C y la fuente completa pesa menos de 200 kB, por lo que debería poder compilarlo para la mayoría de las plataformas con un compilador C. Se recomiendan al menos 128k de Flash y 32k de RAM. Estoy trabajando en un puerto PIC32 para él (aunque todavía en la etapa 'Obtener la placa PIC32') en este momento.
Lo mejor de Lua es que fue diseñado como un lenguaje de unión, por lo que es muy fácil escribir extensiones de C para las cosas que deben ser rápidas (como interrupciones, etc.) y usar las funciones dinámicas e interpretadas del lenguaje para hacer rápido desarrollo en la lógica del programa.
Lua no es un lenguaje puramente funcional, pero puede hacer mucha programación funcional en él, es rápido y pequeño ( en comparación con otros lenguajes de secuencias de comandos ), y no necesita volver a actualizar su dispositivo para probar un programa. ¡Incluso hay un intérprete interactivo!
"¿Hay formas de hacer programación funcional con un lenguaje funcional en una MCU para resolver problemas difíciles?"
Sí, hay maneras. Pero la desventaja es que necesita un procesador de 32 bits, MMU, 128 MB de RAM, SSD, un RTOS y $$$.
Los microcontroladores son diferentes a los microprocesadores. El microcontrolador puede ser solo una CPU de 8 bits, 1K de RAM, 8K de ROM, pero tiene UART, PWM, ADC, etc. incorporados. Y solo cuesta $1.30.
Por lo tanto, podría ejecutar todos esos lenguajes de alto nivel, pero cuesta mucho más hacerlo.
Este libro proporciona una forma de programar con una ligera sensación de FP. http://www.state-machine.com/psicc2/
Pero la FP real requiere tener la capacidad de construir funciones en tiempo de ejecución y pasarlas a través de su programa. Aquí tenemos un problema: ¿cómo podemos representar esta función construida? y ¿cómo podemos ejecutar efectivamente esta función? En un sistema grande, podemos usar compilación dinámica que genera código de máquina real en una aplicación de primera función. En MCU solo tenemos RAM para implementar compiladores muy primitivos como el núcleo del lenguaje Forth.
La única forma en que puede usar FP u OOP si lo prefiere es la metaprogramación : escriba programas complejos funcionales/OOP que generen programas para MCU (código fuente C, por ejemplo, o LLVM IL). En esta variante, no está limitado por el paradigma o la complejidad de los métodos de programación.
kevin vermeer
kevin vermeer
nick t
Kortuk
kevin vermeer
Kortuk
J. Polfer
kevin vermeer
kevin vermeer
J. Polfer
Kellenjb
Kellenjb