Introduction to the Common Language Runtime (2007)
github.com
github.com
Calling V8 "whatever monkey" is a bit ignorant.
Oh, I haven't said that JavaScript is a good language :)
http://en.wikipedia.org/wiki/SpiderMonkey_%28software%29#Tra...
Just look what Lars Bak did with JavaScript.
If he would work on the CLR, things could get really awesome.
AFAIK he didn't create those things from scratch, he had to use the Java, SmallTalk, Self and JavaScript specs that were already out in the wild.
Web Workers don't as multithreading, they are more like isolated processes than threads.
It's a hard problem, though. For instance, async IO is relatively faster on Windows vs sync IO. Whilst threads and processes are pretty expensive on Windows compared to Linux.
Really? Care to provide some details?
The main clame to fame of Rust is providing memory safety without a GC. Is the quote wrong, or is the quote still right because using a few unsafe blocks is unavoidable in practice? I haven't used Rust yet and know almost nothing about the language, so I'd be glad if someone could enlighten me.
Rust invalidates the bracketed assumption. It's been known this is possible for a long time, but Rust is the first time a language with this capability has hit semi-mainstream audiences. C# sure doesn't do it, VB certainly doesn't do it!
Ultimately it comes down to a promise of conceptual cleansliness from the entirety of a language Frontend. It's a big commitment.
Alternatively, due to the existence of the GC as a given in the CLR, it might be that manual memory isn't exposed (as well or as nicely) in the MSIL making the idea of targeting Rust to it kind of silly. I have no personal clue.
(I believe there were some research languages around that tackled this sort of task, but I'm not sure how many tried to tackle the general heap.)
I suspect that we will see more languages like Rust in future, because Rust has essentially proved the feasibility of the ownership model with working implementation.
The GC can be very primitive such as in Rust ou C++11 by using reference counting. Reference counting is not a static allocation.
What Rust introduces is memory safety for statically allocated data. That's, the type system will prevent you use a reference/pointer to data a which has been deallocated.
This is not a criticism of Rust. I think it's a really interesting point in the design space. But there's no free lunch in memory management!
More generally, Rust is not the final word in type systems around data structures, and for more complex ones there are more complex type systems.
Consider, for example, a double-linked list that grows to a certain size, then every second a random node is deleted and a new one is inserted at the beginning. You can't represent the double-linked list with owning pointers, and while you can represent the list in an arena, you can't reclaim any memory until the whole list is deleted.
For instance, AFAICT, the whole double locking initialization question doesn't have a sold public answer. It's unsure that "myfield = new Foo()" is totally safe if the constructor throws. Obviously that'd be a huge flaw if not safe, but even top C# experts don't seem to be sure. With a fully open source CLR and docs, we should be able to figure this stuff out, rather than finding a few things of blog posts from 2004 and guessing.
We could also learn why some things are the way they are. For instance, why can you lock (Monitor) on every object? The syncblock on each object can't be free, so why is this encoded into each object (or even available at all), versus dedicated sync objects (which are what gets used in practice, anyways).
And maybe someone will provide much needed enhancements, like a way to effectively use the stack when safe. Or maybe some research projects will add advanced type features, which spark the way forward into the actual implementation.
I'm very much looking forward to this and really hope it marks a new era beyond hassle-free use on Linux.
[0] One former dev on one of the Iron* languages posted on reddit about how the CLR failed on its cross language ambitions. I can't find the post, but they gradually found it was mostly C# centric anyways, and ports of other languages were mostly incompatible and second-class
[1] http://whiteknight.github.io/2015/01/15/parrottheend.html
[2] http://ironpython.net/announcements/ for what it's worth...
We provided a lot of feedback, but it's tough for a group of a couple of students (or in the case of Perl, one commercial dev) to keep up with the then massive-breaking-changes drops we'd get from DevDiv every 3 months or so and provide feedback when it was on stuff that was, to the developers, around 6 months old. Often, by the time feedback landed, it was "too late" to incorporate because of product cycles and got postponed. Or the stuff we'd request was a dupe of "add tail call instruction" which had been postponed long before any of us got started in Project 7.
I say this as somebody who then graduated and then went to work in DevDiv for the next 7 years, where I was treated very well, so I certainly have no axes to grind on that front :-)
One example is Rack applications are hosted by Java web containers Just Fine via a server -> Rack mapping. We use this in production for both a Sinatra app and a Rails app.
[0] http://stackoverflow.com/questions/2752979/using-jruby-jytho...
The communities aren't to blame, but Microsoft. Like you said, the past lack of OSS spirit.
But maybe things are changing now :)
Clojure has never, ever been about equality between diffrent versions, the were always meant to be simular but diffrent when the platform is diffrent.
With that said, I'd like a better lib story between Clj and Cljs.
What do you base this on? I have not heared major complaints, I clearly remember Rich saying that it was not technical early on.
> With that said, I'd like a better lib story between Clj and Cljs.
They are working on feature expression, that should help.
But it's clear that MS does not really care about other languages. The APIs they ship are often C# only, taking advantage of quirks in the C# compiler, even. This document would have been better off written several years before, when reality hadn't set it. And also vice versa. The C# compiler has always needed "duck" typing, but instead of exposing it in any principled way, they simply hack it into the compiler on an as-needed basis.
The runtime hasn't been updated in about a decade, to boot. So, apart from the F# folks valiantly getting generics pushed in for v2, everything's been essentially frozen for over a decade. There may have been some kerfuffle around boxing of null nullable types, but nothing serious. Serious, deep, flaws, line reference types always being allowed to be null, just go unquestioned as part of the C way of thinking.
I feel like this was the same as IE. MS saw a huge threat in Java, and responded excellently. Then, after matching it, they got complacent.
Part of the issue may have been the Longhorn fiasco. Without a strong runtime (apart from whatever managerial issues), they couldn't ship an OS, and I think the managed code people lost too much political capital to really drive a continuing difference. Although, even before that, teams inside MS (like Office), were totally against taking a dependency on .Net.
I wonder if a light, optional, ownership system would have provided the performance necessary to have pulled it off. Then you could do something like play with an array without making heap allocations galore. The GC is great, but even short lived, gen0 garbage has considerable costs. (In practice, I could measure a single allocation's impact on a per packet (network sniffer app) basis.)
The CLR advancing at this point seems highly unlikely. C# and it's nearly isomorphic verbose flavor, VB.NET, have decided that advancement is a compiler thing only. Something like type classes? Simple annotations for ownership to allow some use of the stack? I will always dream.
* LINQ+Generics(It's my understand much of the generics work was done for LINQ, not F#)
* RyuJIT
* New GC Modes
* Re-Jit
* MPGO
* Thread pools and TPL
The CLR is under constant development. I think, if anything, now that you can upgrade your CLR version on a per-project, per-build basis there should be an acceleration of released improvements.
DLR and LINQ don't modify the runtime, nor does the TPL.
So there's been some incremental improvement in GC, some advancements in JIT (perhaps driven by Windows Phone needing more AOT support). And this was stuff that was known for a long time, but MS stubbornly refused to do, just like they did with static linking for C#.
But come on, no real serious advancements since the CLR v2. The IL is still the same. MSR came in and gave them a vastly improved type system, and things have sat there ever since.
Maybe that'll soon change, but seeing as how C#'s been just slowly adding F#'s features and toting their compiler rewrite for years, somehow I'm not really counting on any revolutionary language tech coming out of there.
I'm very anti Google, and I had dismissed GCE out of hand. But then I looked into it and tried it out and I'm blown away. VMs launch like instantly, and are much faster than their Azure counterparts. Niceties, like SSH in the browser really are cute, too. And, each machine can have a public IP, instead of Azure's quirky "cloud service" one IP limitation.
But pricing, that's what kills you. While Azure makes a big deal about how they match pricing, it's only on the storage/transfer sides. The same specs on Azure are 200% more money. The same performance is... a lot more money. I think it's cause the main tier of Azure runs on some older AMD series, but GCE is running Ivy/Sandy bridge.
As a longtime Azure user, I was rather distressed to find I was paying so much more for less. Even after the discounts MS had for 6 or 12 month commits, their pricing is still far more.
Also s/TypeScript/WebSharper.