刘晓义(00:00:10): 拉一布。每次我还得把 Dream Key 再给弄出来。 刘晓义(00:05:28): 我做频道播到我自己的频道上去,我看了半天,为什么通栏的上面没有视频?太怪了。看看。Ok 连接状况极佳,那可以开始。Ok 那我再 check 一下线上都可以听到了。 贺泽邦(00:06:00): Ok 我这边可以。 刘晓义(00:06:02): 老师那我就来介绍一下今天。 犬戎(00:06:03): 可以的。 刘晓义(00:06:05): 就今天这个活动,今天活动是我们出纳,每年会参加一次专业软件之下就是中科院那边主办,然后。会有一些企业打钱,有点像 google summer code 里面的一个活动,我们会有一堆。同学怎么?再补充一下。 刘晓义(00:06:34): 稍等,那我看一看是我们弄错教室了还是怎么回事,我看邮件好像没有弄错教室对,但是因为邮件是我发的,所以有可能我弄错了教室。所有人都能做的教室。看一下。19周周六1103?对那您这边再确认一下,那我们这边就。那我就开始继续的吧! 刘晓义(00:07:08): 没事。今天这个活动就是刚刚说那个大家不太熟的话,是面向高中生和本科生,一般来说是。Google 打钱应该叫 google 三,不是 google 打钱会邀请一些开源的社区,然后让大家去帮忙贡献代码,然后会有导师带着去做,所以这是国内版本的 GSOC,然后基本上也是相同类似的一个形式,然后我们是一般每年会以社区身份去参加 GSOC 今年我们有两个项目。一个项目?项目是我们之前有。有一个叫就是有一个那样的项目,然后那个那样的项目是做的是。很久之前的一次 GSOC 是不是 GSOC 很久之前的一次 OCD 做的是相当于 UBT 的一个,相当于我们自己做了一个 UBT 的。一个硬件,在那之后事实上,当时的 GSOC 的导师,导航老师,然后又组织了很多次相似,也围绕话题的也是那个 YCP,然后今年也是导航老师的一个项目是跨平台的外部奥森要管理器,相当于是我们对外部奥森的设备在。 犬戎(00:08:12): But it. Thank you. 刘晓义(00:08:36): 在各个平台上,相当于用 flash 做的密钥管理器。还有另一个是今天。在场的 C UI?同学,然后他作为导师去。他作为导师去主导的是 GC Fortune 的一个 function motivation 功能的实现。我们。然后很荣幸的是这两个项目我们获得了两个非常有,相当于有才能的同学的支持,然后跨平台的外部管理器是由杜慧宇同学进行了实现,然后是由贺泽邦同学进行了实现,然后都顺利的结项了,然后。跟大家庆祝一下这项。 刘晓义(00:09:27): 这里,然后。一切 ok。那我们今天是邀请到了朱同学和贺同学去帮我们分享一下他们这次 OS P 相当于他们的成果和心得,我们。就邀请两位同学来共享屏幕吧,那要不然朱同学你先。 犬戎(00:09:49): 好的稍等一下。 刘晓义(00:09:49): 诶对视频摄像头打不开? 刘晓义(00:09:59): 就比现场看。 犬戎(00:10:00): 听得到吗? 刘晓义(00:10:03): 对非通道,但是新 ok。 犬戎(00:10:03): 我马上可以共享。 刘晓义(00:10:05): 我们把山,也就是五这里。 犬戎(00:10:08): 那还行吧。 刘晓义(00:10:09): 好的。 犬戎(00:10:12): 今天是2025年11月15日,我是朱柯宇的。一般会用犬戎网名。这个暑假很荣幸能够参加开源软件供应链点亮计划暑期2025,也就是 OS PP 2025所很荣幸能够参与到这边的项目来。我的项目是 web 三密钥管理器。 犬戎(00:10:48): 今天由我来给大家分享一下我的项目成果。我会主要。讲以下三个部分,第一是项目背景,第二是项目成果,第三总结。首先我自我介绍一下。我来自。我是朱柯宇,犬戎是我常用的网名,我来自浙江大学24级计算机科学与技术专业,同时也是浙江大学 AAA 战队 S。浙江大学的 CTF 战队的成员。 犬戎(00:11:29): 我在今天的五点钟。四点钟刚考完大物。大学物理五点钟。整完一些事情。留给我的准备 tonight 的时间。看看两个小时。挺赶的。两个小时搓出了。简单介绍该项目的背景首先。我们有新一代的认证方式。它叫做通行钥 passkey?它已经在很多网站都投入使用了。也会被称作无密码的未来。 犬戎(00:12:18): 通行密钥它是一种无密码的登录标准,它有 fido 联盟和 W3C。他们共同制定,得到了很大的支持与推动。它无需密码,同时防钓鱼攻击。它也快速便捷。这里是?Passkey 的实体是?我拍一个人。我参加 OS PP 在项目的最初等老师。听那发给我的 can I can。插上去插上你的设备是就能用?甚至大学的统一身份验证,他们有的已经。支持这玩意儿。中科大他们已经做了,但是浙大目前还没有。会不会有我也非常的期待。它在作为无密码认证的未来的同时。巴斯克弗拉特生态。 犬戎(00:13:24): 有一些尴尬,首先是。Final two. 功能不全,它注册验证功能是缺失的,没有实现。第二是这块生态也,它也没有人去做一个跨平台密钥管理工具。我在这个项目中的任务首先就是完善这个库。任务首先是实现注册以及登录这两个流客户端的流程。第二是使用 flutter 来实现一个跨平台的 webos 的密钥管理器。最后做的不止这一点。Yep. 任务是这样的。那么第二个部分是项目成果?在这个项目中,我完成了什么事情?完成了什么工作?首先最后的成果当然就是一个库和应用。一个库。在仓库。为他做了一些贡献。首先实现前面提到的 micro nation 和 get association 的核心协议。还写了一些别的东西。比如说。写了服务端的逻辑 find to see 了服务端对客户端的请求,它怎么去做?pass 怎么样去处理?他的密码学能力扩展。当然还有工程的东西,工程化架构优化重构以及写了很多测试等等。接下来也就简单。 犬戎(00:15:24): 还有。还有应用是?我们是。有点忘了,是陈胜奇老师取的名。好像是。接电话。这名字不是我起的。我也很喜欢名字。还给他画了一个 logo。Github 当然就 push 在了仓库。实现了全功能跨平台应用。 刘晓义(00:15:51): 全国的? 犬戎(00:15:53): 为了实现应用去做了一些。C CI D 与 NFC 的通信。首先补全了这两个操作,写了很多代码。要是实现了它支持。注册生成注册校验验证生成与验证校验。你用的话可以这样去用去。Generates registration options. 爱你。只能发一个奋斗兔色给他配置。接着你可以去处理。直接把客户端发过来的请求 BS 64。放到这里面去你就可以。给处理。用它就是这个东西用的,实现了这样的一个东西。 犬戎(00:17:03): 当然,为了去做它,还有还继续加强了之前的 cos 密码学校验。这个东西是库,本来就有,但是不是很全。自己又加了一些缺陷上去。但是大图这块没空。只能说。真的没库,甚至在自己用 point caster。自己去处理曲线的一些 RS 的参数手写一个密码学校验。虽然大家都说。不要自己实现密码学。这没办法了,逼得没招了。 犬戎(00:17:49): 看起来。也做了一些处理,因为我在 CTI 本来也是。打密码学的?但是去做了一些 OS 校验这些。安全问题上没有什么问题。在 fighter 去之后就。完了,在上完成了一些工作之后,就可以进入到 two K 的开发。 犬戎(00:18:24): 首先是。实现了这样一个全功能的跨屏的应用,使用 flutter 和 material。 犬戎(00:18:31): Provide 状态管理。构建了支持。这么多平台?支持五大平台的统一的应用。应用它是长样子的。写 UI 挺好玩的。为了完成这样的一件事情。做 C CI D 与 NFC 的通信协议的事情。当然你还需要去手动封装一下 APDU 的指令。事情也完成。 犬戎(00:19:15): 这里也就简要介绍一下。在项目开发过程当中,我印象比较深刻的点。大家对更具体的细节感兴趣的话,当然可以去仓库看一看。最后。最后一个部分总结。总结一下。首先,我希望能够总结这段旅程的收获与成长。 犬戎(00:19:46): 首先给我带来的技术成长。有这样一段去熟悉协议。与跨平台开发的一个工程经验。还熟悉了 CI CD。确实开源协作。项目管理与计划。开发自己去。列的一个项目的。去做这样一个项目的经验,对我来说是非常珍贵的。当然要感谢致谢,非常的感谢党凡老师与陈胜奇老师!二位老师的指导!帮助我顺利完成了。该项目的开发也让我。在这段旅途中有了很多收获。 犬戎(00:20:44): 第二是感谢贺泽邦同学。我的同事。OS PP 项目的进行当中。我们。共同。走过来这段旅途。让我不是非常的孤单。我们中途也聊了很多东西。最后是感谢我的朋友贤文,他最初鼓励我。 刘晓义(00:21:09): 感谢我的朋友! 刘晓义(00:21:19): 没有什么没有什么。 犬戎(00:21:19): 说他。是他最初鼓励我参加。最后我最后的最后,我还希望能够感谢自己。我在大一下学期的时候状态非常赖。精神状态非常的美丽!最后在期末考试的时候也是好几门课程60分飘过来。机缘巧合之下,我度过了一个非常充实的暑假。暑假在完成 OS PP 的同时,另外。同时修读了两门比较硬核的短学期课程。所以。我在迷茫当中也见到了很多强大的人,见到了很多优秀的人。在迷茫当中,我也能够逐渐明确自己的志向。在大二上学期,这个学期开始我的状态明显好了很多。也希望我能够。克服之前遇到的迷茫,现在遇到的很多困难。我希望自己能够一直走下去吧! 犬戎(00:22:33): 今天我对 OS PP 我的 OS PP 项目 web of the meal 管理器的分享。就到这里。今天是2025年11月15日,我是犬龙,非常感谢!大家的到来与倾听,谢谢大家! 刘晓义(00:22:53): 谢谢小强同学,这个在场有什么问题?那我问几个问题!首先第一就是关于密码学这件事情,感觉非常 interesting,是因为外包中心有什么特殊就特别特殊的密码学操作,所以没有库是。因为刷的太太灵车了。 犬戎(00:23:15): 不是的,就大尺这块单纯的没有库。我也不知道为什么没有它有,但是没人去做。 刘晓义(00:23:22): 二的问题,只是我的感觉是各个系统里都有各个语言里都有。 犬戎(00:23:30): 是的。没人去做这件事情很奇怪。 刘晓义(00:23:36): 可以立马把这一段代码说出来,作为一个纯大文字,就可以说话。不笑瞎子看泥巴。 犬戎(00:23:43): 是之前想过之前确实想过。 犬戎(00:23:47): 自己去干脆自己去把这个东西给错了,作为一个库发布出去。时间上稍微有一点来不及,所以就暂且就这样。 刘晓义(00:24:01): 我还有一个问题是关于跨平台的事情就是咱们现在是完成的是一个库?还是一个完整的。因为关于跨平台的话。跨平台我个人觉得有一点嘿。就是一个发的框架,比如你说它跨到外部上面,那外部有的时候。很多的 device 上面的东西都是搜不了。这个时候得打适应就是去跑。比如在浏览器里去瞎搞。 犬戎(00:24:31): 他是这样的。首先我最后的成果是首先是完成了之前就有的。清华的各位做的 FALLTRUE 库。 刘晓义(00:24:45): 飞到?对我就比较好奇。 犬戎(00:24:48): 在这之后去做这样一个。可以。 刘晓义(00:24:52): 对我就比较好奇的是,比如说能不能在浏览器里用,是因为 buffer 之前比如说发的 FCP 里面有好多东西是。就是浏览器上是用不了,因为浏览器上用不了,所以浏览器上用不了,是因为浏览器缺的硬件太多了。flash 虽然号称自己是支持的,但是。就比较的灵澈。 犬戎(00:25:14): 是这样。 犬戎(00:25:16): Er. 刘晓义(00:25:20): 然后我也不知道像顾客想怎么搞,你说。那什么 USB 对这件事情,我就觉得郭哥自己都没有把这事整的特别好。 犬戎(00:25:31): 首先这。他跨了外部。所以这个东西它外部少的东西确实很多。这个事情比较麻烦,你需要去。就他们。说是跨平台,你 web 和这些东西之间,它的代码就各自需要写一些代码。也可以看到我最后。也没有做。也没有让他支持 web。 刘晓义(00:26:02): 很好就正确的感觉。 犬戎(00:26:03): 是应用对。 犬戎(00:26:06): 你可以问 mac linux 安卓?Ios 上跑但是 web 不?但是外国还没有写。 刘晓义(00:26:16): 感觉就外部特别难做,都不知道能不能写就缺好多东西感觉。如果要把这事儿做的比较 ok 的话。 刘晓义(00:26:28): 放平。 犬戎(00:26:28): Web 要写 web 的话。 犬戎(00:26:31): 我自己感觉。不如自己去用,更适合写 web 的东西写。东西。比较麻烦。 刘晓义(00:26:47): 感觉安卓也都支持,已经足够跨平台。非常的。安卓 ios 都支持! 刘晓义(00:26:57): 热烈庆祝。那线下的同学还有什么问题?现在桌面它的支持到底。那想请问一下,现在就是桌面端的支持到什么样的一个情况,就感觉像 linux 上感觉,甚至有些他们的 API 什么的感觉都不行的样子。 犬戎(00:27:23): 我这边好像语音有一点不清楚。 刘晓义(00:27:27): 放的是心脏? 犬戎(00:27:29): 不怎么听得到。 刘晓义(00:27:31): 忘了。我换一个麦克试试,就是有可能是因为麦克就比较,然后他们。 犬戎(00:27:39): 是好的。 刘晓义(00:27:43): 是不是收音在我坏了是我电脑的收音坏了!收到。我跟。不是。诶,现在能听见吗? 犬戎(00:28:00): 可以的。 刘晓义(00:28:01): 想问一下现在桌面的支持情况大概是什么样,我觉得现在 linux 上很缺 yarn 的管理工具。 犬戎(00:28:11): 因为我自己就是在 linux 上面进行开发的,我测试在 linux 上测测试很方便的。支持情况是挺好的,可以正常使用。功能也没有缺。 刘晓义(00:28:31): 了解,谢谢!诶对我挺好奇 Flutter 是。自带的 flutter 的相当于 UI 的那套东西,flutter 自己的那套 UI 的东西。 犬戎(00:28:42): 是弗拉特自己带的?那一套。 刘晓义(00:28:45): 就各个平台上的那个各个平台上那种 look and feel 都 ok 吗? 犬戎(00:28:46): 组件库之类的。 刘晓义(00:28:50): 这种的感觉,是不是现在苹果上跑就已经有 LazyClass 了? 犬戎(00:28:57): 这我。 刘晓义(00:28:58): 哈哈。 犬戎(00:29:00): 我没有是。 刘晓义(00:29:00): Oop. 犬戎(00:29:02): 我没有去测试过,我这里是首先是一个 linux。 刘晓义(00:29:02): 在全新自动要理解。对这。 犬戎(00:29:07): 其次,我这也是一个。Android 的手机。我是双系统。还可以在 windows 上进行测试,ios。 贺泽邦(00:29:21): 不至于我觉得 Flutter 应该都是统一的 Material 的风格不太可能有 liquid glass 吧。 刘晓义(00:29:27): Ok。 犬戎(00:29:29): 他给。 刘晓义(00:29:30): 就 flat 和 RN 是不太一样,因为 RN 用的相当于。 犬戎(00:29:32): 他给 ios 好像 flutter 给 ios 好像有另一套 ios 的。组件库叫什么来着? 刘晓义(00:29:41): 主要是不照着搞,是不是会被 F 四拒?我们有自信在对手的平台上使用对手的设计风格点JPG。 刘晓义(00:29:58): Anyway 那。那线下还有什么别的问题吗?那暂时没有了,感谢同学!祝贺 OS PG 顺利结项! 犬戎(00:30:11): 谢谢! 刘晓义(00:30:18): 那我们接下来邀请?邀请。邀请贺同学来介绍一下 GCC fortune 的 functional motivation 的功能,实现这边的。工作和心得。 贺泽邦(00:30:34): 诶,好能听到我和看到我屏幕吗? 贺泽邦(00:30:39): Ok 因为这个微蓝的还是比较灵车 ok。大家好,我是来自上海科技大学的这个贺泽邦。我这一次做的这一个项目是 GCC fortune 的这个 function multi vision 的功能实现。还是先介绍一下这个项目吧。首先我的导师现在也在现场就是陈阳宇老师,然后我们这个基本要求有两个一个,第一个是硬性的要求,就是我们需要实现整个的这个 subroutine 和这个 function 的这个的 tribute 的支持。然后第21个是将实现提交给开源的这个上游 GDC 上游,但是这个还是比较困难,我们之后后面有点困难,这后面再说,然后介绍一下我自己吧,因为我这之前写的,然后所以就没有做这一块。也顺便介绍一下这欢迎关注这个上海科技大学 geek 派社团,然后我是贺泽邦,然后。是 geek 派前社长,现在已经现在只是主要是负责 HP C 这一块,然后也打过一点 CTF。然后比较好玩吧 ok 给大家认识一下。 贺泽邦(00:31:54): Ok. 接下来我们就来介绍一下。整个的项目,然后我这里稍微说一下关于这个 functionmultiversioning 的介绍。那首先什么是这个 function multivergeny 首先,它是一个编译或者说连接的这个技术,它可以实现什么,就是我们可以在同一个这个,比如说二级进制的分发文件中,它可以包含某个函数或者什么样的,甚至整个程序的 multivergeny 多个实现版本。这个 multi 就是它的多版本多在哪儿。你可以针对某个 CPU 特性。比如说你的这个 avx V 二 SC 4.2等等这一些 CPU 特性,甚至说,官网也是 CC 也给他提供了一些,比如说你可以用 ark 等于 ark artem,然后去支持或者专门去给灵动的这一个平台写一个特定一个函数的版本。然后这个 function 就是说明它是一个函数力度的多版本。除此之外。除此之外,像比如说你在编译的时候,你可以用 GDC 然后杠 arc,然后来实现整个这个二进制模块,或者说编译单元的这个多版本。 贺泽邦(00:33:11): fmv 有什么应用前景?这里我稍微列几个,我觉得比较有,首先是一次编译多处运行。就是我们知道这个二进制文件,或者说我们这个通用库,然后你需要在不同的架构,甚至不同的这一个 CPU 这个指令集之间在运行,那你肯定是要保证这个兼容性,同时也要保证性能,特别是你像比如说 F FM peg 或者说这 open SSL 这一些,对于一些向量化或者这些计算有一些要求的地方,那这就非常的这一个需要。 贺泽邦(00:33:47): 兼顾你的兼容和性能。那大家也知道这个某牙膏厂12代的这个 CPU,因为它这个能效核,它能效核就是小核,它不支持 ABX 12所以它整个就不能用 ABX 12。刚好主播的这个是11代的,我11代的就支持 ABX 12然后12代反正就不支持了 ok 这肯定是就是不一定越高的,它支持的特性就越多。ok 然后还有一个就是它可以有效减少这个体积。这当然这是针对这个方程的这一个前缀来说的就是我们函数里的多版本。我们可以只针对这个热点代码或者说热点的这个函数来进行优化,而不需要其他的冗余,比如说你像整个这么一大个东西肯定不可能所有地方都给它生成多个版本,肯定只有一些关键的计算的,或者说等等这样的一些或者一些 open SSL 里面可能计算叉或者计算这一些,数学类的这个东西,我才需要多版本来顾及性能。然后同时大家也知道这 avx 二就是它运行起来会降频,不只是降频,然后可能还有一些初始化的一些开销,那这肯定都是我们需要注意的,对于性能敏感的程序。然后还是支持一个碎片化的这个生态,然后刚好今年我和这个我和我的导师陈阳宇老师都是来上海参加了这个 risk five 的这个峰会,然后我们也是在会上一起,一起听了很多讲座,然后一起看了一下 risk five 这个发展的一个现状。 贺泽邦(00:35:17): 那,比如说,它即使你的这个 RVA 的配置文件是一样的,但是你不同的 CPU 你支持的这个扩展能力也有可能不一样。比如说,我们这个项目导师就是陈阳宇老师。大家可以关注一下这个 RV 64点 CI P 就是域名,就是可以关注一下它的研究成果,它其实就是为了解决 riskfive 生态的碎片化而提出的。然后我这里也稍微借了它的这一张表。那比如说以这个 riskfive 的向量的扩展为例子吧。riskfive 向量扩展它,比如说它有三个大版本,比如说零点七一,零点八和最近2211年发布的这个1.0。这个直到1.0才有一个非常稳定的一个实现之前大家比如说像这个玄铁,它是用自己的这个自研的这个扩展,然后基于这个0.7的,然后它很有 ok 不同的这个不同这个 RVV 的这个实现,然后 ok 可能就会出现一些不兼容的现象,那肯定你的代码。有的时候可能不能一样,或者说有的时候你可能就是效率可能还不一样,像右图也是我直接偷的这一张表,然后也可以发现这个其实 resvive 我觉得个人觉得勿喷个人意见就是。它的生态的碎片化还是成为了它发展一个比较大的阻碍,希望后面能够越来越好。 贺泽邦(00:36:42): 然后接下来就讲它实现原理就是它实现原理。还是比较简单的。首先,一个最基本的原理是 I funk 就是 indirect function,然后这个是叫做格 new 的这个间接函数。它是一种在运行时,选择函数实现的机制。那它本身在内部的这一个是一种特殊的符号类型,这里我也写出来了,然后它就是并不是直接指向一个函数代码,而是指向一个 resolver。有点像你动态链接的时候,你传了一个 PLT 这个 link table 进去,然后它再会选一个指针,然后再跳到那个函数里面。我们这边就是将 multi versioning,主要就是依赖 dispatcher,或者说 resolver 函数。那我们这里的 I funk,它就是我们和这个 I funk 的区别就是 I funk 本身,如果你用这个 tribute 的话,它是可以自定义 resolve 函数逻辑的。而 target clones 更像是在上面包了一层,就是它会自动生成一个,indirect function,然后自动生成这个 resolve 就可以负责运行时检测这个 CPU 的特性,然后返回一个指向这个最合适函数的这个实现版本的这个指针。 贺泽邦(00:37:53): 比如说我之前写了一个程序,我们打开它的汇编,你就会发现,比如说之前是在 man 里边。你调用这个 call 函数的话,它不会直接进入到这里面,而是进入到一个 res over。然后这个的话,它会存不同的指针,然后根据你这个运行时去决定这个它到底是去这个什么 AVX 二还是什么这是 default 的这个 for back 吧。 贺泽邦(00:38:16): 然后因为我这个实现就是比较就是原理和实现都差不多,所以我主要来给大家介绍一下这个成果和我中间的一些小的一些这个采坑经历吧。首先实现 ok 首先我支持 fortune 里面的这样的语法,然后就是模仿的是 C 语言风格的这个参数传递,然后就是大概这样子的。主要的修改就在前端和终端部分,因为在底层都有,我们可以复用的,相当于是基基础基础设施。Ok 然后在前端我就会加了,比如说什么是加 tribute,然后还要加对应的语法解析。你可能还需要对这个符号添加一些这一个添加这些其他一些字段,然后用来,比如说要检查是否有这个 target。因为之前 fortune 是没有这一部分的检查的。然后中断的话,你就需要把这个 tribute 给附加进去。这里也需要复用一些,比如说 CC 里边的关于 target 或者 target cons 里面怎么样生成 res over 或者这样的实现。然后还有测试里面的测试大概就是这个格式的测试。这里因为我又是直接使用的这个 ABX 的这个指令集就是作为这个测试,所以我是放在 I 386的这个里面,然后就不是放在的这个里面。 贺泽邦(00:39:37): 这个项目成果,就是我之前说的一个非常。最大的遗憾就是被上游估了,就是虽然发了很多封邮件,然后也 CC 了很多 fortune maintainer 但是没有收到回答非常可惜。然后唯一收到的回复是当时我发给了一个 maintainer 然后他提醒我,我的这个163邮箱的后缀被会被他直接重定向到这个,然后没看到,然后我又重新给他发了一封,然后没下文了。 贺泽邦(00:40:07): 然后后面复盘就是个人觉得可能是涉及到一个新的语法和新的特性,然后大家可能会比较谨慎,所以就没有那种通常这种 patch 或者 GZC patch 好过,包括我们之前,我们会上也和这个陈安宇老师讨论过,然后他还去看了一下,像隔壁 GZC 他是。思仪那边他是有专门的这种例会的,但是 fortune 这边好像没有找到,就非常可惜。然后这边还有一个遗憾就是 ok。没有实现 C 加加 fork 这个 target 就是我也是具体实验到这个项目才知道,就是 C 和 C 加加中的这个 target 是有区别的。 贺泽邦(00:40:43): 就是 C 加加有点像重载了一个函数,就是你可以在保持相同的函数名的情况下,给不同的版本就是写完全不一样的代码。比如说你在这个 default 里面写一样写一套逻辑输出一套东西,然后 ok 你在这个 ABX 512或者什么样的这个里面,你可以完全写不一样的代码 ok 但是 C 它就只能为特定的函数来生成不同的版本。假设你重新定义了一个函数一模一样的这个函数名。你加了不同 target attributes,那它会报重复定义。因为 fortune 和 C 加加编译的模型有比较大的一个差异。这一块儿就后面就是优先级就降低了一点。 贺泽邦(00:41:26): 给大家分享一下就是收获,或者说其中比较有意思的地方。首先就是我之前说的这个 C 和 C 加加多版本的生成机制是不一样的,就是比如说,你像 C,这里好像有点看不清,我可以放大一点,左边是这个 C 加加同样的一模一样的代码,左边是 C 加加,右边是 C。然后我的这个 LSP 是,然后你会发现,这样的代码你用 C 加加是可以编译通过的你两个 call 函数一起定义了,你只要有这个。 贺泽邦(00:41:58): 然后你再定一个其他的这个 target ok 它是可以编译过的,但是你 GDC 就编译,不过它会报告诉你是这个。但是 clang 又不一样 clang 的话,它这里报错是这个 multi version function 必须要有一个这个 symbol 就是大概,比如说你前面加一个没有任何参数的这个 void call,然后后面再改成什么 call 它也是可以的。不同的编译器的实现还是没有一个特别写死的标准,然后这也是。比较有意思的一个地方就是这里才知道,而这个 CPP 的话,它比如说你在这里扣定了两次之后。Ok 它会自动生成一个 dispatcher,或者说我们之前说的这个 resolve 函数,然后分发到不同的这一个函数的实现里面去。那比如说你在支持这个 AVS 512 AVX2 MX 的情况下,那它就会跳到输出这个 AVX hello AVX512,就比如说我主播的这个机子,它就支持 AVS 512。然后其他的情况下,它 fallback 到这个 hello world。还有一些小的,比如 suffix 的生成不同。 贺泽邦(00:43:07): 这也是我之前遇到一个比较有意思的地方,就是有一个叫符号去重计数器的情况,就是大家如果可能看自己的编译的这个 assembly 的这个文件,你会发现有的它后面可能会加了一个,比如说点一,或者什么的。这就是相当于加了一个叫去重计数器。这个我当时定位了一下,它主要是在这一块儿,就是它有一个判断,就是如果你的函数不是公共的,或者说不是文件,就是如果你函数是公共的,是文件作用域,或者是文件作用域才会添加这个符号去除作用器。 贺泽邦(00:43:40): 我有没有讲反向公共且非文件作用域的函数会获得计数器 ok 然后就是会导致什么,就是你在 C 里边 CC 加加里边是 C 加加里边,我具体探究的是 C 加加里边,那你的这一个所有的函数它默认其实是公共的。那你比如说你添加一个,比如说中间写一个什么 void 什么什么函数,它是不会给你添加。 贺泽邦(00:44:05): 杂七杂八这个去重计数器的,因为它默认就是公共的嘛,公共的你就不需要考虑这个就是符号的这个冲突,但是在 function 里边,你的这个,比如你在一个 module 或者在什么样的里边。那你定义了一个过程。它默认就是私有的,有点像 rust 里面,就你必须要写 pub 才是 public。所以说你深圳出来的这个名字就会加上这个点一就是为了防止你和别的这一个别的里面的这个同样的名字会冲突,然后它会生成一个 suffix,然后这是为什么会注意到这个就是。因为它的 fortune 的生成符号驱动计计数器的这一个过程是在我们生成多版本之前的。所以说正常情况下,比如说你要在 C 里面或者 C 加加里面有这个符号系统计数器,再加上这个 multi versioning 的特性的时候。它是会生成什么样,就是比如 some funk 点 AVX 点一,但是在 fortune 里面,因为它在之前我们是后面 patch 进去的,那就是它会生成 some funk 点一点 AVX 就比较难看。Ok 后面就是还是本来是打算跟上游讨论的,但上游一直没有回我们,然后 ok 这就算了吧,那就先那么做着吧,但是比较有意思,我就跟大家分享一下。 贺泽邦(00:45:19): C 加加和这个 fortunes 里边,为什么它会有这个重复定义,就是 C 加加的话,它是属性解析在前,然后我们再进入到这个 decorations 的这个 match。那我们。进入到这里面的时候。它已经有了这个属性就是它相当于是几乎是在终端的时候才会去检查这个真正的这个就是我们所说所谓的这个。 贺泽邦(00:45:46): 而 C 加加的这个前端主要进行一些基本的一致性检查,然后最晚就是你可以延迟到这个 linking 阶段再有,但是 fortune 它就不一样。我之前也问过 AI 然后它可能它觉得就可能和这个 fortune 的单词编译模型有关,就是 fortune 它的检测就是在前端符号表在构建的时候,它是构建这个,这 fortunes 的时候 ok 它会直接报错,所以说你根本进不到这一个终端去再去生成。然后当时讨论一下,因为这是属于一个比较大的改动。然后当时就决定先实现 C 版 C style 的,然后我们再去和上游讨论去实现后面这个后面 style 的。因为这个中间可能因为你可能需要留存一些冲突的版本。然后你可能需要像 C 或 C 加加一样,我们给它 mark 成一个 version 的函数,然后再去终端再去进行。检查,但是就比较大的改动,然后再加上。不知道上友喜不喜欢 ok,所以就这就稍微 delay 了一下。 贺泽邦(00:46:47): 还有一些比较有意思的就是我在这里学到了怎么样给 GCC 写测试就是第一次学到 GCC 的大部分测试就是这个框架,然后它会放在这个 test suite 的目录下。它是什么样,就是你可以在写 CCP P。当然这个还有可能比如说写 fortune,我就是写 fortune 这里注释也都是 fortune fortune style 的。然后你可以通过特定的这个注释,然后来实现,比如说指定编译选项也好,检查编译产物等这些丰富的功能。比如说我可能需要我需要模拟一个特定的架构,然后生成之后检查它汇编产物,或者说甚至对于某一行代码或是。我是或者某一行的这一个执行的话,我需要看它的特定有没有特定报错。那你就都可以通过这个 delta new 这个风格去进行完成这个特定的功能,比如说我要 ABS 52 F 或者我要需要 assemble 里面有这个点 ABS 生成,或者说我需要知道它到底有没有生成 ABS 52的这个代码,我这里就相当于检测了一个有没有向量化的指令。然后有没有特定的报错等等,这些还是比较有意思的。 贺泽邦(00:48:04): 还有一个如何给 GCC 上游发邮件或者发 patch。首先就是 commit 要记得带上签名,然后这个 commit 规范和传统的 fix,或者就比如说个人,我个人的风格就是 fix fit 这。那这一些 GCC 可能毕竟是个大项目,所以他们的规范就是比如说你对 fortune 有功能性的更新,那就写 fortune 冒号就是这样子,可能不太一样。 贺泽邦(00:48:27): 最方便的是发 patch 的使用 git email 模块。然后它可以直接发一个 patch 到特定的这地址里面。如果你是手动发送,比如说跟上游沟通一些什么的,你需要保证你发的是纯文本的这个消息,因为 HTML 会被这个邮件列表拒收。你加一些 subject,比如 prefix RFC 就是 request for comments,它会在前面加一个方括号的 RFC。表示你需要征求大家意见。我个人是会写一个 coverletter 用来写 summary!然后关于礼仪或者说就是怎么写!就是你 to 和 CC 的人,这也是之前陈阳宇老师告诉我的,不仅你可以从这个 maintainer 这个 file 里面来找,也可以直接找你修改部分的周围的这个 author,然后来 CC 或者 to 一遍,当然我自己试了之后发现上游还是非常冷淡,然后这个还有一个神秘的 GCC 的这个 coding 的这个规范就是你必须要。必须要一行不能多于80个 columns 就是不能多于80个字符,然后我看他们写邮件,写这个 commit 也都是这样子的,就会有神秘的换行。大家可能要注意一下。 贺泽邦(00:49:46): 然后最后就是收获和总结吧,因为这是我第一次参加 OS PP 也是第一次参加 GSOC 这种类似物吧,其实这个超大型项目就是拿给我的时候,阅读的时候还是有一点点畏惧的,包括自己在当时在填的时候还是有点犹豫,但是非常感谢这个陈阳宇老师,然后也非常感谢。给我介绍这个的张艺驰同学,然后。给我推荐,包括给我加油,让我完成了这个东西。也比如说感谢陈老师。当将自己写 JD C patch 的这个经验,然后传授给我,然后给我展这个我提出了很多指导性的建议。然后还要感谢这个 toona 协会,然后包括党老师,妙妙老师以及这个哈里老师,就是每周例会都在参加,所以还是非常辛苦,然后也对我们的这个项目的方向有很大的这个推动把握作用,然后我也参考了很多这个 PLC D 实验室和个人博客的这记录,才能从 learning from scratch 就是学到给。 贺泽邦(00:50:53): Gtc 的贡献方法。然后还要感谢这个同学对,然后我们一个是在浙大,一个是在上科大,我们没有谋面,但是私下也交流了很多那个项目上的性格,然后也参加很多周会,然后不可多得的朋友,然后刚好两个人都又打什么 HBC 又打过 CTF,还打过五毛,然后就比较非常感谢吧,能遇到这么多多人。 贺泽邦(00:51:24): Ok,这就是我这一次的分享,然后 ok 然后 any questions。大家有没有什么问题可以问问的?哈哈。 刘晓义(00:51:34): 线下的同学们有什么问题吗?我刚刚有一个问题,我忘记了一想。 贺泽邦(00:51:45): 我可以把 ppt 往上翻看是能不能回忆起来。 刘晓义(00:51:49): 有时我会想,我忘了对,就是。 贺泽邦(00:51:52): 哈哈。 刘晓义(00:51:54): 雷佳跟你觉得和 firecheck 比哪个好用? 贺泽邦(00:51:58): 我还没用过 file check。 刘晓义(00:51:59): 长得好像 ok? 贺泽邦(00:52:01): 我没用过,我觉得写测试的这东西应该都差不多。包括我自己最近在写 rust rust 那个 test 好像也挺厉害的。总之感觉。还是比较当时比较出乎我意料的,因为我觉得这个居然能 scan assemble 了。我之前还觉得要生成个文件什么的,然后发现还是挺多功能。 刘晓义(00:52:28): 反正大家都会自己造套轮子,因为 file check file check 整的贼简单,然后 file check 我们之前用 file check 的时候会有一些零车情况,file check 会跟 LV M 的输出的 formating 有关,所以你因为它用纯文本文件去 check。 贺泽邦(00:52:30): 哈哈。 刘晓义(00:52:44): 比如你扣的证完了之后把 IR 杠出来杠的。 刘晓义(00:52:49): 比如什么缩进不一样,它多换了个行,然后你就 check 不过就倒闭。 贺泽邦(00:52:53): 这确实有可能,比如说我之前就比如说我这里写这个,我不知道是不是灵车,就是我希望找一个什么点 AVX,然后我是最终试了很久我才试出有这一个,这要写成这个样子才行,然后我当时也不知道,就我直接输入点 AVX 什么好像还是不太行。我也不知道是什么什么其他原因还是我正则写错了,它本身就是一个正则 anyway,反正确实是有零车的情况。 刘晓义(00:53:19): Regular expressions. 贺泽邦(00:53:20): 对的。神秘的而已。 刘晓义(00:53:24): 神秘。我还有一个问题,就是你觉得这件事情在 fortune 上实现,相比于 C 语言实现上面。如果我们脱离编译器架构的这个就是 G fortune 和 GC 的区别,你觉得可能在语言上面来看的话,有什么很大区别,还是就是没有什么区别,和 C 那边就比较像。 贺泽邦(00:53:46): 这个区别是指的什么是? 刘晓义(00:53:48): 无论是你说困难还是优势,还是这个方案的实现和它的功能上面各种各样的地方。 贺泽邦(00:53:48): 说的。个人觉得这一个就是理想情况下肯定是实现的,像 C 加加那样最好就是因为如果从实际应用层面来说的话就是我假设我写一个这个,比如说我写一个,然后肯定是希望它能够就是实现这样子很简单的就是能够帮我切换不同的版本的这个功能,所以肯定这个是目标,这是最好的。fortune 的语言里边,它就是限制了一下,就导致我只能写的跟 C like 一样,就是有这样的限制。可能和 GCC 它本身内部的一个实现有关也不好说是史山,但是就是它内部就是这么写的 ok,这个肯定还是希望跟 CC 一样吧。 贺泽邦(00:54:51): 还有没有?我大概就。 刘晓义(00:54:58): Ok 谢谢。 贺泽邦(00:54:59): Ok. 刘晓义(00:55:00): 线下同学还有什么问题吗?coi 要有什么点评吗?你点评一下。 刘晓义(00:55:07): 我感觉做的很好的一点就是 flash 里面。把就是很非常的 inspiring,就是说 work 的那种感觉,就是把自己就是 C 加加的那一块的风格实现的一些问题给讲清楚了,然后我觉得这是非常好的。 刘晓义(00:55:24): 的讲法。 刘晓义(00:55:27): 这然后我整体上来说这个项目的完成情况还是很不错的,然后那个 pass 给上头交了,然后。可能还要再多拼一拼上游! 贺泽邦(00:55:38): 确实。 刘晓义(00:55:38): 就然后也希望他更早的合进去吧,然后我觉得挺好的。谢谢。好处是不是? 贺泽邦(00:55:45): Ok. 刘晓义(00:55:46): 不想。分支的维护状态是什么情况? 贺泽邦(00:55:51): 哈哈。F 90。 刘晓义(00:55:53): 我玩。但是。但是感觉这个语言本来也没什么人用了,然后其实我觉得这个东西主要是你看很多科学计算可能还在用它,然后科学计算里面就是它做方式 motivation 的这个。 刘晓义(00:56:09): 效果还是不错的。所以说我认为还是挺有意义的。 贺泽邦(00:56:15): 确实。 刘晓义(00:56:16): 就你可以让这些你你老代码,然后你不修改的话,然后加上这 attrib,然后也能跑得更快。对我其实特担心有一些事情比如像这种编译开关不会对。一些比较全局的能会产生影响。你你说其实是什么? 刘晓义(00:56:36): 我思考一下有没有什么例子。我思考一下。思考一下是比如像 O 的等级这种事情,有的时候你 O 会 O 出来一些在 global scope 底下的东西,对显然是有可能的。对浮点数的时候,你你不同的这种 CPU扩展,其实浮点数的这种精度可能都会有差别。对那这种情况下,在这个框架底下会不会有什么困难,是因为之前没这个。 贺泽邦(00:56:48): 对。 刘晓义(00:57:00): 既然他们有他们可能小心。理论上这肯定是存在的嘛?Ok 那就是一个问题 ok。 刘晓义(00:57:10): 能有没有可能性在终端去 check 这件事? 贺泽邦(00:57:10): 确实。 贺泽邦(00:57:11): 也行。 刘晓义(00:57:13): 如果你在一个。module 里边就去 refrain from generating this kind of。Run the machines. 我个人的感觉这个东西,你可能你要手动去截取 GOT表,或者是截持什么 CQID 这种指令。 贺泽邦(00:57:31): 确实。 刘晓义(00:57:32): 理论上是可以测的,这其实挺好测的。Ok. Ok. 总总比你把它重新编译一遍是更好。 贺泽邦(00:57:40): 不是。 刘晓义(00:57:41): 现在如果其他的语言想干这种事,就是搞一些矩阵编译,然后整出来一堆 ISO,然后什么动态加载?对这也是一种方法对。反正我看 MKL 好像有这种做法,像 MKL 还会做一些那种计算直接是 JAT 生成指令。我们好整的。Intel Intel. 贺泽邦(00:58:11): Intel. 刘晓义(00:58:12): Intel. 贺泽邦(00:58:15): 反正 intel 这边我觉得实现也是非常灵活,包括因为我们这里,不过我们这刚好也是 I 386平台吧 I 386这边。还稍微好一些。论 multiverse 里面。像其他的这个,这像那边 ok 可能就生态更乱一些,可能这种情况确实要考虑一下。 贺泽邦(00:58:38): 但是。 贺泽邦(00:58:39): 这边可能还是稍微稳定一些。我也我自己也单独测了一下,就是 O 二 O 三什么的,至少在编译上面产物上面是没问题的,就是肯定要看它,比如说你之前提到精度问题什么的。 刘晓义(00:58:42): 不知道那边。对。 贺泽邦(00:58:53): 它可能自动有优化。可能对科学计算会有点小影响?但是。要 check 的话。No 也是有方法的。 刘晓义(00:59:05): 反正我个人认为它的 track 的难度至少是比你整个编译一遍,重新测一遍是要低的。 贺泽邦(00:59:09): 错误。确实。 刘晓义(00:59:11): 主要是对我刚刚问问题,主要是我有点担心程序里面会不会有看不见你 consciousness。比如说你。生成了一些 globalscope 的东西,两边都生成了一个 globalscope 的东西,然后它们两个重叠了。就它是函,它只改控制流,只要函数流做这个事情我觉得不影响。 刘晓义(00:59:30): 对我就有担心有没有可能有。编译开关会动一些控制以外的东西,就是会动你这个函数外面的东西。会动外面的东西就会有问题。 贺泽邦(00:59:41): 其实我觉得 fault 可能 fortune 还可能稍微安全一点,因为我自己在实践的时候,就是我之前讲这个函数计数器这个东西就是 fortune 计数器,它很多的这个函数其实都是私有的,那私有的它会自动带这个函数计数器,比如说点一,然后同样的名字就是点2.3这样子可能。 刘晓义(00:59:42): 好像。 刘晓义(00:59:59): 本来就有这个东西? 贺泽邦(01:00:00): 对它是本来就有符号计数器的。 刘晓义(01:00:02): 语言设计真好,唯一失败的地方它不像 C,即使它比 C 要早。 贺泽邦(01:00:05): 哈哈。确实。 刘晓义(01:00:09): Despite the fact. It's earlier than. 刘晓义(01:00:17): 好,那好像也。没有什么线下没有什么问题了。感谢何同学,然后也祝贺顺利完,顺利结项,然后这个 patch 也交上去了,后面就是跟上游白沟的过程。 刘晓义(01:00:32): 好那。感谢两位同学,那今天?就先这样,我们通达也非常感谢 ycp 开源软件之下的主办方。和各个赞助方。然后希望。 刘晓义(01:00:49): 明年。出纳还可以 continue?Visual Svp. 然后希望还能有?给我们分的项目。也感谢各位线上线下的听众,今天就先到此为止。 贺泽邦(01:01:05): 谢谢大家拜拜! 刘晓义(01:01:07): Bye bye. 犬戎(01:01:11): 拜拜。 刘晓义(01:01:13): 结束了。两位同学要一块儿去?吃烤串。反正我们几个要去吃串了,是因为我们还没有吃晚饭。辛苦。对我觉得你是在 intel 实习吗?还是看你有 intel 的包包,我来了,不应该带 intel 的包是因为没有,我没在 intel 实习过,这是上次那个高性能计算中心,当时不是因为是买的 intel 的服务。