- Go語言高級編程(第2版)
- 柴樹杉 曹春暉
- 774字
- 2025-08-07 17:56:10
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, n
ewc
)
關鍵字啟動素數篩的并發體,類似Go語言的go filter(p, c, n
ewc
)
語句;become
用于返回函數結果,類似return
語?句。
Newsqueak語言中并發體和通道的語法與Go語言已經比較接近了,后置的類型聲明和Go語言的語法也很相?似。
- 演進式架構(原書第2版)
- JavaScript語言精髓與編程實踐(第3版)
- Learning Laravel 4 Application Development
- Web Application Development with MEAN
- Learning ELK Stack
- iOS編程基礎:Swift、Xcode和Cocoa入門指南
- Elasticsearch Server(Third Edition)
- 數據結構與算法分析(C++語言版)
- C++ Application Development with Code:Blocks
- 黑莓(BlackBerry)開發從入門到精通
- Drupal Search Engine Optimization
- Mastering XenApp?
- 零基礎入門學習C語言:帶你學C帶你飛
- OpenCV:Computer Vision Projects with Python
- HTML 5與CSS 3權威指南(第4版·下冊)