Web 开发用 PHP,Java,Node.js
基础设施用 C/C++
网页设计用 HTML,JS,CSS
数据库用 SQL 。
为什么不发明一种万能的编程语言,我只需要学一门语言就能做所有的事情。
这可能吗?
目前 Python 有这种趋势,但还是无法全面覆盖,比如移动端的 App 开发。
101
2i2Re2PLMaDnghL 2021-10-22 10:26:28 +08:00
『字同』语言
|
102
ciki 2021-10-22 10:30:58 +08:00
kotlin,dart
|
103
lostpg 2021-10-22 10:38:09 +08:00
@industryhive #94 在我理解里,我俩交流中提到的大型系统基本都是指代分布式系统,小型系统都是单机应用的指代;那已经很明显了,分布式系统的瓶颈往往都不在单机性能上,大多数时间都是在等待 IO 上,这种时候语言的性能和延迟就不是大问题;在精确控制内存和 CPU 占用的地方,也就是「小型系统」,Java,或者说自带 runtime 和 gc 的语言注定有着先天劣势的,可以弥补,但是依然是有代价的。带 GC 的语言天生就是为了解放生产力的,作为 trade-off,就是牺牲一部分性能,如果说这部分牺牲能够被弥补上,那么编译型语言也一定会有相应的提升再次拉开距离。
话说那句,能用 js 实现的,一定会用 js 实现,我怎么觉得换成 java 也一样说得通呢( |
104
sakura1 2021-10-22 10:42:03 +08:00
理论上通用一切是可以的,但是现实中谁来创造这门语言呢,一次就能定义成吗,后续肯定会不断升级,遇到突破原则上的东西了,就只能重做一门语言了。
|
106
qaz168000 2021-10-22 10:50:37 +08:00
目前看起来应该就是 C#能往这个上面靠
|
108
industryhive 2021-10-22 11:20:50 +08:00
@lostpg 小型系统不仅受制于单机资源,像 Windows 、Linux 等软件应用范围一般也包括个人主机,也就是说这类软件都必须能够满足在普通个人用户的电脑上安装运行,而家用电脑的性能是非常有限的,所以也会限制这种小型系统的规模。而有的企业级服务器就没有这个限制,CPU 可能有几百核,内存可能有几个 TB,能运用这种资源的系统也是大型系统,就比较适合用 java 做。
另外,java 的确在精确控制内存方面存在劣势,但是并不是 java 就不能“精确控制内存”,你可能不知道 java 是可以选择手动关闭 GC 的,你也可能不知道 java 是可以使用 unsafe 手动分配和释放内存的。当然在内存管理方面一般是自己构建内存池,真要是用 C/C++写高性能程序也不会有人傻到用 malloc/free 这种动态内存分配手段吧? |
109
lostpg 2021-10-22 11:25:31 +08:00
@industryhive #108 没有,一般用智能指针🤣
|
111
GeruzoniAnsasu 2021-10-22 12:34:18 +08:00
|
112
OneMan 2021-10-22 12:53:26 +08:00
人不能懒
|
113
2i2Re2PLMaDnghL 2021-10-22 12:54:20 +08:00
@industryhive malloc 视实现可能是内存池,由 libc 维护
几百核可还行,这发热量可能塞不到 1u 里去,会再多堆几台机器的,就变分布式系统了。 AOT/JIT 不是语言绑定的,Python 也有 pypy 是 JIT 运行时,js 方面 V8 更是重度使用 JIT 帮 Chrome 甩开其他浏览器八条街。 但目前 JIT 因发源较晚,发展程度不足。所以 JIT 理论上的优势未能充分发挥,目前来说还是 AOT 性能更高一筹。 主要是 Java 有冷启动的问题,一是需要载入内存的内容比较多,二是 JIT 有慢启动的情况,要有足够的信息才能更有效地优化。 这在个人主机里面就显得非常不 responsive 但服务器不在乎,单是把硬件全部检测完就远远超过 Java 的冷启动消耗,应用更是长期运行不会关的。 但又一重反转就是,现在的容器自动伸缩技术,依赖于启动速度,需要避免运行时依赖方便容器组装,所以可以看到放进容器里去的很多都是 golang 的。 顺便,我想问一下你怎么看 .net CLR 这种介于 AOT 和 JIT 之间的形式?(看到一说叫 NativeAOT ?) |
114
markgor 2021-10-22 13:41:20 +08:00
好奇问问,JS 属于吗?
在服务端,有 nodeJs 在 web 端,有 vue 在 app 端,有 uniapp (本质也是 vue 在 pc 客户端,有 electron 好像真的什么场景都有 JS 的身影 |
115
lonenol 2021-10-22 13:46:00 +08:00
全能等于全面平庸。
|
116
flniu 2021-10-22 13:48:09 +08:00 1
每种图灵完备的编程语言功能都是等价的,但有不同的特性、适用场景、设计理念。通常你不会考虑用 C 做 Web 开发、用 JS 做数据处理或科学计算、等等。
此外还有特殊用途的非图灵完备的语言,如 SQL 、HTML 、XML 、YAML 等。 就像那篇经典文章《十年学会编程( Teach Yourself Programming in Ten Years )》所说:“学习至少半打的编程语言。包括一种支持类抽象的语言(像 Java 或 C++),一种支持函数化抽象的语言(像 Lisp 或 ML 或 Haskell ),一种支持语法抽象的语言(像 Lisp ),一种支持声明规格说明的语言(像 Prolog 或 C++ 的模板),以及那些强调并行的语言(像 Clojure 或 Go )。” https://xiaogd.net/%E3%80%90%E8%BD%AC%EF%BC%88%E4%B8%AD%E8%8B%B1%E6%96%87%EF%BC%89%E3%80%91%E5%8D%81%E5%B9%B4%E5%AD%A6%E4%BC%9A%E7%BC%96%E7%A8%8B%EF%BC%88teach-yourself-programming-in-ten-years%EF%BC%89/ 并不是说要真的去学上述所有语言,这里体现的是不同编程语言的设计理念或编程思想的差异。 |
117
del1214 2021-10-22 13:50:16 +08:00
商业利益,最后还是听💰的
|
118
Mark24 2021-10-22 13:56:31 +08:00
最终会变得很复杂。学不会。继而分化出简洁的 DSL
|
120
12101111 2021-10-22 14:00:28 +08:00 3
歪个题, C 语言可能不是通用的, 但是 C ABI 恐怕是可预见的未来唯一的一个通用的 ABI 接口, 甚至 C 语言没人用了也很难出一个更通用的 ABI 接口出来
|
121
dangyuluo 2021-10-22 14:04:51 +08:00 1
为什么不能有一辆万能的车呢,一辆车覆盖上下班通勤,越野,拉货( 2 吨以上),赛道绕圈,etc.
|
122
pytth 2021-10-22 14:08:20 +08:00
javascript
前端:vue 后端:node app:vue 、uniapp 、React Native |
124
2i2Re2PLMaDnghL 2021-10-22 14:51:45 +08:00
|
125
ychost 2021-10-22 14:53:53 +08:00
C# 基本涵盖了
前端 √ 服务端 √ 桌面 √ Android/iOS √ |
126
allstack 2021-10-22 15:04:58 +08:00
不可能,真实世界的场景千差万别,为了通用性,必然会在某些场景作出牺牲
|
128
Kasumi20 2021-10-22 15:28:34 +08:00
只有我一个人觉得 C#是垃圾吗?
|
129
bengcaca 2021-10-22 15:47:54 +08:00
因为万事万物都在不断的发展呀
|
130
rpish 2021-10-22 17:13:16 +08:00
看见了安全经验.
你的目的应该不是找一门语言做所有事情,而是找一门能做所有事情的语言作为目标来分析相关框架的漏洞吧. |
132
Chad0000 2021-10-22 17:30:13 +08:00 1
|
133
penguinWWY 2021-10-22 22:03:34 +08:00
@industryhive 我一个做 Compiler 的都惊呆了,JIT 啥时候有了上限比 AOT 强的说法了
|
134
fighterhit 2021-10-23 00:54:23 +08:00
因为语言是人发明的,有人的地方就有江湖,就夹杂着任性、商业利益和创造者对事物、世界的看法
|
135
secondwtq 2021-10-23 01:08:05 +08:00
“安全经验”建议看一下易语言呢亲~
|
136
zeni123 2021-10-23 01:21:09 +08:00 via iPhone
有的 汇编语言 无论什么语言 最后都会是汇编
|
137
cmdOptionKana 2021-10-23 09:19:12 +08:00
虽然 C#可以做桌面软件,但现在做桌面软件基本上都希望跨 mac win linux
|
138
industryhive 2021-10-23 10:09:39 +08:00
@penguinWWY 看来你这 Compiler 做的不行啊,连这种理论上已经定性的东西都不知道,还做什么 Compiler 。。。
|
139
butanediol2d 2021-10-23 11:02:25 +08:00 via iPhone
LLVM 的中间语言算不算(逃
|
140
penguinWWY 2021-10-23 15:56:56 +08:00
@industryhive 理论上定性?谁讲的?哪篇论文?出处贴一下?
|
141
penguinWWY 2021-10-23 16:06:57 +08:00
@industryhive 先请教一下 jit 的 interprocedural alias analysis 准备咋做?有没有实现?能不能做 whole-program alias analysis ? incremental points-to analysis 能做到啥程度?还有像 ObjectLayout optimization 这类问题,麻烦给个出处,学习一下,如果做到的
|
142
industryhive 2021-10-23 16:57:14 +08:00
@penguinWWY 你既然做 Compiler ,那么把你的工作成果晾一下吧,有多少性能提升,如何实现的,相比于其他编译器有哪些突破,发了哪些论文。你否认 AOT 的理论优化上限比 JIT 低,谁讲的?哪篇论文?出处贴一下。MPGO 是怎么生成 NGen 二进制映像的?和 native PGO 优化有什么区别? Native PGO 怎么摆脱 training run 的局限? Managed profiler 通过动态插桩收集 profile 的过程是怎么样的?你们是怎么实现让 JIT 编译器生成收集 profile 的代码,收集细粒度 profile 并在后续进行高度优化的编译这类问题,麻烦给个出处,学习一下,如果做到的
|
143
penguinWWY 2021-10-23 19:54:42 +08:00
@industryhive 你提出的观点,不提供论据的吗?我说的问题都是 jit 目前面临的问题。JIT 相对于 AOT 的劣势,一个是 interprocedural analysis 有差距,无法提供全程序的 alias 结果。二是内存布局冗余多,在部分场景下缓存 miss 、跳转多。
你要是想了解我的工作也可以,我发过 jd: https://www.v2ex.com/t/804224#reply28 鹅厂 jvm 组,但我是做 Python 虚拟机的,新项目没啥成果,但是我们 JDK 做的不错,有两个 OpenJDK 社区的 reviewer ,几个 commiter ,你要是感兴趣我帮你约一下? |
144
penguinWWY 2021-10-23 19:58:05 +08:00
@industryhive 顺便,不是抬杠,我是真的想招人,毕竟人力不够,如果你对编译器感兴趣可以来聊一聊,联系方式在 JD 里
|
146
gengchun 2021-10-24 17:15:27 +08:00
@rim99 我知道你们是什么意思了。不过这东西还取决于硬件架构、操作系统和编译器。真的要外部调用成功需要协调的东西太多。Linux 有 LSB 有一些标准,不过从来都觉得是 Linux 和 x64 的事情。不太清楚别的架构是不是也这样。
|
147
rim99 2021-10-24 18:54:39 +08:00
@gengchun 那倒是,实际上 C 没有明确定义自己的 ABI ,只是 Cpp Rust 这些都选择了使用 `extern C`, C 的编译结果成为了事实上的标准
|
148
newmlp 2021-10-25 09:53:13 +08:00
@industryhive 你对 CPP 的编译优化一无所知
|
149
JerryCha 2021-10-25 10:53:27 +08:00
试试 assembly
|
150
jingslunt 2021-10-25 12:49:38 +08:00
26 个字母和数字
|
151
chtcrack 2021-10-25 13:26:43 +08:00
@industryhive 现在居然还能看到这样的观点,好奇怪啊,就问你 java 没有 linux,Windows 平台能运行得起来嘛?在别人的底层上运行的东西说底层的效率不如 JIT?你是要笑死人吗?
|
152
chtcrack 2021-10-25 13:52:26 +08:00
@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 容器高得多,如果被错误使用就有可能带来性能问题。 |
153
chtcrack 2021-10-25 13:57:01 +08:00
@industryhive java 不要和 c/c++比性能,比开发效率还差不多,你连这些都不了解,只会被人笑..
我们知道 C++的上限之高,目前来看是 Java 等语言所不能企及的。但是 Java 等语言在开发效率上的优势也是 C++很难相比拟的。 如果 Java 性能真的接近 C++,游戏引擎就会用 Java 写吗?显然仍然不行,因为到了性能性命攸关的领域,一点点性能差距都是至关重要的, 而到了极度注重扩展性又要兼顾开发效率、维护效率的领域(大型网站、电商系统),又常常是被 Java 所统治,改用 C++缺乏充分的理由。(可以用 c++写比 java 性能更好的大型网站,电商系统,但是很麻烦,维护麻烦,开发麻烦.) 至少在今天看来,二者最擅长的领域仍然是无法互相替代的。 |
154
chtcrack 2021-10-25 14:09:00 +08:00
@industryhive 还有,建议你去学一下最基础的计算机知识,什么语言在电脑上执行效率最高.
我来告诉你,机器语言效率最高,上来是汇编语言,再上来是 c,c++,linux,Windows 底层都是用 c/汇编写的,java 是 c 语言开发的,你可以用 c 写一个 javaxx,但是你不能用 java 写一个性能更好的 cxx,能不能明白? 嗯,你的意思是用 c 语言写的 java 的性能比 c 语言更好,这逻辑牛逼,怎么做到的?解释一下? |
155
industryhive 2021-10-25 19:26:14 +08:00
@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 性能高么?恐怕这已经突破了你的想象力极限了吧? |
156
canyue7897 2021-10-26 00:12:15 +08:00
@industryhive 其实这牵涉到计算机标准问题。。。现在的云平台都运行在虚拟化平台上。。jvm 真可以直接运行在裸机上。。。但是并不代表效率就一定高。。两个概念。。。
|
157
industryhive 2021-10-26 09:48:16 +08:00
@canyue7897 云平台还是嵌套了一层,和现在的操作系统没什么区别。jvm 直接运行在裸机上,可以抛弃传统的操作系统内核那一套,效率肯定是更高的,而且可能会出现数量级的差距。
|
158
chtcrack 2021-10-26 09:53:19 +08:00
@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 就自己玩吧. |
159
gmywq0392 2021-10-26 10:08:22 +08:00
有人在写 universe language 支持多语言 parse 的。忘了那个 repo 了。。
|
160
industryhive 2021-10-26 10:14:18 +08:00
@chtcrack 这。。。你确定你不是来搞笑的?安卓系统是包装了个 Linux 好吧。。谷歌新做一个操作系统放弃 Linux 和 java 有什么关系??真正用 java 写的操作系统是直接运行到裸机上的 jvm ,这样从下层操作系统到上层应用程序,全部是 java 。只有到极端苛求性能的时候,这样的系统才会出现,现在不需要那么高的性能,你让谷歌花费巨大成本做一个新 jvm 给 Oracle 做嫁衣? Oracle 需要你这样的人才!
|
161
chtcrack 2021-10-26 10:20:37 +08:00
@industryhive
Android 运行库 Android 包括了一个核心库,该核心库提供了 JAVA 编程语言核心库的大多数功能。 每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟机实例。Dalvik 被设计成一个设备可以同时高效地运行多个虚拟系统。Dalvik 虚拟机执行(.dex)的 Dalvik 可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由 JAVA 编译器编译,然后通过 SDK 中的“dx”工具转化成.dex 格式由虚拟机执行。 你知道安卓系统为啥会性能这么差,需要靠硬件堆吗?就是因为这个垃圾 java 啊,估计当时安卓创始人就是被这些迷信吹逼 java 的忽悠了,把 java 弄到安卓系统里,导致安卓系统一直被 ios 吊打.用事实说话,再吹也没用,叫 java 赶紧搞一个不需要 c,c++做底层的操作系统出来啊,别在吹了,看不下去了.. |
162
libook 2021-10-26 10:31:57 +08:00
各种语言存在都是有其合理性的,确实一种语言只能在部分领域好用,多种语言互补。
如果说真的在所有场景都能用的语言,汇编应该差不多吧。 其实通过用其他语言开发 SDK ,可以做到使用一种语言做所有事情,比如主要用 JS ,可以使用 C/C++开发的 Node.js 来用 JS 写 Web 服务,写 C++ Addons 或 Webassembly 的模块可以用 JS 做基础设施,HTML 、CSS 都有 JS API ,数据库用 JS 的 ORM 或者干脆用 MongoDB ,甚至拿 GPIO SDK 可以用 JS 写机器人跑马灯啥的硬件程序。 同理,Python 应该也可以做到,防止反编译可以编译成机器码 /字节码再分发。 |
163
socket1q1 2021-10-26 14:51:58 +08:00
做任何事就算万能啦?你这么说很多语言都可以,比如就是你说 python 。python 也可以做移动开发呀,自己实现一个图片渲染引擎然后跑 python 脚本,你知不知道很多游戏的移动端都是用脚本语言开发的。编程语言本身只是一种人与机器沟通的语言,你说的那些只要是编程的人是万能就可以了。
|
164
testlover 2021-10-26 18:11:10 +08:00
自己玩儿 c#是最合适的 指望这个吃饭 不是不行 就是有点难
|
165
Shensven 2021-10-26 20:44:05 +08:00
所有能用 JavaScript 实现的,必将使用 JavaScript 实现
|
166
qsgy123456 264 天前
我发现了一种方案可以统一全部编程语言:通用代码映射语言。
现在完全开发一种独立的语言是很难的,因为各个领域的解决方案都已经有老牌语言占领了。所以在原有语言的生态基础上增强能力更实用。但我发现,增强到极致以后,实际上语法已经变成了一种新语言,但生态还是可以用旧语言。 这个方案简单说是将一种类 lisp 的代码(方便写语法表达树)和其他编程语言建立双向映射。 好处是,既有 lisp 这样强大的表达能力,又能够充分利用老语言的语法分析器和生态(所有的库都能用) 我认为这是严谨编程语言的终极形态。 |