标题: 真品龙芯与赝品汉语编程之差别
性别:未知-离线 lazyman

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
功绩 2
帖子 243
编号 51305
注册 2005-10-17


发表于 2007-10-16 11:52 资料 主页 短消息 看全部作者
我玩过Linux下的RVM_FORTH, 而且还用C在Linux写了个模仿Forth的虚拟机(用了2个月),对于一个团队写个FORTH应该不难.
对于所谓的“汉语编程”我还真没去看过, 以我的经验如果用FORTH一定可以实现所谓的汉语编程,但是那篇文章大部分是BullShit. 如果他们真的是剽窃Forth, 那真是太恶心了, 我看都不会去看.

在我看来FORTH是一个很好玩的Toy Language, 当然现在也有相当一部分研究人员使用它作为"正式方法学"的实现语言, 因为它比C更贴近逻辑学和计算机数学,而且它简单而优雅.


Forth的原理如下(我自己总结的,有兴趣的朋友自己可以Wiki一下):

1. 首先构建一个基本的字典,还有一个公用堆栈.   
2.  一开始字典里的保存了由开发者提供的基本"单词"(其实就是函数,控制,和循环的关键字)
3. 用户可以用已有的"单词" 解释和定义一个新的 "单词", 参数和返回结果由公用堆栈传递
4. Forth可以本看成一本不断扩充的字典,Forth通常被实现为命令行的虚拟机,用以执行所定义的"单词",所以用户所定义的"单词"通常也给以被看作脚本,因为通常他们   是不需要被编译的.
5. FORTH通常被表述为后缀语言. 一个简单的例子:
          3 4 = <enter>
    数字 3 和 4 将会被推上公用堆栈, 然后单词 " = " 将提取公用堆栈最顶端的两个元素(3和4),然后比较, 返回一个布尔值在公用堆栈上(0或1)

用户单词定义的方法:

: <用户单词名称> <解释和定义> ; <enter>

用户单词定义的例子:
------------------------------------------------------------------------------------------------------------------------
: FACTR ( n -- n!  recursive defn of factorial )
  DUP 0 =
  IF DROP 1
  ELSE DUP 1 -  FACTR
  THEN ;
-------------------------------------------------------------------------------------------------------------------------

例子解释 1:

单词 FACTR 使用归递法求factorial数, 这个单词提取一个公共堆栈的顶端元素作为输入参数,返回一个结果在公共堆栈的顶端.(这个函数有够短吧

例子解释 2:

DUP 复制公共堆栈的顶端元素,提取一个顶端元素,返回原顶端元素和一个复制品.
= 比较公共堆栈的两个顶端元素,返回1或0在公共堆栈的顶端
- 公共堆栈的两个顶端元素相减,返回结果在公共堆栈的顶端
DROP 扔掉公共堆栈的一个顶端元素
IF ELSE THEN. 提取顶端元素如果它等于1, 执行 IFELSE 之间的"单词", 不等于1 执行 ELSE  和 THEN 之间的"单词".

所以,用户完全可以定义一系列的”单词“不但可以执行,而且还有很高的可读性。
比如命令:  COUNT APPLES TELL MANAGER
又比如定义"WORK" : WORK   COUNT APPLES TELL MANAGER ; <enter>
      

另: 看了楼主的另一贴,我要说写一个通过虚拟机画图其实并不难. 我现在手上还有一个我自己写的L-System 2D字符串画图工具(命令行虚拟机,通过OpenGL实现画图)


[ 本帖最后由 lazyman 于 2007-10-16 12:52 编辑 ]


顶部
性别:未知-离线 lazyman

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
功绩 2
帖子 243
编号 51305
注册 2005-10-17


发表于 2007-10-17 00:20 资料 主页 短消息 看全部作者
我去了所谓的汉编网了~~根本就是FORTH... 词=WORD 词典=DICTIONARY. 公用堆栈=摞...

对于FORTH我是很熟悉的,因为我的毕业制作就是基于RVM_FORTH的中缀式逻辑表达式解析器.

汉编:

         编 1加到100 { 临时变量 -- }
            0 写入 临时变量
             101 1
             循环 内环数 临时变量 + 写入 临时变量
            回环
             临时变量 显
         。


我写的FORTH:
      : 1TO100SUM ( TMPVAR -- )
        0 TO TMPLVAR
        101 1
        DO I TMPVAR + TO TMPVAR
        LOOP
        TMPVAR
       .S
      ;


#解释
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TMPVAR 是一个用户自己定义的变量,使用单词 VALUE 来定义:  0 VALUE TMPVAR (定义一个变量TMPVAR,with一个初始值0)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DO I ... LOOP 会提取堆栈顶的两个元素. 当作循环上限和循环初始
The 101 is called the "limit" and the 1 is called the "index."
        FORMULA:
                limit index DO ... LOOP


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在这里 I 是FORTH的为循环服务的系统词, 它储存了当前循环的循环数.
Forth word I copies the top of the loop control stack onto the parameter stack
具体与以下C代码的 "i" 相同

       for(i=1;i<101;i++)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
单词 .S 用以显示堆栈顶端的元素.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
单词 TO 是FORTH里面很少数的几个中缀式的单词之一, 具体作用就是用以赋值

6.2.2295 TO
CORE EXT

        Interpretation: ( x "<spaces>name" -- )

Skip leading spaces and parse name delimited by a space. Store x in name. An ambiguous condition exists if name was not defined by VALUE.

        Compilation: ( "<spaces>name" -- )

Skip leading spaces and parse name delimited by a space. Append the run-time semantics given below to the current definition. An ambiguous condition exists if name was not defined by VALUE.

        Run-time: ( x -- )

Store x in name.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

补充一句 "(" ")"  是FORTH的专有词用以包含注释, 中缀语言都用"#" 或者 "//" "/*", 那为什么他们不用 "(" ")" , 因为中缀语言需要 "(" ")" 来表述优先运算. 而后缀语言FORTH是不需要用任何符号来表述优先运算!  因为这是后缀语言的特性!

比如
中缀表达式: ( a + b ) * c
后缀表达式: a b + c *  

除了FORTH很少有语言使用"(" ")"以包含注释.
汉编的注释Format也和FORTH太相似了! ( TMPVAR -- ) { 临时变量 -- } 换个马甲.
我很有兴趣知道,以后汉编将如何支持SET(集合)呢,用回"("  ")"么, 真是太白痴了,干吗不用 "/*" "*/" 要剽窃也得有点技术含量阿

.


参考:http://vision.twbbs.org/~letoh/forth/pf_tuttw.html

[ 本帖最后由 lazyman 于 2007-10-17 02:03 编辑 ]


顶部

正在浏览此帖的会员 - 共 4 人在线




当前时区 GMT+8, 现在时间是 2024-11-20 10:14
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.012377 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP