当前位置: 首页 > 工具软件 > 太极语言 > 使用案例 >

太极语言出世----比C++更好的语言

谢涵亮
2023-12-01

太极语言出世----比C++更好的语言

我设计了一种新的计算机语言--太极语言,英文名The Universe Language。

我是2002年秋天开始做太极语言的,(我是微波专业卫星通信方向的,当时我正在编一个非常复杂的程序,那个程序要自动做微积分自动推导一些电磁场与电磁波方程,用C++编觉的不够灵活,于是下决心做一套自己的编译器实现自己的语言)

下面我简单介绍一下太极语言。

(一)
太极语言实现了“概念的概念”,太极语言中的这种“面向概念的程序设计”将有深远的意义。太极语言讲究“所思既程序”,怎么想怎么编(HTHC -- How Thinking How Coding)。

 举个具体例子,许多程序员都编写过遍历链表做一些事情的代码。
 比如显示
 void chain_show(chain * pchn)
 {
  while(pchn)
  {
   printf(pchn->name);
   pchn=pchn->next;
  }
 }
 又如搜索
 chain * chain_search(chain * pchn,char * keyname)
 {
  while(pchn)
  {
   if(str_equal(pchn->name,keyname))
    return pchn;
   pchn=pchn->next;
  }
  return 0;
 }
 这些遍历的框架是重复出现的,还有更多的要用到这种框架,如计数,条件计数,定位更改……都写出来?太多了,同一件事情不要做两次。而且这种遍历方式不利于维护,修改时要一处处都修改,很容易出问题(当然这个例子比较简单,修改的可能性也不大,但对复杂的情况必须做到利于维护)。
 
 看--
 现在把这个遍历的框架单独实现。(注意 code 是一个关键字,表示概念)
 
 code goover(chain * a,code b)//定义遍历的概念
 {
  while(a)
  {
   b;
   a=a->next;
  }
 }
 void chain_show(chain * pchn)
 {
  goover(pchn)
  { printf(pchn->name); }
 }
 chain * chain_search(chain * pchn,char * keyname)
 {
  goover(pchn)
  {
   if(str_equal(pchn->name,keyname))
    return pchn;
  }
  return 0;
 }
 ……
 code goover(chain * a,code b)描述了一个概念goover,有参数a,b。用到这个概念时,依次第n个参数用goover后面第n个括号中的代码来代换,最后一个可以用{}。
 让代码的本身做为参数,进行代码组合!
 其他如计数,条件计数,定位更改……都可以这样实现。
 一次定义,到处使用。
 
 大家会注意到这里的code跟C中define的概念很相似。
 (要注意区别,code 定义是要{}的。比如code a{b} 与define a b 一样,)
 是的,宏确实是很厉害的。在太极语言中,实现define同时实现code。而且这里的code还是类型敏感的,比如对tree可以重载实现一个
 code goover(tree * a,code b){……}。
 甚至你可以用一个更通用的模式code goover(code a,code b),这个是不判断类型的。
 
 
 在庞大的程序中,面向概念是非常有效的编程方式。
 
 再举一个例子:
例2:
 我们有一组函数,想让它们都会在被调用时自动做一些事情,这里就假如是使一个全局变量i自增1.在C/C++中你可以一个个的都在其前面加上个i++;以后要修改时呢,再一个个的修改。
 现在我们看太极语言面向概念的程序设计中这个怎么实现的。
 
code do_sth(code a,code c)//定义do_sth概念
{
 a
 {
  i++;
  c;
 }
}

do_sth(int fc1(int a))
{
 return a*a;
}
do_sth(int fc2(int a,int b))
{
 return a+b;
}
do_sth(int fc3(int a))
{
 return a+3;
}
do_sth(int fc4(int a))
{
 return a-2;
}
 
编译后这就成了一组函数,
int fc1(int a)
{
 i++;
 return a*a;
}
int fc2(int a,int b)
{
 i++;
 return a+b;
}
int fc3(int a)
{
 i++;
 return a+3;
}
int fc4(int a)
{
 i++;
 return a-2;
}

规则还是刚才的规则:依次第n个参数用后面第n个括号中的代码来代换,最后一个可以用{}。
这是非常奇妙的,你现在可以自己试着写一段公用退出代码。

其实在太极语言中while,if等控制语句都是这样基于概念虚拟出来的。
比如定义while概念
code while(a)
{
 sign://进入代码
 b;
 goto(a) sign;//退出代码
}

while(i<100)
{
 n=n+i;
 i++;
}
被编译成
sign:
n=n+i;
i++
goto(i<100) sign;

(goto(i<100) sign;是条件goto语句,就是if(i<100) goto sign。另外sign是一个标号编译自增量,这个以后再说了)


基于概念的编程可以方便的控制非线性上下文相关代码。比如有进入和退出模式的代码。

例1:
code usepointer(code pointertype,code pointer,code c)
{
 pointertype * pointer=new pointertype; 
 c;
 delete pointer;
}
usepointer(int,p)
{ ... }
想想这个编译后是什么了?
是:

int * p=new int;
……
delete p;

但是delete的语句不用写了,会自动产生这句话。一次定义,到处使用。在头文件里包含usepointer的定义。好了,这样可以自动解决一大部分可能造成内存泄露的代码了。

 

usepointer(int,p1)
{
 usepointer(int,p2)
 {
  ...
 }
}
这个呢?会被编译成什么?

再举一个例子
例2:
code paint(a)
{
 hdc=BeginPaint(hWnd, &ps);
 a;
 EndPaint(hWnd, &ps);
}
paint
{
 TextOut(hdc,0,0,str, strlen(str));
}
被编译成什么了?
hdc=BeginPaint(hWnd, &ps);
TextOut(hdc,0,0,str, strlen(str));
EndPaint(hWnd, &ps);

限于篇幅,这里不多讲了,而且概念的设计还可以继承,还有“代码装配”的概念,就象机械装配,电路搭配那样,非常有趣。

太极语言非常讲究怎么想怎么编(HTHC)。看前面那个chain_show,是不是思维的直接描述?
 void chain_show(chain * pchn)
 {
  goover(pchn)
  { printf(pchn->name); }
 }

太极语言提出了基于概念描述的编程模式,这是根据模拟思维的原则做的。认识世界,通过概念的设立与关联应用。 比如我们刚才的例子中,遍历就是一个概念,每一个概念都单独用一个模块表示,概念间的关系用模块的组合来描述。
 这是比现在流行的“面向对象”,“泛型”更先进的模式。我可以预言,“基于概念”将是未来软件开发的主要模式,因为这几乎完全是在模拟人的思维形式。
 以前的“函数”,“类”,“面向对象”,只是非常有限度的局部部分模拟,“基于概念”将带来更深远的影响。
 基于概念的代码有极强的可复用性。你想想你自己头脑中的概念这种东西被你思维是复用了多少次。
 概念不只是描述静态物体,而且对于运行状态也同样可以描述,比如刚才说的“遍历”。数学上的定理都可以用概念的形式描述。
 概念的实现不只是一种编译器技术。还是一个软件总体设计工程的原则。

太极语言实现了垣的概念。一段包含进入与退出代码的区域就叫垣,其中进入与退出代码都可以为空。简单一点的说,就是两个括号一包就叫垣——这个字怎么这么形象呢。

太极语言中的函数,类,while等都是基于垣而实现的。垣可以无限嵌套。比如你可以在函数中再定义函数,甚至在if后面的()里再定义另一个函数,在表达式的()里定义一个类,……这都是可以的。太极语言的语法就是自由到这种程度。

(二)

1.函数可以象类一样继承,从而大大的提高了复用能力
2.函数可以嵌套定义,有利于避免名字空间中的冲突。
3.对一般类型可以象类一样添加成员函数
 比如可以对int自己添加一个tostr成员函数,
 typedef出来的类型也可以添加自定义成员函数,
4.对变量也可以添加成员函数,
 比如 int a,然后你可以对a 添加一个onchange函数,a的值一被改变时就被触发,或一用a做加法就被触发——象触发器的概念了。我是以前上VHDL课设计电路时想到这个触发器概念是可以做到编译器中的。
5.函数可以返回多个值,(从matlab中学来的)。
6.动态代码(变形代码),等效于代码可在运行时改变自身。
7.对区域(比如函数体)设计了onenter,onout,可以自动触发。
8.可以自己定义函数或类中变量的OFFSET。
9.可以直接使用ASM与机器码。
………

太极语言比C++描述能力更强更灵活,比C更贴近系统底层更可控。

我拓展了许多C++的基本概念,使其具有全面的普适性。
比如在设计函数继承时,设置了有名体的概念——无论数据类型(类,结构,一般类型)还是变量还是函数都是有名字的,只要是有名体,就可以进行继承,重载,……等一切操作,“一切有名体平等”。

最少的语法规则,最强的组合能力,最灵活又最表义的组合,最强的描述能力,最自由的语法……
太极语言在编译时是完全动态的嵌入式代码。
太极语言设计时是这样考虑的:用最少的语法规则,通过最灵活又最表义的组合,实现最完备的编译描述功能。

更少却更灵活的语法规则,更强大的描述能力.
举个例子
 c++中 :template<t1,t2> class cls
   {
    t1 a;
    t2 b;
    t1 * pt1;
   };
 这是干什么,不就是t1,t2是参数么,看我的
 class cls(code t1,code t2)
 {
  t1 a;
  t2 b;
  t1 * pt1;
 };
 
 这看上去多象函数的那种格式啊,这样建立模板类多直观。还有模板参数用()多好,为什么非要设计个古怪的<>呢?

 而且C/C++中
 typedef count int;
 struct student {....};
 class cls {.......};
 看我的
 type count int;
 type student {....};
 type cls {.......};
 只要是定义数据类型就用type!

这也是可以的:
 class cls(type t1,type t2)
 {
  t1 a;
  t2 b;
  t1 * pt1;
 };
 
 我觉得一种好的语言,不是在于设计了多少代码规则让你去遵守服从,而是设计的尽量少的规则,让你去组合搭积木玩。这里我与C/C++的对比不是说C/C++不好,C/C++有很好的组合灵活性与完备程度,但是我觉的C/C++仍然做的不够好,所以我设计了太极语言。

(未完待续,今天先去睡觉,明天继续,我的EMAIL:taijiyuyan@yahoo.com.cn)

 类似资料: