为什么我们不再发明编程语言了?

news2024/11/23 10:42:38

上个世纪,数百种编程语言被发明出来,但是进入21世纪,当我们都进入互联网时代时,只剩那么寥寥几个了。 

如果你翻一下TIOBE得编程语言排行榜,就会发现20年来,上蹿下跳的就是那几张老面孔:C , Java, Python ,C++ , C#, JavaScript......

6154bfea2d3586004d3043be0092b71f.png

80年代后期,平均每个月就会出现一种新语言,现在,平均每年出现一个就不错了。 

我有点好奇,就去扒了扒其他编程语言的出现时间,把他们分成了分为中生代新生代老年代。 

先看中生代的家伙们,20多岁,30出头,正是编程的中坚力量。

Python : 1991

Visual Basic :  1991

PHP : 1995

Ruby : 1995

Java : 1995

JavaScript : 1995

C# : 2000

(1995年还真是神奇的一年啊,几位大佬同时诞生。)

再看这些老前辈,尤其是C语言,老而弥坚,屹立50年不倒,把系统级编程吃得死死的。

Lisp : 1958

Pascal : 1970

C : 1972

Objective-C : 1984

C++ :1985

Object Pascal : 1986

新生代则活力无限, 锋芒毕露,对老家伙们虎视眈眈。

Go : 2009

Rust : 2010

Kotlin : 2011

Elixir : 2011

Julia : 2012

TypeScript : 2012

Swift : 2014

新生代只是它们想挑战中生代的地位,抢班夺权,希望渺茫。 

主要有这么几个原因:

1.  编程范型没有变化

还是老三样:面向过程,面向对象, 函数式。 

在冯诺依曼架构下,恐怕也不会出现什么新的范型了吧。 

现在TIOBE排行前十的中生代语言完美涵盖了这些范型,例如Java,刚诞生的时候支持面向对象,但是后来补上了函数式这一课。

像Python、JavaScript一开始就支持面向对象和函数式编程。

2. 开发领域

开发领域有桌面开发、Web开发、系统级软件开发、后端开发,数据分析,人工智能等。 

中生代的编程语言不但这些领域看得死死的,还互相扩展,侵入对方的领地。 

其中最典型的就是JavaScript这个屌丝的逆袭,一开始不过是寄居在浏览器中的一个小语言,后来通过V8, Node.js竟然进入了后端,还用Electron蚕食桌面开发!

Python也是,本来用它写点儿小工具,开发点儿小网站,后来竟然傍上了人工智能这个大款,从此发达了。

3. 生态系统

Java , Python, JavaScript,C , C#等经过这么些年的发展,哪个不是积累了海量的类库,哪一个没有庞大的生态系统?想动它们,没有一场革命是绝对不行的。

新语言即使很好,但是看看那么多现有的代码,谁敢轻易切换?

4. 时代的红利

Java遇到了互联网,Python遇到了大数据和AI, JavaScript遇到了前端开发, 时代的机遇让它们爆炸式发展。 

Go的运气不错,遇到了云计算,强势崛起。其他几位想要出头,那是相当难了。

我曾经悲观地认为:主流的编程语言已经都被发明出来了! 

以后新出现的语言都是改进,改良,没法闹革命翻身了。 

举个不恰当的比喻, C, Java, Python, JavaScript,C# , C++, PHP 就像现在的西方七国集团,牢牢占据着最大的市场,然后只要有新人冒出来,就会受到无情的打击。就像现在中国想技术突破,被美国和西方不择手段地打压一样。 

(点击下方漫画可以查看详情)

ecd20f83cd54e949f091e23ca842031a.png

但是也并不绝对,就像中国一定要向上突破一样,我看到在系统编程领域,也有一个新星冉冉升起:Rust

17691127df3c001db4cde871ffc24116.jpeg

Rust虽然没有发明新东西,但是却融合了多种语言的特性和多种编程泛型,它不但包含了上面说的三大编程范式,还集结了泛型、底层内存管理、所有权等特性,可以说是一个集大成者(这也恰恰是它学习曲线陡峭的原因)。

Rust是一门同时追求安全、并发和性能的现代系统级编程语言,有望挑战C语言的地位。

当然,编程语言少,对程序员来说是好事,程序员可以少学一点东西,少掉几根头发。

最后再聊聊人工智能时代的编程问题,我在《天才程序员》中看到一个有趣的比喻,说普通的编程就像循规蹈矩的机械装置,机器会一板一眼地去执行,程序员在逻辑的宫殿中穿行,沿着头脑中的路线行走,一切都有章可循。

但是训练神经网络就完全不同,程序员和程序之间更像园丁与田园的关系。

c9906bc41a76eef375e519801e68d05c.jpeg

豆角为什么突然不长了?西红柿为什么不好吃?园丁可能会换换土壤,可能会调整一下作物之间的距离,也有可能把豆角转移到阳光充足的地方,或者少用些肥料?成功了!它们又开始茁壮成长了!

园艺技能的长进有赖于数之不尽的实验和来之不易的经验。很多新手园丁栽种的第一批作物要么长不好,要么就死了。但最终,经过不断试错(和借鉴同行的经验),园丁们会积累更多知识,形成难以言传的直觉,比如什么有效,什么无效。此时,如果你带他们去新的田园,即便那里的土壤和光照条件完全不同,他们也可以很快弄清楚哪些作物更适合在此处栽种。

看到了吧,虽然编程技能必不可少,但是重点变成了收集数据,不断训练,不断调整,然后“祈祷”程序奏效。

不知道这是程序员的幸运呢,还是不幸?

福利时间到!

免费包邮送5本书

《软件平台架构设计与技术管理之道》!

7a0268e4df6f17cec4449f28b3c9a79a.jpeg

作者由维昭,清华大学2002级软件工程专业,硕士研究生。

本书以复杂平台顶层设计为线索,作者使用接地气的技术语言,轻松叙事的写作风格,提炼近20年软件平台技术工作中的心得体会,整理出如此多的锦囊,执笔成书与读者分享。书中内容引经据典,多处引用成语、谚语,大量使用比喻写法,期望带给读者原生态技术语言之感受,体现软件平台技术工作中的情愫和品味。

点击下面链接,即可参与抽奖,中奖者务必填写联系地址。

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

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

相关文章

(片花)原汤话原食:从公共场所不知深浅的熊孩子聊聊边界感这事

点击文末“阅读原文”即可收听本期节目剪辑、音频 / 伊姐 编辑 / SandLiu 卷圈 监制 / 姝琦 文案 / 伊姐 产品统筹 / bobo 录音间 / 声湃轩天津站本期节目完整版请在各大音频平台搜索”原汤话原食“,找到原汤话原食栏目后订阅收听。刚刚过去的春节,许…

靓号管理(2)

表结构: 根据表结构的需求,在models.py中创建类。 主要是创建级别和默认级别 class PrettyNum(models):"""靓号表"""models models.CharField(verbose_name"手机号", max_length32)price models.IntegerFie…

MES系统智能工厂,搭上中国制造2025顺风车

MES在电子制造业中的应用日益广泛,越来越多的厂商已经购置或自行开发了MES,并将其作为“智能化工厂”。国内大大小小、各行各业都有上百个MES系统,还有很多的国外MES系统,怎么才能在MES系统公司中找到适合自己的MES?希…

数据库学习笔记(2)——workbench和SQL语言

1、workbench简介: 登录客户端的两种方法 在cmd中,只能通过sql语句控制数据库;workbench其实就是一种图形化数据库管理工具,在workbench中既可以通过sql语句控制数据库,也可以通过图形化界面控制数据库。通过workbenc…

LeetCode题解 动态规划(四):416 分割等和子集;1049 最后一块石头的重量 II

背包问题 下图将背包问题做了分类 其中之重点,是01背包,即一堆物件选哪样不选哪样放入背包里。难度在于,以前的状态转移,多只用考虑一个变量,比如爬楼梯的阶层,路径点的选择,这也是能用滚动数组…

ChatGPT 的未来挑战和风险

ChatGPT 是 OpenAI 开发的流行语言模型,彻底改变了我们与 AI 交互的方式。然而,随着像 ChatGPT 这样的语言模型的使用越来越广泛,重要的是要考虑它们未来可能面临的潜在风险和挑战。 一、数据质量和公平性 使用 ChatGPT 的主要风险之一是用于…

大数据-------元数据管理

一、什么是元数据 元数据就是描述数据的数据,它为企业的各类数据提供了上下文环境,使企业能够更好地了解、管理和使用数据。 现在数据对于公司的决策十分的重要,随着业务的发展,业务线会慢慢庞大起来,随着开发人员的…

九、STM32定时器讲解 - 通用定时器实战

目录 1.三种定时器的区别 2.通用定时器的特点描述 3.计数器模式 4.通用定时器工作过程 5.计数器时钟计算方法、 5.1定时器的输入时钟频率 - TimeClockFren 5.2计数器时钟计算方法 6.定时器相关寄存器 7.定时器库函数结构体 8.通用定时器函数 9.定时器中断配置过程 1…

图论算法:树上倍增法解决LCA问题

文章目录树上倍增法: LCA问题树上倍增法: LCA问题 树上倍增法用于求解LCA问题是一种非常有效的方法。 倍增是什么? 简单来说,倍增就是 1 2 4 8 16 … 2^k 可以发现倍增是呈 2的指数型递增的一类数据,和二分一样&…

黑马程序员 Linux 教程

目录Linux 简介不同应用领域主流操作系统Linux 系统历史Linux 系统版本Linux 安装安装方式网卡设置安装 SSH 连接工具使用 FinalShell 连接到 LinuxLinux 和 Windows 目录结构对比Linux 目录介绍Linux 常用命令Linux 命令初体验Linux 命令使用技巧Linux 命令格式文件目录操作命…

Python的文件编码,复制,缓冲,删除

能力有限,仅供参考 本篇博文是上一篇博文( Python的文件读取,写入)的后续,也是python文件管理的一部分,废话不多说,现在就开始。 1. 编码 在实际工作学习中,你可以遇到乱码的问题…

c语言递归 累和 ,累乘积,斐波那契数列,字符串长度

目录 递归使用场景 1:使用递归的方式计算 Sn123..100 2:计算 n!n*(n-1)*(n-2)*......*1; 3:计算输出斐波那契数列前20项,并按每行4个数的格式输出(2019年) 4: 用递归和非递归两种方式编写函数strlength()。该函数…

Nacos 入门微服务项目实战

Nacos 核心源码精讲 - IT贱男 - 掘金小册全方位源码精讲,深度剖析 Nacos 注册中心和配置中心的核心思想。「Nacos 核心源码精讲」由IT贱男撰写,375人购买https://s.juejin.cn/ds/BuC3Vs9/ Hi,大家好,欢迎大家来学习《Nacos 核心源…

2022黑马Redis跟学笔记.基础篇(一)

2022黑马Redis跟学笔记.基础篇 一1.Redis入门1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结1.2.认识Redis1.3.安装Redis步骤一:安装Redis依赖步骤二:上传安装包并解压步骤三:启动(1).默认启动(2…

开发微服务电商项目演示(三)

一,nginx动静分离第1步:通过SwitchHosts新增二级域名:images.zmall.com第2步:将本次项目的易买网所有静态资源js/css/images复制到nginx中的html目录下第3步:在nginx的核心配置文件nginx.conf中新增二级域名images.zma…

论文阅读:MINE: Towards Continuous Depth MPI with NeRF for Novel View Synthes

中文标题:基于连续深度多平面和神经辐射场的新视角合成 本文只介绍与NeRF原文不同的部分 创新点 对单一图像进行密集三维重建,完成新视角合成与深度估计的工作。从单个图像生成连续和遮挡绘制的三维重建。MINE借鉴NeRF可以生成连续的深度图像。 解决…

leaflet上传CSV文件,在地图上显示图形(示例代码054)

第054个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载CSV文件,将图形显示在地图上。CSV(逗号分隔值)文件是一种简单且开放的文件格式,以纯文本形式存储表格数据。 几乎所有电子表格和数据库软件都可以导入/导出这种文件格式。 直接复制下面的 vue+ope…

Navicat无法连接MySQL报错1251的解决方法

日期:2023年2月10日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

C++中的智能指针

1.RAII 与引用计数了解 Objective-C/Swift 的程序员应该知道引用计数的概念。引用计数这种计数是为了防止内存泄露而产生的。 基本想法是对于动态分配的对象,进行引用计数,每当增加一次对同一个对象的引用,那么引用对象的引用计数就会增加一次…

[AAAI 2022] TransFG: A Transformer Architecture for Fine-grained Recognition

Contents TransFG ArchitectureExperimentsReferencesTransFG Architecture Overlapping patch split:ViT 是把图片分成一系列不重叠的 patches,作者认为这可能会破坏 discriminative regions. 为了解决上述问题,作者提出使用 Overlapping patch split,划分的 patch 数 N …