当前位置: 首页 > news >正文

Newsqueak:在 Go 之前的一门语言

写在前面

学习一个东西的一种很好的方法,就是去了解这个东西的历史。在我们学习 Go 的过程中,同样也可以去了解下在 Go 之前的一些事情。

内容

Rob Pike 是 Go 语言的作者之一,早年他在贝尔实验室工作,也是 Unix 团队的成员。

在这里插入图片描述

Go 里的很多思想,来源于他在之前开发过的一门用于关注输入设备交互的语言,叫 Squeak,后来还发展出了 Newsqueak.

(一个小插曲,正如前面所说,Squeak 是一门关注输入设备交互的语言,例如鼠标这些,而 Squeak 这个词,在英文里是吱吱叫的意思,就是老鼠的叫声)

所以我们有必要了解一下 Newsqueak 的一些设计。

Newsqueak

一般在并发问题上,程序员时常要关注线程、锁、信号量、共享内存等概念,但这从程序员进行简易编程的角度来说,还是难度比较高,层次还是比较低,我们需要一种属于高层次、屏蔽更多内容的东西。而 Newsqueak 就是用来解决并发问题,同时又希望能简单些的开发语言。

我们看一下 Newsqueak 的一些代码:

变量

hello: array of char = "hello";i := 23 + 24;b := mk(array[2] of array of char = {s , "go"});

在上面的变量定义和初始化的例子里,是不是就开始看到 Go 的雏形了?

函数

prog 是个关键字:

rec ack := prog(a , b: int) of int {if (a == 0)become b+1;if (b == 0)become ack(a-1, 1);become ack(a-1, ack(a, b-1));
};ack(3, 4) #调用它

在这里,become 可以简单理解为 return。

定义了函数后,我们可以把它当做一个值来使用:

sum := prog(a, b: int) of int {become a + b;
}difference := prog(a, b: int) of int {become a - b;
}sum = difference; #这里只是一个例子,但实际这样用肯定是很奇怪的# 下面这两种结果是一样的
a := sum(24, 23);a := prog(a, b: int) of int {become a + b;
}(24, 23);

接下来,我们把函数当做一个程序来运行

begin sum(23, 5);begin prog(a, b: int) {for(; a >0; a = a-1)print(b);
}(10, sum(23, 5));   # 这段代码会在后台进行打印

这里的 begin 就像 Go 里的 go 了。

channel

c : chan of int; # 声明
c = mk(chan of int); # 初始化c <- = 23; # 发送
x = <- c; # 接收

Newsqueak 里认为这个通信过程是同步的:

  • 发送者会被阻塞,直到有接收者
  • 接收者会被阻塞,直到有发送者
  • 如果两者都准备好了,那么值就会被传递

想要异步的话,可以这样:

begin prog(c: chan of int, a: int) {c <-= a;
}(ch, v)

在 Newsqueak 里,channel 有以下几点:

  • 它们应该被用来处理所有的通信问题
    • 这样可以避免共享内存
    • 将数据和信号做关联
  • 它们应该像文件描述符一样,而不是文件,也就是我们拿到了这个句柄,就可以操作它做一些事情
  • 它是 first-class values (不知道怎么翻译) ,大致意思就是可以像其它基本数据类型一样处理的值,也就是 channel 可以作为函数的参数、返回值、数据结构里的参数等。

与 channel 搭配的,还有一个叫 select 的东西

c1, c2: chan of int;
i: int;select {case i = <-c1:print("A:", i);case i = <-c2:print("B:", i);case i = <-c1:print("C:", i);case i = <-c2:print("D:", i);case c2 <-= 7:print("S");
}

括号里的东西,会一直阻塞直到有一个 case 处理了内容。如果有多个 case 可以处理,就随机一个。

下面是一个 channel 使用的简单例子

counter := prog(c: chan of int) {i := 1;for (;;)c <-= (i = i + 1);
};c := mk(chan of int);
begin counter(c);<-c;
2 #打印
<-c;
3 #打印

因为 Newsqueak 是用于处理交互设备的,我们看下在一个窗口系统里,客户端大概会使用 channel 来做怎样的定义:

type Env: struct of {G: chan of graphics;  #图形命令M: chan of Mouse;     #鼠标K: chan of int;       #键盘
};type Client: prog(env: Env);

参考

Unix 传奇:历史与回忆

Advanced Topics in Programming Languages: Concurrency/message passing Newsqueak

Newsqueak: A Language for Communicating with Mice

http://www.lryc.cn/news/470648.html

相关文章:

  • 世界酒中国菜与另可数字平台达成战略合作
  • ElasticSearch基础篇——概念讲解,部署搭建,使用RestClient操作索引库和文档数据
  • k8s 二进制部署安装(一)
  • 115页PPT华为管理变革:制度创新与文化塑造的核心实践
  • ubuntu限制网速方法
  • 三品PLM研发管理系统:企业产品研发过程的得力助手
  • PyCharm 添加不了 Anaconda 环境
  • Leetcode 二叉树的右视图
  • console.log(“res.data = “ + JSON.stringify(res.data));
  • node和npm
  • 通过四元数求机器人本体坐标旋转量
  • CodeQL学习笔记(2)-QL语法(递归)
  • Video-XL:面向小时级视频理解的超长视觉语言模型
  • postgresql subtransaction以及他的效能
  • 新手逆向实战三部曲之二——通过更改关键跳注册软件(爆破)
  • 高级SQL技巧:提升数据查询与分析能力的关键
  • IntelliJ IDEA 安装 Maven 工具并更换阿里源
  • MIT 6.824 Lab1记录
  • C语言数据结构学习:[汇总]
  • unity游戏开发之塔防游戏
  • 前端项目接入sqlite轻量级数据库sql.js指南
  • 模拟退火算法(Simulated Annealing)详细解读
  • (二十一)、Docker 部署 Minikube 使用可视化管理工具 Kuboard
  • 代码编辑组件
  • 裴蜀定理与欧几里得算法——蓝桥杯真题中的应用
  • 冯诺依曼架构及CPU相关概念
  • 智能管线巡检系统:强化巡检质量,确保安全高效运维
  • React写关键字高亮的三个方案
  • 重塑在线软件开发新纪元:集成高效安全特性,深度解析与评估会员与促销管理系统的系统架构设计
  • 多层感知机的从零实现与softmax的从零实现(真·0000零基础)