诸如Haskell,LISP或Scheme之类的功能语言使程序员可以使用功能编程范例来快速工作。它们确实有效率低下的问题,但是我的应用程序比程序本身的效率更加强调程序员的效率。
我想在微控制器上使用函数式编程来进行机器控制等。
有哪些限制,例如最少的系统资源?
这些语言有哪些示例实现?
诸如Haskell,LISP或Scheme之类的功能语言使程序员可以使用功能编程范例来快速工作。它们确实有效率低下的问题,但是我的应用程序比程序本身的效率更加强调程序员的效率。
我想在微控制器上使用函数式编程来进行机器控制等。
有哪些限制,例如最少的系统资源?
这些语言有哪些示例实现?
Answers:
ARMPIT SCHEME是Scheme语言(Lisp的词法范围的方言)的解释器,该语言在具有ARM内核的RISC微控制器上运行。它基于对算法语言方案(r5rs)的修订报告中的描述,具有一些扩展名(用于I / O)和一些省略项(以适合MCU内存)。它被进一步设计为支持多任务和多处理。腋窝计划预计将非常适合教育环境,包括控制和仪器课程的学生项目,或需要微控制器的顶点设计课程。它旨在丰富可用于MCU(例如BASIC和FORTH)的解释语言的范围,并且可以替代基于MCU的字节码解释器(例如,用于Scheme或Java)和编译语言(例如,C)。
http://armpit.sourceforge.net/
你说:
与Haskell,LISP或Scheme之类的语言相比,使用C,C ++,汇编等的效率很低
使用高级语言可以更有效地利用程序员的时间,但通常可能不那么有效地利用计算资源。对于批量生产的嵌入式系统,成本和性能通常比开发工作具有更高的优先级。
您还可以使用Atom / Copilot使用Haskell对AVR控制器进行编程,例如http://leepike.wordpress.com/2010/12/18/haskell-and-hardware-for-the-holidays/
C,C ++和Assembly都非常接近于机器语言。通过使用高级语言,您将增加额外的开销,以换取更快/更容易的/ etc开发。
大多数微控制器仍然是8位和16位设备(尽管这种情况正在慢慢改变)。到目前为止,其他答案中提到的两种高级语言实例(Scheme和Python)都在32位ARM内核上运行。较小的8位和16位设备(可能只需要花费几美元)就没有足够的RAM来支持所提到的语言-通常,它们只有几KB的RAM。
同样,这些高级语言也不是为编写低延迟中断处理程序等而设计的。微控制器的中断处理程序每秒被调用数百次或数千次,每次执行任务所需的时间都在数十微秒或更短的时间内,这种情况并不罕见。
可以使用Lua语言进行一些功能编程。实际上,Lua是一种多范式语言。维基百科声称它是一种“脚本,命令式,功能性,面向对象,基于原型的”语言。该语言不执行单一范例,而是足够灵活以允许程序员实施适用于该情况的任何范例。受方案影响。
Lua的功能包括 一流的函数,词法作用域,闭包和协程,这些对函数式编程很有用。您可以在Lua用户Wiki上看到如何使用这些功能,该页面有一个专门介绍函数式编程的页面。我也遇到了这个Google Code项目,但是我没有使用过它(它确实受到了您提到的另一种语言Haskell的影响)。
eLua是一种实现,可以为许多用于ARM7TMDI,Cortex-M3,ARM966E-S和AVR32架构的开发板进行配置,并且是开源的,因此您可以针对自己的平台进行配置。Lua是在ANSI C中实现的,整个源的重量不到200kB,因此您应该能够使用C编译器为大多数平台构建它。建议至少使用128k Flash和32k RAM。目前,我正在为此使用PIC32端口(尽管仍处于“获取PIC32电路板”阶段)。
Lua的伟大之处在于它被设计为一种粘合语言,因此为需要快速处理的东西(如中断等)编写C扩展非常容易,并使用该语言的动态,解释功能来快速完成在程序逻辑中发展。
Lua并不是一种纯粹的功能语言,但是您可以使用它进行大量的功能编程,它既快速又小巧(与其他脚本语言相比),并且您无需重新刷新设备即可试用程序。甚至还有一个互动翻译!
“有没有办法在MCU上使用功能语言进行功能编程来解决难题?”
是的,有办法。但缺点是您需要32位处理器,MMU,128MB RAM,SSD,RTOS和$$$。
微控制器不同于微处理器。该微控制器可能只是一个8位CPU,1K RAM,8K ROM,但是它具有内置的UART,PWM,ADC等。它的价格仅为1.30美元。
因此,您可以运行所有这些高级语言,但制作成本要高得多。
本书提供了一些在FP的情况下进行编程的方法。 http://www.state-machine.com/psicc2/
但是,真正的FP需要具有在运行时构造函数并将其传递给整个程序的能力。这里有一个问题:我们如何表示此构造函数?以及我们如何有效执行此功能?在大型系统上,我们可以使用动态编译在第一功能应用程序上生成真实的机器代码。在MCU上,我们只有RAM来实现非常原始的编译器,例如Forth语言内核。
如果愿意,可以使用FP或OOP的唯一方法是元编程:编写复杂的功能/ OOP 程序,这些程序会为MCU生成程序(例如C源代码或LLVM IL)。在此变体中,您不受范式或编程方法复杂性的限制。