[HN Gopher] Twenty years of C# with Anders Hejlsberg [audio] ___________________________________________________________________ Twenty years of C# with Anders Hejlsberg [audio] Author : binarynate Score : 64 points Date : 2022-02-10 20:33 UTC (2 hours ago) (HTM) web link (www.dotnetrocks.com) (TXT) w3m dump (www.dotnetrocks.com) | binarynate wrote: | I thought it was interesting when Anders mentioned that 30% of C# | developers use Unity. Unity doesn't use Microsoft's CoreCLR | runtime, but instead uses the Mono runtime or an AOT compiler | Unity created called IL2CPP, which converts IL code generated by | the C# compiler to C++ that gets compiled to native code. One of | the reasons for this is that CoreCLR supports Windows, macOS and | Linux, whereas Mono and IL2CPP together support every platform, | including consoles. Anyway, it's interesting to me that a | significant number of developers are using C# but are using a | runtime other than Microsoft's CoreCLR runtime. | DizzyDoo wrote: | It's worth mentioning that there's now a _third_ way C# is | utilised in Unity which is via their new 'Burst' compiler, | part of their wider move to an Entity Component System they've | called DOTS[1]. It supports a subset of C# that gets compiled | into memory safe jobs that can run safely on and spread across | different threads. I'm using the Burst compiler + jobs in my | full-time game project and the performance is seriously good | for whenever you just need to process a lot of data. You can | use Burst with both Mono and IL2CPP script modes. | | The go-to deep dive on how DOTS/Burst works is pretty much | everything Jackson Dunstan has ever written on the matter [2] | but specifically the article that digs into how IL2CPP calls | Burst is interesting.[3] | | [1] - | https://docs.unity3d.com/Packages/com.unity.entities@0.17/ma... | | [2] - https://www.jacksondunstan.com/?s=burst | | [3] - https://www.jacksondunstan.com/articles/5251 | mikewarot wrote: | loic-sharma wrote: | Why is supporting .NET evil? | mikewarot wrote: | It locks you in to Microsoft (or it did back then), it's | unnecessary. It serves no actual purpose, other than to | support that lockin. | | A win32 exe will run on Windows 95 through Windows 10, for | the most part. You don't need .NET for that to happen. | | It's a trap, in other words. | timomax2 wrote: | C# is what python programmers wish they had. | CodeGlitch wrote: | As a Python programmer I completely agree. Only last week | I started to look into C# and the cross platform | capabilities. I have to say it looks really good these | days. Wish I learnt C# years ago now... | binarynate wrote: | Microsoft's .NET runtime and C# compiler have been open | source and cross platform for a long time now. Even before | then, MS published ECMA standards for .NET and C# since the | beginning, and the Mono runtime and compiler for C# have | been open source and cross platform since the early 2000s: | | https://en.wikipedia.org/wiki/Mono_(software)#History | aninteger wrote: | Yes, of course this is true but the tooling ecosystem | still hasn't made great strides over to Linux. Rider does | exist but is not open source. As far as I know the | debugger is not open source as well. | WalterGR wrote: | So much goalpost moving. | smackeyacky wrote: | It's biggest competitor (Java) has exactly the same | ownership issues. | | C# and .NET Core in particular give me the ability to | deploy server or utility software on pretty much anything. | You can build a completely self contained executable which | is fantastic for deploying software on machines where you | can't control the infrastructure. | | So, sort of the opposite of lock in. | onemoresoop wrote: | I suggest downloading the file locally first so you can skip over | the reverberated bathroom part. | binarynate wrote: | For context, Anders is the creator of C# and TypeScript: | | https://en.wikipedia.org/wiki/Anders_Hejlsberg | ejb999 wrote: | Interesting - never heard of him, that I can remember anyway, | over my career my three favorite programming languages were (in | order from oldest to newest) - Turbo Pascal, C# and now | Typescript - and apparently he created all three. | spaetzleesser wrote: | He certainly knows how to create programming languages that | last. | Reitet00 wrote: | And also the author of Delphi and Turbo Pascal. | ejb999 wrote: | loved turbo pascal a long time ago - got my professional | start there - but I will forgive him for Delphi anyway :>) | lostmsu wrote: | What did you use between TurboPascal and C#? o-O | ejb999 wrote: | VB/VB6, with some Clipper and Foxpro mixed in. | | Switched to c# instead of picking up vb.net - in | retrospect a good call. | zwieback wrote: | Classic progression - some of us came from VB Classic to | C# others from C++ (at least in the Windows world). Now | we're all one big happy family. | nottorp wrote: | > I will forgive him for Delphi anyway | | Sounds like you never used Delphi. Modern C sharp with | whatever MS calls the GUI classes this week doesn't hold a | candle to how fast you chouls whip up an UI in Delphi and | then concentrate on actual functions. | | Edit: talking about the Delphi before Microsoft offered | Hejlsberg 1 million extra per year and Borland refused to | match... | intrasight wrote: | I can't believe that I've been hacking C# for 20 years | polskibus wrote: | I wish he came back to evolving C#. Progress from v1 to v5 was | enormous in contrast to v6 to v10. | tester756 wrote: | It feels like 6-10 is mostly handy stuff and performance | related | | https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csh... | | Meanwhile 2 and 3 were giant, holy shit. | dgritsko wrote: | As a fellow C# aficionado, what do you think it's lacking right | now? The main thing I really would like to see is support for | discriminated unions - but outside of that, it's pretty | awesome. | binarynate wrote: | I'd love to see support for structural typing. There are some | proposals for that: | | - https://github.com/dotnet/csharplang/discussions/164 | | - https://github.com/dotnet/csharplang/discussions/2548 | polskibus wrote: | Nullable references are far from what they could be. When you | use them a lot, you often have to override compiler with ! | because it is too stupid. I'd also like to have better | support for const references as in c++. | | I'd like to see more powerful generics, so that something | akin to partial template specialisation is possible without | going through boxing and unboxing too much. | | With regards to safety, well rust has shown what is possible. | Async/ await has introduced function colouring which is a | kind of bloat. | | All in all there are many things that could reduce the bloat, | instead of some tiny features that help with value types or | to optimise some rare case. | jayd16 wrote: | People call async/await function coloring bloat but I think | it's exactly where it needs to be. IMO execution yielding | needs to be explicit not implicit for use cases where | thread identity matters. How are you going to write a UI | framework if thread context can change unexpectedly? | coder543 wrote: | Go doesn't need "coloring bloat", but you can still | handle the need to run code on a specific thread using | LockOSThread.[0] If you absolutely need your code that | interacts with the OS GUI functions to be running on the | first thread the OS spawned, the documentation even tells | you how to do that. | | This is an exceptionally low level detail that very few | people should ever have to think about. Is there | something else you can point to that's pertinent to more | developers? | | Having written Go for years (as well as a good bit of | Rust), I love not having to worry about async/await being | the concurrency model, and thread identity is never | something I think about. With the upcoming Go release | that brings generics, I think there are some code | patterns that inherently benefit from an async/await | style pattern where you spawn several tasks and await | their results, so I'm looking forward to having a generic | pattern to spawn goroutines that return a value into a | Promise... but the infectious nature of "real" | async/await is not something I would consider beneficial | in most languages. Rust is a language that is _all_ about | low level details and performance, so it actually makes | sense there, but that 's a rare exception, in my opinion. | | Developers generally shouldn't need to worry about things | a good runtime can take care of, just like you don't need | to worry about when you're going to free an object in | C#... the runtime takes care of these details that are | rarely relevant meeting the developer's objectives. When | you absolutely need that control, there are usually | escape hatches. If the application you're writing | frequently requires unlimited control, you should | probably be using an unmanaged language like Rust to | begin with. | | [0]: https://pkg.go.dev/runtime#LockOSThread | tester756 wrote: | >With regards to safety, well rust has shown what is | possible. Async/ await has introduced function colouring | which is a kind of bloat. | | I do wonder how much effort it'd require | VincentEvans wrote: | I wish for just one thing: native AOP (aspect oriented | programming) aka Python-style decorators and context | managers. Everything else I need C# already covers | adequately. | tester756 wrote: | You mean Java's "Annotation Oriented Programming"? | | like @Transactional? | | If yes, then I'd really do not want those "magic-like, | tricky when it comes to debugging" features | VincentEvans wrote: | Last time I used Java, it looked to me that AOP is | supported with compile-time byte-code rewriting, which | might explain why it may feel like magic and be hard to | debug. .Net also has a IL-rewriting 3rd party toolkits | that enable AOP, namely Postsharp - but my experience | with it wasn't great for similar reasons you stated. | Maybe I did something incorrectly, but my impression of | tools that generate code at compile time - is that you | can't step through the resulting code. Python on the | other hand is both flexible and simple. The decorator | code simply wraps the function it decorates (you get a | lambda variable that will contain the function you | annotate, so you do whatever it is you need to do, and | then call the original function. Or not, your choice. ) | and doesn't feel complicated at all. Debugging is simple. | | Try it and you might change your mind - perhaps C# | designers could use a similar source of inspiration. | jayd16 wrote: | I think Kotlin's type delegation is probably a better way | to handle method overrides/wrapping. Fits into the language | better. | giaour wrote: | > aka Python-style decorators and context managers | | Genuinely curious: aren't Python decorators basically the | same as C# annotations, and aren't context managers | covering the same ground as a C# using statement? | binarynate wrote: | If you want to skip past the intro segments, you can use a | different player like the Apple Podcasts site. The actual | interview starts at 10:00: | | https://podcasts.apple.com/us/podcast/twenty-years-of-c-with... | mattferderer wrote: | You can also use their website that's linked to. Just need to | hit play & than close the pop up & you should see the player | which you can skip around on. | | Not the best website user experience but it's a great podcast, | even if you're not interested in .NET. Highly recommend all | their Geek Out episodes. | zwieback wrote: | I vividly remember when I started using C#, I can say that 20 | years later I only feel a little bit bad about leaving C++ | (mostly) behind and glad I didn't have to go the Java route. | softfalcon wrote: | Why does the intro ad sound like it was recorded in an Elementary | School hallway? | binarynate wrote: | I think they added some reverb to Richard's voice for part of | the intro and accidentally reverbed all of the ads, too | binarynate wrote: | I just sent Carl a heads-up about the reverb: | https://twitter.com/binarynate/status/1491890009674244107 | [deleted] | [deleted] | daok wrote: | The lack of possibility to scroll in time (to skip that part) | is what bothered me the most. ___________________________________________________________________ (page generated 2022-02-10 23:00 UTC)