看到今天群里有人讨论微软用 Go 重写 TypeScript 编译器,为什么不是用他们自家的 C#? C#在大部分 benchmark 项中性能都远超 Go, TypeScript 编译也不是在浏览器进行,不用考虑编译器体积

187 天前
 drymonfidelia
C# 性能远超 Go 来源

https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/fannkuchredux.html
以及这个网站的大部分项目

别的 benchmark 网站结果也大致相同

另外 C#和 TS 大部分类型都对应,实在找不到要用 Go 的理由
11333 次点击
所在节点    程序员
115 条回复
willchen
187 天前
开源角度来讲 go 的社区比 c# 应该还是好点的
sagaxu
187 天前
@nziu 选择的核心不在于 Go 有多优秀,而是契合度,在同等性能的这个梯队中,没有比 Go 更合适的了。tier2 的性能 + 简洁的并发设施 + 带 GC 的类 C 语法 + tier1 的交叉编译能力,从这几个维度去考虑 Go 的契合度就是第一的,这是从工程角度去衡量,而不是语言设计。

Rust 很优秀,但为什么进 Linux 内核阻力重重?是 Linus 等大佬学不会吗?大概率还是工程问题,而非技术本身的问题。
Nugine0
187 天前
资历只能影响一个人说话的份量,但不会自动堵上别人的嘴,望周知
redbule
187 天前
@InkStone #28 那 js 写的和 go 像,就能用 js 评价 go 。逻辑通吗?
weiwenhao
187 天前
typescript 编译器的主要功能就是编译为 javascript 吧。相当于是文本转换的功能,用 python 写都无可厚非,也就是编译速度快慢。

不太了解 c# 的跨平台交叉怎么样,是否方便,选择 golang 一般是看重了 golang 的 auto gc(对于编译器这种一次性应用,内存没啥用), 超级方便且独立跨平台编译特性(不需要 llvm),语法也足够简单, 现在 golang 的现在的运行速度也足够优秀,即使是 cpu 密集应用,性能上不会比 rust 逊色多少。

当然我觉得如果 rust 重构应该会带来更加极致的 ts 编译为 js 的编译器速度。
DrakeXiang
187 天前
原贴说得挺明白了,https://github.com/microsoft/typescript-go/discussions/410 这个贴也说明了为什么是移植不是重写,简单来说就是 go 和现有的代码最像,能 1:1 移植,能减少产生出的新问题,甚至要保留现有代码的 quirks 以实现最大的兼容性,同时还能在后续同时维护的时候两边都能快速修改
levelworm
187 天前
感觉 js/ts 成为世界上应用最广泛的语言之一,也是命运。说实话完全不喜欢前端开发。
lesismal
187 天前
> 选择的核心不在于 Go 有多优秀,而是契合度,在同等性能的这个梯队中,没有比 Go 更合适的了。tier2 的性能 + 简洁的并发设施 + 带 GC 的类 C 语法 + tier1 的交叉编译能力,从这几个维度去考虑 Go 的契合度就是第一的,这是从工程角度去衡量,而不是语言设计。

@sagaxu #62

优点的列举我都赞同,唯独第一句 “选择的核心不在于 Go 有多优秀” 我是不赞同的。
Go 的各方面设计是在工程实践上取舍出来的非常平衡的,如果因为某个方面不是最佳,或者其他语言也有,所以 Go 就不够优秀,那语言是否优秀就只能看某一方面了,比如说性能或者语法糖。

看看这些点:性能好又带 gc ,跨平台交叉编译,简洁的并发设施,类 C 语法的简洁,不用处处搞 Class 、简单的东西不用搞复杂的设计、开发效率。。。
每个点,都能淘汰掉一些或者一类其他语言,这些点又都是工程实践里非常给力的点,这些点都能满足的,几乎也就 Go 了,如果满足了这么多看上去不突出的优点,加起来却还是不够优秀,我真不知道什么叫优秀。
加上 TS 编译器 port 这个 case 叠加 Go 与团队原来使用 JS 方式相像叠加优势,Go 在这次选型中更加优秀,但这个更加优秀是以 Go 本身优秀为基础的。

对 Go 或者编程语言的评价,其他帖子或者楼层也有好多人是类似的说法,我看到的现象大概是:只要某些方面不是最好,那就不够优秀。
我们经常会谈论到木桶理论,谈论到解决短板瓶颈,为啥谈到语言优秀的时候又不这样认为了?
Go 在工程性、性能、开发效率等各个方面做到了很好的平衡,Go 让木桶每根板子都不算短,为了让每根板子都不成为短板、所以也没在每个方面都成为最长的板子、因为鱼和熊掌不可能兼得、做不到所有板子都最长。
但就这么一个板子均衡的木桶,却不优秀!
能非常好的满足工程需要的均衡木桶型的工具,却不优秀!
这是什么优秀论?!这是过于苛刻的极端的评价方法,是脱离了实际的评价方法

正是因为很多人觉得 Go 每个点都不是”最突出“或者其他语言也有,所以才会有很多人不屑地觉得“Go 不够优秀”或者”Go 也就那样“。
以至于一些人看到官方那个 issue 里提到的主要是因为 Go 和原来 JS 代码比较像所以用这个作为主要原因,比如 @stimw #6 里贴的 issue 。
但正如我前面说的:
”要说像那还是 TS 自己跟自己最"像"、本来就是自举何必要换语言重写呢?“

用 Go 也好,用其他语言也好,前提是:这个选型的语言能够满足提高性能和体验的需求。
选 Go 的前提是 Go 本身已经有了足够优秀的基础,而不只是因为它比其他语言更像团队之前对 JS 的使用、但 Go 不够优秀。


同样回复几位:
@stimw #6
@Nugine0 #54
@DrakeXiang #66
@InkStone 前面提过我没说出 Go 任何优点,我没说是因为采访贴里已经列出来了很多,我没必要去一一重复,我反驳是因为这么多人都认为 Go 只是因为像、而对 Go 本身的这些优点的前置条件视而不见
hguangzhen
187 天前
dotnet 从业者,看到新闻天都塌了。 准备转 go 了
qxmqh
187 天前
@hguangzhen 转吧,go 绝对是未来的王者。现在已经稳稳在前十了,未来前五大有希望。
jiazhoulvke
187 天前
C#布道者:臣等正欲死战,陛下何故先降?
ikaros
187 天前
@leokun 有源地址吗?围观一下
sagaxu
187 天前
@lesismal 68# 优秀不是一枝独秀,如果这次不是移植,是彻底重写或者给新语言写编译器,我觉得未必会选 Go 。前端工具生态圈,选择 Rust 的也相当多,例如 swc/oxc/rspack/rolldown/parcel 2 。
laminux29
187 天前
C# 是我用过最强的语言,超越 C 、C++、Java 、PHP 、js 、Python 。它能同时拥有 C 、C++ 的强类型与 js 、Python 的弱类型,性能也很好。

但 C# 因为强绑定了 Windows ,早期不开源,导致错失了发展机会。
qxmqh
187 天前
早在 1998 年法国世界杯的主题曲《 The Cup of Life 》中就决定 go 的地位了,Go Go Go! Ole Ole Ole!
Nugine0
187 天前
@lesismal #68
所谓 Go 是优秀还是平庸,一般是从语言设计的角度衡量。而 Go 在语言特性上有意取舍,有人称之为简洁,有人称之为简陋,可以找到大量相关评价,甚至长年累月的“语言战”。
Go 并不完美,在语言特性和工程实践上也有不少坑。隔壁刚好有人提问 https://v2ex.com/t/1117750 ,作为一个新鲜例子。

引用官方回复
> No single language is perfect for every task
TS 团队官方的意思也是以契合度为主要原因,前面提的优点是契合度的论据。换一个任务场景就不一定是优点了,例如不可能拿 Go 去重写 LLVM 。而且 Go 的进程内 JS 互操作性和 WASM 支持也是很多人提出的疑问。

提契合度不等于忽视优点,而是划分决定性因素和非决定性因素。不然人家 C# 用户要问了,C# 也很优秀,为什么不选自家产品?

最后叠甲,以上仅为个人对此事的看法,不代表任何选型意见,无意冒犯任何人。
lesismal
187 天前
@sagaxu @Nugine0 #73 #76

你门说的我是理解的,我也从来没说 Go 一枝独秀,因为除了 go 和 chan 和简洁,Go 的性能肯定是达不到第一梯队的,Go 对我而言、最重要的是各方面的平衡。
你的评价是相对客观的,但仍缺少一种对普通优秀的认同。这种缺少,会让其他那些不屑甚至贬低的 Go 的人拿去发扬光大,在这些人眼里去看你门客观评价的这种“不是 Go 多优秀”,就会变成了 Go 不优秀。

优秀不需要就是最好,更不需要每个方面都是最好,如果不是最好就不优秀、那就只有每个 Top1 才能作为优秀了,我觉得这是不合理的。
而且话说回来,从平衡的这个角度,Go 已经差不多是做的最好了。
在否定了 Go 优秀的前提下,以 port 这个 case 为主要原因、对 Go 的评论就显得不够客观了。

各位再去品一品这些评论给大家带来的是什么印象?
给我的感觉就是:
TS 小姐姐男友 x 能力不行,要换人:
ABC 因为 xx 方面不行被淘汰了,EF 因为 yy 方面不行被淘汰了;
剩下 G ,各方面都还凑合,但是他会的其他几个也分别有人会、他有的其他几个也分别有人有;
并且某些方面别人比他强,比如有的 x 能力比他强,有的打扮花哨比 G 更加帅气姿势多骚气逼人;
所以,其他人都因为某个或者某些方面不行被淘汰了,只能无奈选了 G ,有个好处就是 TS 小姐姐还是喜欢现任的颜值、G 跟现任很像;
但是呢,虽然选了 G ,但是 G 你资质平庸甚至长的简陋有点丑、你根本就不优秀,选你但还是看不上你,要不是其他人都不行谁 tm 选你啊;
能被选上,G 你就自己偷着乐去吧!

很多人对 Go ,就像是见不得别人好,绝不会夸它的,甚至要不屑、贬低,加之各位这种自认为客观评价的措辞、他们会借来变本加厉。
太多人嘲讽 Go 的 err 处理,太多人嘲讽 Go 的大道至简了,太多人嘲讽 Go 的粗鄙简陋缺少高级特性了。。。
但这些人里:
多数也没搞懂异常和错误本身就是两码事,用一些其他语言抛异常搞定天下去套所有语言,连入乡随俗的道理和鲁棒性都忘记了,就像是校霸来了学校、鬼子进了村一样蛮横;
多数也没搞懂什么是大道至简什么是 less is more ,只自顾自兴致勃勃爬上屎山也拉个够;
就像他们习惯使用的其他语法糖丰富的语言是奢侈品名车名表名牌包包一样,用了这些高级货让他们走在人群中都会闪闪发光一样,但凡用 Go 就是 LowB 村夫。。。

我也不是要去大夸特夸说 Go 多么多么比其他语言优秀,但是我发现了,越来越多的人在嘲讽 go 的大道至简嘲讽语法简陋嘲讽增加鲁棒性的错误处理用其他语言的习惯去要求 go 要有这个要有那个,或者像很多人看似客观地评论 go 是平庸的并不是很优秀。
这些看上去有道理的话,让越来越多的不懂得独立思考的缺乏正确评价标准的人们脱离了工程哲学,去追求很多华而不实的东西。
当然,搬砖做业务,用很多语言都可以搞定都可以拿工资挣钱养家糊口甚至发财飞黄腾达,但这些不合理的评价方式,把好和不好的舆论带偏了,舆论偏了、但是好和不好的实质却不会变。
可以有很多人继续这些不承认 Go 的优秀、看不上甚至贬低嘲讽 Go ,但也应该有我们这些所谓的 Go 邪教信徒的仗义执言为 Go 说说公道话,况且,谁是邪教信徒不是张嘴闭嘴说别人邪教的人决定的,真理掌握在少数人手中是常有的事。

> 提契合度不等于忽视优点,而是划分决定性因素和非决定性因素。不然人家 C# 用户要问了,C# 也很优秀,为什么不选自家产品?

@Nugine0 这点我是理解的,我也知道契合度是最重要原因之一,但是这些对契合度的“客观评价”,例如“选 Go 不是因为 Go 多优秀”、“是为了 port 、选 Go 是因为 Go 和原来的代码像”这些措辞方式,几乎都会给其他人带来一种 Go 不优秀的错觉。
如果是我,我可能会说:首先,Go 在几个方面都比较优秀、都能够达到这个选型的要求,并且在此基础之上,相比于其他语言 Go 是契合度最高的。
lesismal
187 天前
@sagaxu @Nugine0 #77 如果是重写不是 port ,那我肯定是推 Rust 的,因为最大目标是提升性能和对应的体验,Go 性能这点就可以被第一轮淘汰了
lesismal
187 天前
1. 性能很好,但是:性能不是 Top ,所以不是它优秀;
2. native 并且带 gc ,既有性能又不需要为内存管理太操心,但是:其他一些语言虽然没有 gc 但也是 native ,其他一些语言 3. 虽然不是 native 但是也有 gc ,所以不是它优秀;
4. 跨平台支持够好,但是:其他语言虽然性能可能不那么好而且字节码,但也有跨平台够好的,所以它不是优秀;
5. 语法简洁特性少,很明显:缺少高级特性,不够现代化,“大道至简”就是笑话,所以它不是优秀;
最方便易用的并发,但是:其他语言也有并发,虽然用起来麻烦点或者性能不够好,但反正别的语言也有,所以它不优秀;
。。。

我真想知道,什么才能被称为优秀。
june4
187 天前
很正常合理的选择,要不是作者本身是 c# 作者,rust/go 里选一个本来毫无波澜是大家默认的选择,基本没人会考虑 c#。
只能说 c# 不是全能,不但语言设计臃肿 还带个同样臃肿的 .net 运行时,只能和 java 类比了。

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

https://www.v2ex.com/t/1117872

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

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

© 2021 V2EX