B语言 :我心目中永远的两位神共同开发出来的语言

B是贝尔实验室大约在1969年由Ken Thompson和Dennis Ritchie开发的一种编程语言。

B源于BCPL,它的名字可能是BCPL的缩写。汤普森的同事丹尼斯·里奇推测,这个名字可能是基于Bon,这是汤普森为Multics设计的一种更早但与之无关的编程语言。[注1]

B是为递归的、非数值的、与机器无关的应用而设计的,比如系统和语言软件。[3]它是一种无类型的语言,唯一的数据类型是底层机器的自然内存字格式,不管它是什么。根据上下文的不同,这个词被当作一个整数或一个内存地址。

随着具有ASCII处理功能的机器变得普遍,特别是贝尔公司推出的DEC PDP-11,支持将字符数据填充到内存字中变得非常重要。这种语言的无类型特性被视为一种劣势,这促使Thompson和Ritchie开发了该语言的扩展版本,支持新的内部和用户定义类型,这就是C编程语言。

历史
BCPL语义与大量的smallgol语法

——肯·汤普森,[4]
大约在1969年,Ken Thompson[2]和后来的Dennis Ritchie[3]主要基于Thompson在multitics项目中使用的BCPL语言开发了B。B实际上是BCPL系统,为了使它适应当时小型计算机的内存容量,汤普森把他认为不需要的任何组件都去掉了。BCPL到B的转换也包括了根据Thompson的喜好所做的更改(主要是在典型程序中减少非空白字符的数量)。[2]在这个过程中,BCPL的许多典型的类似algol的语法都发生了很大的变化。赋值操作符:=恢复为Rutishauser’s Superplan中的=,相等操作符=被替换为==。

Thompson添加了“双地址赋值运算符”,使用x =+ y语法将y添加到x(在C中,运算符写为+=)。这种语法来自Douglas McIlroy的TMG实现,其中B的编译器首次实现(它来自ALGOL 68的x +:= y语法)。[2][5]汤普森更进一步,发明了自增和自减操作符(++和——)。它们的前缀或后缀位置决定该值是在操作数更改之前还是之后获取的。根据Dennis Ritchie的说法,人们通常认为它们是为DEC PDP-11的自增和自减地址模式而创建的,但这在历史上是不可能的,因为B最初开发时机器还不存在。[2]

分号版本的for循环是肯·汤普森从斯蒂芬·约翰逊的作品中借用的。[6]

B是无类型的,或者更准确地说只有一种数据类型:计算机字。大多数操作符(例如+,-,*,/)将其视为整数,但其他操作符将其视为要解引用的内存地址。在许多其他方面,它看起来很像早期版本的c。有一些库函数,包括一些模糊地类似于c中标准I/O库的函数。[3]用汤普森的话来说:“B和古老的C是非常非常相似的语言,除了C的所有类型不同。”[6]

早期的实现是用于使用早期Unix的DEC PDP-7和PDP-11小型计算机,以及运行操作系统GCOS的霍尼韦尔GE 645[7] 36位大型机。最早的PDP-7实现被编译为线程代码,Ritchie使用TMG编写了一个编译器来生成机器码。[8][9][10] 1970年获得了PDP-11,并将线程代码用于端口;汇编程序dc和B语言本身都是用B语言编写的,用于引导计算机。yacc的早期版本就是使用这种PDP-11配置生成的。里奇在此期间接管了维修工作。[2][10]

B的无类型特性在Honeywell、PDP-7和许多旧的计算机上是有意义的,但在PDP-11上是一个问题,因为很难优雅地访问PDP-11和大多数现代计算机完全支持的字符数据类型。从1971年开始,Ritchie在将编译器转换为生成机器码的同时对语言进行了更改,最引人注目的是为变量添加了数据类型。在1971年和1972年期间,B演变为“新B”(NB),然后是c。[2]

由于被C语言所取代,B语言几乎灭绝了。[11]然而,由于各种原因,它继续在GCOS大型机(截至2014年)[12]和某些嵌入式系统(截至2000年)上使用:小型系统中有限的硬件,广泛的库,工具,许可成本问题,以及仅仅足够好地完成工作。[11]极具影响力的《阿伯穆德》最初是用B语言写成的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lombok 相关注解

话不多说&#xff0c;lombok相关的注解的使用&#xff0c;需要添加入如下依赖&#xff1a; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version> <!-- Spring Boot 项…

Vue-Router 路径匹配与重定向

一、效果与描述 通过设置路由匹配同时设置重定向&#xff0c;让输错的网址重定向到指定页面&#xff0c;例如在网页输入网页地址把路径进行任意修改&#xff0c;重定向到登录页面。 二、Vue-Router代码 import { createRouter, createWebHashHistory } from vue-routerimport …

代码随想录算法训练营第一天 | 704-二分法查找、27. 移除元素

数组基础 1、数组定义&#xff1a;数组是存放在连续内存空间上的相同类型数据的集合。 特点&#xff1a; 数组下标都是从0开始的。数组内存空间的地址是连续的 2、数组的元素是不能删的&#xff0c;只能覆盖。 704. 二分查找 1、题目链接&#xff1a;. - 力扣&#xff08…

2024年华为OD机试真题-小明找位置-Java-OD统一考试(C卷)

题目描述&#xff1a; 小朋友出操&#xff0c;按学号从小到大排成一列&#xff1b;小明来迟了&#xff0c;请你给小明出个主意&#xff0c;让他尽快找到他应该排的位置。 算法复杂度要求不高于nLog(n)&#xff1b;学号为整数类型&#xff0c;队列规模<10000&#xff1b; 输入…

vue 中import 不同层级目录下的文件的表示方式

项目场景&#xff1a; 项目背景&#xff1a; vue 项目中开发页面 需要 用到其它目录下的 文件&#xff0c;需要使用 import 进行导入 问题描述 问题&#xff1a; import util from /libs/util.jsimport drawer from ../drawer/drawerimport mixinViewModule from /mixins/vi…

vue3+ts+vite中封装axios,使用方法从0到1

一、安装axios npm install axios types/axios --save二、配置代理vite.config.ts&#xff0c;如果没有需要新建该文件 module.exports {server: {proxy: {/api: {target: http://localhost:5000, // 设置代理目标changeOrigin: true, // 是否改变请求源地址rewrite: (path)…

氢原子为什么没有中子呢?

问题描述&#xff1a;氢原子为什么没有中子呢&#xff1f; 问题解答&#xff1a; 氢原子是唯一一个没有中子的常见原子。其原子核只包含一个质子&#xff0c;而中子的质量与质子相当&#xff0c;但没有电荷。氢原子的构成为一个质子和一个电子&#xff0c;因此没有中子。 原…

ECMAScript 6 (二)

ECMAScript 6 (二) 面向对象的扩展 不可扩展 一级保护&#xff0c;不可扩展 我们之前在创建的时候&#xff0c;因为JS是一个弱语言&#xff0c;所以对象在创建好之后&#xff0c;任然可以二次添加删除修改属性 同时在ES6里面&#xff0c;虽然推出了const&#xff0c;但是con…

pom.xml中resouces标签

pom.xml中resouces标签 resources是maven在编译项目时将资源文件或者额外的文件赋值到输出目录(target/classes)中。通常包括配置文件&#xff0c;属性文件&#xff0c;模板文件&#xff0c;jar包等。 resouces中可以包含resouce。也就是可以自定义的配置多个资源配置。 direct…

数据结构学习之单向循环链表应用的案例(旋转链表)

实例要求&#xff1a; 1、给定一个链表的头节点 head &#xff0c;请你旋转链表&#xff0c;将链表每个节点向右移动 k 个位置&#xff1b; 2、链表中节点的数目的范围为[0, 500] &#xff1b; 实例分析&#xff1a; 1、入参合理性检查&#xff0c;即head ! NULL || head-&…

JVM运行时数据区(下篇)

紧接上篇&#xff1a;JVM运行时数据区&#xff08;上篇&#xff09;-CSDN博客 堆 一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上。 栈上的局部变量表中&#xff0c;可以存放堆上对象的引用。静态变量也可以存放堆对象的引用&#xff0c;通过静态…

Word插件-大珩助手-手写电子签名

手写签名 支持鼠标写&#xff0c;支持触摸屏写&#xff0c;点击画笔按钮切换橡皮擦&#xff0c;支持清空画板重写&#xff0c;点击在word中插入签名&#xff0c;可插入背景透明的签字图 素材库-保存签名 将写好的签字图复制粘贴到素材库中&#xff0c;以便永久使用&#xff…

AMEYA360:广和通RedCap模组FG131FG132系列

2024年1月&#xff0c;广和通RedCap模组FG131&FG132系列已进入工程送样阶段&#xff0c;可为终端客户提供样片。广和通RedCap模组系列满足不同终端对5G速率、功耗、尺寸、成本的需求&#xff0c;全面助力RedCap技术的行业应用。 FG131&FG132系列基于骁龙X35 5G调制解调…

第六站:C++面向对象

面向对象的第一概念:类 类的构成: “类”&#xff0c;是一种特殊的“数据类型”&#xff0c;不是一个具体的数据。 类的设计: 创建一个类: class Human { public://公有的,对外的void eat();//方法,成员函数void sleep();void play();void work();string getName();//获取对内…

Git相关3 —— 命令及添加Gitee的公钥

1.Git相关命令1 -- 工作目录、暂存区、本地仓库、 使用平台有&#xff1a;cmd、Git bash、VSCode window系统修改VSCode默认终端为git bash git init 初始化 --- 新增.git 文件夹 git status 查看 文件/文件夹 状态 git add 需要追踪的文件名/文件夹名 提交到暂存区 git add…

Electron中 主进程(Main Process)与 渲染进程 (Renderer Process) 通信的方式

1. 渲染进程向主进程通信 修改 html 文件内容 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 解决控制…

docker部署私人云盘nextcloud

1.拉取镜像 docker pull nextcloud 2.创建目录 mkdir -p /data/nextcloud/{config,data,apps} 3.创建实例 docker run -itd --name yznextcloud -v /data/nextcloud/config:/var/www/html/config -v /data/nextcloud/data:/var/www/html/data -v /data/nextcloud/apps:/va…

Sublime Text4 crack时替换的汇编指令

Sublime Text4 crack时替换的汇编指令 首先请支持正版&#xff0c;这里研究破解的步骤&#xff0c;仅做汇编代码学习。 破解步骤很简单&#xff1a; 打开二进制文件&#xff0c; 搜索 80 78 05 00 0F 94 C1&#xff0c; 替换为 C6 40 05 01 48 85 C9. (源: https://gist.git…

项目成本管理

4过程&#xff1a; 规划成本管理&#xff0c;估算成本&#xff0c;制定预算&#xff0c;控制成本 估算和预算的区别&#xff1a; 估算时准备向上级拿钱&#xff0c;通常是数值&#xff0c;项目团队做&#xff0c; 预算是拿到钱之后怎么花&#xff0c;通常是S曲线&#xff0c…