这个没落的编程语言,无意间改变了全球程序员的命运!

2016年,一个叫 left-pad 的小工具被删除,整个 JavaScript 生态瞬间瘫痪。

你能想象吗?这场“网络灾难”的源头,能一直追溯到 1995 年,那个被遗忘的编程语言——Perl,以及它发明的包管理系统CPAN。

01

CPAN的诞生

Perl是一门古老的编程语言。

Larry Wall发明Perl的时候,目的非常单纯,帮助自己做“报告生成和日志分析”。

所以他赋予了Perl无以伦比的文本处理能力,特别适合处理正则表达式、日志文件、配置文本等。

Perl也不是为了优雅,而是为了“快速地搞定事情”,所以它的表达能力、信息压缩能力非常强。

Larry说:“做一件事不止一种方法”,鼓励程序员用自己舒服的方式写代码。

于是有些Perl大师就写出了这样的代码:

#!/bin/perl -s-- -export-a-crypto-system-sig -RSA-3-lines-PERL$m=unpack(H.$w,$m."\0"x$w),$_=`echo "16do$w 2+4Oi0$d*-^1[d2%Sa2/d0<X+d*La1=z\U$n%0]SX$k"[$m*]\EszlXx++p|dc`,s/^.|\W//g,printpack('H*',$_)while read(STDIN,$m,($w=2*$d-1+length$n&~1)/2)

短短的几行代码就实现了RSA算法!

当时美国政府有严格的加密技术出口管制,有人将这几行代码印到了T恤上,于是T恤衫就变成了禁止出口的“军火”。

如果穿着它离开美国,将被处以高额罚款和10年监禁。

1993年,Marc Andreessen发明了Mosaic浏览器,网页开始真正流行起来。

为了增加网页的动态性,有人提出了CGI脚本,可以在服务器端执行,根据用户的输入产生动态内容。

例如留言板,还有访问计数器:

CGI程序员可以用各种语言编写,最早是用C语言,但很快大家就发现Perl更合适,因为CGI主要在处理HTML文本,正好是Perl擅长的领域。

早期的互联网是免费分享的天堂,大家建立了邮件列表,通过邮件的方式分享各种各样的Perl脚本。

Perl脚本多了以后,邮件分享就不方便了,有些“囤积者”就把自己收集的代码放到个人FTP站点上让大家下载。

FTP站点多了以后,有人就想:大家应该合并资源啊!要不然重复代码很多,找起来很麻烦。

最初,大家整理了一个列表,列出Perl模块的名称和下载地址,像这样:

张大胖写的计数器:ftp://xxx.xxx.xxx

赵铁蛋写的留言板:ftp://xxx.xxx.xxx

......

叫什么名称呢?有人提议“CPAN”(Comprehensive Perl Archive Network),灵感来自CTAN,即TeX和LaTex的代码库。(嗯,看来这才是真正的老祖宗)。

后来大家觉得用个人的FTP服务器不好,万一down机了,就无法下载了,干脆集中到一起吧。

有两个人Andreas J. König 和 Jarkko Hietaniemi,建立了一个叫PAUSE(Perl Author’s Upload Server)的东西,即Perl作者上传服务器。

每个人都可以在这个服务器上注册,上传自己的Perl模块。

系统建立了一棵分类树,从原先按人名和文件简单分组,变成了“数据库模块”、“用户界面模块”、“文件处理模块”等等,这样大家找代码更方便了。

从此以后,用Perl做事,大家第一想到的是CPAN,因为那里有所有模块。如果找不到,也许你可以做一个再上传。

Perl 5发布以后,CPAN上的代码和模块激增。

到 1999 年,每个月大约有 200 个包发布到 CPAN。到了 2001 年,这个数字超过了 500 个。

Perl成了首个拥有超大集中开源代码库的语言,CPAN成了一个强大的生态系统。

不过,还有一个问题还没有解决:每个月都有这么多的新模块上传,还有成千上万的模块更新,怎么才能确定它们没有问题呢?

一般的Perl模块都包含测试代码,用户把模块下载以后可以测试,并且反馈是“通过”还是“失败”。

但是不可能让每个用户都这么干,于是CPAN设计了一个自动化的方案:志愿者可以贡献机器,这些机器会自动下载模块,运行测试,然后把结果传到一个叫CPAN Testers的网站。

用户只需要到网站上一看,就知道哪个模块在哪些系统上运行正常。

这其实就是一个全球分布式的持续集成系统(CI),如今CI很常见,但是很少有包管理系统像CPAN Tester那样,能利用志愿者的电脑,分布式地完成Perl代码跨版本、跨环境的测试。

Perl社区确实太了不起了!

从CPAN的发展历史来看,是自然而然,水到渠成的事情,Perl适合写CGI脚本,后来又是LAMP的重要一员,在互联网早期非常流行,用户众多,随着分享代码需求的出现,CPAN这这么一步步地成熟了。

02

"感染"其他语言

Perl语法灵活,Perl社区黑客精神非常浓厚,这些都是好事儿,但是对很多人来说,门槛就有点高了。

2000年左右,有着更清晰语法,更现代面向对象的Python和Ruby崛起,Perl终于让出了王者宝座。

很多Perl程序员转入Python和Ruby阵营,也把Perl的优秀理念给带来过来。

2003年,Python的包管理器PyPI对外发布。

2004年,Ruby的包管理器RubyGems对外发布。

而Java经过了10年发展以后,也通过Maven在2004年建立了自己的中央仓库。

随后,CPAN就像病毒一样,感染了各个编程语言,JavaScript、Go、PHP、Rust都有了自己的包管理系统。

它甚至入侵了微软,.NET,也建立了NuGet作为包管理系统。

这其中以JavaScript的npm最吓人,我看到2023年的一个数据,说npm有300多万个软件包!

JavaScript特别自由奔放,特别推崇“一包一事”,鼓励将功能高度拆分为独立模块,哪怕只是几个字符的功能。

这导致了很多“微型”“极简”的软件包,其中只有几行甚至一行代码。

例如判断一个数字是否是偶数:is-even

module.exports = function(n) {   return n % 2 === 0;};

还有最为知名的,让真个互联网都颤抖的left-pad:

它的作者Azer不但写了left-pad,还写了其他273个软件包,是npm一个相当大的贡献者。

这273个软件包中有一个叫做kik,这个名称和加拿大一家叫做Kik Interactive的公司相同,这家公司要求Azer Koçulu放弃对kik的控制权,因为该公司拥有Kik商标。

Azer当然不愿意放弃,回复了一个 fuck you 的邮件就不搭理他了。

没想到Kik公司找到了npm的CEO,也是创始人 Isaac Schlueter ,注意,npm和CPAN不同,这是一家商业实体,是要盈利的。

Kik威胁说要起诉npm,Isaac Schlueter怕了,就把所有权给了Kik公司。

Azer Koçulu看到npm竟然站在对方那一边,一气之下把自己的273个软件包都删除了,其中就包括left-pad。

这一下子捅了马蜂窝,因为别看left-pad很简单,却是JavaScript的一个核心包。

Babel在用它,Webpack在用它,React也在用它,left-pad被下载使用了1500万次!

left-pad被删除,“整个互联网被摧毁了”!

所以你看,集中式软件包管理给程序员们带来了无数的便利,但一旦出事儿,就是大事儿。

03

缺席的C和C++

有意思的是,C/C++一直没有流行的包管理系统。

2008 年,Linux内核开发者Rusty Russell在开源开发者大会 和CPAN 管理员Adam Kennedy偶然相遇,相谈甚欢,回去以后就创建了CPAN的C语言版本 :CCAN(Comprehensive C Archive Network)。

但是CCAN从来没有流行起来,倒是微软,在2016年创建了vcpkg这个C和C++的包管理系统,收录了2613个知名软件包,还有JFrog创建的Conan,也有几千个,这规模完全无法和 npm 或 pip 那种“几百万包、全民使用”的盛况相比。

C/C++ 是现在这个状况,我觉得可能有这么两个原因:

1.语言设计哲学不同

C 和 C++ 强调底层控制、编译独立性和平台适配性,给了程序员最大程度的控制权。

它们不是“一站式生态”,而是允许开发者自由决定怎么构建和链接依赖。

所以大家都是手动下载源码包、makefile、自定义构建。

2.二进制兼容性难以统一

脚本语言(如 Python、JavaScript)模块多为纯文本,天然跨平台。

而 C/C++ 的模块多是静态链接库(.a/.lib)和动态链接库(.so/.dll),这意味着编译器(gcc、clang、MSVC)不一致会导致兼容性问题,不同平台、架构、选项会生成不同的二进制文件,即使源代码一致,也可能因构建参数不一而行为不同。

这极大增加了构建和分发的复杂性,也使得标准化包管理器难以一统江湖。

C/C++ 没有统一包管理器,可能不是一种“现代开发者习惯”的友好体验,但却是一种“系统编程者文化”的真实写照。

04

总结

Perl 可能早已退出了主流舞台,但它无意间种下的种子——CPAN,首次定义了“集中式代码共享”的范式,让程序员们不再孤军奋战,而是能够站在彼此的肩膀上协作创新。

它激发了Python的 PyPI,启发了 RubyGems,影响了Java的 Maven,甚至在JavaScript中演化成了如今世界最大的软件仓库 npm。

毫不夸张地说,整个编程世界的生态,全球程序员的工作方式,被Perl永久地改写了。

全文完,觉得不错的话就点个赞或者在看吧!

资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在C++编程中,消息框是与用户交互的常用界面元素,它允许程序向用户展示信息,并根据用户的响应进行处理。MessageBox() 函数是Windows应用程序中实现消息框功能的标准接口,属于Windows API的一部分。本文将详细介绍MessageBox()函数的使用方法,包括常用属性、按钮形式和返回值等知识点。 MessageBox() 函数的基本语法结构如下: 其中,参数uType是一个整型值,通过组合不同的标志来定义消息框的按钮、图标等特性。常用属性包括消息框中显示的按钮以及附加的图标,例如: MB_OK:仅显示一个确定按钮。 MB_OKCANCEL:显示确定和取消按钮。 MB_YESNO:显示是和否按钮。 MB_YESNOCANCEL:显示是、否和取消按钮。 图标属性可以与按钮属性组合使用,为用户提供额外的视觉信息: MB_ICONEXCLAMATION 或 MB_ICONWARNING:显示感叹号警告图标。 MB_ICONASTERISK 或 MB_ICONINFORMATION:显示信息图标。 MB_ICONQUESTION:显示询问图标的问号。 MB_ICONERROR 或 MB_ICONHAND 或 MB_ICONSTOP:显示错误图标。 返回值方面,MessageBox() 函数执行后会返回一个整数值,代表用户点击了哪一个按钮。这个返回值可以与预定义的标识符进行比较,以判断用户的操作: IDCANCEL:用户点击了取消按钮。 IDNO:用户点击了否按钮。 IDOK:用户点击了确定按钮。 IDYES:用户点击了是按钮。 在使用MessageBox()函数时,需要特别注意字符编码问题。由于Visual C++ 2005默认使用Unicode字符集,当源代码使用的是ANSI
在机器人路径规划领域,优化算法起着至关重要的作用,它能帮助找到最有效、最经济的运动轨迹。本文将深入探讨“粒子群算法优化3-5-3多项式工业机器人时间最优轨迹规划算法”这一主题,以及如何在MATLAB环境下实现这一算法。 我们来理解3-5-3多项式。在机器人运动学中,通常使用多项式来表示机器人的关节运动,这里的3-5-3表示机器人三个连杆分别用三次、五次和三次多项式来描述其位置随时间的变化。这样的多项式模型可以提供足够的灵活性,同时避免过于复杂的数学问题。时间最优轨迹规划的目标是找到一条使机器人完成任务所需时间最短的路径。 粒子群优化(PSO)算法是一种基于群体智能的全局优化方法,源自对鸟群觅食行为的模拟。在PSO中,每个解(或粒子)代表可能的解决方案,它们在搜索空间中移动并更新速度和位置,以寻找最佳解决方案(全局最优解)。每个粒子的速度和位置由其自身的最佳位置(个人极值)和整个群体的最佳位置(全局极值)共同决定。 在MATLAB中实现PSO算法,首先需要定义粒子群的参数,如粒子数量、最大迭代次数、惯性权重、学习因子等。接着,需要编写一个适应度函数,这里即为计算3-5-3多项式轨迹的时间。适应度函数的目标是最小化时间,因此我们需要计算出给定轨迹下的机器人运动时间,并作为粒子质量的评价标准。 在优化过程中,粒子会根据其当前速度和位置更新,同时考虑其历史最佳位置和全局最佳位置。经过多轮迭代后,PSO算法最终会收敛到一个接近最优解的区域。在本案例中,这个最优解对应于3-5-3多项式参数,使得机器人在满足物理约束的情况下以最短时间完成任务。 为了验证和可视化结果,可以将优化后的3-5-3多项式轨迹与原始轨迹进行对比,并利用MATLAB的图形工具展示机器人在不同时间点的位置和速度。此外,还可以通过分析和调整算法参数,如学习因子和惯性权重,探索不同设置对优化性能的影响。 总结起来,"粒子群优化3-5-3时间最优"是一个将群体智能算法应用于工业机器人轨迹规划的实例。通过MATLAB实现,该算法能够有效地找到3-5-3多项式的参数,以实现时间最优的运动轨迹。对于机器人控制和自动化领域的研究者和工程师来说,理解并应用这种优化技术具有很高的价值
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值