软件设计之美
郑晔
开源项目 Moco 作者
19890 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
软件设计之美
15
15
1.0x
00:00/00:00
登录|注册

10 | 语言的实现:运行时,软件设计的地基

分享利用运行时交互接口实现的程序库特性
运行时是设计的地基,不受限于语言
运行时提供的接口可以实现语言层面不支持的能力
运行时的回调方法
字节码操作
动态代理
运行时类型识别的能力
内存管理机制(GC)
字节码的执行
指令的执行方式
JVM的内存布局
JVM类加载器的工作
可执行文件的结构
运行时的理解可以做出语言本身不支持的设计
思考题
总结
运行时与语言的互相配合
运行时的编程接口
程序如何运行
运行时是软件设计的地基
程序设计语言的实现:运行时

该思维导图由 AI 生成,仅供参考

你好!我是郑晔。
通过前两讲的学习,相信你已经对程序设计语言有了全新的认识。我们知道了,在学习不同的程序设计语言时,可以相互借鉴优秀的设计。但是要借鉴,除了模型和接口,还应该有实现。所以,这一讲,我们就来谈谈程序设计语言的实现。
程序设计语言的实现就是支撑程序运行的部分:运行时,也有人称之为运行时系统,或运行时环境,它主要是为了实现程序设计语言的执行模型。
相比于语法和程序库,我们在学习语言的过程中,对运行时的关注较少。因为不理解语言的实现依然不影响我们写程序,那我们为什么还要学习运行时呢?
因为运行时,是我们做软件设计的地基。你可能会问,软件设计的地基不应该是程序设计语言本身吗?并不是,一些比较基础的设计,仅仅了解到语言这个层面是不够的。
我用个例子来进行说明,我曾经参与过一个开源项目:在 JVM 上运行 Ruby。这种行为肯定不是 Java 语言支持的,为了让 Ruby 能够运行在 JVM 上,我们将 Ruby 的代码编译成了 Java 的字节码,而字节码就属于运行时的一部分。
你看,做设计真正的地基,并不是程序设计语言,而是运行时,有了对于运行时的理解,我们甚至可以做出语言本身不支持的设计而且理解了运行时,我们可以成为一个更好的程序员,真正做到对自己编写的代码了如指掌。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

程序设计语言的实现是关键的一部分,也称为运行时系统或运行时环境。了解运行时对于软件设计至关重要,因为它是软件设计的基础。通过对运行时的理解,我们可以做出语言本身不支持的设计,成为更好的程序员。本文以JVM为例,介绍了程序如何运行以及运行时的编程接口。通过了解指令的执行方式和字节码,我们可以创造出一些语言层面没有提供的能力,甚至在静态语言上实现动态语言的效果。运行时和语言互相配合,对方法查找机制的了解可以帮助我们实现更好的设计。文章强调了学习运行时的重要性,以及如何将设计构建在运行时之上。总之,了解运行时是设计优秀软件的关键,它为我们提供了更多的设计空间和灵活性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《软件设计之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • Jxin
    1.在web flux出来之前,java的web开发大多都是基于servlet的。可以认为servlet容器是java web项目的运行时环境。servlet 3.0的"ServletContext"(通过编程方式配置servlet,filter,listener而不依赖web.xml)和"运行时插拔”两大特性(两个特性前后关联),相当于以编程库的方式提供了运行时容器的服务增减的能力。这也是spring 3.X后spring web自动装配的实现基础。 2.spring基本是java后端开发的实时标准,如果以spring为运行时环境(ioc容器+依赖注入以及其他功能),那么其以约定和编码库提供的运行时编程的接口就实在挺多了。 3.按本篇自己的理解,运行时不限于语言级别。固有以上推断。

    作者回复: 你这个理解的角度很有趣,非常好的补充!

    2020-06-15
    16
  • 西西弗与卡夫卡
    我们自己的分布式日志收集系统就使用了运行时字节码生成技术,这样既对业务应用没有任何影响(性能上微乎其微),又能根据抓取的日志分析服务调用链、异常等有用的信息

    作者回复: 你做的事情与APM有相似的地方。

    2020-06-15
    16
  • 业余爱好者
    学习一门语言,从模型开始。 设计一门语言,以运行时为地基。 按照时间顺序的发展是:高手把运行时抽象为简化的模型,供小白入门。小白想进阶的话,还是要深入到运行时的实现细节中去。

    作者回复: 想深入,就要到细节中去。

    2020-07-11
    8
  • 阳仔
    运行时是程序语言设计中的地基 理解运行时可以深入理解程序语言是如何加载,执行的,这能让我们对语言添加一些原本不支持的功能 对于JAVA语言就是要了解jvm执行的机制, 它包括加载字节码,解析,内存管理,线程调度等等方面 这些跟操作系统的很多知识其实是相通的,因此需要把各种知识在头脑建立连接,达到知识的迁移的效果,提高学习的效率

    作者回复: 很好的总结!

    2020-06-15
    7
  • 佟宏元
    突然打卡新思路,运行时是一个语言的核心基础,程序设计语言却是一种表现,掌握运行时,我们就可以开辟新的语言设计。

    作者回复: 是这么理解的。

    2020-11-20
    5
  • 老师,C和C++不是直接编译成操作系统可执行文件吗?没有运行时这一说吧。不是太理解文中提及的C语言运行时

    作者回复: 首先,推荐去读一本书,《程序员的自我修养》https://book.douban.com/subject/3652388/ 这是一本好书,只是名字起得不太好。 C 和 C++都有运行时支持,不然,C++的虚拟函数是怎么实现的。不同的是,C/C++的运行时是以库的形式存在,最终与你的代码生成到一个可执行文件中,而不像 Java 是以一个可执行的 JVM 形式存在。

    2020-07-08
    3
    4
  • 林铭铭
    之前老觉得性能优化才需要理解运行时,现在才发现设计也需要理解运行时。

    作者回复: 想要做好的话,就需要掌握更多的知识。

    2021-04-23
    1
  • 读第三遍了,真心觉得老师这个专栏真是一个大宝藏,每次都有不同收获

    作者回复: 还可以分享给更多小伙伴!

    2020-10-20
    1
  • Janenesome
    郑老师的文章信息量好大,感觉每个点细究下去的话都能形成一个新的专栏。

    作者回复: 面覆盖到了,细节可以慢慢补充。

    2020-10-19
    1
  • 术子米德
    🤔☕️🤔☕️🤔 【R】运行时环境 = 程序设计语言的执行模型 = 软件设计的地基。 【.I.】起手写个热身代码,就来个“Hello XYZ”,一写、一编、一跑,再瞄一眼,输出符合预期,可以。这么流畅的过程,会忘记去关注,写的时候敲入的文本,编的时候转换成的二进制,跑的时候所在的系统环境,这之间哪些是显性的编程语言特征、哪些又是隐性的部分。而编程语言的运行时,就是容易被忽视的关键隐者。以至于刚开始做嵌入式,愣是不明白交叉编译、目标运行的原理到底是什么,只是觉得特别神奇,神奇到难以解释的略显神秘感,实际上却是编程语言运行时能够解释这一切神奇性。 当解开这种运行时环境的神奇性之后,就不会再尴尬去面对,在编写“Hello XYZ”时,如果“X=C”、“Y=JAVA”、“Z=Python”时,都是在控制台输出这么问好话语,居然会拖泥带水引入如此之多的七大姑八大姨还有十六兄三十二妹。 运行时的典型特点,就是它在帮助我的时候,我浑然不知,就像公司里用电用网自然而然,但是当断网断水的时候,我除了叽里咕噜抱怨几句,却拿不出啥招式来解决遇到的问题。运行时已经让我享受到很多恩惠,却没有来想我索要感谢的透明又极其重要的存在。如果说编程语言的语法像公司的各种规章制度,那么编程语言的运行时,就是公司里让这些制度实施的人和物。 【Q】如何设计一个C语言运行时环境的课程,同时达到讲得明白、上手操练、深入理解、拓展开去的效果? ---- by 术子米德@2023年10月9日
    2023-10-09归属地:浙江
    2
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部