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

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

但是实验室的活儿只能用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#之类的语言之所以效率较低有一个原因就是自动垃圾回收。这个暂时还没想到啥好的解决方法。

Asp.net果然可以异步处理http请求

这是我的一大发现。。(虽然很有可能早就有别人发现了。。)

我这里的异步是指,客户端1某此请求服务器端数据,服务器端先进行数据的接收,直到某一条件(比如说有另外的客户端2访问、某事件的触发)时,继续进行客户端1的数据的发送。

这里以客户端2的访问为例。

在aspx网页中放上一个Button,代码如下:

C#语言:
namespace Test
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Application["thread"] != null)
            {
                System.Threading.Thread th=Application["thread"] as System.Threading.Thread;
                if ((th.ThreadState & System.Threading.ThreadState.Suspended) > 0)
                {
                    HttpContext hc = Application["context"] as HttpContext;
                    hc.Response.Write("hello world!");
                    th.Resume();
                   
                }
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Application["thread"] = System.Threading.Thread.CurrentThread;
            Application["context"] = HttpContext.Current;
            System.Threading.Thread.CurrentThread.Suspend();
            Response.End();
        }
       
    }
}

某个客户端1访问时,按下按钮,然后客户端1处于等待状态;

直到另外一个客户端2访问时,客户端1的服务器处理线程停止挂起状态,并且客户端1的输出交给了服务器处理客户端2时的线程。

这正是我想要的效果。Asp.net的Application真是强大啊。。

WM版计算器

在北航这个破地方能做出点东西来真不容易。。

Windows Mobile这个“老掉牙”的操作系统(其实我觉得WM还可以。。)上的计算器们都太蛋疼了,不是数字显示不了就是试用期已到。其实我的要求不高,能算出一般复杂的式子就可以了,也不需要太花哨的界面。于是我就用C#编了这个计算器。

阅读更多

Asp.net中Application的收尾事件的触发

根据我之前的谷歌一下,貌似很多人都表示Application的各个事件(尤其是各种收尾事件)的触发十分诡异。

而且这些事件还十分有用。比如说如果用Application作缓存,用户输入的东西先不直接存储在数据库中而先保存到Application中,直到Application到达一定大小时再一起存储进数据库。如果Application在销毁时不利用事件将剩余的数据存储,那么那些数据就将丢失。

于是刚才做了个小程序尝试了一下。在global.asax里写下这个:

阅读更多

张总泪流满面 CloudClip云剪贴板 beta版发布

这样的张总:你在家里的电脑上按了CTRL+C,然后在公司的电脑上再按CTRL+V是肯定不行的。即使同一篇文章也不行。不不,多贵的电脑都不行。

张总的愿望终于可以实现了。经过将近半个月的折磨,这个传说中的“云剪贴板”终于发布了!现在开始我们可以在不同的电脑上共享多达100条的剪贴板,支持普通文本、word文档、HTML文档等格式!

当然google docs是最先实现这个功能的工具,不过并不是所有需要复制粘贴的东西都在google docs中,况且google docs不一定能时时刻刻访问(比如说连接被重置)。

不过现在这个程序的缺点就是不能跨平台,因为是用c#编的。我的索尼本不能用ubuntu,所以不能测试可不可以在mono下运行。估计够呛。

云端的地址初始为:http://graphonline.info/clip/service.asmx 程序中已经预先定义了这个地址。如果这个地址挂了,可以把云端的asp.net程序发布到别的主机上,然后改一下.config文件就可以了。

不过毕竟只是一个简单到极点的beta版的小工具,有一些力所不能及的事情它是不能做到的。比如说拷贝超过10k的大文本,在网络不好的时候很容易出错;不能拷贝excel表格,因为不知道为啥excel每次拷贝时总会同时拷贝四次,造成网络堵塞而出问题。更有许多bug,等待着大家去发现。

计划在下个版本中加入上传功能,解决目前的上传不稳定的问题;还打算加入对图片格式的支持。

好了不废话了。下面是下载地址:

客户端可执行文件(需要.net framework 2.0及以上(windows vista以上自带)):CloudClipWindow.exe

云端源代码(Visual Studio 2008+Asp.net 2.0):CloudClip

客户端源代码(Visual Studio 2008+C# 2.0):CloudClipWindow

.Net中的Clipboard。。算是bug么

用Clipboard.GetData(format)与Clipboard.SetData(format,data)中的format竟然大小写敏感..搞了好久才知道。

format 返回类型
Text string
text以及其所有大小写格式 MemoryStream
HTML Format string
html format以及其所有大小写格式 MemoryStream

我建议都用MemoryStream的,可以用ToArray()输出byte[]。 string的很容易出现各种各样的问题,尤其在HTML Format上。

c#中监控剪贴板的两种方法

最近在做一个云剪贴板的程序,需要用一个c#桌面应用程序来监控剪贴板。本来想的是,新建一个线程用while循环检查剪贴板内容的改动,不过发现不成功,如果用GetText()访问剪贴板则不管剪贴板内有没有文字都返回空字符串,用SetText()设置剪贴板则出错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。”

所以我google了一下,发现貌似监视剪贴板可以不用“幕后线程”去不断检查,有专门的API来进行监视,并通过触发事件来告诉我们。

阅读更多