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

C语言与Unix的传奇起源

C语言与Unix的传奇起源

背景:Multics项目的困境

这段历史要从20世纪60年代中叶的美国说起。当时,三大技术巨头——麻省理工学院(MIT)、AT&T贝尔实验室和通用电气(GE)——联手为GE-645大型机开发一个名为Multics(Multiplexed Information and Computing Service)的分时操作系统。然而,随着开发的深入,这个系统逐渐变得臃肿复杂,性能也未达预期,贝尔实验室最终决定退出这个项目。

意外的开端:太空旅行游戏

故事并非就此结束。在贝尔实验室尚未完全退出Multics项目时,一位名叫肯·汤普森(Ken Thompson)的开发人员在工作之余自己开发了一款名为"太空旅行"(Space Travel)的小游戏。

有了游戏自然想玩,但哪台计算机适合运行这款游戏呢?直接在GE-645大型机上运行Multics系统来玩游戏?这无疑是奢侈的,就像今天用超级计算机来玩《英雄联盟》一样不合理。

于是,聪明的汤普森将目光转向了实验室里一台闲置的PDP-7小型机。有了硬件,但还缺少合适的操作系统。当时的操作系统大多是专用的,Multics虽然能在GE-645上运行,但无法在PDP-7上正常工作。

Unix的诞生

汤普森是个狠角色,他决定自己为这台小型机开发一个操作系统。这听起来不可思议,但别忘了他本身就是一位操作系统开发工程师。更重要的是,他邀请了好友丹尼斯·里奇(Dennis Ritchie)加入,后者同样是贝尔实验室的顶尖技术人才。

1969年,他们完成了Multics的极简版本。在英文中,词缀"multi-“表示"多”、“复杂"的意思,他们便选取了意义相反的"uni-”,将系统命名为Unix。这一年,汤普森26岁,里奇28岁。

C语言的起源

Unix最初是用汇编语言编写的。汇编语言作为机器指令的直接映射,是一种底层语言,使用它编程就像盖房子还要自己烧砖一样低效。他们需要一种抽象层次更高的工具来提升开发效率。

汤普森最初尝试了名为Fortran的编程语言,但不太满意。随后他转向BCPL(Basic Combined Programming Language),并对其进行简化,去掉了一些不必要的功能,创造了B语言。他甚至编写了一个将B语言代码翻译成汇编代码的编译器。

然而,使用一段时间后,汤普森发现B语言也无法充分发挥PDP-7小型机的性能。早期程序员有一个共同特点,就是追求让计算机发挥最大性能,毕竟那个年代计算资源极为宝贵。

这时,里奇说:"让我来改进一下你的B语言。"于是,C语言的雏形诞生了。C语言既保留了足够的底层控制能力,又提供了更好的抽象和移植性,完美平衡了效率与易用性。

经典著作与影响

1978年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇共同编写了《C程序设计语言》(The C Programming Language),这本被程序员亲切地称为"K&R"的经典著作(国内常被称为"C语言黑皮书"),以其简洁明了的风格成为了无数程序员的入门宝典。

共生的系统与语言

C语言的历史与Unix的发展紧密相连,它们相辅相成。C语言的可移植性使得Unix能够被重写并移植到不同的硬件平台上,而Unix的广泛应用又促进了C语言的普及。

如今,Unix的衍生系统遍布全球,包括macOS、Linux以及Android等,它们都与Unix有着深厚的血缘关系。C语言作为系统级编程语言的代表,至今仍在操作系统、嵌入式系统、高性能计算等领域发挥着不可替代的作用。

技术创新的启示

汤普森和里奇的故事告诉我们,伟大的创新往往源于实际需求,甚至可能是从一个看似微不足道的爱好项目(如"太空旅行"游戏)开始的。他们没有刻意追求创造历史,而是专注于解决问题,追求技术的完美。

正如Unix设计哲学所倡导的:“做好一件事,并把它做好”(Do one thing and do it well)。几十年后的今天,他们的作品仍然影响着整个计算机产业,这正是真正技术大师的标志。


从最初为了运行一个游戏,到创造了改变世界的操作系统和编程语言,汤普森和里奇的故事启示我们:真正的创新往往始于解决实际问题的简单愿望,而伟大的工具则源于对完美的不懈追求。

相关文章:

C语言与Unix的传奇起源

C语言与Unix的传奇起源 背景:Multics项目的困境 这段历史要从20世纪60年代中叶的美国说起。当时,三大技术巨头——麻省理工学院(MIT)、AT&T贝尔实验室和通用电气(GE)——联手为GE-645大型机开发一个名…...

C#扩展方法与Lambda表达式基本用法

C# 扩展方法与 Lambda 表达式详解 一、扩展方法详解 1. 基本概念 ​​扩展方法​​允许为现有类型"添加"方法,而无需修改原始类型或创建派生类型。 ​​定义条件​​: 必须在静态类中定义方法本身必须是静态的第一个参数使用this修饰符指…...

C#规避内存泄漏的编码方法

C#规避内存泄漏的编码方法 内存泄漏是C#开发中常见的问题,尽管.NET有垃圾回收机制(GC),但不当的编码实践仍可能导致内存无法被及时回收。以下是系统性的规避内存泄漏的方法: 一、理解内存泄漏的常见原因 ​​未释放的事件订阅​​​​静态…...

ARM 指令集(ubuntu环境学习) 第一章:ARM 指令集概述

1.1 ARM 架构简介 ARM(Advanced RISC Machine)是一种精简指令集计算机(RISC)架构,最初由英国的 ARM Holdings 公司设计。与复杂指令集计算机(CISC)不同,RISC 架构通过使用简单且高效的指令集,使得处理器能够以更高的速度和更低的功耗执行任务。ARM 架构被广泛应用于各…...

OpenCV实战教程:从零开始的计算机视觉之旅

第一部分:基础入门 OpenCV简介 什么是OpenCV及其应用领域开发环境搭建(Windows/MacOS/Linux)安装配置和第一个程序"Hello OpenCV" 图像基础 图像的数字表示方式色彩空间(RGB、HSV、灰度图)图像读取、显示与…...

零基础做自动驾驶集成测试(仿真)

图 1:使用 GPUDrive 进行极快的多代理模拟。上图:GPUDrive 中 Waymo Open Motion Dataset 场景的鸟瞰图,方框表示受控智能体,圆圈表示其目标。底部:相应的代理视图,以一个代理为中心。可以根据用户的目标轻…...

‌阿里云dns服务器不可用怎么办?dns可以随便改吗?

阿里云DNS服务器不可用怎么办?dns可以随便改吗? 当DNS服务器不可用时,可能导致无法访问网站或网络服务。以下是常见的解决方法: 1. 检查网络连接 确保设备已连接到互联网(如Wi-Fi或有线网络)。 尝试访问其他网站或服务&#x…...

神经网络用于地震数据时空均匀插值的方法与开源资料

神经网络用于地震数据时空均匀插值的方法与开源资料 地震数据的不均匀采样是一个常见问题,神经网络提供了一种有效的解决方案。以下是关于如何使用神经网络进行地震数据时空均匀插值的概述和可用资源。 主要方法 1. 基于深度学习的插值方法 卷积神经网络(CNN)&a…...

线性微分方程与非线性微分方程

方程一 d x d t x \frac{dx}{dt} x dtdx​x 这是一个一阶线性常微分方程,可以直接分离变量求解。 将变量分离: d x x d t \frac{dx}{x} dt xdx​dt 两边积分: ∫ 1 x d x ∫ 1 d t ⇒ ln ⁡ ∣ x ∣ t C \int \frac{1}{x} \, dx \…...

Windows查看和修改IP,IP互相ping通

Windows系统 查看IP地址 winr 输入cmd 打开终端使用 ipconfig 或 ipconfig -all 命令查看当前网络 IPV4地址 Windows系统 修改IP地址 自动获取IP(DHCP): 打开 控制面板,点击 网络和Internet。点击 网络和共享中心。选择 更改适配…...

ESP32开发之freeRTOS的信号量

什么是信号量信号量能干啥信号量的函数实例举例总结什么是信号量 简而言之,就是发出通知,接收通知的任务获得通知后去干啥啥。通知有多有少。自定义通知数量的,叫计数型信号量;只有有无(即“0”,“1”)通知的,叫二进制信号量。 信号量能干啥 资源管理:控制多个任务对…...

CRMEB-PRO系统定时任务扩展开发指南

适用场景 当系统内置定时任务类型无法满足业务需求时,开发者可通过本教程快速掌握自定义定时任务的扩展方法。本指南以"定时检测服务"为例,演示完整开发流程。 我想添加一个定时任务 ,而这里没有我需要的,我怎么来添加 比如我想添加一个定时检…...

单片机不同通信方式的适用场景

一、串口通信 UART 通信双方约定好波特率,每次发送一个字节(8位数据) 这种通信方式一共有2根线,且互相独立不受影响。 串口通信的缺点 二、RS232和RS485 优点是能够远距离传输信号 RS232达到30m RS485达到1000m 同时RS485还具有一对多的功能 三、S…...

【神经网络与深度学习】探索全连接网络如何学习数据的复杂模式,提取高层次特征

引言 全连接网络(Fully Connected Network,FCN)是深度学习中的重要架构,广泛用于模式识别、分类和回归任务。其强大的特征提取能力使其能够自动学习输入数据中的复杂模式,并逐步形成高层次特征。这种能力主要依赖于参…...

股指期货贴水对对冲的影响大吗?

如果你持有股票,又担心股市下跌,可能会想到用股指期货来“对冲风险”——比如买入股票的同时,卖出股指期货合约。但如果股指期货处于贴水状态(期货价格低于现货价格),对冲效果会受影响吗? 一、…...

浙江大学 | DeepSeek系列公开课 | 当艺术遇见AI:科艺融合的前沿探索

今天要给大家分享一份由浙江大学出品的DeepSeek系列公开课第三季第一期,公开课的主题是当艺术遇见AI,科艺融合的新探索。本报告系统展示了浙江大学在艺术与人工智能融合领域的研究成果,涵盖古画修复流程、色彩复原技术、诗画融合模型、图像召…...

(Go Gin)Gin学习笔记(三)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法

1. 数据解析和绑定 bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将请求体中的参数值绑定到对应的结构体上,以方便后续业务逻辑的处理 1.1 JSON数据解析和绑定 客户端传参,后端接收并解析到结构体 package mainim…...

【JavaEE】网络原理之初识(1.0)

目录 ​编辑 局域网与广域网 IP地址和端口号 实现简单的服务器客户端交互 简单理解socket TCP和UDP的差别(初识) socket面对udp DatagramSocket API DatagramSocket 构造方法 DatagramSocket 方法: DatagramPacket API Data…...

Go与Cpp的本质区别

这个问题是我们经常听到的问题 常见的观点有 Go 与 C 的差异主要体现在设计哲学、内存管理、并发模型、语法特性及应用场景等方面,以下从多个维度进行详细对比: 一、‌内存管理机制‌ ‌C‌:需手动管理内存(如 new/delete、智能…...

Vulkan 学习(16)---- 使用 VertexBuffer

Vertex Buffer 创建一个 VertexBuffer 存储 Vertex data,代替之前在 Shader 中使用固定顶点值的做法 Vertex Shader 修改 GLSL 的 VertexShader 如下: 注意这里指定了 input Vertex data 的 location 和 格式 #version 450 layout(location 0) in vec2 inPosit…...

论文阅读 2024 arxiv Comprehensive Assessment of Jailbreak Attacks Against LLMs

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Comprehensive Assessment of Jailbreak Attacks Against LLMs https://arxiv.org/pdf/2402.05668 https://www.doubao.com/chat/4015423571416834 速览 这篇论文是关于大…...

SIFT特征点检测

刚看完了SIFT特征点检测的原理,阅读的是两篇csdn博客,一个全面和一个最全面,不得不说,你俩写的都很全面,这么用心奉献知识的博主是全人类的财富。 现在用我这张笨拙的嘴先说一下我理解的流程 首先先将图像扩大一倍&a…...

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验-pipeline方式(二)

一、前言 阿里云最新推出的 Qwen3-8B 大语言模型,作为国内首个集成“快思考”与“慢思考”能力的混合推理模型,凭借其 80 亿参数规模及 128K 超长上下文支持,正在重塑 AI 应用边界。该模型既可通过轻量化“快思考”实现低算力秒级响应,也能在复杂任务中激活深度推理模式,以…...

Python os.path.join()路径拼接异常

问题 在使用os.path.join()对两个路径进行拼接,如:/University/School/和/Department/Class/进行拼接,最终的结果为/Department/Class/,而/University/School/却不知所踪。 import osos.path.join(“/University/School/”, “/…...

Flink之DataStream

Apache Flink 的 DataStream API 是用于 处理无限(流)或有限(批)数据流的核心编程模型,适用于事件驱动、实时分析、ETL 等场景。相比 Flink Table API,DataStream API 提供了更强的灵活性和底层控制能力。 …...

WHAT - Tailwind CSS + Antd = MetisUI组件库

文章目录 Tailwind 和 Antd 组件库MetisUI 组件库 Tailwind 和 Antd 组件库 在 WHAT - Tailwind 样式方案(不写任何自定义样式) 中我们介绍了 Tailwind,至于 Antd 组件库,我们应该都耳熟能详,官网地址:htt…...

【LLM】MOE混合专家大模型综述(重要模块原理)

note 当前的 MoE 架构就是一个用显存换训练时长/推理延迟的架构MoE 目前的架构基本集中在于将原先 GPT 每层的 FFN 复制多份作为 n 个 expert,并增加一个 router,用来计算每个 token 对应到哪个 FFN(一般采用每个 token 固定指派 n 个 exper…...

量子机器学习中的GPU加速实践:基于CUDA Quantum的混合编程模型探索

引言:量子机器学习的新范式 在量子计算与经典机器学习交叉融合的前沿领域,量子机器学习(Quantum Machine Learning, QML)正经历着革命性突破。然而,随着量子比特规模的增长和算法复杂度的提升,传统计算架构…...

CentOS Linux 环境二进制方式安装 MySQL 5.7.32

文章目录 安装依赖包新建用户解压初始化配置文件启动服务登录MySQL修改密码停止数据库 安装依赖包 yum -y install libaio perl perl-devel libncurses* autoconf numactl新建用户 useradd mysql解压 tar xf mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.32-l…...

数学:拉马努金如何想出计算圆周率的公式?

拉马努金(Srinivasa Ramanujan)提出的圆周率(π)计算公式,源于他对数学模式的超凡直觉、对无穷级数和模形式的深刻洞察,以及独特的非传统数学思维方式。尽管他的思考过程带有强烈的个人色彩,甚至…...

Java 未来技术栈:从云原生到 AI 融合的企业级技术演进路线

一、云原生架构:重构 Java 应用的运行范式 1.1 微服务架构的深度进化 Java 在微服务领域的实践正从 Spring Cloud 向服务网格(Service Mesh)演进。以 Istio 为代表的服务网格技术,通过 Sidecar 模式实现服务间通信的透明化管理&…...

mid360驱动安装以及联合相机标定

1 mid360 安装 1.1 安装 一定要使用 SDK2和 ROS2驱动(livox_ros_driver2) 先安装SDK2,再安装livox_ros_driver2 GitHub - Livox-SDK/Livox-SDK2: Drivers for receiving LiDAR data and controlling lidar, support Lidar HAP and Mid-360. GitHub - Livox-SDK/l…...

LeetCode —— 572. 另一棵树的子树

572. 另一棵树的子树 题目:给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所…...

模型部署技巧(一)

模型部署技巧(一) 以下内容是参考CUDA与TensorRT模型部署内容第六章,主要针对图像的前/后处理中的trick。 参考: 1.部署分类器-int8-calibration 2. cudnn安装地址 3. 如何查找Tensor版本,与cuda 和 cudnn匹配 4. ti…...

PostgreSQL中的SSL

PGSQL数据库的默认隔离级别是读提交,并且同时支持可重复读和序列化模式。但是在9.1之前的版本中,序列化模式等价于快照隔离,并非是真正的序列化模式。 这样的话就会存在一个问题,那就是写偏序(Write Skew)…...

使用 Spring Data Redis 实现 Redis 数据存储详解

使用 Spring Data Redis 实现 Redis 数据存储详解 Spring Data Redis 是 Spring 生态中操作 Redis 的核心模块,它封装了 Redis 客户端的底层细节(如 Jedis 或 Lettuce),提供了统一的 API 来操作 Redis 的数据结构。以下是详细实现…...

短视频矩阵系统贴牌开发实战:批量剪辑文件夹功能设计与实现

摘要:在短视频矩阵系统的开发中,批量处理功能是提升运营效率的关键。本文将深入探讨如何实现基于文件夹的短视频批量剪辑功能,涵盖技术选型、核心功能实现及代码示例。 一、需求背景与场景价值 在短视频矩阵运营场景中,运营者常面…...

2025年消防设施操作员考试题库及答案

一、判断题 25.防火门顺序器使用半个月后,需检查所有的螺钉,对固定螺钉进行加固拧紧,后续每月进行一次。() 答案:错误 解析:本题考查的是防火门顺序器的保养。防火门顺序器使用一周后&#x…...

ASP.NET MVC后端控制器用模型 接收前端ajax数据为空

1、前端js代码 如下: const formData {DeptName: D001,Phone: 12345678900 };$.ajax({url: "/Phone/SavePhone1",type: "POST",contentType: "application/json",data: JSON.stringify(formData), //必须要JSON.stringifysuccess:…...

ES基本使用方式

ES基本使用 文章目录 ES基本使用1.es的访问使用URL访问 2.mapping的理解Dynamic Mappingkeyword 与 text的区别‌基础定义与核心差异主字段,子字段 创建mapping 3.创建索引4.查看索引列表5.删除索引6.添加数据7.查询数据 重置es密码,初始用户elastic el…...

【中间件】bthread效率为什么高?

bthread效率为什么更高? 1 基本概念 bthread是brpc中的用户态线程,也是协程的一种实现。其采用M:N模型,即多个用户线程映射到少量的系统线程上。 2 高效做法 用户态调度:避免内核态和用户态之间的切换开销,上下文切…...

Transformer架构指南:从原理到实战资源全更新

🌟 什么是Transformer? 2017年Google提出的Transformer架构,彻底颠覆了传统RNN/LSTM的序列建模方式,通过自注意力机制实现全局上下文建模,成为GPT、BERT等大模型的底层基石。其核心优势在于并行化计算和长距离依赖捕捉…...

数据库规范

数据库版本相关 版本:mysql8.0 引擎:InnoDB 字符集:utf8mb4_general_ci 表名称 字段名称te 不允许使用大写字母,尽量使用英文或英文缩写,中间用下划线连接 数据表前缀为zzt_ 同一功能模块的表(特别是附表)尽量保持…...

Java 核心--泛型枚举

作者:IvanCodes 发布时间:2025年4月30日🤓 专栏:Java教程 各位 CSDN伙伴们,大家好!👋 写了那么多代码,有没有遇到过这样的“惊喜”:满心欢喜地从 ArrayList 里取出数据…...

使用skywalking进行go的接口监控和报警

安装 helm upgrade --install skywalking ./skywalking-v1 --namespace skywalking --create-namespace 查看安装结果 kubectl get pod -n skywalking NAME READY STATUS RESTARTS AGE elasticsearch-6c4ccbf99f-ng6sk 1/1 …...

基于Docker的Elasticsearch ARM64架构镜像构建实践

一、前言 Elasticsearch(以下简称为ES) 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次…...

【Token系列】14|Prompt不是文本,是token结构工程

文章目录 14|Prompt不是文本,是token结构工程一、很多人写的是“自然语言”,模型读的是“token序列”二、Prompt写法会直接影响token结构密度三、token分布影响Attention矩阵的聚焦方式四、token数 ≠ 有效信息量五、Prompt结构设计建议&…...

在宝塔面板中安装OpenJDK-17的三种方法

title: 在宝塔面板中安装OpenJDK-17的三种方法 date: 2025-4-30 categories: 技术教程 tags: [Minecraft, 服务器搭建, 宝塔面板, Java] 如果你的宝塔面板软件商店中缺少 OpenJDK-17(例如搭建 Minecraft 1.17 服务器时),本文提供三种解决方…...

瑞昱点屏芯片RTD2785T带旋转功能

一、产品概述 RTD2785T是瑞昱半导体(Realtek)推出的新一代高性能显示驱动芯片,专为高端显示器、嵌入式系统、工业控制及专业影像设备设计。该芯片集成多接口输入(HDMI、DP、DVI、VGA)与多种输出接口(eDP、…...

蓝桥杯Python(B)省赛回忆

Q:为什么我要写这篇博客? A:在蓝桥杯软件类竞赛(Python B组)的备赛过程中我在网上搜索关于蓝桥杯的资料,感谢你们提供的参赛经历,对我的备赛起到了整体调整的帮助,让我知道如何以更…...