官术网_书友最值得收藏!

1.2.3 Newsqueak——Rob Pike,1989

Newsqueak是Rob Pike發明的“老鼠”語言的第二代,是他用于實踐CSP并發編程模型的戰場。Newsqueak是“新Squeak語言”的意思,其中squeak是老鼠“吱吱吱”的叫聲,也可以理解成類似鼠標點擊的聲音。Squeak語言是一種提供鼠標和鍵盤事件處理的編程語言,其通道是靜態創建的。對Squeak進行了改進的Newsqueak語言是一種帶垃圾收集機制的純函數式語言,它仍然針對鍵盤、鼠標和窗口事件管理,但其通道是動態創建的,屬于第一類值,可以保存到變量中。Newsqueak還提供了類似C語言的語句和表達式的語法,還有類似Pascal語言的推導語?法。

類似于腳本語言,Newsqueak內置了一個print()函數,它的“Hello, World”程序看不出什么特色:

print("Hello,", "World", "\n");

從上面的程序中我們除了能猜測出print()函數可以支持多個參數,很難看到Newsqueak語言相關的特性。由于Newsqueak語言和Go語言相關的特性主要是并發和通道,因此下面我們通過一個并發版本的“素數篩”算法來略窺Newsqueak語言的特性。“素數篩”的原理如圖1-4所?示。

圖1-4 素數篩

Newsqueak語言并發版本的“素數篩”程序如下:

// 向通道輸出從2開始的自然數序列
counter := prog(c:chan of int) {
    i := 2;
    for(;;) {
        c <-= i++;
    }
};
// 針對listen通道獲取的數列,過濾掉是prime倍數的數
// 新序列輸出到send通道
filter := prog(prime:int, listen, send:chan of int) {
    i:int;
    for(;;) {
        if((i = <-listen)%prime) {
            send <-= i;
        }
    }
};
// 主函數
// 每個通道第一個流出的數必然是素數
// 然后基于這個新素數構建新的素數過濾器
sieve := prog() of chan of int {
    c := mk(chan of int);
    begin counter(c);
    prime := mk(chan of int);
    begin prog(){
        p:int;
        newc:chan of int;
        for(;;){
            prime <-= p =<- c;
            newc = mk();
            begin filter(p, c, newc);
            c = newc;
        }
    }();
    become prime;
};
// 啟動素數篩
prime := sieve();

程序中的counter()函數用于向通道輸出原始的自然數序列,每個filter()函數對象則對應每個新的素數過濾通道,這些素數過濾通道根據當前的素數篩將流入輸入通道的數列篩選后重新輸出到輸出通道。mk(chan of int)用于創建通道,類似Go語言的make(chan int)語句;begin filter(p, c, newc)關鍵字啟動素數篩的并發體,類似Go語言的go filter(p, c, newc)語句;become用于返回函數結果,類似return語?句。

Newsqueak語言中并發體和通道的語法與Go語言已經比較接近了,后置的類型聲明和Go語言的語法也很相?似。

主站蜘蛛池模板: 道真| 和田县| 楚雄市| 长宁县| 大城县| 云和县| 建宁县| 玉山县| 固镇县| 赤水市| 南投市| 隆尧县| 巴彦淖尔市| 雷波县| 灯塔市| 岳普湖县| 濉溪县| 新营市| 张家口市| 外汇| 油尖旺区| 调兵山市| 远安县| 博客| 胶南市| 大名县| 沙洋县| 曲沃县| 饶平县| 称多县| 怀宁县| 株洲市| 通海县| 中宁县| 永丰县| 濮阳市| 龙口市| 石城县| 伊春市| 盐城市| 马鞍山市|