F351(5):谁才是真正的高级计算机语言?C语言还是Forth语言?
一、Forth复合字前面文章:F351(3):Forth点灯,照亮AI单片机学习之路(https://www.stcaimcu.com/forum.php?mod=viewthread&tid=12013)给出了使用“金湖X51_F51编译器”的LED闪烁的星星点灯例子,其效果如下:(1)星星点灯的Forth程序的主函数部分如下:
其中第89行到第91行是系统引导程序(BOOT),第94行到第99行程序是STC8H单片机端口初始化程序,第103行到113行是主程序(mian())的主循环部分。(2)在Forth中,基本元素是“词/字(Word)”,每个词都有确定含义,它让计算机完成特定的功能。(3)复合词定义。就像在C语言中可以用现有的函数新定义一个函数一样,在Forth语言中也允许用现有的词构成一个新的词,新词按次序完成其组成词的功能。这种由其他词组成的词在Forth中称为“复合词/复合字”。在WD-Forth中复合词的定义规范如下:CW_:新词名称 旧词1 旧词2 ... 旧词N ;_CW比如可以定义一个新词将一个数乘以10:CW_: *10 10*;_CW以后在程序中使用它就可以完成将堆栈顶上的数乘以10的功能。例如程序:“123*10 ”的结果是1230。(4)在Forth语言中,对词的名称的组成字符没有特别的限制,就像上面直接使用“*10”也可以。在Forth如果新词的名称已经存在,编译器不会进行任何警告,只是替代了旧词:从此后新词的功能代替了旧词原有的功能。
二、Forth复合字应用例子(5)为了简化范例1中的主函数,范例2在第80行处加入了新定义的复合词,下图是本文范例程序“F351_Demo_0502.wdf”中新词的定义部分:
(6)在F51汇编语言中,指令“PX, 立即数MOV#”是将立即数赋值给PX端口,这是8051单片机控制外部设备最重要的方法,将这个指令用Forth复合字的方法给出专门的“新指令”,有助于Forth程序的可读性。上面第82行到第84给出了对端口赋值的新指令定义,以后就可以用新指令进行对端口赋值了,比如将“P0, 55 MOV#”指令写为“55 写入_P0”。(7)利用Forth复合字的方法,也可以像C语言函数一样将整段的程序原样放在复合字的定义中,以后只要用一个Forth就可以完成整段程序的功能。上面第89行到第93行定义了本范例的引导程序部分,第95行到第102行程序定义了对端口的初始化功能。(8)预先定义了上面的复合字后,使用这些复合字就可以使后面的Forth程序变得清晰明了:
其中第112行是系统引导程序,第115行是端口初始化,第129行是转移语句,第119行到127行每行程序实现一个功能,整个程序简洁多了。并且引入汉字复合词名称后,程序的可读性大大加强了。(9)如果将上面程序用C语言写,对应的程序如下:
可以看出C语言与Forth汇编语言程序是一一对应的。(10)结论:C语言是公认的高级计算机语言,借助Forth语言的复合词功能,就将Forth 8051汇编语言升级为高级计算机语言了。这样以后用Forth语言编写STC单片机就能够像C语言一样简单方便,不必处处像汇编语言一样冗长难懂了。
三、Forth“虚词”,打造有味的中文程序(11)笔者一直认为:计算机程序不单只是给计算机编译器看的,更重要是给人看到(最少编程的是个人),因此编出来的程序就是一种作品,是作品就要完善到艺术,是艺术就要提高到有文化,要文化就要带有点中文味。(12)Forth语言的复合词也可以是虚词,就是光有词的名字,并不包含任何内容。这样的虚词在计算机程序执行时没有任何作用,但是人类读它的时候感觉就不一样了。下面是将范例2程序加上虚词后的样子:
其中第104行到第106行程序定义了3个虚词,然后将虚词加入到主循环语句中,就成了下面的样子。
================================================================== 写在最后:考试题:如何编写STC单片机程序,使得单片机上的3组LED灯如上面视频中那样闪烁?答:Main_Loop将十六进制数 55 写入_P0,将十六进制数 33 写入_P1,将十六进制数 F0 写入_P2,延时500毫秒, 将十六进制数 AA 写入_P0,将十六进制数 CC 写入_P1,将十六进制数 0F 写入_P2,延时500毫秒, 向 Main_Loop 转移, 如此循环,永不停止。
请问,这样的程序能得几分?
那不是又要记一套关键字 用的汇编编译器,和高级语言有什么关系 C语言都能面向过程编程思维,高级些的能用C语言写面向对象编程思维
你这什么编译器,顶多面向寄存器编程
你是不是以为8051只能点点灯,跟C语言比简直差的十万八千里呢 本帖最后由 杨为民 于 2024-11-25 00:40 编辑
QQ624353765 发表于 2024-11-24 20:19
C语言都能面向过程编程思维,高级些的能用C语言写面向对象编程思维
你这什么编译器,顶多面向寄存器编程
你 ...
(1)你了解FORTH吗?不了解就先百度一下,好吗?
下面内容来自(https://worktile.com/kb/ask/2027594.html)
飞飞Worktile&PingCode市场小伙伴评论Forth是一种面向堆栈的编程语言,具有简洁的语法和灵活的数据结构,被广泛用于嵌入式系统和低级别的软件开发。它的设计目标是提供一个直接的、高效的开发环境,使程序员能够快速地编写、测试和调试代码。在Forth中,所有的操作都是基于堆栈的,这意味着数据的存取和操作都是通过堆栈来完成的。Forth使用两个堆栈,一个是数据堆栈(数据栈),用于存储操作的数据;另一个是执行堆栈(执行栈),用于存储程序的指令。Forth的语法非常简单,只有一小组基本的操作符和控制结构。它的代码由一个个称为“词”的定义组成,每个词都是一个可以被调用的函数。在Forth中,程序员可以创建自定义的词,通过将一系列操作组织为一个单独的词,以便在其他地方反复使用。Forth的灵活性主要体现在其数据结构的设计上。Forth不仅支持基本数据类型,如整数和浮点数,还支持用户自定义的数据类型。程序员可以根据需要创建自己的数据类型,以实现更复杂的数据结构和算法。Forth还具有交互式的编程环境,允许程序员在运行时动态修改代码。这种交互式的开发方式使得调试和测试变得非常方便,同时也提供了一个实验性的环境,可以快速尝试新的想法和解决方案。总而言之,Forth是一种面向堆栈的编程语言,以其简洁的语法、高效的开发环境和灵活的数据结构而闻名。它在嵌入式系统领域得到了广泛应用,并且在低级别的软件开发中仍然具有一定的影响力。
(2)如果你连百度都没有查,至少先看看这里论坛里的介绍。别做井底之蛙,别动不动就大口马牙的,很丢人的!
F351(1):Forth是什么?
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11914
(出处: 国芯技术交流网站)
(3)你说“你是不是以为8051只能点点灯,跟C语言比简直差的十万八千里呢”
你有没有觉得你的中文很烂?8051是单片机或者指令集,怎么与C语言比,这两者不是同一类型,比什么?你的这个评价比指鹿为马还离谱,鹿和马好歹都是动物一类呀?
(4)你说“你是不是以为8051只能点点灯”。瞧你说的,在这个论坛里,STC的8051单片机能做什么,恐怕我知道的比你多得很多很多!!!
Ai8051U单片机,从入门到精通(1):继往开来的新一代51单片机
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=9909
(出处: 国芯技术交流网站)
从32位到64位,记录STC单片机的发展探索历程
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7607
(出处: 国芯技术交流网站)
Ai8052U,单片机进入DOS时代的首航者
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11166
(出处: 国芯技术交流网站)
(5)你说“跟C语言比简直差的十万八千里呢”。瞧你说的,在这个论坛里,我是写C语言编译器的人,你写过C语言编译器吗?恐怕我对C语言的了解比你知道的多得很多很多,而且肯定超过十万八千里!!!
STCIDE + 金水151 + AIapp-ISP:全国产纯绿色的80x51单片机软件开发工具链
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=10532
(出处: 国芯技术交流网站)
本帖最后由 杨为民 于 2024-11-25 09:59 编辑
晓飛飛 发表于 2024-11-24 19:49
用的汇编编译器,和高级语言有什么关系
Main_Loop
将十六进制数 55 写入_P0,
将十六进制数 33 写入_P1,
将十六进制数 F0 写入_P2,
延时500毫秒,
将十六进制数 AA 写入_P0,
将十六进制数 CC 写入_P1,
将十六进制数 0F 写入_P2,
延时500毫秒,
向 Main_Loop 转移,
我认为这一段程序属于高级计算机语言的程序,不是汇编语言程序
本帖最后由 晓飛飛 于 2024-11-25 12:16 编辑
杨为民 发表于 2024-11-25 09:57
Main_Loop
将十六进制数 55 写入_P0,
这段代码是顺序赋值+GOTO式的跳转,像极了汇编语言的复刻,更像是某些机器语言脚本
至于中文编程不过是词典里面定义了中文关键词,本质上还是基于指令解释的方式编程,算不得高级计算机语言,最多是汇编和高级语言之间的过渡阶段。
很遗憾的说,Forth语言已经被淘汰了,或者说从来就没有进入过主流阵营,很多统计数据里面,Forth语言上不了榜单,众多的编辑器也很少提供Forth语法高亮支持。也许它在某些方面很优秀,但不入流是事实。
虽然c的份额排行下滑了,但c族群包含了c、c++、c#,总体份额目前仍然是王者。拿Forth语言与c相提并论,有点星辰与日月争辉的那味儿了。拉踩可以,但是选错对象就不太合适了。
IEEE Spectrum的编程语言榜单请看下图,也许不够准确,但应该能反映一定的现状:
本帖最后由 杨为民 于 2024-11-25 13:29 编辑
晓飛飛 发表于 2024-11-25 12:02
这段代码是典型的顺序赋值+GOTO式的跳转,像是汇编语言的复刻,
至于中文编程不过是词典里面定义了中文关 ...
(1)有一种人以排行榜为荣:喝排行榜前排的饮料,穿排行榜前排的服饰,说着排行榜前排的话,然后觉得自己就上了排行榜头几名。我觉得这种人骨子里自卑,靠排行榜来证明自己。
有一种人以做自己为荣:喝自己喜欢的饮料,穿自己喜欢的服饰,说着自己懂的话,然后为自己梦想去努力。我觉得这种人骨子里硬气,无需靠排行榜来证明自己。
(2)而大多数计算机语言是工具,编程者/使用者必须遵从编译器创造者定下的规矩。因此对于这种计算机语言,比如对于Keil的C51/C251,从本质上说,程序员只是C51/C251的“奴隶”。
但是“Forth”计算机语言是文化,它允许编程者自己创造出“自己的语言”,就像这个系列文章已经介绍的,程序员可以将Forth计算机语言,如将本文的Forth 8051汇编语言,打造成自己喜欢的样子。所以对于Forth这个计算机语言,程序员是Forth语言的“主人”。
我想绝大多数的程序员都想做“主人”,不想做“奴隶”,只是他们不知道怎么做和要花多大的代价而已。本系列Forth文章将展示一种DIY自己的计算机语言的方法。
(3)做衣服的裁缝人少,穿衣服的顾客人多。当出现一种新面料的时候,裁缝跟不上形势时,穿衣的人就得自己造,这才能引领潮流。当年“的确良”衣服刚在中国大陆出现(1968、1969年),我的一个“大哥”居然手工做了个的确良的“白衬衣领子”,从毛衣上露出个领子,一路上收获很多眼球。如果当年有抖音,绝对上热搜。
(4)Keil的C51/C251是以8051/80251指令集为基础的,面对STC今天的AI8051U单片机和明天的AI8052U单片机的性能和架构,早已落后很多很多了。
因此大潮既已来临,应该有新的编译器或者计算机语言出来赶潮了。我个人觉得用“函数库”的方式提供补丁,就像“白衬衣领子”,终究不能充分发挥STC新一代32位单片机的优势,最终还是要靠打造STC单片机指令集和编译器才能从根本上解决问题。
(5)Forth语言正是这样一种平台,人人都可以打造“我的STC单片机指令集、我的STC单片机计算机语言和我的STC单片机编译器”:先有春天到来百花开,后有大浪淘沙只剩金,也许新的STC单片机指令集、新的STC单片机计算机语言和新的STC单片机编译器就随着STC单片机架构和性能的不断提升,脱颖而出了。
拿一个比单片机都老的编程语言帮助STC“脱颖而出”吗?这简直是逼一个朝气蓬勃的少年去与一个70岁的老奶奶结婚。。 杨为民 发表于 2024-11-25 13:25
(1)有一种人以排行榜为荣:喝排行榜前排的饮料,穿排行榜前排的服饰,说着排行榜前排的话,然后觉得自己 ...
醍醐灌顶,大浪淘沙,涛声依旧,
Forth, 在我学 Basic的年代,他是那么的光芒 ?
在 51U / ARM / RISC-V 三分天下的 当下
Forth@Ai8051U 是那颗耀眼的星