I'm a very experienced software developer and manager (I wrote my first line of code in 1960 in college!). I'm retired now, but still do a lot of software development for my own use. My primary focus is a suite of personal finance programs that I wrote mostly for myself, but have shared on github. The main program and several utilities are written in C; other smaller utilities in Tcl. The data is stored in a sqlite database. The gui was done with gtk3.
I do have a particular interest in programming languages and have used an awful lot of them over my long career. In recent years, I've written a fair amount of Haskell code and more recently, some Go and Rust code. I'd like to re-write the C components of my finance suite in something more modern, so am evaluating languages for that purpose. I've re-written the smallest of them in Haskell, Go and Rust as exercises in those languages. I've also done a similar exercise with Chez Scheme. That system is excellent -- solid and very fast -- but I've really become sold on static typing. I've had debugging sessions with Scheme code that were much too long and involved errors that would have been caught at compile-time in a statically typed environment. I think Haskell is very interesting, something to which we should all have some exposure. But to get anything real done, you end up writing a lot of imperative code and it isn't a good vehicle for that. Go is fine, well done, but pretty uninteresting as a language, and its performance, at least in bench-marking exercises, has not always been stellar. It's probably fine for my purposes, but I'd like to have some fun, too, and Go is awfully ho-hum. Rust. Now there's an interesting case. I've spent too much time trying to wrestle it to the ground and have, finally, produced working code with it. But if you need global state for any reason -- e.g., hash-tables, switches, etc. -- I wish you a lot of luck. Trying to pass around a mutable global structure gets you into lifetime hell. Statics, particularly if they are mutable, are almost impossible to use, partly because the damned thing insists on imposing thread-safety upon you, even if your application is inherently single-threaded. Also statics can only be initialized with things that can be computed at compile time. Yes, there's lazy_satic and a thread-local thing, but I ran into road-blocks there, too. Basically, if you like wearing a hair-shirt while writing code and like fighting with your tools, Rust is just the thing for you. Did I mention that the documentation is awful? At this point, the only reason I can see for using Rust is if you have a situation that really can't tolerate garbage collection in any form. I can imagine situations where the pauses due to mark-sweep could be an issue, but reference counting? I wonder if this is a solution in search of a problem. I certainly don't think Rust is a sensible choice for most applications. Reading slashdot recently brought nim to my attention. I'd never heard of it, but what I read suggested that I ought to have a look. I have done that and have re-written my smallest C utility in nim and have gotten it working (I do my work on Arch Linux systems and one machine running DragonFly BSD). So far, I'm very impressed. The language is nicely designed, a very sensible amalgam of good things from places like Python. The performance seems good, though what I've written thus far is not demanding in that regard. What has impressed me most is the speed of my work and the readability of the code. Developing in nim thus far has been comparable to Go and the opposite end of the scale from Rust in terms of productivity and frustration level. The code reads very much like Python and that's a good thing, especially when you consider that you have the added advantage of the performance of compiled code and the debugging advantage of static typing. So I just wanted to drop a note and pay a compliment for what appears to be very good work. Hopefully I won't run into any show-stoppers, but so far, so good. /Don Allen| ---|---
