Windows,Linux和MacOS的Swiftforth开发系统

2021-05-05 20:24:44

在此开发系统中,在Windows,Linux和MacOS中找到所有应用程序开发人员。访问本机系统功能很容易。第四个编程语言是这种全功能,交互式开发环境的高性能基础。

安装后,完整的Swiftforth文档(所有PDF格式;需要Adobe Reader)将位于Swiftforth / Doc目录中。该文件包括:

SwiftForth的全许可版本包括完整的源,包括内核,交互式开发环境(IDE)和所有功能。

SwiftForth还包括交叉编译器,它编译内核,因此您可以自定义内核以满足您的需求。

MacoS的命令行IDE:Mac OS x 10.6通过MacOS 10.14(需要32位库支持)

Swiftforth需要一个I386兼容的CPU。如果您正在寻找猎犬,覆盆子PI或其他嵌入式ARM Linux板的东西,请检查SWIFTX-ARM for Linux目标。

SwiftForth旨在产生最佳性能。本节介绍了第四虚拟机的实现,并将有兴趣地经历过重大的程序员。

SwiftForth是一个32位,子程序线程的系统,在Windows,Linux和MacOS下运行为用户应用程序。

子程序线程是一种实现策略,其中冒号定义中的引用被编译为子程序调用。 Swiftforth替换直接代码代替子程序调用,尽可能效率。

结肠和代码定义没有与定义本身的内容不同的代码字段;数据结构通常具有由对该数据类型的代码的呼叫组成的代码字段。在结肠定义结束时,传统出口被子程序返回(或尾递归)替换。

子程序线程实现的性质将其自身带到内联代码扩展。 SwiftForth通过具有标头标志来利用此目的,该标志指示在线或调用的单词是否被编译。编译器将自动内联inline字段设置的定义。许多内核级代码单词被标记为内衬。

SwiftForth在一个连续的平坦32位地址空间中运行。 Swiftforth是独立的位置,这意味着它可以在主机操作系统加载它的情况下运行,而无需跟踪它的位置。

通过独立定位,Swiftforth简化并加快了与主机环境的交互。此功能是子程序线程的自然结果,因为I386呼叫指令使用相对地址。第四执行令牌是相对于运行时内存空间的开始,但它们仅在内部使用并且不需要转换。返回地址的所有数据对象返回可以在不转换的情况下返回可以传递给主机操作系统的完整绝对地址,而无需转换。

Swiftforth字典可以容纳长度最多254个字符的字名。 WordList通过散列机制多线程,以加快字典搜索过程。 Swiftforth中的字列表可能有任何数量的线程;默认线程数为31。

SWIFTFORTHS于符合遵守实施,并包括HAYES遵从性测试套件的副本。除了标记过时的单词之外,核心,核心扩展,块,双数,例外,文件,文件访问,浮点,内存分配,编程工具,搜索顺序和字符串字符集。提供了符合Argument Order的符合条件的本地变量字。

对于文本文件,系统提供链接到任意外部编辑器。 POSINATE对文本和块文件完全支持,可将在命令窗口中显示源的一部分,以选择切换到外部编辑器。普通列表方法用于块文件。

提供了Postfix汇编程序和反汇编程序。汇编器支持所需的Intel定义操作集和寻址模式。除了参数的排序外,它与英特尔符号基本相同。结构化条件(如果,如果,那么)是实施的。

SwiftForth提供了与兼容的局部变量实现。 SwiftForth中的局部变量在返回堆栈上实例化。

SwiftForth包括对浮点数学的良好支持。使用硬件FP堆栈是可选的(例如,当您一次在堆栈上不需要超过大约六个或七个浮点值时,使用它最佳速度)。

SwiftForth包括ANS Forth Floating-Point Wordet,以及用于Trig,日志和指数函数的高级单词,以及用于定义和显示矩阵的单词。输入和显示格式可配置。

Swiftforth还包括整个索引科学图书馆,具有所需的兼容层。有关此库的内容的信息可以在https://www.taygeta.com/fsl/scilib.html中找到。

如前所述,Swiftforth使用内联的代码和尾部递归来提高效率。更广泛的优化由强大的基于规则的优化器提供,可以优化数百个常见的高级短语。通常启用此优化程序,但可以禁用用于调试或比较目的。

例如,考虑数字的定义,将小二进制数转换为可打印字符:

:数字(U - Char)DUP 9>如果7 +那么[char] 0 +;

使用优化器禁用,生成以下代码(使用swiftforth disassembler在此处显示):

查看Digit 47170F 4#EBP SUB 83ED04 471712 EBX 0 [EBP] MOV 895D00 471715 4#EBP SUB 83ED04 471718 EBX 0 [EBP] MOV 895D00 47171B 9#EBX MOV BB09000000 471720 403A8F(>)呼叫E86A23F9FF 471725 EBX EBX或09DB 471725 0 [ebp] ebx mov 8b5d00 47172a 4 [ebp] ebp lea 8d6d04 47172d 471744 jz 0f8411000000 471733 4#ebp sub 83ed04 471736 ebx 0 [ebp] mov 895d00 471739 7#ebx mov bb07000000 47173e 0 [ebp] ebx添加035d00 471741 4# EBP Add 83C504 471744 4#EBP SUB 83ED04 471747 EBX 0 [EBP] MOV 895D00 47174A 30#EBX MOV BB30000000 47174F 0 [EBP] EBX添加035D00 471752 4#EBP添加83C504 471755 RET C3

见Digit 47170F 9#EBX CMP 83FB09 471712 47171B JLE 0F8E03000000 471718 7#EBX ADD 83C307 47171B 30#EBX ADD 83C330 47171CE RET C3

当您输入命令窗口时,Swiftforth将等待处理您输入的内容,直到按Enter键。在按Enter键之前,您可以退格或使用左右箭头键来编辑命令行。通过先前命令行的缓冲区的上下箭头键页面。

Swiftforth命令行处理器还实现了选项卡完成。在键入几个字符之后按“键”重复键完成命令历史缓冲区中的匹配模式后,按此标签键。

您通过键入定位<名称>您在当前搜索顺序中查看当前搜索顺序中的任何单词的源。这将在出现单词的源中显示该行,其中几行以及源所在的文件以及显示的行的行号。这是一个例子:

找到单词C:\ tonkinc \ swiftforth \ src \ kernel \ parser.f 33:word(char" ccc" - c-addr)34:/ source over> r 2选择跳过下降R> - >在+! 35:/源跌落' tib @ - In> !!解析杜普In>细胞+! 36:这里c!在这里计算Cmove;

您可以调用您的链接编辑器 - 对于最近通过键入编辑来获取源最近显示的单词 - 通过键入编辑。编辑器将使用所选的正确源行启动和打开。

或者,您可以键入编辑< name>打开与名称定义的行中定位的编辑器。

Swiftforth提供了一种交叉引用工具,使您可以找到对单词的所有引用。要查找使用单词的所有位置,请键入:

这将显示名称定义的第一行,其次是在当前加载的代码中引用的每个源代码行。如果有多个具有相同名称的定义,则会在其中列出每个定义和分别引用。快捷方式:

做同样的事情。此命令与源搜索不同;它基于现在加载的代码。这意味着您将在您未使用的文件中进行任何名称的实例,并且可以看到重新定义及其各自的引用。

SwiftForth包括解索勒,其可用于从编译的定义生成人类可读源代码。这是有用的作为交叉检查,只要新的定义就预期工作,并且还显示Swiftforth的优化编译器的结果。通过拆卸定义,您可以确切地查看编译器生成的指令。

参见计时器47170F 45B2AF(计数器)呼叫E89B9BFeff 471714 0 [EBP] EBX SUB 2B5D00 471717 4#EBP添加83C504 47171A 40916F(U.)JMP E9507AF9FF

左列显示了分解的内存位置。这是该位置的指令(或数据)。请注意,DISOSSEMBLER尝试使用其地址匹配内存中的命名位置。右列显示内存中的实际字节。

简单的单步调试器允许您步浏览从源文件编译的代码。这是一个简单的例子:

[调试:2x(n1 - n2)dup +; :3x(n1 - n2)dup 2x +; :4x(n1 - n2)dup 2x交换2x +; :5x(n1 - n2)dup 3x交换2x +;调试]

假设此源已编译,您可以输入4个调试5x以输入单步调试循环。

在每个步骤中,使用突出显示的下一个单词显示源线。在此之后,将显示当前数据堆栈(以熟悉的.s格式)以及下一步的提示:

Swiftforth包括一个强大的面向对象的右图,称为俯冲。威盛提供面向对象编程的基本特征。

信息隐藏:对象拥有数据和方法无法在其类之外访问的能力。

继承:基于先前定义的(父)类来定义新类的能力。新课程自动拥有父母的所有成员;它可以添加或替换这些成员,或者定义延迟成员的行为。

多态性:不同子类别以不同方式响应相同信息的不同子类别的能力。例如,添加一对标量与添加一对向量不同。

Swiftforth对面向对象的编程的支持是广泛的强大的。以下简要的入门信息从Swiftforth参考手册中摘录。

点(下面定义)是一个简单的类,我们将作为俯冲的主要构建块示例。它演示了四种基本成员类型中的两个:数据和结肠。以下单词是类的名称;类和终端类之间的所有定义属于它。这些定义称为类别。执行类名时,它会在堆栈上留下其句柄(xt)。构造函数单词是此句柄的主要消费者。

类点变量x变量Y:show( - )x @。 y @。 ; :Dot( - )。"点AT"表演 ;终课

类定义本身不会分配任何实例存储;它只记录类别的每个实例需要多少存储。变量保留空间单元格并将其与成员名称相关联。

结肠成员显示和点就像常见的冒号定义,但仅在类型点的对象的执行上下文中有效。 x和y也表现得完全类似于右编程语言的正常变量。

数据成员包括所有数据定义。可用的数据成员定义单词包括创建(通常后跟与或c,或c,),缓冲区编译的数据:(长度在地址单位中指定的数组),变量,可变(单个char)或常量。

延迟成员是冒号的定义,其中默认行为可以在定义类时引用,但这可能具有由稍后定义的子类定义的替代行为。这些允许多态性和后期结合。

对象可能是静态或动态的。支持早期和后期结合。实例数据和方法是以在第四个开发环境的上下文中非常有效的方式实现的。

由于SwiftForth从一开始作为托管系统设计,因此,鉴于操作系统环境的固有复杂性,因此已经提供了对系统和库的界面和易于使用的界面。

Windows,Linux和MacOSare中的系统功能通过动态库机制提供给应用程序。 SwiftForth支持一个简单的库函数导入机制,基于C函数原型。

...姓名是(区分大小写)发布的函数名称,params表示传递给库函数的参数列表,并且(可选)结果是返回的值。在函数原型中描述的顺序在堆栈上提供参数,因此可以轻松地引用来自Forth程序的功能。

可以调用C-Prototype和Pascal-Prototype库功能; SwiftForth自动将参数堆栈传递给外部函数。可以通过别名机制来调用具有来自不同库的相同名称的函数。目前附加的库列表及其导入的功能可以随时显示在调试窗口中。

以下是从kernel32.dll导入Windows全局内存分配函数的示例:

回调是进入您程序的一个条目点。在某些情况下为操作系统提供调用,以将消息或信号传递给您的程序。

回调与其他编程环境中的中断相同,因为响应它的代码不会作为应用程序的顺序部分执行。在SWIFTFORTHS中,回调由瞬态“任务”处理,具有自己的堆栈和用户区域;它仅存在于回调函数的持续时间。回调可以执行任何重圈SWIFTFORTHS单词,但不能直接与运行程序通信,而不是通过存储程序可以找到它的数据。

...其中XT是例程的执行令牌来响应回调,n是传递给回调的参数数。

回调必须始终返回一个整数结果,该结果用作来自回调函数的返回值。定义字CB:用必要的代码包裹XT的执行,以构造和丢弃回调运行的瞬态任务环境。执行名称将地址返回到OS(例如,作为消息或信号处理程序)。

SwiftForth提供了一个简单的设施,用于定义和激活SWIFTFORTHS程序中的内线的任务。线程类似于其他右实施的背景任务,因为它给出了它自己的堆栈和用户区域,并且正在从Swiftforth的字典空间内执行代码。

系统消息通过编译的交换机机制处理,可以轻松扩展到包括需要处理的任何新消息。例如,这是扩展标准现有Windows消息处理程序SFMEssages的代码以包含键击事件:

[+ Switch SFMessages WM_SYSKEYDOWN运行KDOWN1 WM_KEYDOWN运行KDOWN0 WM_CHAR运行CDOWN0 WM_SYSCHAR运行CDOWN1 SWITCH]

通过简单的对话框编译器支持对话框,该编译器使Microsoft资源编译器相似。 Swiftforth的控制台调试工具可用于跟踪Windows对话框代码的执行。

在Swiftforth中,创建具有导出功能的Windows DLL是一个简单的事情。由SWIFTFORTHS制作的DLL包含整个系统。任何能够调用基于DLL的函数的程序可能导入导出的函数。

SwiftForth包括可选的DDE客户端服务,包括用于发送或请求数据的简单用户单词:

告诉发送字符串到服务器上的项目,并询问来自服务器的项目。例如:

SwiftForth提供了一种简单的方法,可以定义菜单并将菜单项与四个单词相关联。该机制提供了用户的上下文敏感项,通过简单地定义直接对应于菜单文本的名称来易于扩展。例如,这里显示的图中的“Hello World”演示包括文件和关于菜单,由以下定义:

菜单你好菜单弹出"&文件" mi_exit menuiuem" e& xit"端口弹出弹出"&帮助" mi_about menuitem"&关于"端口窗口结束菜单

可以使用可扩展开关结构附加行为。可以分配上面弹出窗口中定义的菜单项MI_EXIT和MI_ABOUT,如下所示:

[切换hello-commands zero mi_exit运行:( - res)hello-close 0; mi_about运行:( - res)hello-约0;转变]

运行后的代码:是连接到相应菜单项的未命名定义。已经定义的命名单词也可以通过替换运行附加:运行< name&gt ;.

被标准异常过滤器捕获的Windows异常被捕获,记录并生成用户可以捕获和处理的简单抛出。回调期间的错误也被捕获并处理。

MSDN库的这一部分包含使用Win32开发的基本资源。 使用搜索框快速查找特定Win32 API调用的详细信息。 英特尔®64和IA-32架构软件开发人员手册介绍了英特尔®64和IA-32处理器的架构和编程环境。