搞一个新的程序设计语言?

当了好多年的码农,有时候真的想搞一个完美的程序设计语言一直用下去。去年编译原理大作业让我的这个愿望更加清晰了一些,但是现在又有些退缩了。学到的越多,越不敢去创造。

但是实验室的活儿只能用Java与C++,课堂里的东西呢?也是Java, C#, C++, 顶多在上学期有一门Ruby的课程,我还没选。所以到现在,上面的愿望就愈加模糊了——没有用处的语言,造它何用?

不过还是想写一下我使用过的语言的各种缺陷和我的构思,希望有朝一日这样的新的程序设计语言能够成真。

1. 不要禁锢在面向对象里。典型的语言就是Java与C#,任何一个东西,变量、类、函数等等都要被包含在一个类里,每个类还必须单独在一个单独的文件里(Java)。

在OOP的课里,我们以用更多的类、有更多的文件和代码行数为荣。现在看来,真是太可笑了。OOP确实给大项目带来了很多方便之处,但是也让项目无从下手。

比类要细化一些的大概就是函数了,这也是我最近很迷恋FP的原因。而且,如果你愿意,FP也可以当OOP来用。

Java支持FP看来是无望了,这样一个庞然大物太难以改变了。Scala是个有前途的语言,但也不是个好语言,虽然很多特性让我眼前一亮,但是它是OOP向FP的妥协,让人感觉不伦不类,如同C++一样。但是C++有高性能,Scala有么?

所以我心目中的语言,代码的单位一定是函数。

2. 语法可以自己定义。很多语言有很多语法,比如说C#,我从它的1.1用到了现如今的4.5,语法多了不少。如lambda表达式省掉了delegate,var,async/await等。但是人和人的想法是不一样的,如果我们可以自定义自己的语法该多好。比如说我十分想在C++里用一种非常优美的方式实现可变参数,如这样:

int sum(int x){return x;}

int sum(int x, ...){

return sum(...)+x;

}

当然这是不可能的,哪怕动用C++的宏和模版也是不可以的。据说lisp的宏是比C++的宏可怕的多的东西,可以定制一切,大概就可以自己搞搞让它支持这种语法吧。

3. 面向人类语言的语法。据说,lisp是一个评价很高的语言。我在寒假看了《计算机程序的构造和解释》,发现它确实非常牛,是属于语法非常少、功能非常强、而且可定制化的典型语言,而且还是函数式的。但是,一般人不会使用它,因为它的语法一般人忍不了。

现如今的语言都往人类语言的方向发展,如python,写起来的代码就像说话一样。比如说

a,b=c,d

这样的语法是我在Java/C#里梦寐以求的。

面向人类语言也就意味着语法分析、词法分析将变得很困难,就像lisp根本就不需要语法分析器一样。

4. 面向IDE。语言不能少了IDE,虽然有很多装逼和牛逼的人会说那是你能力太弱。和上一点一样,语言是面向人类的,不是面向机器的。语言的发展不是为了那些装逼的和牛逼的人,而是为了更广大的劳苦码农们。这方面比较好的是C#,配合Visual Studio简直太完美了,不过最近加入了一些动态语言的东西导致VS有时也不这么靠谱。

另一方面,弱化类型也是我想要的。如Java里定义一个函数,类型就要写半天。如果可以省略类型该多好。但是这样IDE的语法提示就少了很多。

5. 冗余要少。我想到最近写的东西,就会发现,好多冗余的东西啊。比如说,Java里,每个代码文件开头的那堆import. 这些东西当然有用,但是,如果这个世界(这个程序的包)里只有一个叫做xxx的类,我为何还要费劲的import它?又比如Java的输入输出,当年搞ACM的时候简直对这个输入输出太有意见了,虽然是使用了Adapter的设计模式,看起来很高端大气上档次的样子,但是冗余太多了啊!为了输入个数字搞这么多代码干啥?

6. 面向并行计算。现如今的大部分语言还是要显式的搞thread啊,mutex啊之类的东西,好麻烦,而且还不能适配CPU的个数。最近在看《并发的艺术》,发现为了个并发会有这么一本书的算法,真是不明觉厉。对于分布式,更是有一堆connection,错误处理之类的东西,为了简单的一个功能(如分布式队列)却要写上千行的代码。

对于immutable的语言,比如说纯函数式语言,貌似确实可以很容易的支持并行计算,但是也不能做到适配CPU的个数。对于支持actor模型的语言,如scala,看起来很容易做到适配CPU个数,但是对于现有的代码和设计方法也需要重构才行。

7. 编译(解释)、调试简单。还是有很多牛逼或者装逼的人推荐使用gcc+gdb编译和调试cpp程序,但是我依然一直在使用的是VS的编译调试功能,确实好用。相反,我一直找不到如何不用VS对C#程序进行调试。 又如, Java的java.exe和javac.exe我一直不知道他俩的区别。

我心目中的简单的编译器,它绿色环保跨平台,只有一个可执行文件,它可以接受一个像人类语言的参数或输入,去执行我们想要的东西。

8. 支持reactive programming. Reactive Programming是我梦寐以求的东西,比如说Excel,一个数据变化会引起一连串的数据的变化。这个功能在有用户界面的程序上用处相当大。

当然支持RP了就肯定不是immutable了,所以需要好好设计一下。

9. Lazy Evaluation. Lazy的思想应该不只在lisp这样以列表为主要结构的语言中。用好了lazy可能会极大地提升效率。

如,一些函数是纯函数式的,也就是说,一样的输入在任何时候都会得到同样的输出。这样的函数完全可以弄成Lazy化的——如果这个函数需要很大的计算量,那么可以在计算完第一次后,将输入作为key,输出作为value存储到一个NoSQL数据库中作为cache。这种需求很大,现在的情况是,NoSQL很火,但是程序员仍然要像操作SQL语言一样操作NoSQL数据库,将数据库整合到语言里不是很好么?

10. 让垃圾回收更加智能。最近在开发Android应用,发现它的垃圾回收简直太慢了,Java还只支持在堆里分配空间,实在是太不爽了。Java、C#之类的语言之所以效率较低有一个原因就是自动垃圾回收。这个暂时还没想到啥好的解决方法。

2012

2012年是我码代码最多的一年。1个android小游戏+5个wp7水应用+DynamicCode第一版+BrickBreaker小游戏+DynamicCode第二版+Gearman小修改+Kestrel大修改+C0编译器+Shieldstar大游戏+Cobra实现+数据库大作业...

有关高性能计算

在百度实习的两个多月,在技术上还是有很多收获的,首当其冲的便是对高性能计算方面有了一些见解。

大约在四十多年前,我们的计算机还只是单线程的——它们顺序的读程序,然后交给CPU进行计算,偶尔跳转到别的地方去读写数据。随后,一个叫做操作系统的东西出现了,更高级的操作系统支持多任务,一开始的多任务很粗糙,只是把每个任务分成几个定长的时间片,然后备份CPU寄存器里的数据,轮换各个任务罢了。然后,多任务变得越来越人性化——如加入了优先级,对IO任务和计算任务加以区分等。多任务也成就了日后的线程和进程。

随着计算能力的不断提升,多任务切换所需的额外花销也就不算什么大事了。但是,单个CPU的计算能力在近些年增长缓慢。于是,我们很容易的想到,使用多个CPU去解决问题。但是,一个已有的程序更改成为可以并行计算的程序时很困难的。还有,CPU的数量是未知的,为了适应越来越多的CPU并不浪费其能力,我们建立尽可能多的线程/进程(远远大于CPU数),并行的处理任务,操作系统会帮我们处理它们之间的切换。网络的兴起使得服务器大多采用了这样的方式:每个请求都是一个线程,它们互不干扰的运算、存取、返回结果。

这里便出现了三个问题:一个是怎样把已有的程序改造成为并行程序。这让躲在学术圈的函数式语言得以大放光彩。函数式语言的几乎所有语句都是由函数组成的,而且,每个函数的调用不会修改已有的数据,也就是说,一个对象被创建后,便不会被修改。这样,首先它是线程安全的;另外,它可以在不修改代码的情况下,自适应多CPU的情况,只需将不同的函数调用分配到不同的CPU中去便可以了。但是,真正的函数式语言比较理想化,不是十分浪费内存就是十分浪费计算量,虽然写起来和听起来很好很强大的样子。所以,比较新的函数式语言,如Scala等,也兼容普通的命令式编程和面向对象的思想,虽然浪费了一些并行性,但是最近也越来越火。

第二个问题是,怎样让这些并行运行的线程之间进行通信。并行计算中的一个很常见的东西是锁,或者CAS之类的替代品,因为多个线程同时操作同一个数据时会出现难以预料的后果。但是,锁的使用一方面带来的死锁的现象,另一方面则降低了效率,就算现代的CPU硬件支持某些指令,但是在某个线程对某个对象上锁的过程中,另一个也需要访问该对象的线程便只能干等着,这浪费了CPU的很多性能。多个机器的情况下,频繁的数据通信会加重网络的负担。

第三个问题是,IO。CPU那点时间和IO比起来不值一提,对内存的读写、对硬盘的读写、网络的访问,这些都时时刻刻影响着程序的效率。并行计算虽然解放了CPU,但是并没有解放IO。

这三个问题又衍生出很多其他的问题,比如说,在多个线程在同一个CPU中运行时,CPU内部的寄存器、Cache都会被更换,这在线程数比较少的时候不算什么,但是线程数会尽可能的多,则线程之间切换的花销就不能被忽略了而且功耗也是一个问题。线程过多、IO、锁也时时刻刻影响着机器的稳定性;再比如,有些任务是IO密集型任务,有些则是计算密集型任务。我们需要把它们放到适当的机器中运行,不然则会产生浪费。但是,一个线程所在的CPU是随机的,甚至它所在的机器都是随机的。这将会造成一定的浪费。

在这些问题日益增加的情况下,我们勤劳的劳动人民想出了很多的办法。比如说,为了区分IO密集型任务和计算密集型任务,对机器们进行统一个管理和调度,把新的IO密集型任务放在计算密集型任务比较多的机器中,反之亦然;再比如说,关于线程过多计算量过大、机器容易不稳定的问题,通过减少高性能的机器而增加更多的普通机器,来让任务们各得其所。

但是这解决不了根本问题,那就是,本来计算机就是为顺序执行程序而设计的,但是我们为了让计算能力提升而逼迫程序以一种完全不同的方式去运行,这种背离了计算机本身运行方式的计算方法肯定会存在问题的。于是,我们便从另一个方向去思考这个问题:为什么不让一个机器(CPU)以它最大的可能去运行一个它最擅长的任务呢?正如,我们要分别考语文数学英语三科,我们为什么要让一个非常牛的人用两只手加一只脚分别写三科试卷,而不让三个分别擅长语文数学英语的人分别用一只手去写他们擅长的试卷呢。

所以,我们的思绪回到了几十年前,那个没有操作系统的时代,计算机是那样的高效。我们希望回到过去,让每个CPU执行单一的任务,不同任务之间采用无锁的通信方式。但这显然需要很多的工作,比如创建一个崭新的操作系统。但是,现在的许多计算框架已经有这个趋势了:它们只有几个为数不多的线程,线程数根据CPU个数而定,而且各自分工明确;每个线程都拥有一个队列或其他容器,用来进行线程之间的通信;一个机器与另外机器通信后还可以继续执行它后面的任务,也就是异步执行;它们可以很容易的移植到多个机器上,每个机器做特定的事情。

通过这样设计出的系统在性能和稳定性上都优于以往的基于多线程的系统,可以说,这是高性能计算的趋势。但是,它似乎仍然没有解决一个问题,那就是锁和IO,数据通信和对数据的写入成为了瓶颈。但是,锁是用来干啥的呢?一是用来在写数据的时候,不与同时进行的其他写数据的操作冲突,二是在分步操作数据的时候,不被同时进行的其他读数据的操作读到中间结果。但是,我们目前的存储器支持的操作都是单线程的,那我们对其的操作为啥要并行呢?所以,我们可以让一个机器只负责IO,它也有一个容器用来盛放其他机器对它的请求,它依次执行并把执行结果通知拥有请求的机器,它不需要很强大的CPU。如果IO的负担过大,可以把它分为好几个这样的部分。关于数据通信,也就是各个CPU之间的通信。在同一个机器上可以通过共享内存,可那就需要锁,于是,一些无锁队列的实现方式最近火了起来;但是,解决这个问题的终极方法只有一个,那就是制造出适应于并行计算的存储器。不同机器只能通过网络,可是网络不可靠,而且传输速度有上限。于是,很多分布式计算的理论出现了。

我在百度做的东西,Gearman和Kestrel,都采用了这样的思想。

所以,高性能计算的未来不是并行运算,而是分布式运算。

以上有感于12306...

自我剖析

时光荏苒,岁月如梭,转眼间,大一就这样结束了。。(我敢不敢不用这个蛋疼的开头。。)

这一年分为两个学期,而这两个学期对于我是截然不同的,虽然有不少的联系吧。。

两个学期的我有截然不同的风格,当然很多都没有变。因为种种原因,第二学期变得更加沉默了。

功利点的总结,这一年的时间里成功宣传了自己,但是自己的能力却事实上没什么提高。

所以第二学期尝试着更加低调做事高调做人,不过没做到。。

下个学期争取做到。

这一年学的东西,估计这个暑假就差不多忘了。其实学了那么多科五十多个学分,我认为真正有用的也就是数分里的求面积/体积和高代里的行列式/矩阵了,估计也就这两点在不久的以后不会被忘记。

第一学期绩点很不入眼,仅仅1.30.第二学期估计会顺眼点,就看物理了。

我就不是学霸的坯子,每天10点就不学术,11点多就睡觉,考期也一样,还有大把的时间奉献给人人足球搞对象,像我一样作息而能有比我高的分数的人能有多少呢。

初中9点睡,高中10点睡,不还是照样来到了这里。

大二课程和大一下的数量差不太多,我希望我能在不改变作息的情况下,取得更好的成绩。身体第一,学习第二,爱情第三。

另外,OI的那堆东西其实也没怎么学习。毕竟在高中我的OI知识就不是特意学的。这一年,新学的算法神马的也就是个SPFA和欧拉回路了,其他的学了也忘了。

在刷题的过程中我发现我的码代码能力还是可以的,一二百行的程序写起来还是无压力的。所以这个暑假就至关重要了,集训的时候我要努力学习算法学习数据结构,刷题就是次要的了。

另外一个冯如杯创新奖让我轻飘飘了一阵之后,更加让我认识到我的不足和坐井观天。买的jquery的书还没有看过,还打算编wp7的应用,还没有动手。以后的业余时间也要利用起来。

另外四级考得很不好,但愿能水过。这一年英语退步太大了。

总之,这个暑假是一个机会。

但前提是住的地方能有空调啊啊。。

it's not the end

到今天为止,第21届冯如杯对我来说基本上就落下帷幕了。听纪导的意思是“基本上创新奖已经拿下了”,这已经是一个再好不过的结局了。创新奖作为一个一等奖和二等奖之间的奖项,已经远远超出了我当初申报时的期望,作为一个大一学生,能走到今天离不开各位老师同学辅导员的努力。

但是我在这里不想表扬谁谁,我也不想表扬我自己。得到这样的奖项我也没怎么感觉到有多么的荣幸,虽然很多人都替我感到高兴。导说如果不是大一,这个项目甚至可以冲击一等奖。但是我觉得一等奖是根本不可能的。因为它真的没有想象当中的那么难,虽然对我们来说可能很难。另外,一些毫无必要的事情所占用的精力甚至超过了项目本身,这也在不断的消磨着我的激情。

这个项目叫做“云剪贴板”,我想一直看我博客的人都会知道,这个东西我在去年的四月份就已经做好了一个最简单的多bug版。上学期在商讨SRTP项目时我不打算说这个东西,因为这个东西实在太简单以至于可能骗不到钱。当时我说了我的其他几个想法,但几乎都被毙掉了,反而这个小东西得到了大家一致的支持。最终,它和另外一个硬件项目通过了SRTP,而后也报名了冯如杯。

在这个寒假,为了使它能够跨平台,我才开始了重构这个东西。在服务器端仅仅修改了一下缓存机制和增加了几个为其他客户端设计的函数,真正重构的是客户端,使用了队列以防止它崩溃,以及支持了更多的格式。这些都是小改动,但是各种小改动加起来就成了大改动了,然后的debug也很繁琐,很无聊。但是编这个东西是个很惬意的事情,毕竟有想法,有动力。随后开学后,有了服务器,我们开始做Android的客户端。这个才是真正的难点,因为我们对Android都不熟。Java这种连String的==操作符都不重载的东西是相当的蛋疼,以及Android的线程机制也很捉摸不透。在很长的一段时间里Android客户端都处于一开就死的状态。直到半个星期之前它才可以真正的使用,真是很及时。

MacOS和WM方面我没怎么去了解,我也不知道它们做起来是不是也很难。。

总体来讲,至少相对于其他排名前十的项目来讲,这个项目真的没有那么难。它所用到的最NB的技术,也就是二进制序列化与XML序列化混合存储这个了,根本就没有其他项目那些精深的算法那样炫,但是我们依然付出了相当多的努力。它之所以能排名这么靠前,应该是因为它的创新性以及实用性吧,虽然我觉得也没什么。。我离一等奖,还差得远。。

第二个方面是一些琐碎的事情占用的精力甚至超过了项目本身。做项目本是件很惬意的事情,但是做PPT就不是了,改PPT就更不是了,答辩就更更不是了。多次的做PPT改PPT以及回本部答辩是相当蛋疼的,这消磨着我的激情。为了这些事情,我已经旷掉了很多节课,其中以物理居多,以至于我现在就指着看上海交大的课件过日子了。。

而且,这种本身应该靠科研能力,靠学生的平均能力水平来排名的比赛,却和项目的数量挂钩。各种为了刷数量所申请的蛋疼的项目多种多样,我不知道这样用数量换取平均质量,除了那么一个奖杯以外会有什么意义。

我从今儿下午就一直在想大二要不要再做个项目。大二的学业压力很大,如果再像这学期这么折腾,如果没有得到一等奖再挂了科,就得不偿失了。

如果最近有好的想法可以在这个暑假之内做出来,那我就做;如果不能,大二的冯如杯就打酱油吧。。

就这样了,阿森纳平了利物浦,睡觉了。

这个学期需要做的东西

给自己列个计划吧。。不然又会像上学期一样啥都没怎么做,生活不能只有妹子和学术。

非ACM:

SRTP云剪贴板 3月31日前完成服务器+Windows客户端,4月31日前完成Windows Mobile/Android客户端,5月份做网页查询。应该问题不大。

网页版砸红一 我觉得我已经有足够的技术去做这个东西了。。争取5月31日前完成,难度有点大。。

选择题最优策略 这个。。其实难点不是算法而是怎么搞到电子版的选择题。。说不好还得学学OCR。。好吧,这个随意,能不能做出来回头再说。。

ACM:

顺其自然吧,各种学算法各种刷题是必须的但不是全部,我不希望ACM会占用我全部的时间。毕竟相比于ACM,还是上面的那三个更吸引我。。

学术:

有得必有失。学术上我要求不高,平均绩点比上学期高就可以了。。

把妹:

把Deadline定在了愚人节,我要花一个月的时间忘记你。

 

年轻人,不能不敢去尝试。

PS:Take That的某些歌太好听了。。

我生活的世界

这或许就是我生活的世界吧。

那是地球,像一叶扁舟一样,孤独而不孤单的在她预定的轨道上,承载着我们渺小的世界,不知疲倦地飘啊飘。这世界对于我们来说却是那么熟悉而又陌生:我们已经在这个小舟上生活了数不清的岁月,却又不知道未来的她会不会渐渐老去。

这就是我们生活的世界。我们和她一起朝夕相处了几千年。我们日出而作日入而息,她默默地奉献着她的温柔与力量。那是大自然的气息:当鸟儿们在树林里高歌,草地上点缀着鲜花时,那种气息会不经意间让你沉醉。

可是,一切都在不经意间变化了:鸟儿们找不到家,却被困在笼子中被人赏玩;鲜花被车轮碾压,草地变成了笔直的马路……世界变了,她变得如此不堪重负而又如此的脆弱。高楼挡住了阳光,却没有挡住温度的升高,烟雾把天空染成了灰色,污水把河流染成了黑色……

当地震海啸频繁的发生,高温酷暑折磨着我们,这些就是大自然给我们的警告?当大自然和我不再是朋友而成为了敌人,而我们却还在寻找另一片殖民地,

这难道就是我生活的世界?

人定胜天,但是不能违反大自然的规律。2012的故事还在流传,但是谁都不希望它会发生甚至提前发生。面对日益严重的环境问题,唯一的解决方法还在我们自己。

我欣喜的看到,世界上绝大多数的人都已经意识到了这个问题,并且已经开始了行动。思科、IBM等等企业已经把研究重点放在了我们的生活环境上,各国领导人也把政治问题放在了环境问题的后面。我们可以看到,废物会越来越少,取而代之的是各种各样的再生材料,树木会越来越多,把多余的大气废物过滤得更干净……

闭上眼睛,我看到一个梦幻般的世界:在这个蓝色的星球上,河水不再肮脏,天空依然蔚蓝;海水不再上涨,沙漠不复存在……它依然在轨道上飘着飘着,不过它并不孤独,因为在它上面承载着那么多的生命,他们是永远爱着它的孩子。在他们眼中,它永远不会老去。

但愿,这会是我生活的世界。