One year of Rust
blog.rust-lang.org
blog.rust-lang.org
I'm sorry, but much of Dropbox’s back-end infrastructure is historically written in Python, not Go. Go is a new addition to the stack. Only a small and very specific part of Dropbox is written in Rust, where things like an effectiveness of CPU caches becomes important. Other back-end code is still being written in Go.
While you're right that it's a small and specific part, it's also the core of the whole thing, so it's a very significant part. Dropbox isn't moving away from Go generally any time soon, as far as I know: it's still very much the default.
I guess I call "a new" what you call "a long time now". Dropbox is using Go for about 3 years.
To my knowledge Dropbox's backend is migrating (slowly) from Python to Go (new default), with Rust for some specialist features where the memory management model is preferable.
But still the language is great.
To be extra clear, a crate is the unit of compilation in Rust, so changing your code means that the whole crate it's in needs recompiled; your dependencies won't be. Or, if your project is split up into multiple crates, the other ones won't. Incremental recompilation will reduce this level of granularity such that the whole crate won't need to be recompiled.
I think we are likely to see better incremental support with the recent development of MIR, but I'm not sure what the current plans are. Should help tooling around the language generally!
Eh, debugging is a mess, at least on OS X. Rust advertises LLDB support, but it seems semi-broken. Listing source is non-functional and just setting a break-point requires a lot of hand-holding.
$ cat hello.rs
fn main() {
println!("Hello world!");
}
$ lldb -v
lldb-350.0.21.9
$ uname -a
Darwin mycomp 15.5.0 Darwin Kernel Version 15.5.0: Tue Apr 19 18:36:36 PDT 2016; root:xnu-3248.50.21~8/RELEASE_X86_64 x86_64
$ rustc --version
rustc 1.8.0
$ rustc -g hello.rs
$ ./hello
Hello world!
$ lldb hello
(lldb) target create "hello"
Current executable set to 'hello' (x86_64).
(lldb) source list
(lldb)
(lldb) b 2
error: No selected frame to use to find the default file.
error: No file supplied and no default file available.
I don't see how the core team could be unaware of this unless literally no one has done even a cursory glance at OS X & LLDB in months.I'll copy and past this into a Github issue when I have a sec.
I tried to pickup Rust, but I was super frustrated by the code/compile/run cycle with the current plugin. But, hopefully more users will make that better.
To clarify: I'm not author of this plugin.
And I tried Racer with Microsoft Visual Code plugin - it works without any lags, very fast. Just fails sometimes :)
I agree however that it would be nice to have ie lifetimes visualized and stuff like that, hopefully sometime soon...
I just found this link[1] for a pretty complete Emacs IDE-like setup the other day. I'm not a Rust programmer, but it seemed promising enough that it made me want to give it a spin.
[1] http://julienblanchard.com/2016/fancy-rust-development-with-...
It is a really big barrier to adoption because it's very hard to find out what functionality is or is not offered. Here's an example: I want to iterate over a set. Easy, right?
No.
http://static.rust-lang.org/doc/master/std/collections/hash_...
Look at the signature for Cycle. It's really hard to know what this does even though it's trivial:
fn cycle(self) -> Cycle<Self> where Self: Clone
When you click through to the real documentation, it describes a useful use case for this. But that's not how programmers think. They think "I need to do X right now so I'll find something that looks right" not "I'm going to click through the documentation... oh X looks interesting I'll remember that later". There's no way to infer what Cycle really does without having actually clicked through or used it.
It's just a pretty terrifying way to output right now.
(Also, that page is a bit sparse because I haven't gotten around to writing any docs for it yet, so it's just the autogenerated stuff.)
Thanks for the bug ticket :)
Rustdoc isn't perfect, but it's pretty easy to find things imo.
I agree that a summary would be good, but this doesn't require a PL Ph.D. It means "cycle is a method that moves its receiver and returns a Cycle object of the same type of the receiver, and only works if the receiver is cloneable". The trickiest thing here, IMHO, is move semantics, which is something fundamental to Rust in general.
If you've spent more than a cursory time with Rust this is pretty straightforward.
You'd represent this in Java(minus move semantics, because Java has nothing like that) via:
class IntoIter {
public Cycle<T extends Clone> { ... }
...
}
Where Clone is just an interface that knows how to clone its value.I think the point still holds. Maybe just not for that one.
I guess I've just had a different experience. I come from almost no PL/ML background and I've found the Iterator interface in Rust(along with Option/Result) to be some of the most impressive, clear things about the language.
This kind of thing seems silly to experts but could raise the rate at which folks make it through language learning funnel.
> I want to iterate over a set. Easy, right?
yes, it is easy, `for value in &set {}`. Not sure why you went all the way down to `Cycle`
In this case I agree that perhaps rustdoc should note that a full description should be alluded to (the full description of Cycle is on the Iterator trait's docs), but it's still IMO much better than go
I'm actually doing a talk about the ACM's Applicative conference in NYC this year talking about the history of Rust.
If it is true, please file bugs. We do our best not to break people's stuff, going to pretty extreme lengths compared to many other ecosystems.
No, it won't. Rust has been stable since 1.0, as the article itself mentions.
One of the big advantages of Go is that it comes with a coherent set of libraries from a single source (Google) that do most of the things you'd want to do on a server. Rust is more like Python; many people write libraries, many of which overlap and some of which work.
But I do want to emphasize that Rust libraries follow semver, and the lock features of Cargo mean that your builds are always reproducible and you upgrade only when you want to. Your code will never stop compiling one day just because some library "churned".
Odd comparison, Python actually has quite a comprehensive, well used standard library, which usually gives you enough to get going.
Using NodeJS as an example would've made more sense, where most libraries/modules are user written.
No one would say those commits show he was working on Go as a "personal project" during that time.
I filled out the survey that was sent around and mentioned some of my concerns about missing crypto-in-Rust code and some of the shortcomings of the documentation. I'm pretty happy I'm not the only one mentioning one or both of those things, because it makes me hopeful that we'll see improvements soon. In particular, regarding docs, I've found it rather difficult to go from reading a type signature and brief explanation of a function/method and being able to actually use it, as a beginner. For example, when I tried to figure out Hyper, it took me a long time to realize I could use pattern matching in my function signatures to capture a mutable reference to something that Hyper was giving me ownership over. I feel silly having missed that, but being a beginner just referencing the Hyper docs, I really struggled.
Does anyone have more information about the crypto situation? In particular, I use ECDSA 384-bit for a lot of the code I write at work and have only been able to find the Ring library, which doesn't seem to feature signing yet. If I could get some high-quality, audited crypto code (or heck, even just some nice Rusty wrappers), I'd be so close to ready to use Rust at my day job and for more personal stuff as well.
We're in the process of starting up a docs subteam, and one of the things we're interested in is helping the broader ecosystem get better docs. It's also possible that part of my job writing docs will eventually move towards contributing ecosystem docs, but gotta finish up the official distribution first.
Crypto is tough: it's very, very important to get correct. Right now, most projects use wrappers over OpenSSL, but having it all in pure Rust (and maybe some asm where appropriate) is, of course, the dream...
1. https://crates.io/crates/sodiumoxide 2. https://crates.io/crates/pumpkin
https://github.com/servo/servo
It is a massive undertaking and it's already sort of working in many regards.
Panopticon, a cross-platform disassembler: https://panopticon.re/
Redox, an everything-is-a-URL microkernel OS: http://www.redox-os.org/
Piston, a modular collection of libraries for game development: http://www.piston.rs/
Pijul, a next-gen implementation of Darcs: http://pijul.org/
Xi, a high-performance text editor: https://github.com/google/xi-editor
timely-dataflow, "a low-latency cyclic dataflow computational model" (i.e. big data shenanigans): https://github.com/frankmcsherry/timely-dataflow
https://news.ycombinator.com/item?id=11283538
http://www.wired.com/2016/03/epic-story-dropboxs-exodus-amaz...
EDIT: It's funny how people down vote my personal feelings about the language without any anti-argument or comment. It seems having other opinion than "Rust is GREAT" is not desirable here.
Rust doesn't solve memory leaks, it solves memory unsafety- things like use-after-free and iterator invalidation that modern C++ does virtually nothing to help with, and that vulnerability statistics show are still huge problems with programs written in C++.
EDIT: My point is that i have nothing to gain from rust when knowing c++ and memory management rules + i got good static analyzer. But probably for someone that do not know C++ at all Rust could be a better choice.
Simple rules are, again according to the evidence, not good enough. There are simple rules you can follow in C as well. The benefit of Rust (as far as memory safety goes) is that the compiler enforces those rules.
In fact, the mechanism by which it does this (lifetimes) is typically what makes Rust seem more complicated to beginners. But the fact is, that complication is still there in C and C++, the compiler just lets you deal with it all on your own.
I will try third time with Rust, i just feel sometimes like in shackles in Rust, i would like to say to compiler hey i know what i am doing, like i can do in C++.
No. The entire history of large-scale security-critical applications in C++ disagrees with you.
> I will try third time with Rust, i just feel sometimes like in shackles in Rust, i would like to say to compiler hey i know what i am doing, like i can do in C++.
That's precisely what unsafe is for.
https://www.mozilla.org/en-US/security/known-vulnerabilities...
Here's Google Chrome, search for "buffer overflow", "Use after free", "out-of-bounds":
http://googlechromereleases.blogspot.com/search/label/Stable...
Edit: Chromium bug tracker talks to me now, query for "use-after-free" has 2157 results:
https://bugs.chromium.org/p/chromium/issues/list?can=1&q=typ...
Still waiting.
And read how chromium use C++11... (https://chromium-cpp.appspot.com/) + google style guide that is prehistory and NOT considered good in community.
Maybe try with proxygen, rocksdb, folly from facebook ?
These security flaws are in code that has used smart pointers for years and years.
> And read how chromium use C++11... (https://chromium-cpp.appspot.com/) + google style guide that is prehistory and NOT considered good in community.
It doesn't matter from a security perspective. In fact, I think C++11 is actually less safe than C++03 with custom smart pointers, because use-after-move is a hazard and lambdas make it very easy to have dangling references.
Chromium security engineers are some of the most competent engineers in their field. If using more C++11 features made their code more secure, they would do so. They don't, because C++11 doesn't make their code more secure.
Ultimately, these debates are really premised on something absurd: "assume modern C++ is completely memory safe unless proved otherwise". This is completely backwards and leads to endless "no true Scotsman" games. You need to show why C++ is supposedly memory safe. You won't be able to, because C++ is not.
> Maybe try with proxygen, rocksdb, folly from facebook ?
Those codebases aren't being attacked the same way browsers are.
But I can easily find use-after-free in them too with Google: http://code.metager.de/source/history/facebook/folly/folly/i...
Tell me then if it's such a huge problem that rust solves ( that people have with memory safety) why whole world didn't switched to Rust for NEW projects? It's stable already.
Why yes, I can!
https://bugzilla.mozilla.org/buglist.cgi?o5=substring&o13=su...
Before you object, this is largely modern C++.
> You could use static analyzer and would avoid most of the problems.
> EDIT: My point is that i have nothing to gain from rust when knowing c++ and memory management rules + i got good static analyzer. But probably for someone that do not know C++ at all Rust could be a better choice.
Yes, you do. Empirically, programmers consistently make the same game-over mistakes in C++ over and over again.
Please see my reply in the other sub-thread about very similar story of exploitable memory safety bugs in Google Chrome fixed in every release; do you want to continue your line of argument with a claim that Chromium developers are all incompetent too?