zForth –适用于嵌入式系统的微型,可嵌入,灵活,紧凑的Forth

2021-01-15 20:05:13

Forth环境将编译器与交互式shell结合在一起,用户在其中定义并运行称为word的子例程。可以在输入源代码时测试,重新定义和调试单词,而无需重新编译或重新启动整个程序。所有语法元素(包括变量和基本运算符)均定义为单词。第四环境在结果程序的存储方式上有所不同,但理想情况下,运行程序与手动重新输入源具有相同的效果。

zForth是另一个Forth,但具有其他大多数版本所没有的一些特殊功能。请注意,zForth是为工程师而不是为语言纯粹主义者或Forth爱好者编写的。它的主要目的是成为一种轻量级脚本语言,用于在小型微处理器上扩展嵌入式应用程序。它的速度不是特别快,但是应该易于集成到具有几kB ROM和RAM的任何平台上。

对于许多程序员来说,Forth似乎属于异质语言领域:它看起来并不像大多数人所遇到的主流语言,它是建立在许多需要一定时间才能习惯的哲学基础上的。将解释器和编译器带到资源有限的平台的更有效方法。

小字典:字典不依赖于固定的单元格大小,而是在可变长度的单元格中编写:小数和普通数占用的空间较小,然后变大,从而节省了30%到50%的空间

可移植性:zForth用100%ANSI C编写,可在几乎所有操作系统和所有体系结构上运行。在x86 Linux / Win32 / MS-DOS(Turbo-C 1.0!),x86_64,ARM,ARM thumb,MIPS,Atmel AVR和8051上进行了测试。

占用空间小:内核C代码可以编译为大约3或4 kB的机器代码,具体取决于体系结构和所选的单元数据类型。

跟踪:zForth能够很好地跟踪其幕后工作,请参见以下示例。

VM:实现为小型虚拟机:不是最快的,但是安全又灵活。代替直接访问主机内存,抽象了第四个VM内存,从而可以对内存访问和堆栈操作进行适当的边界检查。

灵活的数据类型:在编译时,用户可以自由选择应将哪种C数据类型用于字典和堆栈。 zForth支持从16到128位的有符号整数大小,但还可以与浮点类型(例如float和double)(甚至是C99' complex'类型!)无缝兼容。

轻松接口:通过主机系统调用原语轻松地从C进行调用,并且代码可以访问堆栈以在Forth和C之间交换数据。从C进行调用很容易,只有一个函数可以评估第四代码。

./forth:zforth核心库以及各种片段和示例。/src/zforth:zfort核心源代码;将它们嵌入到您的程序中。/src/linux:示例Linux应用程序。/src/atmega8:示例AVR atmega8应用程序

zForth仅包含两个文件:zforth.c和zforth.h。将两者都添加到您的项目中,并在初始化期间调用zf_init()和zf_bootstrap()。从文件或终端中读取语句,并将字符串传递给zf_eval()以解释,编译和运行代码。有关详细信息,请查看zforth.h中的嵌入式文档。

zforth.c取决于用于配置的许多预处理程序常量,您可以选择这些常量以满足您的需求。文档包含在文件zfconf.h中。

这里提供了一个在Linux上运行zForth的演示应用程序,只需运行maketo build。

:皮3.141592654 :: 0演示PI不要犯罪。 PI 10 / +循环:演示

包括来回/ mandel.zf ......................... ---- ............... ...........................---- + --................ * .............................-- -................. ..............................- --..... - ...... ................ ---- ........--%---------.......... .................-------------#---------.......... ..................------------ ---------........... .................------------ ---------............ .................---------的--------.............. ..............--------- O = ----------------------... ..........---- 0-∞O = - = --------------.............-- ---- *#------------.............-------- = - = O - = ---- ----...........-------------- = = ---------.......... ....------------- + + ---------................------ ------- =#=%-----------................-------- = - - = --------..............------ = = ------------.....--- O = = = ---------------- ----------------- + +○○---------- ------- ----------- O = = = =##=#=#= ---- --- = = = - + + - O == OO * == - = * = O = ------------ = ----------------- =#=#------ - ------------ %% ------.... ...---- --- = =% - =#= ----..... .......--- = O ---- * = * + --------- + * - * ---- O = ----....... ...... -------------------------------------- ....

zForth可以冗长它编译和运行代码的痕迹写。为了enabletracing,与./zforth ComDleW参数运行。跟踪可以在运行中启用timeby在跟踪变量写入1。

堆栈操作的前缀为双箭头,“手段弹出,»手段push.for操作上返回堆栈的箭头前缀的R

testr»0 [试验/ 0326] 0326 0001┊(点亮)»5 0328 031C┊价格/ 031Cř»810 031C 000B┊┊(DUP)«5»5»5 031d 0007┊┊(*)«5«5» 25 031E 0000┊┊(出口)R«810 0133 032A┊./0133ř»812 0133 0001┊┊(点亮)»1 0135 0019┊┊(SYS)«1«0136 25 0000┊┊(出口)R«812 0000┊032C(出口)R«0 25

:Dup的价格*,R»0 / 002C] 0003┊002C(002C :)┊0003(:) ===创建'&#39价格:0314 0313 0006¹²02eb 0316 0000 S& #39,#39&平方; === 002D 0000┊(出口)R«0 + 031C 000B¹+ DUP + 031d 0007¹+ R *»0 0031 0004┊()+ 031E 0000¹+ [/ 0031。]出口=== 0032 0000┊(出口)R«0:5方检验。 ; R»0 / 002C] 0003┊002C(002C :)┊0003(:) ===创建'测试' 0004 + 031f¹²0322 0320 0313 0000 S'试验& #39:[/ 0031] 0000┊=== 002D(出口)R«0 0326 0001¹+点亮+ 0327 0328 0005¹²031C +正方形+ 032A 0133²+吐痰»0 0031 0004┊(; )+ 032C + 0000¹0032 0000 ===出口┊(出口)R«0