BCPL语言 :这可是B语言啊,汤姆森大佬趁老婆回老家用来开发第一个unix操作系统的语言(大佬基于BCPL开发的bon语言,C语言前身)

本文主要是介绍BCPL语言 :这可是B语言啊,汤姆森大佬趁老婆回老家用来开发第一个unix操作系统的语言(大佬基于BCPL开发的bon语言,C语言前身),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

BCPL(“基本组合编程语言”)是一种过程式、命令式和结构化的编程语言。BCPL最初旨在为其他语言编写编译器,现在已不再常用。然而,它的影响仍然存在,因为BCPL的一个剥离和语法改变的版本,称为B,是C编程语言的基础。BCPL引入了许多现代编程语言的几个特性,包括使用花括号来分隔代码块。[3]BCPL最早是由剑桥大学的Martin Richards在1967年实现的。[1]

BCPL被设计成可以为它编写小而简单的编译器;据说有些编译器可以在16kb内运行。此外,最初的编译器本身是用BCPL编写的,很容易移植。因此,BCPL是引导系统的一种流行选择。编译器可移植性的一个主要原因在于它的结构。它被分成两部分:前端解析源代码并生成O-code(一种中间语言)。后端接收o码并将其转换为目标机器的机器码。只有1 / 5的编译器代码需要重写以支持新机器,这项任务通常需要2到5个人月。这种方法后来成为常见的实践(例如Pascal、Java)。

这种语言的不同之处在于它只有一种数据类型:一个字,一个固定的位数,通常被选择来与体系结构的机器字对齐,并且有足够的容量来表示任何有效的存储地址。对于当时的许多机器来说,这种数据类型是一个16位字。当BCPL用于最小可寻址项不是字而是字节的机器上,或者用于字长较大的机器(如32位或64位)时,这种选择后来被证明是一个严重的问题。[引文需要]

任何值的解释都是由用于处理这些值的运算符决定的。(例如,+将两个值相加,将它们视为整数;! 间接通过值,有效地将其视为指针。)为了使其工作,实现没有提供类型检查。

BCPL的字定向和面向字节的硬件之间的不匹配可以通过几种方式解决。一个是通过提供标准库例程来将字打包和解包为字节串。后来,添加了两个语言特性:位域选择操作符和中缀字节间接操作符(用%表示)。[引文需要]

BCPL以一种独特的方式处理跨越不同编译单元的绑定。没有用户可声明的全局变量;相反,有一个全局向量,类似于Fortran中的“空白公共”。不同编译单元之间共享的所有数据包括标量和指向存储在全局向量中预先安排位置的向量的指针。因此,头文件(在编译过程中使用“GET”指令包含的文件)成为在编译单元之间同步全局数据的主要手段,其中包含“global”指令,该指令表示符号名称列表,每个符号名称都与一个数字配对,该数字将名称与全局向量中相应的数字寻址单词相关联。除了变量之外,全局向量还包含外部过程的绑定。这使得编译单元的动态加载非常容易实现。BCPL没有依赖底层实现的链接加载器,而是有效地让程序员控制链接过程。[引文需要]

全局向量还使替换或增加标准库例程变得非常简单。程序可以保存指向原始例程的全局向量指针,并将其替换为指向替代版本的指针。替代方案可能会调用原始程序作为其处理的一部分。这可以用作快速的特别调试辅助工具。[引文需要]

BCPL是第一个大括号编程语言,大括号在语法变化中幸存下来,并已成为一种常用的方法

BCPL最早是由剑桥大学的Martin Richards在1967年实现的。[1]BCPL是对其前身剑桥编程语言(后来更名为组合编程语言(CPL))的困难的回应,该语言是在20世纪60年代初设计的。Richards通过“去除整个语言中那些使编译变得困难的特性”创建了BCPL。1967年春天,理查兹在麻省理工学院访问MAC项目时,为兼容分时系统下的IBM 7094编写了第一个编译器实现。这种语言最初是在1969年春季联合计算机会议上发表的一篇论文中描述的。[引文需要]

据传,BCPL最初代表“Bootstrap Cambridge Programming Language”,但自从BCPL的开发停止以来,CPL从未被创建过,这个缩写后来被重新解释为BCPL书。[需要澄清][需要引证]

BCPL是最初“Hello, World!”程序编写的语言。[5]第一个MUD也是用BCPL编写的(MUD1)。

有几个操作系统是部分或全部用BCPL编写的(例如,TRIPOS和AmigaDOS的早期版本)。BCPL也是施乐帕洛阿尔托研究中心(Xerox PARC Alto)项目——第一台现代个人电脑——使用的最初语言;在其他项目中,Bravo文档准备系统是用BCPL编写的。

一个早期的编译器,在1969年启动,从Richards的Atlas 2编译器的o码纸带开始,目标是ICT 1900系列。这两台机器具有不同的字长(48位对24位)、不同的字符编码和不同的打包字符串表示,并且成功的引导增加了对该方法实用性的信心。

到1970年末,Honeywell 635和Honeywell 645、IBM 360、PDP-10、TX-2、CDC 6400、UNIVAC 1108、PDP-9、KDF 9和Atlas 2的实现已经存在。1974年,在BBN上实现了一种不使用中间o码的BCPL方言。最初的实现是一个托管在BBN的TENEX pdp -10上的交叉编译器,直接针对BBN在ARPANET中使用的第二代imp实现中使用的pdp -11。

在20世纪80年代中期,还有一个版本是由理查兹计算机产品公司为BBC Micro生产的,这家公司是由马丁理查兹的兄弟约翰理查兹创办的。[6]BBC的《末日审判》节目就使用了这种语言。为Amstrad CPC和Amstrad PCW计算机的BCPL版本也在1986年由英国软件公司阿诺有限公司发布。MacBCPL是1985年由英国肯辛顿的Topexpress Ltd为苹果麦金塔电脑发布的。

BCPL的设计和理念都强烈地影响了B,而B又反过来影响了c。[7]当时的程序员争论的是,C的最终继承者应该被称为“D”,即字母表中的下一个字母,还是“P”,即母语言名称中的下一个字母。最被接受为C语言继承者的语言是c++ (c++是C的自增运算符)[8],尽管同时也存在一种D编程语言。

1979年,至少有25种体系结构存在BCPL的实现;随着C语言在非unix系统上的流行,这种语言逐渐失宠。

马丁·理查兹在他的网站上维护着一个现代版本的BCPL,最近一次更新是在2018年。它可以在各种系统上运行,包括Linux、FreeBSD和Mac OS x。最新的发行版包括图形和声音库,并且有一个全面的手册。他继续用它编程,包括他对音乐自动乐谱跟踪的研究。

BCPL常见的非正式MIME类型是text/x-bcpl。

这篇关于BCPL语言 :这可是B语言啊,汤姆森大佬趁老婆回老家用来开发第一个unix操作系统的语言(大佬基于BCPL开发的bon语言,C语言前身)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/607733

相关文章

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife