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

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

上个世纪,数百种编程语言被发明出来,但是进入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年软件平台技术工作中的心得体会,整理出如此多的锦囊,执笔成书与读者分享。书中内容引经据典,多处引用成语、谚语,大量使用比喻写法,期望带给读者原生态技术语言之感受,体现软件平台技术工作中的情愫和品味。

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

相关文章:

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

上个世纪,数百种编程语言被发明出来,但是进入21世纪,当我们都进入互联网时代时,只剩那么寥寥几个了。 如果你翻一下TIOBE得编程语言排行榜,就会发现20年来,上蹿下跳的就是那几张老面孔:C , Java…...

预处理指令详解

预处理指令详解**1.预定义符号****2.#define****2.1 #define 定义标识符****2.2 #define 定义宏****2.3 #define 替换规则****2.4 #和##****#的作用****##的作用****2.5 带副作用的宏参数****2.6 宏和函数的对比****宏和函数对比图****2.7 命名约定****3.#undef**4.条件编译4.1…...

Redis

一.认识NoSQL 1.SQL 关系型数据库 结构化: 定义主键,无符号型数据等关联的:结构化表和表之间的关系通过外键进行关联,节省存储空间SQL查询:语法固定 SELECT id,name,age FROM tb_user WHERE id1 ACID 2.NoSQL 非关系型数据库 Re…...

Elasticsearch5.5.1 自定义评分插件开发

文本相似度插件开发,本文基于Elasticsearch5.5.1,Kibana5.5.1 下载地址为: Past Releases of Elastic Stack Software | Elastic 本地启动两个服务后,localhost:5601打开Kibana界面,点击devTools,效果图…...

4.4 序列化与反序列化

文章目录1.概述2.特点/应用场景3.涉及到的流对象4.代码实现序列化与反序列化4.1 步骤1:创建学生类Student24.2 步骤2:创建序列化测试类5.测试案例中常见的几种编译错误类型6.为什么反序列化版本号需要与序列化版本号一致?7.自动提示 生成UID …...

647. 回文子串 516. 最长回文子序列

647. 回文子串 方法一:动态规划 dp[i][j]:[i,j]范围的下标字符串s是否为回文子串 遍历字符串,每次判断s[i]与s[j]是否相等 ①若相等,j-i0 即单个字符串s[i],那么一定为回文子串,赋值为1 ②若相等,j-i1…...

实用小妙招

记录一些实用小妙招,都是收藏夹里收藏的各种文章,总结在一起,持续更新 实用小妙招LinuxUbuntu修改终端语言安装 Node.js (nvm)git 记住账号密码WSL迁移默认用户修改Linux Ubuntu 修改终端语言 apt update apt install -y language-pack-zh…...

别让猴子跳回背上

1.管理者的贡献来自于他们的判断力与影响力,而非他们所投入的个人时间与埋头苦干 2.管理者的绩效表现则是许多人群策群力的结果 3.管理者的时间管理: 老板占用的时间;组织占用的时间;自己占用的时间;外界占用的时间; 4.管理者的策略在于增加自己的时间&#xff0c…...

数据结构 | 线性表

🔥Go for it!🔥 📝个人主页:按键难防 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 📖系列专栏:数据结构与算法 &#x1f52…...

Deepwalk深度游走算法

主要思想 Deepwalk是一种将随机游走和word2vec两种算法相结合的图结构数据的挖掘算法。该算法可以学习网络的隐藏信息,能够将图中的节点表示为一个包含潜在信息的向量, Deepwalk算法 该算法主要分为随机游走和生成表示向量两个部分,首先…...

微服务项目【服务调用分布式session共享】

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

神经网络的万能逼近定理

这是我见过的讨论神经网络万有逼近问题的最好的文章。在文章中,给出了最清晰,简洁的构造性证明。揭示了它的本质。 三十年前,我们接触到神经网络的万有逼近问题。发表了几篇文章。这些文章把神经网络能力的来历、优点、缺点,都已…...

【信息系统项目管理师】项目管理过程的三万字大论文

【信息系统项目管理师】项目管理过程的三万字大论文 【信息系统项目管理师】项目管理过程的三万字大论文 【信息系统项目管理师】项目管理过程的三万字大论文1.制定项目章程2.识别干系人3.制定范围管理计划4.制定进度管理计划5.制定成本管理计划6.制定质量管理计划7.编制人力资…...

【C++】C++11 ~ 包装器解析

🌈欢迎来到C专栏~~包装器解析 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&a…...

SpringBoot整合(三)SpringBoot发送邮件

使用SpringBoot发送邮件 邮件发送其实是一个非常常见的需求,用户注册,找回密码等地方,都会用到,Spring Boot 中对于邮件发送,提供了相关的自动化配置类,使得邮件发送变得非常容易。 1、前置工作 目前国内…...

【docker知识】联合文件系统(unionFS)原理

一、说明 Docker CLI 操作起来比较简单——您只需掌握Create、Run、InspPull和Push容器和图像,但是谁想过Docker 背后的内部机制是如何工作的?在这个简单的表象背后隐藏着许多很酷的技术, UnionFS(统一文件系统)就是其…...

使用Lame库实现wav、pcm转mp3

文章目录 前言 一、Lame库是什么? 二、使用步骤 0.创建native项目 1.下载Lame库 2.pcm转MP3 3.wav转MP3 4、native方法如下 三、注意 总结 前言 因为使用android录音后生成的文件是wav或者pcm格式,项目要求最后的文件需要是mp3格式,于…...

c++11 标准模板(STL)(std::multimap)(三)

定义于头文件 <map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class multimap;(1)namespace pmr { template <class Key, class T…...

【报复性赚钱】2023年5大风口行业

今天就来和大家分享一下&#xff0c;在时代的洪流下&#xff0c;普通人如何顺应大势抓住机遇&#xff01; 实现人在风口上&#xff0c;猪都会飞起来。 根据对市场的观察及各平台数据分析结果&#xff0c;结合国家政策和经济专家的分析&#xff0c;小编预测了2023年将会迎来大…...

单目相机、双目相机和RGB-D相机学习笔记(一些视频和博文网址)

目录1. 单目相机1.1 摄像头原理1.2 单目相机的标定2 双目相机2.1 双目相机定位原理2.2 双目相机的缺陷3 RGB-D相机3.1 深度相机结构光原理3.2 RGB-D相机的应用1. 单目相机 1.1 摄像头原理 视频网址&#xff1a;【全网最详细】摄像头原理分析&#xff08;约25分钟课程&#xf…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...