为什么没有类似 TypeScript 这样的 TypePython 语言( Python 超集)呢?

2020-11-17 11:36:19 +08:00
 miniyao
人多发现用 TypeScript 确实规范了很多,增加的成本是可以接受的。

好像没有发现 Python 有类似的超集语言 TypePython 这样的呢?
6941 次点击
所在节点    Python
44 条回复
jatai
2020-11-17 18:10:51 +08:00
随着廖雪峰入职微软, 这个很快就会有了, 不过应该不影响 游标卡尺 热卖现状
nthhdy
2020-11-17 18:56:41 +08:00
有 mypy 啊,正是你想要的
lewinlan
2020-11-17 19:06:40 +08:00
为什么会有 ts ? 因为你不能决定客户端用什么,所以必须兼容 js 。
那么问题来了,为什么在你可以主宰一切的后端,还要委屈自己强行给 python 加类型?
直接静态类型语言吧
人生苦短,少点动态
l1nyanm1ng
2020-11-17 19:09:44 +08:00
@jatai 过分了啊,你甚至不肯称呼廖雪峰大神一声教父(狗头保命
xfcy
2020-11-17 19:26:59 +08:00
Tython 好像听起来也不错
Roxk
2020-11-17 19:32:14 +08:00
@xfcy 中文名:泰森🙊
est
2020-11-17 19:39:29 +08:00
@cmdOptionKana 静态语言的最终归属就是一大堆 XML 来实现动态特性。

哦不对,YAML 。。。
AX5N
2020-11-17 19:57:53 +08:00
python 这个所谓的 typing 丑到掉渣,与其让我这样写,我直接换静态语言算了。
secondwtq
2020-11-17 20:54:54 +08:00
#23 是正解,JS 这语言和政府一样,有天然的垄断性,所以其实很多时候是作为目标语言。但是 JS 从设计之初(如果这破玩意真的有“设计”的话)又是作为编程语言来设计的,所以 JS 有直接的编程语言和间接的目标语言两面(有意思的是,JS 无论作为编程语言,还是作为目标语言,都挺烂的 ...)。
前端圈开始是把 JS 作为编程语言来用,后来发掘出了目标语言的潜力,这才有了各种 source-to-source transformer,后来又有了各路 Script 。TypeScript 作为各路 Script 中的一个实例,虽然以兼容 JS 为核心设计理念,在作为“JS 的‘超集’的同时”依然可以理解为“以 JS 为目标语言的船新的编程语言”(忒修斯:阿嚏!)

如果把目标定在 JS 上的话,那 Babel 则是一个静态的 Rosetta,Reason 相当于 ocamlopt,TypeScript 类似 C 语言。在 naive 领域,目标语言是具体 ISA 的机器码,CPython 实际上是“用 C 实现的一个脚本语言解释器”,从目标语言的角度来看已经可以和 TypeScript 有一定的可比性,所以说 CPython 汁己就已经是 TypeScript 了,同时还有对等的 Ruby 、Perl 和一些无 JIT 的 Scheme 实现等。( CPython 放在 JS 上应该是“用 JS 实现的一个脚本语言解释器”——因为 JS 作为目标实在是太慢了,所以除了练手项目之外很少见,可以说前端在应用层“AOT 编译"占绝对主导)

和 JS 有类似情况的语言其实不少,C 是最接近的之一,有很多 C 的”超集“,以及一些和 C 完全不同的编程语言是编译到 C 的,同时 C 也广泛作为通用编程语言使用。还有 JVM Bytecode/MSIL/LLVM IR 等,不过这些语言本身设计就是目标语言 /中间语言,并不能作为编程语言。
Death
2020-11-17 21:18:17 +08:00
@laike9m
可惜 Reason 没有流行起来,就个人的体验而言,Reason 的 type system 感觉比 TypeScript 好多了。
namelosw
2020-11-17 22:42:10 +08:00
@laike9m Compatible 的, 怎么可能割裂
namelosw
2020-11-17 22:43:31 +08:00
@Death Hindley-Milner 从七十年代就已经成型了, 主要还是人们不思进取, 看见跟 C 不像的语言就敬而远之
namelosw
2020-11-17 22:48:10 +08:00
@cmdOptionKana 这两个不矛盾, 最终还可以有静态类型的 LISP, 已经有很多了, 其实 TypeScript 抄的就是 Typed Racket. 然后还有比如 Lux Lang 这种 ML module + Haskell type system + LISP syntax 的新语言.

长远来讲肯定是静态语言更强, 前提是表现力足够强, 允许人们表达绝大多数能想到的程序. 像 Java C#这种抠脚的类型系统很多代码写不出来. 像 Haskell 都有很多程序写不出来, TypeScript 很多时候也不得不用 as any.

最终方向就是 Lambda Cube 全满, 像 Idris 那种 Dependent Type 语言, 不过问题是想写好 IDE 还要等几十年.
dustinth
2020-11-17 22:48:58 +08:00
TypeScript 和 JS 是相辅相成的: JS 的广泛应用给 TypeScript 提供了用户基础, 也是 TypeScript 的在设计上定义为 JS 的超级以及采用类型抹除方案的原因; 反过来, JS 的动态特性以及 JS 的没有静态 Type System 的包袱也为 TypeScript 在 Pratical 的 Type System 上玩到极致提供了基础.
oahebky
2020-11-17 23:30:16 +08:00
其实你要的“编译”功能,不是“类型声明”。

然后这个“编译”其实就是 “一键报‘低级’错误” !


其实其它编译型语言,写到“抽象”级别,类型声明一样没有啥帮助,错的跑起来 bug 的地方一样错,一样崩溃;一样在写代码的时候发现不了。


======

当然,有编程语言本身带“编译报错”功能和不带编译报错功能是有区别的。
learningman
2020-11-18 00:12:14 +08:00
@xiaolinjia 我学 Python 的时候,这玩意儿就已经是标准了
SingeeKing
2020-11-18 00:24:28 +08:00
其实楼主要的就是 Pydantic 吧,参数类型不对直接报错,typing hint 最多算是强大一点的注释,运行时并不起作用

另外,CPython 是 Python 的 C 实现,Cython 才是一种基于 C+Python 多东东,上面说的很多这个人概念是模糊的
laike9m
2020-11-18 08:31:29 +08:00
@namelosw 举几个例子。
- js 里的 map 类型,ts 里就没有,因为 map 是后来加的。最接近的只能用 record,但也有一些问题
https://stackoverflow.com/a/30019750
- protobuf + grpc 的代码生成。grpc-js 至今无法依赖官方工具生成 ts binding,只能依靠第三方库
- 各种各样的库都没有 ts 版本,或者有了也没有很好的支持

这些问题我相信只要你写了一定量的代码都会遇到,并且在一个社区要支持两种语言的情况下是必然出现的。
laike9m
2020-11-18 08:36:23 +08:00
@SingeeKing 用静态语言不就是想在编译期检查出错误么,而不是放在运行时才报错么
myCupOfTea
2020-11-18 08:50:19 +08:00
typing hint 简单用用还行,其实还是有点鸡肋

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

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

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

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

© 2021 V2EX