3 ms·
Nice post. There are many things that aren't possible in C# but can be expressed in pure IL. Sigil [0] is an IL generator used in the high-performance JSON ser
by jsingleton 10y ago
Nice post.
There are many things that aren't possible in C# but can be expressed in pure IL. Sigil [0] is an IL generator used in the high-performance JSON serializer Jil [1], which takes advantage of this.
https://github.com/kevin-montrose/Sigil https://github.com/kevin-montrose/Sigil
https://github.com/kevin-montrose/Jil https://github.com/kevin-montrose/Jil
- matthewwarren 10y agoI've seen Jil/Sigil before, but not thought about it in this way. Are you saying that you could exactly replicate a C# System.String using IL, or am I mis-understanding?
- pjmlp 10y agoGiven that IL needs to be expressive enough to represent C++/CLI, I would guess it is possible.
- zamalek 10y agoI'm not sure if you could replicate System.String, because the oddity is happening at the metadata level - apart from special cases like String, .Net types must be compile-time constant length (if I remember correctly). However, at the instruction level you can do some pretty awesome stuff. This slice[1] library is able to verifiably and safely grab a slice of data out of any arbitrary structure by using a MSIL feature that was invented for C++/CLR. The call site[2] is not unsafe. [1]: https://github.com/joeduffy/slice.net/blob/master/src/PtrUtils.il https://github.com/joeduffy/slice.net/blob/master/src/PtrUti... [2]: https://github.com/joeduffy/slice.net/blob/master/src/Slice.cs#L56 https://github.com/joeduffy/slice.net/blob/master/src/Slice....
- matthewwarren 10y agoYeah the slice stuff is pretty nice, it's actually now being developed on the CoreFX Labs[1], so it might eventually make it into the Core CLR. [1]: https://github.com/dotnet/corefxlab/tree/master/src/System.Slices https://github.com/dotnet/corefxlab/tree/master/src/System.S...
- jsingleton 10y agoNo, I wasn't suggesting that you could implement the same high-performance System.String in IL, especially considering the assembly language used. I was just saying that there are many other things that can't be done in C# but are possible in .NET, using other languages. BTW there is a typo: "passed in my the calling code" should probably be "passed in by the calling code". I wonder if the new C# 6 string interpolation also uses string builder like format does. e.g. $"Name = {name}, hours = {hours:hh}" https://msdn.microsoft.com/en-us/library/Dn961160.aspx https://msdn.microsoft.com/en-us/library/Dn961160.aspx This post seems to suggest it uses concatenation, which may be bad for performance in some situations due to the immutability. https://weblogs.asp.net/bleroy/c-6-string-interpolation-is-not-a-templating-engine-and-it-s-not-the-new-string-format https://weblogs.asp.net/bleroy/c-6-string-interpolation-is-n...
- matthewwarren 10y agoI just did a quick test with Reflector and it looks like string interpolation is turned into String.Format(..) calls, which in turn will use StringBuilder. This makes sense as String.Format(..) understands all the string formatting placeholders. > BTW there is a typo: "passed in my the calling code" should probably be "passed in by the calling code". Thanks for spotting that, I'll fix it in a bit