essay | tech | year-summary | about

返回上级菜单

AOT and JIT


日期:2022-02-05T00:00:00Z

太无聊了,就找了本动物书《c# 7.0 核心技术指南》来看。(此书出书时仍在.net core 2.0时代)
看到里面提到了一个概念,AOT(ahead-of-time compliation)。
随手查了一下这是什么,什么时候会用。

结果查到一个csdn的博主,2022年还要出书《wow c#》的那种。
花了很长篇幅啰哩啰嗦也讲不明白,我一看这对 interpreter 的认识竟然还没我的认识清楚(解释半天竟然也没解释明白 interpreter 和 complier 的区别。。。。最后说什么运行速度),还一直说什么形而上学,醉了,我还去百度了一下什么是形而上学😵‍💫

我也不出书,不过我解释下吧。

interpreter : 一般指script语言中的编译器(complier)的一种,编译时直接按照script进行翻译,注意是逐行翻译。所以会造成许多经典的问题,比如如果提前引用下一行的代码会报错 -- 当然现代的一部分interpreter已经可以避免了这个问题。
complier : 广义上指所有的编译器,狭义上指的一般是编译成机械语言,或CLR或Bytecode这类中间语言的翻译工具。当然,比如llvm项目中编译成的底层中间语言一般也认为它是机械语言,也属于complier。

那么这两样的区别就很明显了。运行interpreter一步到位,运行complier一般需要两步。所以两者上本质上并不是优化的区别,而是进行翻译时的翻译方式的不同。当然更专业的区别可以参考龙书,这里就不献丑了。

那我就把读书笔记写在这里吧。

这里有篇对于complier比较简单的描述
https://stackoverflow.com/questions/32653951/when-does-ahead-of-time-aot-compilation-happen

AOT & JIT

AOT : ahead-of-time compilation
JIT : just-in-time

AOT一般指的是类似于转换成机械码的一种编译。
JIT指的是类似于interpreter的一种随时使用随时调用的一种编译。

JIT的缺点是启动时需要的时间比较长,随时使用什么包就随时调用。至于debug时候随时修改随时就能变也许也是JIT的一个特性。
而AOT一般是我们指定了平台后的统一打包。比如指定win x64后,输出的针对平台的中间语言和机械码的合集。

那么好,我们的csc编译器原生支持JIT,.net framework 2.0之后开始支持AOT,那么何时开启AOT何时开启JIT呢?
参照下面的链接,只有publish的时候会使用AOT模式进行编译。

https://docs.microsoft.com/en-us/dotnet/core/deploying/ready-to-run

国内的书……果然只能看看动物书,其他的要么是外国书要么直接看官方文档。

xcopy

可以进行跨平台的copy。比如ntfs去copy到ext4。是asp .net core开始有的deploy时的新特性

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/xcopy

sql server 调用 c#

sql server的CLR集成环境支持在SQL中调用c#代码。

WinRT

WinRT : windows runtime,win8以后提供的类似于win32 API的interface,不过由OOP模式编写,更贴近c#的原生调用。

C# 7.0 Deconstruct

it is different from 'destruct', it's just a method of class.

https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/functional/deconstruct
https://ufcpp.net/study/csharp/datatype/deconstruction/
https://ufcpp.net/blog/2016/12/tipsdeconstruct/