在小内存中运行的可用交互式语言都有哪些? [关闭]
Posted
技术标签:
【中文标题】在小内存中运行的可用交互式语言都有哪些? [关闭]【英文标题】:What are the available interactive languages that run in tiny memory? [closed]在小内存中运行的可用交互式语言有哪些? [关闭] 【发布时间】:2010-11-08 03:20:38 【问题描述】:我正在寻找通用的编程语言
具有交互式(实时编码)提示 单独使用 32 KB 的 RAM,或者当编译器托管在单独的机器上时使用 8 KB 在总内存只有 8-32 KB 的微控制器上运行(没有 MMU)。以下是我目前的清单,我缺少什么?
Python:PyMite VM 需要 64K 闪存、8K RAM。以 8K 或更多分辨率为目标的 LPC、SAM7 和 ATmegas。托管。 Lua:eLua 常见问题解答建议使用 256K 闪存、64K RAM。 FORTH:amforth 在 ATmega 上需要 8K 闪存、150 字节 RAM、30 字节 EEPROM。 方案:armpit Scheme 最小的目标是具有 32K 闪存、4K SRAM 的 LPC2103。 C:Interactive C 在 68HC11 上运行,没有闪存和 32K SRAM。托管。 C:picoc 一个开源的、交叉编译的、交互式的 C 系统。为 AVR 编译时,需要 63K 闪存、8K RAM。可以通过努力将表保存在闪存中来减少 RAM。 C++:AngelScript 一种开源的、基于字节码的、类似 C/C++ 的脚本语言,具有简单的本地调用。 Tcl:TinyTCL 在 DOS 上运行,60K 二进制文件。看起来很容易移植。 BASIC:TinyBasic:初始化为 64K 堆,可能是可调的。 Lisp PostScript:(我还没有找到低内存的 FOSS 实现) Shell:bitlash:Arduino (ATmega) 的交互式命令外壳。另见AVRSH。【问题讨论】:
您提到的第四个系统似乎只需要 8k 闪存,但您将其列为 128k。我错过了什么吗? 1) FORTH impl 的 Flash/RAM 编号。用于指定的处理器。 2) 我不知道*** 中有一个社区wiki。我会调查的。 用于嵌入式编程的 Tcl 有多个版本:wiki.tcl.tk/1363 一个有趣的问题。作为一名嵌入式程序员,我很好奇您为什么要在嵌入式系统上运行交互式提示。除了“neato”因素之外,就是这样。只要我的嵌入式系统连接到 PC,我就会尝试在 PC 中进行尽可能多的处理,并在嵌入式设备中使用最少的代码。一般来说,在 PC 上用代码实现特定功能比在嵌入式系统中更容易。 我在大学的机器人选修课中使用了 Interactive C。我在 6 周内通过交互式提示了解了更多关于 C 的知识,这比我在 C 实验室的整个学期中学到的更多。自 1996 年以来我一直在编程 Python,它的交互式提示让我在 2 天内学习了这门语言(达到了我需要做的事情的地步)。所以我相信交互式语言非常适合学习和快速原型制作。最后,我是 PyMite 的首席开发人员,因此我正在寻找对等语言的示例,并尽可能地向他们学习。 【参考方案1】:问题或答案列表中的所有语言都不能满足超简单编译和集成到现有微控制器项目的要求(披露:我实际上并没有尝试每一个建议) .
我发现 tinyscript 是一个单独的 .c
+.h
文件,它与我项目中的其余源文件一起编译,唯一需要的额外配置是提供一个可以为空的 void outchar(int c)
如果您不需要脚本的输出。
对我来说,执行速度远没有易于构建和集成以及与 C 互操作重要,因为我的用例主要只是按顺序调用一些 C 函数。
【讨论】:
【参考方案2】:我建议使用 python。但是现在唯一的问题是内存开销对吗?因此,对于以后可能会遇到此问题的人,我有一个好主意。
首先,编写一个 bf 解释器(或者只是从某个地方获取源代码)。口译员将非常小。 bf 也是图灵完备的语言。现在您需要在 python 中编写代码,然后使用 bfpy(https://github.com/felko/bfpy/blob/master/README.md) 将其转译为 bf。我已经为您提供了开销最少的解决方案,我很确定 bf 解释器将轻松保持在 10KB 的内存使用量以下。
【讨论】:
【参考方案3】:还有 javascript,通过Espruino。
这是专门为微控制器构建的,并且有针对各种不同芯片(主要是 STM32)的构建,可将整个系统装入低至 8kB 的 RAM。
【讨论】:
【参考方案4】:我会推荐 MY-BASIC,运行在至少 8 KB RAM 中,并且易于移植。
【讨论】:
【参考方案5】:您缺少 EmbedVM、主页here、svn repo here。记得查看首页上的两个 [1,2] 视频;)
来自主页:
EmbedVM 是用于微控制器的小型可嵌入式虚拟机 具有类 C 语言前端。已通过 GCC 和 AVR 测试 微控制器。但是由于虚拟机相当简单 应该很容易将其移植到其他架构。
VM 模拟一个 16 位 CPU,可以访问高达 64kB 的内存。它 只能对 16 位值和 16 位和 8 位值的数组进行操作。 不支持复杂的数据结构(结构、对象、 等等。)。一个函数最多可以有 32 个局部变量和 32 个 论据。
除了虚拟机的内存之外,还有一个保存虚拟机状态的小结构 以及 EmbedVM 函数在 堆栈对 VM 没有额外的内存要求。 尤其是 VM 不依赖于任何动态内存管理。
EmbedVM 针对大小和简单性进行了优化,而不是执行速度。这 VM 本身在 AVR 上占用大约 3kB 的程序内存 微控制器。在以 16MHz 运行的 AVR ATmega168 上,VM 可以 每毫秒执行大约 75 条 VM 指令。
VM 完成的所有内存访问都是使用用户回调进行的 职能。因此,可以将部分或全部 VM 内存打开 外部存储设备、闪存等或“内存映射”硬件 VM 的功能。
编译器是一个 UNIX/Linux 命令行工具,它读取 *.evm 文件并生成各种格式的字节码(二进制文件,intel hex, C 数组初始值设定项和特殊的调试输出格式)。它也是 生成可用于访问 VM 中数据的符号文件 来自主机应用程序的内存。
类 C 语言如下所示:http://svn.clifford.at/embedvm/trunk/examples/numberquizz/vmcode.evm
【讨论】:
【参考方案6】:Wren 符合您的标准——默认情况下,它配置为仅使用 4k 的 RAM。 AFAIK 它没有看到任何实际用途,因为我写它的那个人决定他根本不需要完全在目标系统上运行的解释器。
该语言受 ML 和 Forth 的影响最为明显。
【讨论】:
【参考方案7】:一些 AVR 解释器/VM:
-
http://www.cqham.ru/tbcgroup/index_eng.htm
http://www.jcwolfram.de/projekte/avr/chipbasic2/main.php
http://www.jcwolfram.de/projekte/avr/chipbasic8/main.php
http://www.jcwolfram.de/projekte/avr/main.php
http://code.google.com/p/python-on-a-chip/
http://www.avrfreaks.net/index.php?module=Freaks%20Academy&func=viewItem&item_id=688&item_type=project
http://www.avrfreaks.net/index.php?module=Freaks%20Academy&func=viewItem&item_id=626&item_type=project
http://www.avrfreaks.net/index.php?module=Freaks%20Academy&func=viewItem&item_id=460&item_type=project
http://www.harbaum.org/till/nanovm/index.shtml
【讨论】:
【参考方案8】:你可以看看非常强大的 AvrCo Multitasking Pascal for AVR。您可以在http://www.e-lab.de 试用。 MEGA8/88版本是免费的。有大量带有 JTAG 调试器的驱动程序和模拟器,以及所有标准设备(LCDCHAR、LCDGRAPH、7SEG、14SEG、LEDDOT、KEYBOARD、RC5、SERVO、STEPPER...)的实时或模拟可视化。
【讨论】:
【参考方案9】:我听说 CHIP-8、XPL0、PicoC 和 Objective Caml 已被移植到图形计算器。 ***“Lego Mindstorms”文章列出了一堆据称在 Lego RCX 或 Lego NXT 平台上运行的编程语言。 它们中的任何一个都符合您的“实时编码”标准吗?
您可能想查看 Forth wiki 上的其他微控制器 Forths。它为 Atmel AVR 列出了至少 4 个 Forth:amforth(您已经提到过)、PFAVR、avrforth 和 ByteForth。 (这些解释器的链接以及这个 *** 问题都包含在“Embedded Systems”wikibook 中)。
【讨论】:
【参考方案10】:二郎 - http://erlang.org/
它可以容纳 2MB
http://www.experts123.com/q/is-erlang-small-enough-for-embedded-systems.html
【讨论】:
2mb 是他可用的全部内存大小的 30 倍以上!【参考方案11】:序言 - http://www.gprolog.org/
根据谷歌搜索“prolog small”,通过避免链接内置谓词,可执行文件的大小可以变得非常小。
【讨论】:
【参考方案12】:您考虑过port in C 中的Tiny Basic 吗?或者,也许将UCSD Pascal p-machine 从 Z-80 重写为您的架构?
虽然说真的,JavaScript 会成为一种很好的嵌入式脚本语言,但我不知道 VM + GC 的最低内存要求是多少,也不知道删除操作系统依赖项有多么困难。不久前我玩过NJS,它可能满足您的需求。这个很有趣,因为编译器是用 JavaScript(自托管)编写的。
【讨论】:
【参考方案13】:我会推荐 LUA(或 eLUA http://www.eluaproject.net/ )。不久前,我已经将 LUA“移植”到了 Cortex-M3。在我看来,它的闪存大小为 60~100KB,需要大约 20KB 的 RAM 才能运行。我确实精简了基本要素,但根据您的应用程序,这可能就足够了。仍有优化空间,尤其是关于 RAM 要求,但我怀疑您是否可以在 8KB 中舒适地运行它。
【讨论】:
谢谢,但 eLua 项目已经在我的列表中(请参阅问题中的第二个项目符号)。【参考方案14】:一个自制的 Forth 运行时确实可以在很少的内存中实现。我知道有人在 1970 年代在 Cosmac 上制造了一个。核心运行时只有 30 字节。
【讨论】:
FORTH 已经列出。这是评论,不是答案。【参考方案15】:我在之前的工作中一直在 BlackFin 上使用busybox。
我们为它编译了 perl + php,在更改了 s/fork/vfork/g 之后,它工作得非常好……或多或少。没有 MMU 不是一个好主意。内存碎片很容易杀死服务器。我所做的只是:
for i in `seq 1 100`; do wget http://black-fin-ip/test.php; done
当我走向我的老板并告诉他服务器将在生产中死掉时它死了:)
【讨论】:
这个答案不被接受,因为 Perl 和 PHP 不能在少于 32 KB 的 RAM 中运行。没有 MMU 是必需的。我正在研究深度嵌入式系统; 32 KB 是系统中的总 RAM 量。【参考方案16】:您是否考虑过简单地使用busybox 提供的/bin/sh
?还是他们推荐的smaller scripting languages?
【讨论】:
我正在寻找在没有 MMU 的微控制器上运行并且具有如此小的 RAM (8K-32K) 以至于操作系统不合理的语言。我将编辑问题以使其更清楚。 ucLinux 没有 MMU 并且在微控制器上运行。它使用busybox。 @DoxaLogos:感谢您为我辩护,但我认为 ucLinix 不会在这么小的内存占用中运行。 (我一开始没有阅读。留下答案,因为它可能对其他人有用。)任何人都知道你可以编写一个支持 BB 的操作系统有多小?以上是关于在小内存中运行的可用交互式语言都有哪些? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章