汉语编程的核心问题和我的非形式语言解决方案
实现汉语编程是许多中国人的梦想,但是他们没有意识到,汉语编程的首要问题和汉语英语无关,而和编译器的处理能力有关。
问题一 符号问题
了解C#的朋友都只知道最简单的输出"Hello World"程序语句是这样写的:
Console.WriteLine("Hello World"); 程序1
如果把这个语句的点号括号去掉,就变成了这样
Console WriteLine "Hello World"; 程序2
我的问题是:怎么让编译器把这条符号很少的程序语句编译出正确的结果?
为什么会提出这个问题:
因为我们日常使用的语言都是没有这些符号的;
用类似BNF简单表示上面的标准C#语句是
expression ->
identifier +“.”+ identifier +" ( "+ literal +")"
因为程序2没有非终结符点号和括号,所以上面的BNF表达式是不适用的,也不能根据这个BNF表达式编写编译程序
要正确处理变形后的程序2,已经超出了形式语言的范围,用通用的BNF已经不能正确表示了。
我的解决方案:
1 确定每个词的属性,建立描述
可以分析出表达式、
类名称identifier + 函数名称identifier + literal
2 匹配描述
类名称identifier + 函数名称identifier 可以确定这是一条调用函数的语句,再分析Console 类中是否有函数和 程序2中的函数名称identifier+ literal 匹配,如果有,表明这个语句是正确的
3 翻译到通用的函数调用
进一步翻译成 类名称identifier . 函数名称identifier( literal ),最后生成。
问题二 语序问题
假设要求写一个函数,实现一个物体从一个点跑到另一个点的功能。
一般语言是这么声明这个函数的
void move(Point fromPoint,Point toPoint)
翻译成白话就是
移动(开始点,结束点)
但是日常语言的语序不是这样的,而是
从(开始点)跑到(目的点)
按照自然语言的语序应该这么声明这个函数:
void from(Point fromPoint) move to(Point toPoint)
我的问题是:怎么让编译器把这条语序不一般的程序语句编译出正确的结果?
为什么会提出这个问题:
因为日常语言的语序就是这样的。
当前所有的编程语言定义函数都是来源于数学函数形式,形式都是
函数名称+参数列表
在CPU汇编级别也是如此。
一般的编程语言是无法解决语序随意放置的问题。
我的解决方案:
1.按主流编程语言定义函数,并实现功能
声明的函数就是void move(Point fromPoint,Point toPoint)
2.在此函数上加文本标注(C#用Attribute,Java用Annotation),
内容是"from(Point fromPoint) move to(Point toPoint)"
3.编译程序前对标注"from(Point fromPoint) move to(Point toPoint)"进行解析,建立它与函数run的一一对应关系。
用C#实现是这样
[新语言程序Attribute("from(Point fromPoint) move to(Point toPoint)")]
void move(Point fromPoint,Point toPoint)
用java的标注同样也可以实现。