关于创建新的编程语言时,基于旧语言,如果旧语言的性能不好,是不是新语言的性能也一定不会好?

2020-12-08 21:34:23 +08:00
 find456789

我的理解是这样的:

假如我基于 python,开发一门新语言,假设就叫 bb 语言

首先 bb 语言的打印字符串的代码如下:


打印 bb("你好")  # 这是 bb 语言的打印语句,类似 python 的 print

由于我是基于 python 创造 bb 语言的,所以,我用 python 代码 针对 上述的 文本内容( bb 源代码),进行处理(词法分析、语法分析), 然后 python 代码里,捕捉到了 词法 打印 bb 以及 你好

python 代码就可以知道,是要打印一段文本, 然后就调用 python 的print,并把 你好 传给print

就这样, 完成了 基于 python 创造一门新语言 bb (目前只支持一个语法,即 打印 bb)

我理解的其他语言,比如:
java 基于 c ( java 的printf本质是调用 c 的printf),
cpython 基于 c ( cpython 的print本质是调用 c 的printf) ,

所以,如果我基于 python 创造了 bb 语言,那么 bb 语言的 打印 bb 本质就是调用 python 的print

不知道我的理解对不对


如果 我的以上理解是正确的, 那么,假如 python 的print性能很差,那么是否 bb 语言的 打印 bb 也一定会很差?

如果以上假设成立,那么 假如 在我的 bb 语言里,我给打印 bb这个方法加了更多额外处理流程,比如,在执行 打印 bb的时候,还检测了网络,还读取了 xx 信息,总之 要 10 秒才能打印出内容

那么,某一天,有人基于 bb 语言,创造了 cc 语言,cc 语言的 打印 cc 基于 bb 语言的 打印 bb,那么,cc 语言的 打印 cc被调用后,也会有 10 秒多的延迟吧? 也会检测网络,读取 xx 信息 对吧?

那么,那些基于 c 的语言,如 java 、cpython,是怎么确保 基于 c 语言开发时,不会被 c 语言自身的私货(即 bb 语言里的 检测网络,读取 xx 信息 ) 影响了性能呢?

那么在这种情况下, 自举 还能提高性能吗? 不就变成了 套娃了吗? 最开始的娃很卡(如 bb 语言的打印 bb), 以后套上的娃 性能肯定不会超过最初的娃吧

有人基于 bb 语言,创造了 cc 语言,并且在 打印 cc 还加了自己的处理流程, 打印 cc 的延迟成功的增长到了 20 秒, 后来 又有人 基于 cc 语言创造了 dd 语言, ..... ... 直到 zz 语言,这时候 打印 zz 的 延迟很高很高了吧?

套娃,越来越卡,各种历史包袱, 导致更卡了

我的理解对吗

跪求各位前辈指点

谢谢

2304 次点击
所在节点    问与答
24 条回复
ysc3839
2020-12-08 21:42:32 +08:00
> 那么 bb 语言的 打印 bb 本质就是调用 python 的 print
这句话作为前提的情况下,bb 语言性能是会更差的。

但是这句话不能作为结论,bb 语言完全可以不用 Python 的 print 。

比如 Python 允许你直接调用系统 API,那你完全可以直接用最底层的 API,不用 Python 的 print 。
BoarBoar
2020-12-08 21:46:18 +08:00
什么叫基于 xx 语言创建一门语言啊。。
java 和 python 也不是基于 C 创建的,只不过是用 C 写的编译器
不管啥语言都会被编译器翻译成二进制机器语言,计算机也只认识机器语言
你理解的那种 cc 先翻译成 bb 再翻译成 aa 的,只有中文编程的骄傲易语言
cmostuor
2020-12-08 21:49:23 +08:00
@BoarBoar 这还真是 早期版本的易语言是会把中文写的代码翻译成英文然后编译
ysc3839
2020-12-08 22:48:41 +08:00
@BoarBoar
> 不管啥语言都会被编译器翻译成二进制机器语言
不一定的,比如 Python 就是解释执行的,不会生成机器代码。

@cmostuor 没记错的话易语言一开始就是自己实现的编译器,不依赖其他语言的编译器。
msg7086
2020-12-08 23:06:11 +08:00
@BoarBoar @cmostuor @ysc3839
易语言我记得一开始是解释执行,后来 3.0 的时候全部本地编译了,只依赖运行时,不需要解释器。
二十年前的事情了,如果有记错的话请纠正。

@find456789
新语言不需要基于某种语言。
Java 的 printf 并不一定要调用 C 的 printf,你也可以用 Java 自己实现。
C 的 printf 也不一定要是 C 写的,你完全可以汇编,或者别的语言来写(比如 Rust 或者 Go )。

归根结底,CPU 执行的是机器码,你运行的程序最终都是机器码。
只要一段机器码能实现相关的功能,用任何语言去写都是一样的。
语言只是书写工具,是让你方便地写出最终能编译成机器码的东西。
比如说计算两个整数的和,最终都是回到 ADD 指令,那么「 1 加 2 」完全可以直接编译成 MOV ax, 1; ADD ax, 2 而不是去调用 Python 的加法函数。
beidounanxizi
2020-12-08 23:16:31 +08:00
你的理解真的很民科啊 语言又不是左右性能的因素 🐶
Kininaru
2020-12-08 23:21:48 +08:00
你知不知道有的 C 编译器里面有 Python 组件。。。如果你高兴的话,也可以用 Java 写一个 C 编译器,只要算法相同,编译出来的东西是完全一样的,执行速度也一样,唯一不同的就是编译耗时
namaketa
2020-12-08 23:22:36 +08:00
新语言( x )
DSL (√)
你想的很对,所以一般高级语言不会用另一个高级语言做中间码,而是到更加低级的 C 或者机器码。
编译器套编译器,虚拟机套虚拟机这种事还是比较蠢的。
效率还不是主要问题...而是 debug 可能会让你崩溃。
si
2020-12-08 23:28:51 +08:00
@msg7086 确实是,易语言刚开始是解释执行的,后面的版本才编译成机器码的。不过生成的机器码质量比较差,基本没有优化,而且数值运算都是基于浮点数的。
msg7086 已经说得很清楚了,用什么语言实现并不影响目标语言的程序性能。关键看你的语言的编译器生成的是什么。
python 可以读写二进制文件,即使你用 python 写编译器,这个编译器也可以直接生成机器码。
python 的性能只影响编译器的性能,可能编译时间会比较久一点。编译出来的目标程序性能怎么样要看你写的编译器生成的程序质量怎么样。
如果你的编译器是生成 python 代码,目标程序要在 python 上执行,就会受到 python 的影响。
如果你的编译器直接生成 c 代码,那就要在调用 c 编译器编译成可执行文件,就会受到 c 编译器的影响。
如果你的编译器直接生成机器代码,输出可执行文件,那就看你的编译器生成的结果怎么样,其他语言不会影响程序性能。
misaka19000
2020-12-08 23:34:53 +08:00
太民科了。。。

语言分为 runtime 和编译器,你所理解的应该是 runtime
shroxd
2020-12-08 23:55:41 +08:00
@BoarBoar 老哥你忘了 TypeScript
muzuiget
2020-12-09 00:27:34 +08:00
确实民科了,根本就没有关系。JS 都有 N 个语言实现,所谓解释执行并不是真的一行一行边读边解析,而是先解析生成字节码,然后再对字节码运行。
find456789
2020-12-09 00:28:41 +08:00
@ysc3839
@BoarBoar
@cmostuor
@ysc3839
@msg7086
@beidounanxizi
@Kininaru
@namaketa
@si
@misaka19000
@shroxd

谢谢大家, 我刚才看了很多资料, 我感觉我上面的描述,应该是指解释器, 我现在利用 antlr 实现了一个 bb 语言的雏形, 可以通过 在 shell 执行 ./bb_lang a.bb 来执行 a.bb 里的代码

bb_lang 的代码如下:
![image.png]( https://i.loli.net/2020/12/09/T2cMLUBWvNJtoRX.png)


a.bb 的代码:
![image.png]( https://i.loli.net/2020/12/09/gIcQY8lnGTUh5WE.png)

visitror.py 核心代码:

![image.png]( https://i.loli.net/2020/12/09/bil9vtOsqU71Jrw.png)

在这里面,我的 方法 `打印` 就是直接调用 python 的 print

加, 就是直接调用 python 的 加法运算符
减 也类似

所以在发帖的时候,我才会觉得,基于另外一个语言来开发新语言,就类似套娃




所以我现在还是有些糊涂,我可能需要再看一些书
msg7086
2020-12-09 00:30:45 +08:00
@find456789 DSL 或者解释运行的代码,的确如你所说,是会变慢的。
慢是慢在解释运行,而不是语言。

语言甚至都没有速度,因为语言只是一些语法文法规则而已。
怎么把这些语法文法跑起来,不同的跑法速度是不同的。
sagaxu
2020-12-09 00:32:11 +08:00
pypy 了解一下?
ipwx
2020-12-09 01:47:38 +08:00
解释型语言也不一定比 native code 慢,因为有 JIT 。

用 Python 写的解释性语言 interpreter 也不一定比 Python 慢,因为有 JIT 。参考 PyPy 。
Cbdy
2020-12-09 08:28:12 +08:00
答案是不一定
12tall
2020-12-09 08:39:11 +08:00
如果你能将 bb 翻译为机器码,可能比 python 还要快哦
cmostuor
2020-12-09 12:31:23 +08:00
@msg7086 没错 3.0 之前的那会我下载来分析过 分析完了还在社交网络发吐槽 没记错的话
BoarBoar
2020-12-09 17:05:49 +08:00
@ysc3839 我没表达严谨,没说解释型语言的情况。
但是动态语言也一样是由解释器或者 runtime(例如 jvm)动态编译成机器码动态执行,cpu 除了 0101 根本不认识其他东西。

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

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

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

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

© 2021 V2EX