2012-07-21

众所期待 – 真正的类C通用型脚本编程语言出世了!

Views: 31332 | 34 Comments

虽然是借鉴了C语言的语法, 使用了Python语言的模型和运行环境, 但它是一个真正的*中国人自己完全自主发明创造的拥有自主知识产权的*(^_^)通用型脚本动态脚本编程语言, 而且是一个21世纪的编程语言, 在2012年这个世界末日之年正式诞生!

它能做什么?

它是通用型编程语言, 是一种动态语言, 是一种脚本语言, 可以用来做日常的文本处理, 也可以用来开发网络服务器和客户端, 可以用来做企业级开发... 总之, 只要Python能做的, 它就能做. 它和Python唯一的不同就是: 它是类C语法的! 这就避免了Python那种悬空的摇摇欲坠的混乱的代码风格的缺点, 有助于大型项目代码的开发.

而且, 它能复用所有的Python内置模块和所有你写出来的Python代码, 你只需要简单的import它们即可.

先来一个简洁的的例子吊一下你的胃口:

class A{
	public a = 0;
	public static s = 1;

	function init(a){
		this.a = a;
		print 'A init', a;
	}

	function f(a, b=1){
		return a + b;
	}
}

print A.s; // 1
a = new A(1); // A init 1
print a.f(1, 2); // 3

补充一句: 大部分编程语言的某些看起来很奇特的写法, 都是可有可无的个人爱好的语法糖, 只有类C语法才是编程语言最精简的语法, 只有包, 类, 函数才是通用型编程语言最重要最根本的元素.

下载地址: https://code.google.com/p/cpy-scripting-language/

Related posts:

  1. 用C语法来写Python代码
  2. 消除JavaScript闭包的一般方法
  3. SSDB – 支持 zset 的 LevelDB 服务器
  4. iphp 框架增加 lazyload 特性
  5. C++成员函数作为pthread_create参数
Posted by ideawu at 2012-07-21 12:57:12 Tags:

34 Responses to "众所期待 – 真正的类C通用型脚本编程语言出世了!"

  • 为什么没人提xrange呢。。。。 Reply
    @luomio: 有人提了的… Reply
    @ideawu: 完全找不到~~~ Reply
  • 有必要这么冷嘲热讽么,楼主不就是自己搞了个东西玩玩么。程序员何苦难为程序员呢。 Reply
    @null: 许他吹大气,不许别人挑刺?什么“众望所归”啊,什么“21世纪的编程语言”啊,连 Python 的基本使用都弄不清楚,就“发明”语言,还当自己是救世主? Reply
    @None: 哈哈, 从你的名字看出你对 Python 的迷恋. Reply
  • 楼主低调点吧,别拉那么大的旗。就当成自己一个练习就是了。

    另外,楼主那个 for i in range(100000000): 暴露了楼主对 python 的一个基本的概念
    –迭代器–不熟。 Reply
  • 我觉得你本末倒置了,现代编程语言追求的是语言的表达能力,主要体现在两方面:一方面更符合人类的思维方式而不是机器的思维方式,另一方面用更简练的语言表达更丰富的语义。
    如果你认为高级语言的“语法糖”可有可无,要追求语言的精简的话,那么for也是可有可无的,因为有while就够了,进一步来说while也是可有可无的,有if和goto就够了。 Reply
    @oobleck: 同学, 麻烦你用if和goto实现for语句我看看, 哪个简洁? 不要为了反对而毫无逻辑地联想, 要讲究科学精神. 你的前一句我比较认同, 我们要讨论的是简洁到什么程度, 何为简洁. Reply
    @ideawu: 你混淆了语法的精简和写出程序的简洁。我可以问你同样的问题:
    用ruby可以写
    attr_reader :a, :b, :c, :d, :x, :y
    用c写实现看看,哪个简洁?
    除非把c的宏引入进来,那又会违背你语言追求精简的初衷。

    如果要讨论语言可以使写出的程序简洁到什么程度,我认为,在程序执行性能可以接受的情况下,自然是程序越简洁越好,更短的程序可以提升程序的可读性和减少bug数目。

    c之所以长久不衰在于其和机器语言更接近所以可以使程序有优秀的性能,而并不是因为其精简的语法。且不说lisp,即使去掉了for和hile的c的语法子集也可以做同样的事情,而语法上比c更精简。那么为什么会有for和while?自然是为了增强语言的表达能力,而高级语言的多出的特性也是这个目的

    这个语言继承了c的表达力不够强的语法,又不能获得c的性能,那么就有了我开始的问题,这个语言的定位是什么? Reply
    @oobleck: 我对ruby完全不了解, 现场搜索了一下, 好像是定义类的只读属性吧吧? 我考虑给Cpy加上一类似的功能, 但语法大概是 readonly a,b,c,d,x,y;

    bug的数目和出现频率和项目代码行数无关, 和单行代码长短无关, 只和其逻辑是否简洁, 思路是否清晰相关.

    类c语法的 java/javascript/php/c# 都取得了巨大的成功, 这不仅仅是偶然. 既然语言本身支持上百个奇技淫巧, 但真正经得过时间验证也就那几个. 表达式不在多, 够用就行. Reply
    @ideawu: 你看,你也加入了“语法糖”之类的东西,我想你会把readonly作为语言的关键字,但ruby不是,attr_reader只是一个库函数,后面几个是它的参数,这就提供了足够的灵活性。c 如果想要这种灵活性,就只能用宏。 Reply
    attr_reader(:a, :b, :c) 写成这样可能更好理解,只是ruby允许把函数调用时不必要的括号省略掉所以大家一般不写括号
    @ideawu: 这是函数不是语法,:a在ruby中你可以理解为是类似字符串"a",但又不完全一样,如果去掉冒号,在函数参数中出现时,解释器就没办法区分这是变量还是符号
    @oobleck: attr_reader 这种特性不错, 但 ruby 对这种对外只读属性的定义语法不够好, ":"号可以省略. 可以想出一个更好的关键字来表示对外只读的属性. 说java等是类C语言, 并非对它们不公平, 因为它们确实就是类C语言, 这是公认的.
    @ideawu: attr_reader不是你所想的const/readonly,而是类似java/c++等面向对象语言中的getter。而且这个是函数,不是语言关键字,所以可以写出很多类似的功能

    你所列出的java/javascript/php/c#都提供了c所没有的lambda、闭包、反射机制,你把它们都归为类c语法,对它们是很不公平的
    @oobleck: readonly/const在大部分的类C语言中都包含, 所以不是语法糖(const比readonly更简洁一点). C语言本身也有类似的对变量作用域(类型)进行限定的修饰符.
  • @ideawu: 哈哈哈,那个 Python 2 代码使用了大量内存只能说明你根本不懂 Python 编程! Reply
  • 哥们,你这不过是基于Python做了个给喜欢C口味的人吃的糖而已,就别嘲笑别人的糖了吧 Reply
    to ravenwang: 哥们, 你过度了. 这不是嘲笑, 而是科学的讨论. Reply
  • 1. 分号既然能用换行来代替了,那么大括号呢…缩进可以了吧
    3. 所以我觉得现在很多的语言所具有的大括号和分号是历史原因,也之所以现在的新语言都不考虑使用大括号和分号了。既然缩进和对其是编程的基本要求,而通过他们已经可以表达出块结构了的话,那么让Python编程具有C语法的意义到底在哪里呢?你看看我想发明的这款语言,我们的想法是呈是180度的….https://github.com/alsotang/Tang
    5. 创建对象也是对于函数的调用啊,调用的是构造函数,然后让一个变量名接受构造函数的返回值。况且按照约定来说,首字母大写的就是Class名了,那么调用一个类名开头的函数就是构造函数,这点甚至可以通过vim的好亮来进行函数和创建对象的区分,毕竟函数名是小写字母开头的。
    6. 太巧了我只能说。我也觉得for in 是一种逆思维的语法,而且我更进一步认为这是外国人的思维方式,他们觉得for i in arr 很平常,而我们中国人需要的是for arr as i。这一点上,你的想法我表示赞同。但是就实现来说:我觉得foreach可以用for代替,while也可以用for代替,for(init;loop;incr)这个语法,在Python中没必要了,这个语法无论你怎么写,我都可以找到对应的简洁的 for i in range(num)[s:e:step]写法。

    Wordpress确实没有自动发邮件通知我,回复的时候,还是麻烦你能发封邮件提醒一下我。另外,我有收到你去我博客的留言,我的技术博客是:http://fxck.it Reply
    to AlsoTang: 另外, foreach不是中国人独创, 也不是中国人的思维专利. 如我前面说的, 我最先在PHP中看到这种语句, 而PHP的发明者并不是中国人. Reply
    to AlsoTang: 不巧, 我偏偏要写出这样的Python代码(希望你还能看出这段优雅的代码是什么意思并执行它, 毕竟它只有4行):

    import time
    for i in range(0, 100000000):
    print i
    time.sleep(1)

    竟然报系统虚拟内存不足…

    我Cpy的代码却能运行得只用了少得可怜的内存:

    import time;
    for(i=0; i<100000000; i++){
    print i;
    time.sleep(1);
    } Reply
    哥们, 关于花括号, 你就看看你前面回复中贴的"优雅"的类Python代码, 你要再多贴几行, 明天连你自己都不认识了. 而function f(a, b=1){return a + b;}, 即使一百年以后, 人们也能看出是什么意思. 这个是智者见智的问题, 真没法说服你. 其他几条我仔细看完再说. Reply
  • 完完全全地逆流而上。
    1. 现在的语言无论是脚本型(CoffeeScript)还是编译型(Go)都试图去掉分号与大括号。你这里倒好….反而把这些元素加到了Python之上来…

    2. 把def 统一改为了function,不是在为难键盘吗…

    3. 如果这语言硬是去掉了Python的缩进的话,我想知道,一句话代码:
    function f(a, b=1){return a + b;} 。可以运行吗?

    4. 隐藏了Python定义类时的self关键字并改成了this,那么,如果要定义类方法的话,改怎么写?静态方法呢?

    5. public, static关键字倒还算是个小特点,extends关键字可就没必要咯。从__init__方法改成了init方法也还好,还不是语法糖-_-…..建立新object时,多加个new关键字难道不是把简单的事物变复杂和麻烦了?Ruby不要求写 obj = new Class(*args)是因为Ruby希望人们写 obj = Class.new(*args),比较符合它面向对象的原则;CoffeeScript要求写 obj = new Class(*args)是因为它底下的JS是这么干的;Go语言则与Python一样不必写new(注意Go语言是编译型噢)。这说明能省去new关键字的语言都在省了好不好….C语言中的new是为了说明对象是处在stack上而不是内存中,可Python中你根本没法定义东西在stack上啊。Java定义类时所用的new纯属多余,历史所限。

    6. 如果你喜欢C语言语法的话,foreach(arr as k=>v) 这个语法我真心觉得不好。我希望是 for arr as k, v 即可。循环的时候
    for bool
    doSth()
    即可,把while关键字给去掉。不过你的这个for arr as k => v1, v2的语法还是挺屌的哈。

    7. printf不见得比Python的print 加上 "% (*args) "语法好在哪里啊。

    8. stdin.cpy 里面那个实例,又printf又print的逻辑在哪里….

    9. " 任何代码行数超过1000行的项目和软件, 语法糖的贡献都是零. 而超过300行代码项目和软件, 语法糖的贡献也几乎为零. 真正有贡献的是制定的规范和开发出来的类库." 我想说,如果把一门本来通过语法糖简化了很多输入的语言硬是加入了更多的限制的话,对于开发项目的贡献是否会小于零…

    10. 这门语言的定义"类C语法, 通用型, 脚本",后两者是Python本来具有的,前者的是把缩进语法毁灭之后以更麻烦的C语法代替之后得来的。


    纯学术探讨,为了我能收到您的回复,请您在回复之后通知一下我: alsotang#at#gmail.com Reply
    printf() 函数不输出换行符. 而 print 指令不仅输出换行符, 而且对参数执行 str() 操作强制转换为字符串. Reply
    很高兴你回复了很多, 我也没法一一讨论了, 暂时先挑几点讨论一下吧, 其它的点以后慢慢讨论.

    1. 分号也许可以去掉, 用换行来替代分号的功能.
    3. 其实, 缩进和对齐并不是Python的专利, 而是编程的基本要求.
    5. 加入new的原因, 就是要区别函数调用和创建对象.
    6. foreach(arr as k=>v) 这个是借鉴PHP的语法, 它的作用和 for-in 有些不一样, 增加了 for-in 所不包含的功能. 在迭代数组时, k就是下标, 在迭代字典时, k就是字典的key. 相比Python的 for k,v in d.items()简洁不少. 迭代数组时, 也不用再 index+=1. 而且"k=>"是可以省略的, 不需要可以不加上. 在看了ANTLR的手册时, 我才明白了我不喜欢 for-in 的本质原因, 因为 for-in 是一种 trackback 结构, 需要人看到 dict.items() 时要回溯到 k,v.

    另: Wordpress应该能自动发邮件通知你吧, 要不是, 我明天再发邮件通知你. Reply
    @ideawu:
    您可以参考这里:
    http://en.wikipedia.org/wiki/Set-builder_notation Reply
    @ideawu:
    我觉得您应该误解了python的for in语法吧?
    (当然,我不保证我说的是正确的。)
    以您的学历,应该知道数学上的 *集合* 吧?
    在英语的表达中,对于一个元素在这个集合中 “{x | x ∈ A}“,
    貌似就是用for x in A来表达。这个for,翻译出来更像是 *对于*。 Reply
  • 脚本语言的价值很大部分在于以牺牲运行速度为代价换取更快的开发速度,那些看似可有可无的语法糖正是为了达到这一目的而存在的。

    那这个只提供基本元素的脚本语言的定位是什么呢? Reply
    to oobleck: 这个脚本语言的名称已经说明了它的用途和定位: 类C语法, 通用型, 脚本. Reply
    to oobleck: 任何代码行数超过1000行的项目和软件, 语法糖的贡献都是零. 而超过300行代码项目和软件, 语法糖的贡献也几乎为零. 真正有贡献的是制定的规范和开发出来的类库. Reply
  • 难道是把类C代码字符串替换成python然后再在python解释器里运行?
    看上去和Facebook把PHP转成C++是一个路数。。 Reply
    to lovelucy: 正是! 目前的实现版本选择了快速实现的方式, 将代码转成Python代码, 然后用Python来执行.

    未来, 实现方式可以跳过Python代码, 直接生成Python字节码, 甚至可能改变Python的运行模型, 使其完全脱离Python. Reply

Leave a Comment