为什么没有一种万能且通用的编程语言呢?

2021 年 10 月 21 日
 onice

Web 开发用 PHP,Java,Node.js

基础设施用 C/C++

网页设计用 HTML,JS,CSS

数据库用 SQL 。

为什么不发明一种万能的编程语言,我只需要学一门语言就能做所有的事情。

这可能吗?

目前 Python 有这种趋势,但还是无法全面覆盖,比如移动端的 App 开发。

19256 次点击
所在节点    程序员
166 条回复
penguinWWY
2021 年 10 月 23 日
@industryhive 先请教一下 jit 的 interprocedural alias analysis 准备咋做?有没有实现?能不能做 whole-program alias analysis ? incremental points-to analysis 能做到啥程度?还有像 ObjectLayout optimization 这类问题,麻烦给个出处,学习一下,如果做到的
industryhive
2021 年 10 月 23 日
@penguinWWY 你既然做 Compiler ,那么把你的工作成果晾一下吧,有多少性能提升,如何实现的,相比于其他编译器有哪些突破,发了哪些论文。你否认 AOT 的理论优化上限比 JIT 低,谁讲的?哪篇论文?出处贴一下。MPGO 是怎么生成 NGen 二进制映像的?和 native PGO 优化有什么区别? Native PGO 怎么摆脱 training run 的局限? Managed profiler 通过动态插桩收集 profile 的过程是怎么样的?你们是怎么实现让 JIT 编译器生成收集 profile 的代码,收集细粒度 profile 并在后续进行高度优化的编译这类问题,麻烦给个出处,学习一下,如果做到的
penguinWWY
2021 年 10 月 23 日
@industryhive 你提出的观点,不提供论据的吗?我说的问题都是 jit 目前面临的问题。JIT 相对于 AOT 的劣势,一个是 interprocedural analysis 有差距,无法提供全程序的 alias 结果。二是内存布局冗余多,在部分场景下缓存 miss 、跳转多。

你要是想了解我的工作也可以,我发过 jd: https://study.congcong.us/t/804224#reply28
鹅厂 jvm 组,但我是做 Python 虚拟机的,新项目没啥成果,但是我们 JDK 做的不错,有两个 OpenJDK 社区的 reviewer ,几个 commiter ,你要是感兴趣我帮你约一下?
penguinWWY
2021 年 10 月 23 日
@industryhive 顺便,不是抬杠,我是真的想招人,毕竟人力不够,如果你对编译器感兴趣可以来聊一聊,联系方式在 JD 里
rim99
2021 年 10 月 24 日
@gengchun Rust, Cpp, Scala Native 都用 C ABI
gengchun
2021 年 10 月 24 日
@rim99 我知道你们是什么意思了。不过这东西还取决于硬件架构、操作系统和编译器。真的要外部调用成功需要协调的东西太多。Linux 有 LSB 有一些标准,不过从来都觉得是 Linux 和 x64 的事情。不太清楚别的架构是不是也这样。
rim99
2021 年 10 月 24 日
@gengchun 那倒是,实际上 C 没有明确定义自己的 ABI ,只是 Cpp Rust 这些都选择了使用 `extern C`, C 的编译结果成为了事实上的标准
newmlp
2021 年 10 月 25 日
@industryhive 你对 CPP 的编译优化一无所知
JerryCha
2021 年 10 月 25 日
试试 assembly
jingslunt
2021 年 10 月 25 日
26 个字母和数字
chtcrack
2021 年 10 月 25 日
@industryhive 现在居然还能看到这样的观点,好奇怪啊,就问你 java 没有 linux,Windows 平台能运行得起来嘛?在别人的底层上运行的东西说底层的效率不如 JIT?你是要笑死人吗?
chtcrack
2021 年 10 月 25 日
@industryhive C++的性能取决于代码是如何编写的
我们说一辆车很快,是说加速快?急速高?转弯快?而且关键是,这辆车在赛场上能开多快,赛车手的水平和发挥才是关键吧。

同样,“C++写的代码更快”也是无稽之谈,因为任何人都可以轻松用 C++写出超慢的代码。

排除故意写错的情况,不够熟悉 C++的初学者,如果不熟悉 C++背后的执行原理、不能正确使用指针、大量使用值传递、不能合理管理内存,一不小心写出比 Ruby 还慢的代码也并非难事。

由于 C++这门语言同时满足:1 、提供非常多的高级特性; 2 、同时保持直接访问硬件底层的能力。所以更准确的说法是:C++是一门效率下限很低、效率上限极高的语言。

上限高到什么程度?任何其它常用语言都难以望其项背。

而下限和上限之间的弹性区域,就是各种不同的说辞存在的空间了。

因为我们知道了 C++下限低、上限高,如果以所有 C++代码的中位数水平看,很难说 C++真的有多么快,因为确实存在大量写得不怎么出色、存在性能问题的代码。有时是因为编写者水平有限,有时是因为某一段代码不重要所以没有刻意认真写,结果性能不高。

如果把“写得一般的 Java 程序”和“写得一般的 C++程序”拿来对比,说不准 Java 还真有胜算。这是因为,Java 的编写方式相对比较规范,而且有很多让程序员不容易用错的设计:1 、不用关心内存管理,2 、参数默认是引用传递,3 、常用容器优化较好,4 、字符串经过合理优化。

对比 C++的 STL ,要想高效使用 STL ,门槛就比 Java 容器高得多,如果被错误使用就有可能带来性能问题。
chtcrack
2021 年 10 月 25 日
@industryhive java 不要和 c/c++比性能,比开发效率还差不多,你连这些都不了解,只会被人笑..
我们知道 C++的上限之高,目前来看是 Java 等语言所不能企及的。但是 Java 等语言在开发效率上的优势也是 C++很难相比拟的。
如果 Java 性能真的接近 C++,游戏引擎就会用 Java 写吗?显然仍然不行,因为到了性能性命攸关的领域,一点点性能差距都是至关重要的,

而到了极度注重扩展性又要兼顾开发效率、维护效率的领域(大型网站、电商系统),又常常是被 Java 所统治,改用 C++缺乏充分的理由。(可以用 c++写比 java 性能更好的大型网站,电商系统,但是很麻烦,维护麻烦,开发麻烦.)

至少在今天看来,二者最擅长的领域仍然是无法互相替代的。
chtcrack
2021 年 10 月 25 日
@industryhive 还有,建议你去学一下最基础的计算机知识,什么语言在电脑上执行效率最高.
我来告诉你,机器语言效率最高,上来是汇编语言,再上来是 c,c++,linux,Windows 底层都是用 c/汇编写的,java 是 c 语言开发的,你可以用 c 写一个 javaxx,但是你不能用 java 写一个性能更好的 cxx,能不能明白?
嗯,你的意思是用 c 语言写的 java 的性能比 c 语言更好,这逻辑牛逼,怎么做到的?解释一下?
industryhive
2021 年 10 月 25 日
@chtcrack 老哥打这么多字不容易,回复你一下吧,拓展下你的知识边界。

“如果 Java 性能真的接近 C++,游戏引擎就会用 Java 写吗?显然仍然不行,因为到了性能性命攸关的领域,一点点性能差距都是至关重要的”,这句话是错的,数据库都可以用 java 写,游戏引擎当然也可以,恐怕还更简单点。现在 java 做游戏存在一个比较严重的缺陷,就是 java 的内存模型非常不适合游戏这种需要大量小对象的领域,java 要做到和 C++一模一样的的内存布局非常麻烦,所以游戏领域 java 出现的很少。不过 java 和 jvm 正在快速发展,project valhalla 也就是 java 的自定义值类型正在快速推进,一旦正式发布,java 将有能力轻松实现像 C++一样的内存布局,我预计到时候会涌现出一批 java 游戏引擎。
“机器语言效率最高,上来是汇编语言,再上来是 c,c++,linux,Windows 底层都是用 c/汇编写的,java 是 c 语言开发的,你可以用 c 写一个 javaxx,但是你不能用 java 写一个性能更好的 cxx,能不能明白?”你这段话是完全错误的。所有的编程语言,只要他是编程语言,那就一定是实现图灵完备的。你知道图灵完备是什么意思吗?就是说,c/c++/java/python 等等在数学上都是等价的,c/c++能做到的 java 都可以分毫不差的做到。并且由于 java 拥有运行时 JIT 的支持,java 的理论性能上限比 c/c++等只有 AOT 的语言高。你懂 AOT 和 JIT 的区别吗? Windows 和 Linux 确实是用 C 写的,但是这种客户端操作系统 java 也不是不能写。我给你推荐一篇文章:一种新的操作系统设计 http://www.yinwang.org/blog-cn/2013/04/14/os-design 。知乎上也有对这篇文章的讨论:如何看待王垠对于内存管理的理解? - 灵剑的回答 - 知乎
https://www.zhihu.com/question/484194993/answer/2098751994
。总的思想就是让 JVM 直接运行在裸机上,去掉操作系统的冗余,这样 JVM 就是操作系统,极大的提高程序的运行性能。其实这样的想法我很早之前也想到的,现在全世界几十亿台安卓设备,底层都是 Linux 系统,然后在 Linux 之上运行了 jvm ,在 jvm 之上再运行安卓应用。我就想为什么不直接运行 jvm ,去掉 Linux 呢?这对于安卓设备来说运行效率会极大的提高。我不知道现在有没有公司在做这方面的研究,但我知道,如果 SUN 公司还在的话,一定会很乐意这么做的。
最后,你对 java 的理解几乎为零,jvm 有很多实现,现在应用最广泛的 Hotspot 是用 c++写的。但是前两年 Oracle 搞出了个新玩意,叫 GraalVM ,这是一个完全由 java 实现的通用高性能跨语言虚拟机,用 java 实现的 GraalVM 性能比用 c++实现的 Hotspot 高大概 4%~20%。怎么样?你知道为什么 java 写的 jvm 为什么比 c++写的 jvm 性能高么?恐怕这已经突破了你的想象力极限了吧?
canyue7897
2021 年 10 月 26 日
@industryhive 其实这牵涉到计算机标准问题。。。现在的云平台都运行在虚拟化平台上。。jvm 真可以直接运行在裸机上。。。但是并不代表效率就一定高。。两个概念。。。
industryhive
2021 年 10 月 26 日
@canyue7897 云平台还是嵌套了一层,和现在的操作系统没什么区别。jvm 直接运行在裸机上,可以抛弃传统的操作系统内核那一套,效率肯定是更高的,而且可能会出现数量级的差距。
chtcrack
2021 年 10 月 26 日
@industryhive 再怎么吹 java 也没用啊,实际上看安卓手机,现在内存都 12G,16G 了,而苹果手机目前最大的好像还是 6G,一个用 java 的安卓系统和 c 搞出来 ios 操作系统性能上就是有先天上的差距.
还有告诉你一个坏消息.
据 TheReg ,谷歌公布了 Fuchsia OS 的内核文档,对开发者展开编程指导。Fuchsia OS 基于微内核(和 Windows 一样),名为 Zircon ,由谷歌员工 Travis Geiselbrecht 领导研发。后者 2012 年重新加入谷歌,2015 年开始涉及工作。

Fuchsia 内核被命名为 Zircon ,其基于 lk 并以 C 语言编写而成,应用程序可以用 32 位句柄调用采访对象,比如管理内存、与其它程序互相交换信息等。内核还获取了 C ++类,来通过系统调用操作者对象。内核向下是 Zircon Core ,它处置设备驱动程序,还包括输入输出、ELF 二进制读取等。

还有 Zircon Framework ,运营核心库。目前的设计方案反对 x86-64 和 ARM 64 指令集的处理器体系结构,文档后一章是向下兼容,但继续空白。

操作系统的研发是一个漫长的过程,不过谷歌似乎早已准备好转换到一套舍弃 Java 且新的将 Android 和 Chrome OS 跨平台融合的新产物,就看发售时机了。

嗯,java 很牛逼,谷歌都要放弃 java 用 c 语言再另外搞一个操作系统了,你们 java 就自己玩吧.
gmywq0392
2021 年 10 月 26 日
有人在写 universe language 支持多语言 parse 的。忘了那个 repo 了。。
industryhive
2021 年 10 月 26 日
@chtcrack 这。。。你确定你不是来搞笑的?安卓系统是包装了个 Linux 好吧。。谷歌新做一个操作系统放弃 Linux 和 java 有什么关系??真正用 java 写的操作系统是直接运行到裸机上的 jvm ,这样从下层操作系统到上层应用程序,全部是 java 。只有到极端苛求性能的时候,这样的系统才会出现,现在不需要那么高的性能,你让谷歌花费巨大成本做一个新 jvm 给 Oracle 做嫁衣? Oracle 需要你这样的人才!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/809557

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX