矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: 渔翁音乐

突发奇想 用汉语编写计算机语言

[复制链接]
     
发表于 2017-8-3 21:11:33 | 显示全部楼层
岑蓉络阳 发表于 2017-8-1 20:40
从头看到尾,没有发现计算方法专业的朋友。打个比方,计算一个N个未知量的线性方程组或者一个常系数微分方 ...

真正了解计算机基础的朋友就能解释了。而且前面有位计算机专业的朋友解释的很清楚。其实计算机也不认识英语,所以从底层开发中文计算机就是个伪命题。是非计算机专业的人随便想想罢了。
国家,大公司,国外政府也没有谁提出要开发一个本国语言电脑的说法。

从计算机发明开始,编程就不是用英语,那时编程还是用针在纸条上扎小孔呢。

在编程的世界,英语,只是用到数十个单词,来代表每一种操作而以。所以,不是用英语来编程。
从没有用英语来编程的说法,也从没有英语计算机系统的说法。

操作系统有英文版,中文版,就同一本书,能说是英文版的书,不能说英文版的纸。
回复 支持 2 反对 0

使用道具 举报

     
发表于 2017-8-4 16:09:38 | 显示全部楼层
2549608436 发表于 2017-8-3 16:00
看来这个"屁"是一个无条件跳转的函数量.只要程序检验员一个IF,就可以404了?

技术论坛最怕逻辑混乱.

话都说不顺当,还谈逻辑?
回复 支持 反对

使用道具 举报

     
发表于 2017-8-4 22:54:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2017-8-10 18:42:36 | 显示全部楼层
不管什么语言,最终都要转换成机器码
回复 支持 反对

使用道具 举报

发表于 2017-8-16 11:05:16 | 显示全部楼层
80年代初,我读研究生时就有同学做中文BASIC的课题,现在想来那个老师的眼光不行。
回复 支持 反对

使用道具 举报

     
发表于 2017-8-19 00:08:30 | 显示全部楼层
学习了,很早以前开始编程的时候有过这想法,可真正有几年编程经验后,发现编程的难点不在于英语,而在于编程的逻辑和思路。而且,英文的词组,看起来更简洁,看不懂的用中文注释即可。
回复 支持 反对

使用道具 举报

     
发表于 2017-8-21 20:52:53 | 显示全部楼层
旭日天天升 发表于 2017-7-23 15:57
全中文的编程软件,本来就有的。

能上传一下吗
回复 支持 反对

使用道具 举报

     
发表于 2017-8-22 09:08:57 | 显示全部楼层
本帖最后由 无敌吴刚 于 2017-8-22 09:16 编辑
岑蓉络阳 发表于 2017-8-1 20:40
从头看到尾,没有发现计算方法专业的朋友。打个比方,计算一个N个未知量的线性方程组或者一个常系数微分方 ...


何以见得不能用中文编程呢?况且你楼上所说的“中文在计算机中的应用无形中还比西文增加了计算机的运算量,因为西文充其量就是ASCII码中的字符,中文需要面对最少2000个汉字。只不过使用者并没有感觉出来而已。从讲究效率来讲是很不合算的。”,你所说的是VB这种解释语言的工作方式吧??其它那些流行的编译语言,哪一个需要用这种方式来工作的?不都是充当于一个翻译器,直接一次性将语言翻译成机器码的程序文件吗?中文与英文有何区别?顶多在编译程序那个时候,花多一点儿运算量而已(这个工作只有一次,以现在的机器的性能,当食生菜啊),生成EXE文件后,不都是一样的么?

如果想,就连关键字其实都可以用中文来代替的!只不过流行的编译工具大多数是外国人开发的,就用了英文而已,至于其它变量,函数命,结构定义什么的,现在都可以用中文(以前Ansi的时候,就比较麻烦,因为有一部分汉字的字码与英文字符的字码有重叠,这个解析起来有可能会有错误,现在则不再会了)。

最后让摘取部分我写的中英结合的不论不类的A*寻路算法,可以看到里面有很多中文,也有英文,编译成程序,一点问题都没有!也不见得会慢,因为最终运行的都是机器码。




procedure TAXMap.光标转换到地图坐标(X, Y: Integer; var MapX, MapY: Integer);
begin
MapX:=X div F显示比例;
MapY:=Y div F显示比例;
end;

function TAXMap.初始化开始寻路(): Boolean;
var
X, Y: Integer;
begin
for X:=0 to MapWidth-1 do
begin
  for Y:=0 to MapHeight-1 do
  begin
   MapData[X, Y].TR:=0;
  end;
end;
调试_1:=0;
开启节点记录列表大小:=0;
SetLength(开启节点记录列表, 开启节点记录列表大小);
MapData[F路径计算开始点X, F路径计算开始点Y].父节点X:=F路径计算开始点X;
MapData[F路径计算开始点X, F路径计算开始点Y].父节点Y:=F路径计算开始点Y;
MapData[F路径计算开始点X, F路径计算开始点Y].父节点方向:=3;
寻路_开启节点记录列表最大历吏记录:=0;
已寻路:=False;
if (F路径计算开始点X=F路径计算结束点X) and (F路径计算开始点Y=F路径计算结束点Y) then
begin
  已寻路:=True;
  Result:=False;
end
else
begin
  Result:=True;
end;
end;

function TAXMap.坐标非法(X, Y: Integer): Boolean;
begin
Result:=True;
if X<0 then
  Exit;
if Y<0 then
  Exit;
if X>=MapWidth then
  Exit;
if Y>=MapHeight then
  Exit;
Result:=False;
end;

procedure TAXMap.添加到开启列表(X, Y: Integer);
begin
开启节点记录列表大小:=开启节点记录列表大小+1;
if 寻路_开启节点记录列表最大历吏记录<开启节点记录列表大小 then
begin
  寻路_开启节点记录列表最大历吏记录:=开启节点记录列表大小;
end;
SetLength(开启节点记录列表, 开启节点记录列表大小);
开启节点记录列表[开启节点记录列表大小-1].X:=X;
开启节点记录列表[开启节点记录列表大小-1].Y:=Y;
end;

procedure TAXMap.从开启列表中删除(T: Integer);
var
N: Integer;
begin

for N:=T to 开启节点记录列表大小-2 do    //事实证明这样子很多余,既然是无序数组,何需移动数据?直接将最后元素换到当前位置即可
begin
  开启节点记录列表[N]:=开启节点记录列表[N+1];
end;

开启节点记录列表大小:=开启节点记录列表大小-1;
// 开启节点记录列表[T]:=开启节点记录列表[开启节点记录列表大小];   //这样应该会快多了吧
SetLength(开启节点记录列表, 开启节点记录列表大小);
end;

function TAXMap.开启列表中寻找最小(var X, Y, T: Integer): Boolean;
var
n: Integer;
MinF: Integer;
begin
if 开启节点记录列表大小<=0 then
begin
  Result:=False;
  Exit;
end;
Result:=True;
MinF:=MapData[开启节点记录列表[0].X, 开启节点记录列表[0].Y].F;
X:=开启节点记录列表[0].X;
Y:=开启节点记录列表[0].Y;
T:=0;
for n:=1 to 开启节点记录列表大小-1 do
begin
  if MapData[开启节点记录列表[n].X, 开启节点记录列表[n].Y].F<MinF then
  begin
   MinF:=MapData[开启节点记录列表[n].X, 开启节点记录列表[n].Y].F;
   X:=开启节点记录列表[n].X;
   Y:=开启节点记录列表[n].Y;
   T:=n;
  end;
end;
end;

procedure TAXMap.开始寻路1;
var
X, Y, T, X1, Y1: Integer;
N, G: Integer;
label
L完成寻路;
begin
if 初始化开始寻路()=False then
  Exit;
//开启第一个节点
MapData[F路径计算开始点X, F路径计算开始点Y].TR:=1;   //标记开启
MapData[F路径计算开始点X, F路径计算开始点Y].G:=0;    //起点到此点损耗 0
MapData[F路径计算开始点X, F路径计算开始点Y].H:=估算到终点距离(F路径计算开始点X, F路径计算开始点Y);     //此点到终点损耗评估
MapData[F路径计算开始点X, F路径计算开始点Y].F:=MapData[F路径计算开始点X, F路径计算开始点Y].G+MapData[F路径计算开始点X, F路径计算开始点Y].H;
//添加第一个记录
开启节点记录列表大小:=1;
SetLength(开启节点记录列表, 开启节点记录列表大小);
开启节点记录列表[0].X:=F路径计算开始点X;
开启节点记录列表[0].Y:=F路径计算开始点Y;
//开始寻路
while 开启列表中寻找最小(X, Y, T) do
begin
  for N:=0 to 7 do    //开启周围7个方向的格子
  begin
   调试_1:=调试_1+1;
   X1:=X+DirToDianX[N];
   Y1:=Y+DirToDianY[N];
   if 坐标非法(X1, Y1) then      //该格子超出地图边界
    Continue;
   if 寻路_终点可以是个障碍物 then   //非正常寻路,即终点是一个障碍点,但这个障碍点的周围是一个可到达的通路的,用这个,直接比较X1 Y1,速度慢少少
   begin
    if X1=F路径计算结束点X then       //直接与终点比较
     if Y1=F路径计算结束点Y then
     begin
      if N in [1, 3, 5, 7] then
       MapData[X1, Y1].G:=MapData[X, Y].G+寻路_斜线耗损距离
      else
       MapData[X1, Y1].G:=MapData[X, Y].G+寻路_直线耗损距离;
      MapData[X1, Y1].H:=估算到终点距离(X1, Y1);
      MapData[X1, Y1].F:=MapData[X1, Y1].G+MapData[X1, Y1].H;
      MapData[X1, Y1].父节点X:=X;
      MapData[X1, Y1].父节点Y:=Y;
      MapData[X1, Y1].父节点方向:=求反方向[N];
      已寻路:=True;
      goto L完成寻路;
     end;
   end;
   case MapData[X1, Y1].TR of
    0:       //未被标记的节点
     begin
      if MapData[X1, Y1].Open=False then   //障碍物
      begin
       MapData[X1, Y1].TR:=2;  //直接设该格子为关闭的节点 不被访问
       Continue;
      end;
      if N in [1, 3, 5, 7] then
       MapData[X1, Y1].G:=MapData[X, Y].G+寻路_斜线耗损距离
      else
       MapData[X1, Y1].G:=MapData[X, Y].G+寻路_直线耗损距离;
      MapData[X1, Y1].H:=估算到终点距离(X1, Y1);
      MapData[X1, Y1].F:=MapData[X1, Y1].G+MapData[X1, Y1].H;
      MapData[X1, Y1].父节点X:=X;
      MapData[X1, Y1].父节点Y:=Y;
      MapData[X1, Y1].父节点方向:=求反方向[N];
      MapData[X1, Y1].TR:=1;      //开启节点
      添加到开启列表(X1, Y1);
      if 寻路_终点可以是个障碍物=False then   //正常的寻路,即终点为一个可到达的点,就可以用这个来判断,这样速度快少少 否则 则用上面比较X1 Y1后直接判断
      begin
       if MapData[X1, Y1].H=0 then   //到终点估算距离为0,即到达终点
       begin
        已寻路:=True;
        goto L完成寻路;
       end;
      end;
     end;
    1:         //已标记为开启节点的格子
     begin
      if N in [1, 3, 5, 7] then                //重新计算G值(开始点到此节点的损耗距离)
       G:=MapData[X, Y].G+寻路_斜线耗损距离
      else
       G:=MapData[X, Y].G+寻路_直线耗损距离;
      //  H:=估算到终点距离(X1, Y1);   不需要重新计算H值
      //F:=G+H;                        不需要重新计算
      if G<MapData[X1, Y1].G then       //而是根据G判断 简化
      begin
       MapData[X1, Y1].G:=G;            //重新获得更小的G值
       MapData[X1, Y1].F:=MapData[X1, Y1].G+MapData[X1, Y1].H;      //重新计算更小的F值
       MapData[X1, Y1].父节点X:=X;
       MapData[X1, Y1].父节点Y:=Y;
       MapData[X1, Y1].父节点方向:=求反方向[N];
      end;
     end;
    2:       //该格子为已关闭节点
     begin
      Continue;
     end;
   end;
  end;
  MapData[X, Y].TR:=2;  //已完成周边格子开启 关闭该节点
  从开启列表中删除(T);  //从开启列表中删除
end;

L完成寻路:


end;

回复 支持 反对

使用道具 举报

     
发表于 2017-8-22 09:27:31 | 显示全部楼层
回复 支持 反对

使用道具 举报

     
发表于 2017-8-22 10:42:10 | 显示全部楼层
不管什么语言,关键在其后的编译程序,你非要如此做便可以 设定个变量名字叫武二郎等于100个炊饼也无不妨。编译后即为 A=100 。
回复 支持 反对

使用道具 举报

     
发表于 2017-8-22 10:58:34 | 显示全部楼层
不论什么语言编程,就看是不是CPU能识别的规定的机器码,编译器就是个关键。我要是再年轻三十岁,非恶补专业知识,来研究这个用汉语编程的编译器。现在是多么好的创新时代,看后生吧,能早日诞生这种编译器。
回复 支持 反对

使用道具 举报

     
发表于 2017-8-22 11:51:37 | 显示全部楼层
可以用中文做,反正最后都会被编译成机器码,和编程语言没关系,是编译器的事情了
现在用中文写MCU的好像没有但是写Windows程序的有呢
回复 支持 反对

使用道具 举报

     
发表于 2017-8-22 11:54:19 | 显示全部楼层
旭日天天升 发表于 2017-8-22 09:27
链接:http://pan.baidu.com/s/1gfhAjcR 密码:e8f9

谢谢,已下载
回复 支持 反对

使用道具 举报

     
发表于 2017-8-22 12:54:33 | 显示全部楼层
无敌吴刚 发表于 2017-8-22 09:08
何以见得不能用中文编程呢?况且你楼上所说的“中文在计算机中的应用无形中还比西文增加了计算机的运算 ...

哎,不要说了,叫这个劲的都是不会编程的,甚至都是没看过编程的。另外,VB也不是你说的那样要每次去查的,各种解释语言也是先处理为中间代码,然后对中间代码进行解释,这个时候除了字符串,其他都已经重新编码了,VB编译出来的可以是直接的机器码,而且VB的连接器就是VC的,VB可以连接VC的目标代码。

评分

1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

     
发表于 2017-8-22 13:22:28 | 显示全部楼层
本帖最后由 zhxzhx 于 2017-8-22 13:31 编辑
OODLL 发表于 2017-8-22 11:51
可以用中文做,反正最后都会被编译成机器码,和编程语言没关系,是编译器的事情了
现在用中文写MCU的好像 ...


有,单片机的叫习51,计算机的是易语言,叫尘土还是叫飞扬我忘了,安卓的叫A4E,苹果手机的叫蓝鸟。
实际上有很多,不下23十种,一般人不知道而已。
还有一个奇葩的用全角符号的,堆栈不叫堆栈叫数摞。
其实易语言用的还是很多的,功能很强大,代码效率接近VC,很多外挂,病毒都是易写的,导致很多杀毒软件见到易的月运行库就误报。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-3-29 10:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表