9 ms·
Nim Community Survey 2019 Results
- jarredkenny 7y agoVery happy to see Nim gaining some adoption. I started using Nim about a year ago and could not be happier with the language. I do wonder what it might take to take Nim towards "main stream" status.
- ac29 7y agoI think it needs a "killer library". The core language is pretty easy to learn if you've used Python, but there aren't a ton of third party libraries, and the ones that do exist seem to be incomplete, poorly documented, buggy, abandoned, or some combination thereof.
- gameswithgo 7y agomaking clones of the top 50 python libraries would make it attractive. familiar syntax! way more speed!
- staticassertion 7y agoThis would be super compelling.
- Random_ernest 7y agoMany of the top 50 python libraries are wrapping a lot of code that is actually c, c++ or fortran. So I doubt that there is a lot of performance to be gained. Numpy is a good examples for that.
- gameswithgo 7y agoI have applied for a job at a company where they were switching from Python to Rust, because even though they were using Numpy, there was a lot of overhead in setting the data up to send to Numpy.
- airstrike 7y agoIt's not those libraries' performances, but allowing people to port their own code with less friction for a presumed gain in performance.
- sergiotapia 7y agoHow would one find these "top 50 python libraries" list?
- shimst3r 7y agoI’d suggest based on PyPI download numbers, see https://hugovk.github.io/top-pypi-packages/ https://hugovk.github.io/top-pypi-packages/
- greggirwin 7y agohttps://libraries.io/ https://libraries.io/ ?
- blackrock 7y agoI got annoyed when it didn’t have a decent standard library to handle command line flags and arguments. The examples given so far, are mediocre. parseopt is incredibly cumbersome. docopt is an incredibly poor design, that I can’t believe anyone thought this was a good idea. And failing to have such basic libraries, I realized, this language has a long way to go. I contemplated building my own library to handle such a need, but why, this doesn’t solve my problem of building something. And if it’s missing such basic libraries, then what else is it missing? The odds were too great, and too risky for me to commit my time to it.
- pathsjs 7y agoThere are many libraries for that, but I suggest cligen. It is the simplest command line parser I have found across all programming languages.
- s_gourichon 7y agoWhat if the Nim maintainers made some kind of continuous popularity measurement to let good libraries bubble up? Opens other problems I know, but may fix such scenario and accelerate Nim adoption?
- pathsjs 7y agoThere was an attempt a few months ago, but it was a little weird. But if you just want to find libraries relevant for your task (e.g. parsing the command line), there is https://nimble.directory https://nimble.directory where all Nim libraries are listed
- deleted 7y ago[deleted]
- alehander42 7y agoyou can try cligen and then argparse https://github.com/iffy/nim-argparse https://github.com/iffy/nim-argparse
- 7y ago
- beagle3 7y agoI'll place my chips on mratism (Arraymancer, Weave, Laser) being the killer librarian. But it will take a decade or two to unseat Python.
- gavinray 7y agoI keep looking for a good excuse to learn it, but it does not fit my domain or my language-style preferences very well. I primarily develop web services, and it is really difficult to beat Typescript due to the fact I can write my front-end, backend, and mobile apps in it (via NativeScript or React Native). I use uWebsockets.js, which has both an HTTP API that is nearly-identical to Express, and a Websocket API that is identical to Socket.io, but performance ~x10 faster than Express and ~x2 faster than the top-performing Go/Rust/C web libraries due to being a C++ library exposed as Node V8 bindings. If I really need performance outside the context of handling web requests, I will write small functions or services in Go/Rust and compile to WASM and invoke it through Node, or just throw it up on OpenFaaS. I like a lot of what Nim does, but I have had a difficult time since finding it two years ago ever coming up with an adequate reason for using it. Edit: I want to make one clarification. I think that Nim may actually have a bright future in ML, primarily due to the work of Mamy Ratsimbazafy. He has some libraries for HPC, Laser [0] and Arraymancer [1] that can smoke C by several orders of magnitude. Combined with Weave [2], the multi-threaded runtime he built for Nim, that opens the doors for ridiculously performant ML. I think the only the other language that would give Nim a run for its money here is Julia, I really dig the work that has been going on there for ML as well. [0] https://github.com/numforge/laser https://github.com/numforge/laser [1] https://github.com/mratsim/Arraymancer https://github.com/mratsim/Arraymancer [2] https://github.com/mratsim/weave https://github.com/mratsim/weave
- bloomer 7y agoSmoke C by several orders of magnitude? Citation needed.
- gavinray 7y agoEntirely reasonable doubt, you can find well-commented benchmark output of the Laser High-Performance Computing lib and Arraymancer lib in their source: https://github.com/numforge/laser/blob/d1e6ae6106564bfb350d4e566261df97dbb578b3/benchmarks/vector_math/bench_exp.nim#L204 https://github.com/numforge/laser/blob/d1e6ae6106564bfb350d4... https://github.com/mratsim/Arraymancer/blob/6fddfa9a734ac01c13a9595adccaac571aa75093/benchmarks/integer_matmul.nim#L21 https://github.com/mratsim/Arraymancer/blob/6fddfa9a734ac01c... To qualify the statement, it would be more accurate to say that Nim can smoke C by several orders of magnitude unless you devote significant engineering efforts into replicating the equivalent Nim (as Nim targets C/C++ regardless, so this is just heavy lifting and optimizations)
- simias 7y agoI wonder what causes the strong European bias in the results, in general in those surveys I'm used to seeing USA #1. Beyond that it actually looks pretty good for the language, it seems popular among experienced developers and they seem pretty happy with it and consider using it for serious work (although obviously the fact that they even bothered to reply to the survey probably biases that).
- tokai 7y agoOf the top ten contributors on github, nine of them are Europeans. I think all nim meet-up/conferences have been in Europe. Makes me wonder if the language would have more mainstream traction if it was more of a US project.
- wtf1234 7y agoThere are various papers on the topic of developer locations. Among community-driven projects USA is very far from #1. Instead it's #1 on corporate stuff.
- Koshkin 7y ago> Efficient, expressive, elegant let people = [ Person(name: "John", age: 45), Person(name: "Kate", age: 30) ] Verbosity at its finest. Compare with C++: Person people[] { { “John”, 45 }, { “Kate”, 30 } };
- deleted 7y ago[deleted]
- willbw 7y agoI am going to give you the benefit of the doubt that this is a joke.
- staticassertion 7y agoWe reading the same code? The nim code is way simpler. Maybe if you'd used auto (if that's possible - now I understand that auto is out of fashion due to sometimes forcing copies) it'd be closer. `let people = [` vs `Person people[] {` Just for starters...
- agumonkey 7y agoah, syntax debate. * goes back to lisp
- kazinator 7y agoThis is a false comparison because you're really comparing by-order-of-argument initialization/construction ("BOA constructors") versus keyword-value initialization/construction. BOA is more compact, but it's possible to get the arguments wrong, and the type system won't save you if you exchange two arguments of the same type. There is no reminder anywhere that 45 and 30 are ages. That's also true in function calls that do not use keyword arguments (the vastly prevalent paradigm in mainstream languages), but function calls specify a function name which can reveal something, like set_age(john, 45). Some languages have both. No knowing anything about Nim, I have no reason to believe that it has no way to achieve a compact way for initializing an array or list of objects using just positional arguments, and no repetition of the type name. If nothing else, surely there has to be a way to write an array of tuples, and that aggregate can surely be passed to some function that iterates over it and constructs the implied Person objects. On the C++ front, I seem to recall C++ recently adding C99 designated initializers or planning to. If so, then { .name = "John", .age = 45 } will be possible, and C++ coders will end up using it.
- awb 7y ago25% reported having never used the language. Surprising that so many people outside the Nim development community would fill out this survey.
- craftinator 7y agoThere has been a lot of observation and speculation about Nim for a few years now. Seems that a lot of people follow it's progress because they like it's philosophies, but don't feel comfortable enough with it's maturity level to dive in (language stability issues and API changes can be really frustrating when you are trying to maintain a project)
- gameswithgo 7y agothey hit 1.0 very recently so maybe more people will start feeling comfortable now.
- flukus 7y agoI'd assume they purposefully reached out to as many as possible, otherwise it just becomes an insular circle jerk. The people currently using the language will presumably have far fewer issues with it than people not using the language for whatever reason.
- codexon 7y agoI used it a few times before but I stopped once I realized it was a long way off from being worth using. The lack of tooling, libraries, and numerous compiler bugs meant that it would be easier for me to write the same thing in C++ even though nim is a superior language. I'd imagine many people came to realize this before even trying it out.
- gameswithgo 7y agohow long ago? I tried it maybe 3 years ago or so, and also ran into a lot of compiler bugs, which I reported. The good news is I saw all of them get fixed! Haven't tried the language since it hit 1.0 recently.
- deleted 7y ago[deleted]
- lasagnaphil 7y agoNim would be really competitive in the gamedev/graphics field if there was a standard library that you can use without the GC. (Technically you can turn off the GC entirely, but you can’t use the current standard library without it.) The language’s especially good for gamedev because of its extensive metaprogramming facilities, a sane build system (which lets you write build scripts with a subset of Nim itself), and the fact that you can load C/C++ libraries with ease.
- glouwbug 7y agoDon't forget, there's an LTO switch built right into the Nim build system which does whole program optimization across C translation units. This is the real killer feature - 40 years of GCC optimization leverage
- pjmlp 7y agoUnreal and Unity appear to be quite competitive with GC. I love Tim Sweeney quotes: "Programming languages without garbage collection send us down a long path of design decisions that lead to slow compile times and fragile runtime performance cliffs." https://twitter.com/timsweeneyepic/status/1223670431095427072 https://twitter.com/timsweeneyepic/status/122367043109542707... "It's interesting that many games can afford a constant 10x interpretation overhead for scripts, but not a spikey 1% for garbage collection." https://twitter.com/timsweeneyepic/status/880607734588211200 https://twitter.com/timsweeneyepic/status/880607734588211200
- jrvarela56 7y agoJust discovered the HN ‘past’ tab. Went back 5 years in order to find something that also appeared today. Nim was the only topic I found in a front page article today and 5 years ago. Maybe just random but I’ll give it a try and report back.
- mindv0rtex 7y agoFunny, today's when I finally decided to start learning Nim. I do C++ with CUDA and Python on top for work. Having looked at the Arraymancer lib, I became interested in the language. Between its outstanding meta programming features and its ability to be compiled to C++, I think it is perfect for the scientific computing domain.
- logicchains 7y agoThanks for pointing it out, that library looks quite interesting. A question: it mentions it "Supports tensors of up to 6 dimensions.". Sadly some of us have to deal with tensors of even more dimensions sometimes. Does Nim support some kind of equivalent to C++'s variadic templates that would allow creating tensors with an arbitrary number of dimensions?
- beagle3 7y agoNim supports variadic templates, type checked variadic run time calls, and macros which let you run readable code at compile time (unlike C++ which has an accidentally turing complete, so can do anything but readability -- or speed -- are not part of that accident). But unless you actually extend Arraymancer to more than 6 dimensions, you will likely lose some speed and convenience. mratsim is a magician. Both Arraymancer (tensor library) and weave (multithreading core) are comparable and in some way better than other similar runtimes, despite being written by one person who is working on other projects as well.
- mratsim 7y agoAuthor here: Actually it's 7 [1] But in my future backend revamp I plan to make the default 6 [2] Note that the line can easily be updated to const MAXRANK* {.intdefine.} = 6 as in the planned revamp and then you would be able to change the MAXRANK with a compile parameter nim c -d:MAXRANK=16 path/to/my/app [1]: https://github.com/mratsim/Arraymancer/blob/6fddfa9a734ac01c13a9595adccaac571aa75093/src/tensor/backend/global_config.nim#L22 https://github.com/mratsim/Arraymancer/blob/6fddfa9a734ac01c... [2]: https://github.com/numforge/laser/blob/d1e6ae6106564bfb350d4e566261df97dbb578b3/laser/dynamic_stack_arrays.nim#L6 https://github.com/numforge/laser/blob/d1e6ae6106564bfb350d4...
- blackrock 7y agoI like the Nim syntax, but I’m not certain why they chose to transpile it to C. Why not just go all the way, and encode it in assembly? Yes, I understand their reasoning, to make use of all the advanced C compilers out there. And to make the code compatible with existing C libraries and APIs. But I feel this is more of a shortcut, and a crutch, that will prevent them from fulfilling their expectations, of being a C language and systems programming replacement. I think the better approach would have been to target assembly code instead, and then, build connections to existing C APIs.
- WalterBright 7y agoD doesn't compile to C code because I found C to be a rather limited platform. By generating native code, I could go beyond what C supported. The vagaries of various C compilers was also a problem.
- Reelin 7y agoGiven that C has raw pointers and inline assembly, what is D doing that it couldn't (easily?) express?
- simias 7y agoInline assembly is a compiler extension and not portable. Beyond that, sure you can do whatever you want in C if you're willing to mess with assembly and non-portable memory tricks but at this point you're better off writing your own native backend. The whole point of generating C instead of machine code is to leverage the existing compiler infrastructure to support a vast number of architectures and generate efficient code. If you just dump inline assembly in a C function or rely on opaque memory shenanigans the C compiler won't be able to meaningfully optimize your code and it probably won't be portable.
- WalterBright 7y ago1. cannot support anything but the C ABI 2. cannot support exception handling 3. cannot support types that C doesn't 4. stuck with C symbolic debug info, not your language's 5. cannot innovate with things like how strings are stored 6. many C compilers do not emit COMDATs 7. no thread local storage 8. chained to slow compilation speeds 9. stuck with trying to find a way to work around C compiler bugs 10. stuck with whatever C compiler the user has, i.e. one has to support multiple versions of multiple C compilers 11. C compiler can change, breaking your compiler The original C++ compiler, cfront, had a LOT of problems with these issues.
- rishav_sharan 7y agoSpeaking for myself, as an absolute novice, OOPs in Nim is not great. it feels shoehorned in, rather than being a primary citizen of the language design. There is too much fiddling with methods vs procs, pragmas and such involved for the most basic stuff. I am tinkering on a small 2d game using Nim. I was planning on using OOPs for most of my game objects. Now I am debating if I should make the effort to actually learn OOPs the Nim way or just do it procedurally. Considering that my project is tiny, I might go for the latter and skip OOPs altogether. So for me right now Nim is a better C, with nicer syntax, simple build system and a package manager.
- dom96 7y agoI would say that this is in some ways by design. Nim offers some OOP features, but in general does its best to discourage the use of OOP. In that sense I would say you should skip OOP and implement everything in a procedural style (it will be more efficient too).
- auxym 7y agoThe only OOP-ish thing I've really missed in nim is interfaces. It seems to be a really convenient way to re-use code: "this function (proc) can operate on any type that has implementations of this and that other function (proc)". Googling has left me with suggestions of using macros to re-implement similar functionality, which I guess is in line with nim's philosophy of "small core with powerful macro system". Looking into it however, developing macros seems like more effort than a simple interface. Just the impressions of someone not super familiar with metaprogramming.
- dom96 7y agoThe idea I think is that someone needs to implement it using macros and get it into Nim's stdlib. Then we can all make use of it. If you're passionate enough about interfaces then you may just be able to implement something that works beautifully and get it merged into stdlib (that would be awesome).
- tokai 7y ago