digitalmars.D - D and Nim
- Jonathan (10/10) Jan 04 2015 Hey folks,
- Shammah Chancellor (8/20) Jan 04 2015 I just heard about this language the other hanging out with some other
- JN (2/2) Jan 04 2015 It's compiling to C, I suppose it should be much easier to port
- weaselcat (3/13) Jan 04 2015 AFAIK nim has a much better GC implementation for soft real-time
- Vlad Levenfeld (2/4) Jan 04 2015 What about GC.disable?
- Mengu (4/14) Jan 04 2015 i agree. i first saw nim related threads on HN and they were
- Ary Borenszweig (47/56) Jan 04 2015 In my opinion Nim is superior than D in every aspect (and I say this as
- Jonathan (3/3) Jan 04 2015 I will say that Nim's documentation is severely lacking, even
- Bioinfornatics (2/2) Jan 04 2015 Thanks I will try it. It seems really cool. Maybe my new
- bearophile (6/11) Jan 04 2015 So are Nim developers still in need to find more than two
- Meta (5/9) Jan 04 2015 I agree, it's more likely that there are more undiscovered bugs
- anonymous (19/88) Jan 04 2015 You do want a language war because your spewing too much
- Ary Borenszweig (6/9) Jan 04 2015 If there are library issues (like a slow json parser, or an unusable
- Andrei Alexandrescu (3/12) Jan 04 2015 That's a good point. The new json is blocked on Sönke who is remodeling...
- Ary Borenszweig (22/111) Jan 04 2015 As I said, it's just my personal opinion. Others have said D is superior...
- Walter Bright (3/5) Jan 04 2015 Does Javascript count?
- Ary Borenszweig (3/10) Jan 04 2015 Definitely!
- weaselcat (3/12) Jan 04 2015 the D implementation was a straight translation from C++ and the
- Walter Bright (21/25) Jan 04 2015 You could write the D version with about the same lines of code as the N...
- bearophile (7/13) Jan 04 2015 I don't agree, the good D way is:
- Jonathan (6/6) Jan 04 2015 On a subjective note, I've always felt that D "gets" me as a
- Ary Borenszweig (2/18) Jan 04 2015 Why?
- weaselcat (3/27) Jan 04 2015 Implies intention of the variable at declaration & gives the
- Ary Borenszweig (5/31) Jan 04 2015 The first, maybe (for me it's noise: if I want to mutate it, I do,
- weaselcat (10/13) Jan 04 2015 I'm inclined to believe there's some benefit to explicitly using
- Daniel Murphy (4/11) Jan 04 2015 You're exactly right, the compiler can sometimes tell a variable is neve...
- bearophile (10/14) Jan 04 2015 Since some years Computer Science has found that the right
- Vlad Levenfeld (3/7) Jan 04 2015 Can the compiler automatically make variables immutable if it can
- bearophile (11/13) Jan 04 2015 This is very different from what I am saying. The C compilers
- Ary Borenszweig (4/16) Jan 04 2015 Are there proofs of percentage of bugs caused by incorrectly mutating
- Daniel Murphy (10/13) Jan 04 2015 Every C++ programmer has hit this bug at some point:
- H. S. Teoh via Digitalmars-d (5/21) Jan 04 2015 I actually hit this bug in D. :-/
- Daniel Murphy (5/15) Jan 04 2015 I like that I can just not define a constructor in D structs and it will...
- Jonathan (7/7) Jan 05 2015 Thanks everyone for the incite so far! Reading between the lines,
- Suliman (2/2) Jan 05 2015 What is kill future of Nim?
- Paulo Pinto (5/7) Jan 05 2015 A C++ successor is any language that earns its place in a OS
- "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?= (18/26) Jan 05 2015 But C++ gained traction before any OS officially supported it
- Paulo Pinto (21/49) Jan 05 2015 Yes. It was almost immediately adopted by C compiler vendors
- "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?= (14/20) Jan 05 2015 If there will be a C++17 ABI and it is adopted, then that will be
- Paulo Pinto (19/41) Jan 05 2015 For your reference, http://isocpp.org/files/papers/n4028.pdf
- "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?= (9/12) Jan 05 2015 Yeah, I saw that one, but when ABI was brought up in one of the
- Brian Rogoff (14/21) Jan 05 2015 I'm not sure if you're being serious, but I'd say yes. The space
- Paulo Pinto (11/15) Jan 05 2015 Still it leaves out the systems programming space, which is what
- anonymous (2/4) Jan 05 2015 Nim is successor of Nimrod.
- CraigDillabaugh (3/10) Jan 05 2015 First sentence ... did you mean 'insight' or was that some sort
- bearophile (5/14) Jan 05 2015 I have a bug report for something like that [TM]:
- bearophile (13/16) Jan 05 2015 I don't know, probably not, but the progress in language design
-
Abdulhaq
(2/8)
Jan 05 2015
- Ary Borenszweig (25/37) Jan 05 2015 You said "Computer Science has found that the right
- "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?= (7/11) Jan 05 2015 FWIW, proper computer scientists do not care about making fast
- Daniel Murphy (3/5) Jan 04 2015 It can apply the same optimizations, yes.
- Daniel Murphy (2/16) Jan 04 2015 Reading Walter's post, I somehow knew you'd be posting this exact reply.
- logicchains (15/23) Jan 05 2015 Just a note that the reason it uses printf is because, when ldc
- Joseph Rushton Wakeling via Digitalmars-d (17/20) Jan 04 2015 Meh, if you compare the code in detail you realize (i) the D example "wa...
- Walter Bright (5/6) Jan 04 2015 I bet the D version would be significantly faster if you didn't read the...
- Joseph Rushton Wakeling via Digitalmars-d (4/8) Jan 04 2015 The timing shouldn't include the breaking up into strings etc., only the...
- weaselcat (23/31) Jan 04 2015 It doesn't time that part
- Walter Bright (7/8) Jan 04 2015 You're right, I overlooked that.
- weaselcat (3/12) Jan 04 2015 Small improvement but almost put it equal to C++/gcc, also
- weaselcat (4/12) Jan 04 2015 just realized I forgot the -release flag on ldmd, sped it up past
- Walter Bright (3/6) Jan 04 2015 You can also find dramatic differences in C++ performance from one C++ c...
- Andrei Alexandrescu (2/4) Jan 04 2015 Mistake. -- Andrei
- H. S. Teoh via Digitalmars-d (5/10) Jan 04 2015 When are we going to fix this?
- bearophile (4/5) Jan 04 2015 Soon.
- Brad Anderson (6/16) Jan 05 2015 monarch dodra tried to make a reduce that was backward compatible
- H. S. Teoh via Digitalmars-d (6/25) Jan 05 2015 Should somebody take over the implementation of "fold"? This is
- Andrei Alexandrescu (2/24) Jan 05 2015 If you could that would be great but please fix groupBy first :o) -- And...
- bearophile (6/8) Jan 04 2015 It's a design mistake, but there's a "fold" function replacement
- bearophile (4/7) Jan 04 2015 https://github.com/D-Programming-Language/phobos/pull/1955
- Elie Morisse (18/28) Jan 04 2015 D and Nim have similar goals (conciseness, CTFE, other advanced
- Ary Borenszweig (3/5) Jan 04 2015 It has 'when', which is similar to static if. I would say that's
- Brian Rogoff (31/42) Jan 04 2015 I'm pretty sure that D was not a big inspiration to Nim, even
- Vlad Levenfeld (3/8) Jan 04 2015 Could you elaborate on the difference between D's
- Brian Rogoff (17/19) Jan 04 2015 I'd suggest you read the available documentation on each feature;
Hey folks, I've been recently checking out Nim/rod and feel like it takes a lot of inspiration from D (I think the creator was in the D community too as some point). How do you think it compares? What areas does D, in principle, makes it a better choice? To give you my background, I like creating games (mostly using SDL bindings) using new languages, aiming for the most efficient yet concise way to write the engine and game logic. FYI, this is NOT a language war thread. I'm just curious about what separates them from a principle level.
Jan 04 2015
On 2015-01-04 18:10:51 +0000, Jonathan said:Hey folks, I've been recently checking out Nim/rod and feel like it takes a lot of inspiration from D (I think the creator was in the D community too as some point). How do you think it compares? What areas does D, in principle, makes it a better choice? To give you my background, I like creating games (mostly using SDL bindings) using new languages, aiming for the most efficient yet concise way to write the engine and game logic. FYI, this is NOT a language war thread. I'm just curious about what separates them from a principle level.I just heard about this language the other hanging out with some other techies. I like that it makes some common idioms in D first-class citizens. For example, imperative type declarations are first-class citizens so all the boiler plate around "if (isInputRange!(R))" type stuff goes away in Nim. Unfortunately, they decided to use whitespace to define scope :/ -S.
Jan 04 2015
It's compiling to C, I suppose it should be much easier to port to other platforms than for example D?
Jan 04 2015
On Sunday, 4 January 2015 at 18:10:52 UTC, Jonathan wrote:Hey folks, I've been recently checking out Nim/rod and feel like it takes a lot of inspiration from D (I think the creator was in the D community too as some point). How do you think it compares? What areas does D, in principle, makes it a better choice? To give you my background, I like creating games (mostly using SDL bindings) using new languages, aiming for the most efficient yet concise way to write the engine and game logic. FYI, this is NOT a language war thread. I'm just curious about what separates them from a principle level.AFAIK nim has a much better GC implementation for soft real-time applications because it can be paused.
Jan 04 2015
On Sunday, 4 January 2015 at 19:06:34 UTC, weaselcat wrote:AFAIK nim has a much better GC implementation for soft real-time applications because it can be paused.What about GC.disable?
Jan 04 2015
On Sunday, 4 January 2015 at 18:10:52 UTC, Jonathan wrote:Hey folks, I've been recently checking out Nim/rod and feel like it takes a lot of inspiration from D (I think the creator was in the D community too as some point). How do you think it compares? What areas does D, in principle, makes it a better choice? To give you my background, I like creating games (mostly using SDL bindings) using new languages, aiming for the most efficient yet concise way to write the engine and game logic. FYI, this is NOT a language war thread. I'm just curious about what separates them from a principle level.i agree. i first saw nim related threads on HN and they were mentioning it has CTFE, UFCS and many things that D already has. it got me wondering whether nim was inspired by D.
Jan 04 2015
On 1/4/15 3:10 PM, Jonathan wrote:Hey folks, I've been recently checking out Nim/rod and feel like it takes a lot of inspiration from D (I think the creator was in the D community too as some point). How do you think it compares? What areas does D, in principle, makes it a better choice? To give you my background, I like creating games (mostly using SDL bindings) using new languages, aiming for the most efficient yet concise way to write the engine and game logic. FYI, this is NOT a language war thread. I'm just curious about what separates them from a principle level.In my opinion Nim is superior than D in every aspect (and I say this as my personal opinion, not to trigger a language war). There are examples of D code in these two repos: https://github.com/logicchains/LPATHBench https://github.com/kostya/benchmarks Take a look at for example the first one in D and Nim: https://github.com/logicchains/LPATHBench/blob/master/d.d https://github.com/logicchains/LPATHBench/blob/master/nim.nim According to the writeup: https://github.com/logicchains/LPATHBench/blob/master/writeup.md Nim is faster than D. And it does so with much less code. Then look at kostya/benchmarks: D is always behind Nim (except matuml, where they are similar, but all statically compiled languages are similar in that one). And Nim's code is always shorter and cleaner. (and before you reply to this with "but if you add pure nothrow safe abracadabra", continue reading) There was a time I liked D. But now to make the code fast you have to annotate things with pure nothrow safe to make sure the compiler generates fast code. This leads to code that's uglier and harder to understand. Another point is that Nimrod has CTFE but does so with a virtual machine, so I'm sure it's faster than D in that aspect. Then, Nim is written in Nim. Having the compiler be written in itself is a good way to immediately have the developers of the language get the feeling of the language, find bugs and improve it. Nim has 363 issues accoring to https://github.com/Araq/Nim/issues . D has 2444 according to https://issues.dlang.org/buglist.cgi?component=DMD&limit=0&order=bug_status%2Cpriority%2Cassigned_to%2Cbug_id&product=D&query_format=adv nced&resolution=--- . Also, because the compiler is written in itself, everything is garbage collected, so there are no worried when doing CTFE (D's CTFE consumes a lot of memory, I read in this newsgroup). Nim compiles itself in between 2.5 and 5 seconds. Also, I get the feeling that D has too many features and not all of them work in harmony with the rest of them. So people always find small bugs and others suggest workarounds and eventually people learn to program in a WDD way (Workaround-development-driven). Back to LPATHBench, I find things like minimallyInitializedArray and uninitializedArray, which are great for optimizing things, but it's sad that one has to use these special functions instead of regular ones (idiomatic code) to achieve better performance. Also, "uninitialized" sounds unsafe... And then you must compile your code with -noboundscheck to get more performance, but that's so unsafe... But then, both D and Nim have things which I dislike: too many built-in things. Static arrays, arrays, sequences, etc. Can't these be just implemented in D/Nim? Why the need for special built-in types with special operations? Anyway, just my opinion :-)
Jan 04 2015
I will say that Nim's documentation is severely lacking, even compared to D. For example, it took me far more time figuring out Nim's file io operations.
Jan 04 2015
Thanks I will try it. It seems really cool. Maybe my new favorite language.
Jan 04 2015
Ary Borenszweig:But now to make the code fast you have to annotate things with pure nothrow safe to make sure the compiler generates fast code.Do you have any proof of this?Nim has 363 issues accoring to https://github.com/Araq/Nim/issues . D has 2444 according toSo are Nim developers still in need to find more than two thousand unknown issues? ;-) Bye, bearophile
Jan 04 2015
On Sunday, 4 January 2015 at 22:55:52 UTC, bearophile wrote:I agree, it's more likely that there are more undiscovered bugs in Nim than D, not fewer bugs, if both languages have around the same number of features. Nim also probably has a smaller development team and fewer users to find and submit bugs.Nim has 363 issues accoring to https://github.com/Araq/Nim/issues . D has 2444 according toSo are Nim developers still in need to find more than two thousand unknown issues? ;-)
Jan 04 2015
On Sunday, 4 January 2015 at 21:46:09 UTC, Ary Borenszweig wrote:On 1/4/15 3:10 PM, Jonathan wrote:You do want a language war because your spewing too much bullshit. I dabbled in both d and nim/rod. All interesting in nim is whats taken from d.Hey folks, I've been recently checking out Nim/rod and feel like it takes a lot of inspiration from D (I think the creator was in the D community too as some point). How do you think it compares? What areas does D, in principle, makes it a better choice? To give you my background, I like creating games (mostly using SDL bindings) using new languages, aiming for the most efficient yet concise way to write the engine and game logic. FYI, this is NOT a language war thread. I'm just curious about what separates them from a principle level.In my opinion Nim is superior than D in every aspect (and I say this as my personal opinion, not to trigger a language war).There are examples of D code in these two repos: https://github.com/logicchains/LPATHBench https://github.com/kostya/benchmarks Take a look at for example the first one in D and Nim: https://github.com/logicchains/LPATHBench/blob/master/d.d https://github.com/logicchains/LPATHBench/blob/master/nim.nim According to the writeup: https://github.com/logicchains/LPATHBench/blob/master/writeup.md Nim is faster than D. And it does so with much less code.Bullshit. dmd is easy to beat. also json parsing? library issue.Then look at kostya/benchmarks: D is always behind Nim (except matuml, where they are similar, but all statically compiled languages are similar in that one). And Nim's code is always shorter and cleaner. (and before you reply to this with "but if you add pure nothrow safe abracadabra", continue reading)Bullshit. Main differences are nim has significant whitespace. Code looks shorter because theres less {}. Second difference is nim has code at top level. Great for short benchmarks but aweful in large code.There was a time I liked D. But now to make the code fast you have to annotate things with pure nothrow safe to make sure the compiler generates fast code. This leads to code that's uglier and harder to understand.Bullshit. That stuff makes d more modular than nim.Another point is that Nimrod has CTFE but does so with a virtual machine, so I'm sure it's faster than D in that aspect.How does that make the language superior? Bullshit again.Then, Nim is written in Nim.How does that make the language superior? Bullshit again.Having the compiler be written in itself is a good way to immediately have the developers of the language get the feeling of the language, find bugs and improve it.ddmdNim has 363 issues accoring to https://github.com/Araq/Nim/issues . D has 2444 according to https://issues.dlang.org/buglist.cgi?component=DMD&limit=0&order=bug_status%2Cpriority%2Cassigned_to%2Cbug_id&product=D&query_format=advanced&resolution=---Bullshit. Thats nimrod is less popular than dmd. Jesus i cant believe you can smoke that.. Also, because the compiler is written in itself, everything is garbage collected, so there are no worried when doing CTFE (D's CTFE consumes a lot of memory, I read in this newsgroup). Nim compiles itself in between 2.5 and 5 seconds.How does that make the language superior? Bullshit again.Also, I get the feeling that D has too many features and not all of them work in harmony with the rest of them. So people always find small bugs and others suggest workarounds and eventually people learn to program in a WDD way (Workaround-development-driven).Also, I get the feeling your bullshitting through your ears.Back to LPATHBench, I find things like minimallyInitializedArray and uninitializedArray, which are great for optimizing things, but it's sad that one has to use these special functions instead of regular ones (idiomatic code) to achieve better performance. Also, "uninitialized" sounds unsafe... And then you must compile your code with -noboundscheck to get more performance, but that's so unsafe...Bullshit.But then, both D and Nim have things which I dislike: too many built-in things. Static arrays, arrays, sequences, etc. Can't these be just implemented in D/Nim? Why the need for special built-in types with special operations? Anyway, just my opinion :-)Just a load of bullshit.
Jan 04 2015
On 1/4/15 8:17 PM, anonymous wrote:On Sunday, 4 January 2015 at 21:46:09 UTC, Ary Borenszweig wrote:If there are library issues (like a slow json parser, or an unusable one), these should be top priority instead of adding more features (C++ interop?) to the language. Once everything is smooth more things can be added. Otherwise there's always the feeling that things aren't quite stable and fast enough.On 1/4/15 3:10 PM, Jonathan wrote:Bullshit. dmd is easy to beat. also json parsing? library issue.
Jan 04 2015
On 1/4/15 6:04 PM, Ary Borenszweig wrote:On 1/4/15 8:17 PM, anonymous wrote:That's a good point. The new json is blocked on Sönke who is remodeling his home. -- AndreiOn Sunday, 4 January 2015 at 21:46:09 UTC, Ary Borenszweig wrote:If there are library issues (like a slow json parser, or an unusable one), these should be top priority instead of adding more features (C++ interop?) to the language. Once everything is smooth more things can be added. Otherwise there's always the feeling that things aren't quite stable and fast enough.On 1/4/15 3:10 PM, Jonathan wrote:Bullshit. dmd is easy to beat. also json parsing? library issue.
Jan 04 2015
On 1/4/15 8:17 PM, anonymous wrote:On Sunday, 4 January 2015 at 21:46:09 UTC, Ary Borenszweig wrote:As I said, it's just my personal opinion. Others have said D is superior to Nim and they gave their reasons.On 1/4/15 3:10 PM, Jonathan wrote:You do want a language war because your spewing too much bullshit. I dabbled in both d and nim/rod. All interesting in nim is whats taken from d.Hey folks, I've been recently checking out Nim/rod and feel like it takes a lot of inspiration from D (I think the creator was in the D community too as some point). How do you think it compares? What areas does D, in principle, makes it a better choice? To give you my background, I like creating games (mostly using SDL bindings) using new languages, aiming for the most efficient yet concise way to write the engine and game logic. FYI, this is NOT a language war thread. I'm just curious about what separates them from a principle level.In my opinion Nim is superior than D in every aspect (and I say this as my personal opinion, not to trigger a language war).I actually meant all those annotations (pure nothrow safe immutable final) that appear every time someone ones to get their code run fast.There are examples of D code in these two repos: https://github.com/logicchains/LPATHBench https://github.com/kostya/benchmarks Take a look at for example the first one in D and Nim: https://github.com/logicchains/LPATHBench/blob/master/d.d https://github.com/logicchains/LPATHBench/blob/master/nim.nim According to the writeup: https://github.com/logicchains/LPATHBench/blob/master/writeup.md Nim is faster than D. And it does so with much less code.Bullshit. dmd is easy to beat. also json parsing? library issue.Then look at kostya/benchmarks: D is always behind Nim (except matuml, where they are similar, but all statically compiled languages are similar in that one). And Nim's code is always shorter and cleaner. (and before you reply to this with "but if you add pure nothrow safe abracadabra", continue reading)Bullshit. Main differences are nim has significant whitespace. Code looks shorter because theres less {}. Second difference is nim has code at top level. Great for short benchmarks but aweful in large code.How "pure nothrow safe" make things more modular?There was a time I liked D. But now to make the code fast you have to annotate things with pure nothrow safe to make sure the compiler generates fast code. This leads to code that's uglier and harder to understand.Bullshit. That stuff makes d more modular than nim.Many have complained that CTFE can take about 2 gigs of memory so they can't compile their programs (I think related to vibe.d templates). If that memory was garbage collected there would be no problem. Of course, DMD can have a GC, Walter said it before, but it slowed down things. Nim compiles itself in 2.5~5 seconds with a GC on (I think, please correct me if this is wrong). In any case Crystal compiles itself in about the same time with a GC on, so disabling a GC for speed shouldn't be an excuse.Another point is that Nimrod has CTFE but does so with a virtual machine, so I'm sure it's faster than D in that aspect.How does that make the language superior? Bullshit again.But the main D developers are using dmd, written in C++. I'm not sure they have written large D programs, as big as a compiler (but correct me if I'm wrong). Having a compiler written in D can make things more stable, and authors can improve the language as they get immediate feedback. At least that's how I feel it when I develop Crystal.Then, Nim is written in Nim.How does that make the language superior? Bullshit again.Having the compiler be written in itself is a good way to immediately have the developers of the language get the feeling of the language, find bugs and improve it.ddmdYou might be right, I didn't think of that.Nim has 363 issues accoring to https://github.com/Araq/Nim/issues . D has 2444 according to https://issues.dlang.org/buglist.cgi?component=DMD&limit=0&order=bug_status%2Cpriority%2Cassigned_to%2Cbug_id&product=D&query_format=advanced&resolution=---Bullshit. Thats nimrod is less popular than dmd. Jesus i cant believe you can smoke that.Well, at least give me a reason why most people here recommend compiling with -noboundscheck to get optimal code.. Also, because the compiler is written in itself, everything is garbage collected, so there are no worried when doing CTFE (D's CTFE consumes a lot of memory, I read in this newsgroup). Nim compiles itself in between 2.5 and 5 seconds.How does that make the language superior? Bullshit again.Also, I get the feeling that D has too many features and not all of them work in harmony with the rest of them. So people always find small bugs and others suggest workarounds and eventually people learn to program in a WDD way (Workaround-development-driven).Also, I get the feeling your bullshitting through your ears.Back to LPATHBench, I find things like minimallyInitializedArray and uninitializedArray, which are great for optimizing things, but it's sad that one has to use these special functions instead of regular ones (idiomatic code) to achieve better performance. Also, "uninitialized" sounds unsafe... And then you must compile your code with -noboundscheck to get more performance, but that's so unsafe...Bullshit.Maybe.But then, both D and Nim have things which I dislike: too many built-in things. Static arrays, arrays, sequences, etc. Can't these be just implemented in D/Nim? Why the need for special built-in types with special operations? Anyway, just my opinion :-)Just a load of bullshit.
Jan 04 2015
On 1/4/2015 6:11 PM, Ary Borenszweig wrote:But the main D developers are using dmd, written in C++. I'm not sure they have written large D programs, as big as a compiler (but correct me if I'm wrong).Does Javascript count? https://github.com/DigitalMars/DMDScript
Jan 04 2015
On 1/5/15 12:42 AM, Walter Bright wrote:On 1/4/2015 6:11 PM, Ary Borenszweig wrote:Definitely! I take my word then.But the main D developers are using dmd, written in C++. I'm not sure they have written large D programs, as big as a compiler (but correct me if I'm wrong).Does Javascript count? https://github.com/DigitalMars/DMDScript
Jan 04 2015
On Sunday, 4 January 2015 at 21:46:09 UTC, Ary Borenszweig wrote:There are examples of D code in these two repos: https://github.com/logicchains/LPATHBench https://github.com/kostya/benchmarks Take a look at for example the first one in D and Nim: https://github.com/logicchains/LPATHBench/blob/master/d.d https://github.com/logicchains/LPATHBench/blob/master/nim.nim According to the writeup: https://github.com/logicchains/LPATHBench/blob/master/writeup.md Nim is faster than D. And it does so with much less code.the D implementation was a straight translation from C++ and the nim version was written by a regular nimrod contributor...
Jan 04 2015
On 1/4/2015 1:46 PM, Ary Borenszweig wrote:There are examples of D code in these two repos: https://github.com/logicchains/LPATHBench https://github.com/kostya/benchmarks Nim is faster than D. And it does so with much less code.You could write the D version with about the same lines of code as the Nim version. For example, the D version has two implementations in it, the Nim one. The D version has an extra function it in that is manually inlined in the Nim one. The only significant difference is that Nim doesn't use { }, and so saves a line here and there. For another example, Nim: for neighbour in nodes[nodeId].neighbours: D: foreach(immutable route neighbour; nodes[nodeID].neighbours){ Correctly written D: foreach (neighbour; nodes[nodeID].neighbours){ Not a dime's worth of difference. For another, Nim: echo result, " LANGUAGE Nim ", int(duration * 1000) D: printf("%d LANGUAGE D %d\n", len, sw.peek().msecs); Correctly written D: writeln(len, " LANGUAGE D ", sw.peek().msecs); Pretty much the same for the rest.
Jan 04 2015
Walter Bright:Nim: for neighbour in nodes[nodeId].neighbours: D: foreach(immutable route neighbour; nodes[nodeID].neighbours){ Correctly written D: foreach (neighbour; nodes[nodeID].neighbours){I don't agree, the good D way is: foreach (immutable neighbour; nodes[nodeID].neighbours) { D programmers should apply const/immutable to every variable that doesn't need to mutate. Bye, bearophile
Jan 04 2015
On a subjective note, I've always felt that D "gets" me as a developer. This is extremely subjective, but I found that in many cases I could just write code without consulting documentation when I was learning the language. Even talking about the "immutable" For statement, I discovered this by writing code that seemed logical to the situation.
Jan 04 2015
On 1/4/15 9:27 PM, bearophile wrote:Walter Bright:Why?Nim: for neighbour in nodes[nodeId].neighbours: D: foreach(immutable route neighbour; nodes[nodeID].neighbours){ Correctly written D: foreach (neighbour; nodes[nodeID].neighbours){I don't agree, the good D way is: foreach (immutable neighbour; nodes[nodeID].neighbours) { D programmers should apply const/immutable to every variable that doesn't need to mutate.
Jan 04 2015
On Monday, 5 January 2015 at 01:56:20 UTC, Ary Borenszweig wrote:On 1/4/15 9:27 PM, bearophile wrote:Implies intention of the variable at declaration & gives the compiler more opportunities for optimizationWalter Bright:Why?Nim: for neighbour in nodes[nodeId].neighbours: D: foreach(immutable route neighbour; nodes[nodeID].neighbours){ Correctly written D: foreach (neighbour; nodes[nodeID].neighbours){I don't agree, the good D way is: foreach (immutable neighbour; nodes[nodeID].neighbours) { D programmers should apply const/immutable to every variable that doesn't need to mutate.
Jan 04 2015
On 1/4/15 11:09 PM, weaselcat wrote:On Monday, 5 January 2015 at 01:56:20 UTC, Ary Borenszweig wrote:The first, maybe (for me it's noise: if I want to mutate it, I do, otherwise I don't). For the second, the compiler can tell that if you don't assign anything more to it then it's immutable. So I'm not sure the second one is true.On 1/4/15 9:27 PM, bearophile wrote:Implies intention of the variable at declaration & gives the compiler more opportunities for optimizationWalter Bright:Why?Nim: for neighbour in nodes[nodeId].neighbours: D: foreach(immutable route neighbour; nodes[nodeID].neighbours){ Correctly written D: foreach (neighbour; nodes[nodeID].neighbours){I don't agree, the good D way is: foreach (immutable neighbour; nodes[nodeID].neighbours) { D programmers should apply const/immutable to every variable that doesn't need to mutate.
Jan 04 2015
On Monday, 5 January 2015 at 02:12:21 UTC, Ary Borenszweig wrote:For the second, the compiler can tell that if you don't assign anything more to it then it's immutable. So I'm not sure the second one is true.I'm inclined to believe there's some benefit to explicitly using immutable as Walter has written about it more than once, and it's in D's own documentation. While I'm sure the compiler can infer immutability, it probably becomes more difficult as the lifetime of the objects become more complicated... but I'm in no position to make a statement about it, maybe Walter or Andrei could chime in. http://dlang.org/const3.html http://www.drdobbs.com/architecture-and-design/optimizing-immutable-and-purity/228700592
Jan 04 2015
"weaselcat" wrote in message news:nopttywdkgouyxnlrwcf forum.dlang.org...I'm inclined to believe there's some benefit to explicitly using immutable as Walter has written about it more than once, and it's in D's own documentation. While I'm sure the compiler can infer immutability, it probably becomes more difficult as the lifetime of the objects become more complicated... but I'm in no position to make a statement about it, maybe Walter or Andrei could chime in.You're exactly right, the compiler can sometimes tell a variable is never modified, but will have serious trouble when it comes to class members, indirections, global/tls variables, etc.
Jan 04 2015
Ary Borenszweig:Since some years Computer Science has found that the right default for variables is to have them immutable, and to have them mutable on request. Immutable variables make the code simpler to understand for programmers and more handy for compilers. The less moving parts your code has, the better it's for you. More explanations on request. Bye, bearophileD programmers should apply const/immutable to every variable that doesn't need to mutate.Why?
Jan 04 2015
On Monday, 5 January 2015 at 03:56:31 UTC, bearophile wrote:Immutable variables make the code simpler to understand for programmers and more handy for compilers. The less moving parts your code has, the better it's for you. More explanations on request.Can the compiler automatically make variables immutable if it can prove that they are never changed in some code?
Jan 04 2015
Vlad Levenfeld:Can the compiler automatically make variables immutable if it can prove that they are never changed in some code?This is very different from what I am saying. The C compilers don't go to add a "const" annotation to your source code (but perhaps the Rust compiler warns about mut variables that don't get mutated). Inferring that a D template function is pure because it contains no side effects is not the same thing as stating it is pure in the source code. In the second case you get an error if you try to print from the function, it's part of the function contract. Bye, bearophile
Jan 04 2015
On 1/5/15 1:54 AM, bearophile wrote:Vlad Levenfeld:Are there proofs of percentage of bugs caused by incorrectly mutating variables that were supposed to be immutable? I don't remember having such bug in my life.Can the compiler automatically make variables immutable if it can prove that they are never changed in some code?This is very different from what I am saying. The C compilers don't go to add a "const" annotation to your source code (but perhaps the Rust compiler warns about mut variables that don't get mutated). Inferring that a D template function is pure because it contains no side effects is not the same thing as stating it is pure in the source code. In the second case you get an error if you try to print from the function, it's part of the function contract. Bye, bearophile
Jan 04 2015
"Ary Borenszweig" wrote in message news:m8d6g5$hna$1 digitalmars.com...Are there proofs of percentage of bugs caused by incorrectly mutating variables that were supposed to be immutable? I don't remember having such bug in my life.Every C++ programmer has hit this bug at some point: struct S { int a; S(int a) { a = a; } };
Jan 04 2015
On Mon, Jan 05, 2015 at 05:18:36PM +1100, Daniel Murphy via Digitalmars-d wrote:"Ary Borenszweig" wrote in message news:m8d6g5$hna$1 digitalmars.com...I actually hit this bug in D. :-/ T -- Nearly all men can stand adversity, but if you want to test a man's character, give him power. -- Abraham LincolnAre there proofs of percentage of bugs caused by incorrectly mutating variables that were supposed to be immutable? I don't remember having such bug in my life.Every C++ programmer has hit this bug at some point: struct S { int a; S(int a) { a = a; } };
Jan 04 2015
"H. S. Teoh via Digitalmars-d" wrote in message news:mailman.4136.1420439089.9932.digitalmars-d puremagic.com...I like that I can just not define a constructor in D structs and it will still let me create them with S(0). I get to drop at least some of my useless init functions.struct S { int a; S(int a) { a = a; } };I actually hit this bug in D. :-/
Jan 04 2015
Thanks everyone for the incite so far! Reading between the lines, I gather most thoughts are that both languages are similar in their positioning/objectives yet differ in certain domains (e.g. generic/template capabilities) and qualities (e.g. Nim opinionated choice of scope delimiters). Does that sound logical? This was kind of the thing I was fishing for when thinking of the post.
Jan 05 2015
What is kill future of Nim? D is successor of C++, but Nim? Successor of Python?
Jan 05 2015
On Monday, 5 January 2015 at 09:51:22 UTC, Suliman wrote:What is kill future of Nim? D is successor of C++, but Nim? Successor of Python?A C++ successor is any language that earns its place in a OS vendors SDK as the OS official supported language for all OS layers. Which one it will be is still open game.
Jan 05 2015
On Monday, 5 January 2015 at 10:21:12 UTC, Paulo Pinto wrote:On Monday, 5 January 2015 at 09:51:22 UTC, Suliman wrote:But C++ gained traction before any OS officially supported it (sans BeOS)? Without an ABI, I think C++ will be it's own successor. And I think key C++ people know this and will avoid creating an ABI... Besides that I don't think there will be a single replacement. It will more likely be several languages aiming at different domains where you have different hardware requirements (hpc, embedded, servers, interactive apps...) D needs to pick one area, and do it well there. * If D is aiming for conserving memory and realtime apps, then it needs better memory model/reference type system, * if D is aiming for convenient server programmer (that can afford wasting memory), then it need to tune the language for better garbage collection. With no tuning... other languages will surpass it. Be it Rust, Chapel, Go, Nim or one of the many budding language projects that LLVM has inspired...What is kill future of Nim? D is successor of C++, but Nim? Successor of Python?A C++ successor is any language that earns its place in a OS vendors SDK as the OS official supported language for all OS layers. Which one it will be is still open game.
Jan 05 2015
On Monday, 5 January 2015 at 13:13:43 UTC, Ola Fosheim Grøstad wrote:On Monday, 5 January 2015 at 10:21:12 UTC, Paulo Pinto wrote:Yes. It was almost immediately adopted by C compiler vendors given it came from AT&T and as compatible with C. UNIX vendors jumped on it for CORBA and telecommunications (C++ original field) so by the early 90's pretty much all UNIXes had some form of C++ support. Walter's work was also an influence, given it was the first C++ compiler to directly produce native code. Epoch/Symbian and later OS/400 revisions were also done in C++. On MS-DOS I was already using C++ back in 1993.On Monday, 5 January 2015 at 09:51:22 UTC, Suliman wrote:But C++ gained traction before any OS officially supported it (sans BeOS)?What is kill future of Nim? D is successor of C++, but Nim? Successor of Python?A C++ successor is any language that earns its place in a OS vendors SDK as the OS official supported language for all OS layers. Which one it will be is still open game.Without an ABI, I think C++ will be it's own successor. And I think key C++ people know this and will avoid creating an ABI...C ABI only works in OS that happen to be written in C. There are a few where this is not the case. OS/400 is such an example. For C++ there is the Itanium ABI, COM/WinRT on Windows and the upcoming C++17 ABI.Besides that I don't think there will be a single replacement. It will more likely be several languages aiming at different domains where you have different hardware requirements (hpc, embedded, servers, interactive apps...) D needs to pick one area, and do it well there. * If D is aiming for conserving memory and realtime apps, then it needs better memory model/reference type system, * if D is aiming for convenient server programmer (that can afford wasting memory), then it need to tune the language for better garbage collection. With no tuning... other languages will surpass it. Be it Rust, Chapel, Go, Nim or one of the many budding language projects that LLVM has inspired...Yes there are lots of options, still the ones that live longer as system programming languages, are the ones that get OS vendor adoption. So far, it has always been the case. -- Paulo
Jan 05 2015
On Monday, 5 January 2015 at 13:47:24 UTC, Paulo Pinto wrote:For C++ there is the Itanium ABI, COM/WinRT on Windows and the upcoming C++17 ABI.If there will be a C++17 ABI and it is adopted, then that will be the beginning of the end for C++ IMO. (Wishful thinking... ;-)Yes there are lots of options, still the ones that live longer as system programming languages, are the ones that get OS vendor adoption. So far, it has always been the case.By my definition of "system level programming" the only adopted system level programming language since the 1980s has been C (and C++ only as C-with-bells-and-whistles). Then you have some fringe languages such as Ada, and now probably also Rust as it is approaching version 1.0. I cannot really see Nim or D taking that slot. They appear to have too wide a scope. I think only a focused language that can bring along better optimization and manual memory handling has a chance against C/C++ in system programming. (We have to remember that C/C++ are moving too with various extensions that also are gaining traction: OpenMP, Cilk...)
Jan 05 2015
On Monday, 5 January 2015 at 14:22:04 UTC, Ola Fosheim Grøstad wrote:On Monday, 5 January 2015 at 13:47:24 UTC, Paulo Pinto wrote:For your reference, http://isocpp.org/files/papers/n4028.pdfFor C++ there is the Itanium ABI, COM/WinRT on Windows and the upcoming C++17 ABI.If there will be a C++17 ABI and it is adopted, then that will be the beginning of the end for C++ IMO. (Wishful thinking... ;-)Yes, C, C++, Ada have all been adopted by OS vendors for systems programming (bare metal/full OS stack).Yes there are lots of options, still the ones that live longer as system programming languages, are the ones that get OS vendor adoption. So far, it has always been the case.By my definition of "system level programming" the only adopted system level programming language since the 1980s has been C (and C++ only as C-with-bells-and-whistles). Then you have some fringe languages such as Ada, and now probably also Rust as it is approaching version 1.0.I cannot really see Nim or D taking that slot. They appear to have too wide a scope. I think only a focused language that can bring along better optimization and manual memory handling has a chance against C/C++ in system programming. (We have to remember that C/C++ are moving too with various extensions that also are gaining traction: OpenMP, Cilk...)Sadly me neither. I think C++11/14 has improved the language quite a lot. For those willing to wait until 2017, it will look even better, assuming modules and concepts lite get in. Clang/XCode also brought the .NET/JVM tooling capabilities to C++, which is being adopted by other vendors (JetBrains, Microsoft, ...). However, the majority of C++ code out there is mostly pre-C++98 in style. So what I got to learn from CppCon 2014 videos is that I should not miss my C++ days at work. It also remains to be seen what Apple and Microsoft do with their new babies (Swift, .NET Native, Dafny). -- Paulo
Jan 05 2015
On Monday, 5 January 2015 at 14:52:00 UTC, Paulo Pinto wrote:For your reference, http://isocpp.org/files/papers/n4028.pdfYeah, I saw that one, but when ABI was brought up in one of the CppCon videos I perceived a lack of enthusiasm among the other committee members. Maybe I got the wrong impression, we'll see...It also remains to be seen what Apple and Microsoft do with their new babies (Swift, .NET Native, Dafny).Yes. I bet the management of big corporations often focus more on what the competitors are doing than pure technical merits. So I am pretty sure that Microsoft is keen to have something like Swift, just in case. I guess that means increased internal
Jan 05 2015
On Monday, 5 January 2015 at 10:21:12 UTC, Paulo Pinto wrote:On Monday, 5 January 2015 at 09:51:22 UTC, Suliman wrote:I'm not sure if you're being serious, but I'd say yes. The space where I see Nim being successful is mostly occupied by Python and Go. That it can compete with D in some systems programming, or for games, is nice, but games are dominated by C++ and I don't see how any new language displaces it in the near future. That doesn't mean that the OP shouldn't experiment though. With some effort in the scientific space, I believe that Nim could compete with MATLAB/R/Julia, but currently the libraries just don't exist. But the language would appeal to scientific programmers I think, more so than would D.What is kill future of Nim? D is successor of C++, but Nim? Successor of Python?A C++ successor is any language that earns its place in a OS vendors SDK as the OS official supported language for all OS layers.I think a C++ successor is a language that 'enough' people would choose where before they'd have chosen C++. Java has already cleared that bar.
Jan 05 2015
On Monday, 5 January 2015 at 15:51:14 UTC, Brian Rogoff wrote:... I think a C++ successor is a language that 'enough' people would choose where before they'd have chosen C++. Java has already cleared that bar.Still it leaves out the systems programming space, which is what is being discussed. Java might have again a shot at it, when AOT, value types and the new JNR (Java Native Runtime) land, but that is only planned to be fully available by Java 10 timeline. There are implementations like JikesRVM, Excelsior JET Embedded, MicroEJ among others that target bare metal, but many developers aren't aware of them. -- Paulo
Jan 05 2015
On Monday, 5 January 2015 at 09:51:22 UTC, Suliman wrote:What is kill future of Nim? D is successor of C++, but Nim? Successor of Python?Nim is successor of Nimrod.
Jan 05 2015
On Monday, 5 January 2015 at 08:13:29 UTC, Jonathan wrote:Thanks everyone for the incite so far! Reading between the lines, I gather most thoughts are that both languages are similar in their positioning/objectives yet differ in certain domains (e.g. generic/template capabilities) and qualities (e.g. Nim opinionated choice of scope delimiters). Does that sound logical? This was kind of the thing I was fishing for when thinking of the post.First sentence ... did you mean 'insight' or was that some sort of Freudian slip :o)
Jan 05 2015
Daniel Murphy:Every C++ programmer has hit this bug at some point: struct S { int a; S(int a) { a = a; } };I have a bug report for something like that [TM]: https://issues.dlang.org/show_bug.cgi?id=3878 Bye, bearophile
Jan 05 2015
Ary Borenszweig:Are there proofs of percentage of bugs caused by incorrectly mutating variables that were supposed to be immutable?I don't know, probably not, but the progress in language design is still in its pre-quantitative phase (note: I think Rust variables are constant by default, and mutable on request with "mut"). It's not just a matter of bugs, it's also a matter of making the code simpler to better/faster understand what a function is doing and how.I don't remember having such bug in my life.Perhaps you are very good, but a language like D must be designed for more common programmers like Kenji Hara, Andrei Alexandrescu, or Raymond Hettinger. Bye, bearophile
Jan 05 2015
On Monday, 5 January 2015 at 11:01:51 UTC, bearophile wrote:<kapow!>I don't remember having such bug in my life.Perhaps you are very good, but a language like D must be designed for more common programmers like Kenji Hara, Andrei Alexandrescu, or Raymond Hettinger. Bye, bearophile
Jan 05 2015
On 1/5/15 8:01 AM, bearophile wrote:Ary Borenszweig:You said "Computer Science has found that the right default for variables is to have them immutable". I don't think "Rust == Computer Science". Otherwise their compiler would be fast (Computer Science knows how to do fast compilers). At least I like that they are introducing a new feature to their language that none other has: lifetimes and borrows. But I find it very hard to read their code. Take a look for example at the lerp function defined in this article: http://www.willusher.io/2014/12/30/porting-a-ray-tracer-to-rust-part-1/ Rust: ~~~ pub fn lerp<T: Mul<f32, T> + Add<T, T> + Copy<T>>(t: f32, a: &T, b: &T) -> T { *a * (1.0 - t) + *b * t } ~~~ C++: ~~~ template<typename T> T lerp(float t, const T &a, const T &b){ return a * (1.f - t) + b * t; } ~~~Are there proofs of percentage of bugs caused by incorrectly mutating variables that were supposed to be immutable?I don't know, probably not, but the progress in language design is still in its pre-quantitative phase (note: I think Rust variables are constant by default, and mutable on request with "mut"). It's not just a matter of bugs, it's also a matter of making the code simpler to better/faster understand what a function is doing and how.I don't think those are common programmers :-)I don't remember having such bug in my life.Perhaps you are very good, but a language like D must be designed for more common programmers like Kenji Hara, Andrei Alexandrescu, or Raymond Hettinger.
Jan 05 2015
On Monday, 5 January 2015 at 14:40:18 UTC, Ary Borenszweig wrote:You said "Computer Science has found that the right default for variables is to have them immutable". I don't think "Rust == Computer Science". Otherwise their compiler would be fast (Computer Science knows how to do fast compilers).FWIW, proper computer scientists do not care about making fast compilers... They care about proving properties such as "why and when algorithm 1 is faster than algorithm 2 for data sets that approaches infinite size, given infinite memory"... Computer Science is the stepchild of Discrete Mathematics. Highly impractical, but very useful.
Jan 05 2015
"Vlad Levenfeld" wrote in message news:xrizfcicbvbkhtpvugvm forum.dlang.org...Can the compiler automatically make variables immutable if it can prove that they are never changed in some code?It can apply the same optimizations, yes.
Jan 04 2015
"bearophile" wrote in message news:bwxlgpicmmnvphyiqyxt forum.dlang.org...Reading Walter's post, I somehow knew you'd be posting this exact reply.D: foreach(immutable route neighbour; nodes[nodeID].neighbours){ Correctly written D: foreach (neighbour; nodes[nodeID].neighbours){I don't agree, the good D way is: foreach (immutable neighbour; nodes[nodeID].neighbours) { D programmers should apply const/immutable to every variable that doesn't need to mutate.
Jan 04 2015
On Monday, 5 January 2015 at 00:01:34 UTC, Walter Bright wrote:D: printf("%d LANGUAGE D %d\n", len, sw.peek().msecs); Correctly written D: writeln(len, " LANGUAGE D ", sw.peek().msecs);Just a note that the reason it uses printf is because, when ldc was working on ARM, writeln produced gibberish characters. On Sunday, 4 January 2015 at 21:46:09 UTC, Ary Borenszweig wrote:There was a time I liked D. But now to make the code fast you have to annotate things with pure nothrow safe to make sure the compiler generates fast code. This leads to code that's uglier and harder to understand.For this particular benchmark I noticed little effect on the speed of the program from these annotations, I just originally added them for that warm fuzzy feeling that comes from marking things immutable/pure. Also, in relation to comments about -boundscheck=off (aka noboundscheck), it's interesting to check out the latest Rust version. Previously, it was a bit slower than C++, D and Nimrod. Now, it matches them... by converting the code to use a tree in order to avoid bounds checks! https://github.com/logicchains/LPATHBench/blob/master/rs.rs. Personally I prefer D's approach.
Jan 05 2015
On 04/01/15 22:46, Ary Borenszweig via Digitalmars-d wrote:According to the writeup: https://github.com/logicchains/LPATHBench/blob/master/writeup.md Nim is faster than D. And it does so with much less code.Meh, if you compare the code in detail you realize (i) the D example "wastes" a lot of lines with imports, { } brackets, and a second implementation of the core algorithm using std.range/std.algorithm functionality instead of the "naive" (but it seems, faster) implementation. The rest of the weight in lines is down to a not-so-nice "readPlaces" method that could be rewritten idiomatically in D in much less space, but no one's bothered because it's not actually part of the benchmark. Now, to the numbers -- the x86-64 benchmark shows a 50ms difference between Nim and D. That's such a trivial difference, it's difficult to know what is responsible; depending on whether the results are averaged over multiple runs, it might even just be random fluctuation, or differences in the implementation of the time measurement. Looking at the runbench.sh code, I don't think there is any averageing, so it's not a very certain measure of what is best. The results from the Haswell processor seem more clear-cut, but without more information, I'd hazard a guess that there the person concerned tweaked the build file to use dmd, rather than the superior (for code speed) ldc2 or gdc.
Jan 04 2015
On 1/4/2015 1:46 PM, Ary Borenszweig wrote:Nim is faster than D.I bet the D version would be significantly faster if you didn't read the file as a text string, then try breaking it up into an array of lines, then break those lines up into an array of strings, etc. This is a lot of memory allocation. Instead, open the file and use byLine() on it, which does not allocate memory.
Jan 04 2015
On 05/01/15 01:53, Walter Bright via Digitalmars-d wrote:I bet the D version would be significantly faster if you didn't read the file as a text string, then try breaking it up into an array of lines, then break those lines up into an array of strings, etc. This is a lot of memory allocation. Instead, open the file and use byLine() on it, which does not allocate memory.The timing shouldn't include the breaking up into strings etc., only the actual calculation of the longest path. Are you concerned that some kind of GC event might be being triggered, skewing the timing of the latter?
Jan 04 2015
On Monday, 5 January 2015 at 00:54:45 UTC, Walter Bright wrote:On 1/4/2015 1:46 PM, Ary Borenszweig wrote:It doesn't time that part Either way I sped it up by changing the non-fast(?) part a little bit int getLongestPath(immutable(node[]) nodes, const int nodeID, bool[] visited) nothrow safe{ visited[nodeID] = true; scope(exit) visited[nodeID] = false; return reduce!(max)(0, nodes[nodeID].neighbours .filter!(x=>!visited[x.dest]) .map!(x => x.cost + getLongestPath(nodes, x.dest, visited))); } I'm not that great at D though. Compiled it with LDC, GDC and DMD seem to choke on the functional programming and run 4-5x slower. ~1120 ms with my version, ~1210 ms with the 'fast' version the C++ version compiled with gcc still beats it by about 100ms on my machine, but it's the same exact performance as C++ when using clang/LLVM. Why does reduce! take the seed as its first parameter btw? It sort of messes up function chaining.Nim is faster than D.I bet the D version would be significantly faster if you didn't read the file as a text string, then try breaking it up into an array of lines, then break those lines up into an array of strings, etc. This is a lot of memory allocation. Instead, open the file and use byLine() on it, which does not allocate memory.
Jan 04 2015
On 1/4/2015 5:07 PM, weaselcat wrote:It doesn't time that partYou're right, I overlooked that. You can also speed things up by noticing that the nodes[] and visited[] arguments never change, so getLongestPath can be made as a nested function with those arrays as locals in the enclosing function. This will reduce stack consumption, improving cache performance, and nodeID will get passed in a register.
Jan 04 2015
On Monday, 5 January 2015 at 01:30:08 UTC, Walter Bright wrote:On 1/4/2015 5:07 PM, weaselcat wrote:Small improvement but almost put it equal to C++/gcc, also greatly sped up GDC weirdly(not quite LDC speed though)It doesn't time that partYou're right, I overlooked that. You can also speed things up by noticing that the nodes[] and visited[] arguments never change, so getLongestPath can be made as a nested function with those arrays as locals in the enclosing function. This will reduce stack consumption, improving cache performance, and nodeID will get passed in a register.
Jan 04 2015
On Monday, 5 January 2015 at 01:07:07 UTC, weaselcat wrote:Compiled it with LDC, GDC and DMD seem to choke on the functional programming and run 4-5x slower. ~1120 ms with my version, ~1210 ms with the 'fast' version the C++ version compiled with gcc still beats it by about 100ms on my machine, but it's the same exact performance as C++ when using clang/LLVM. Why does reduce! take the seed as its first parameter btw? It sort of messes up function chaining.just realized I forgot the -release flag on ldmd, sped it up past clang and within ~40ms of C++ with gcc. gdc and dmd still woefully slow with functional version.
Jan 04 2015
On 1/4/2015 5:33 PM, weaselcat wrote:just realized I forgot the -release flag on ldmd, sped it up past clang and within ~40ms of C++ with gcc. gdc and dmd still woefully slow with functional version.You can also find dramatic differences in C++ performance from one C++ compiler to another.
Jan 04 2015
On 1/4/15 5:07 PM, weaselcat wrote:Why does reduce! take the seed as its first parameter btw? It sort of messes up function chaining.Mistake. -- Andrei
Jan 04 2015
On Sun, Jan 04, 2015 at 07:25:28PM -0800, Andrei Alexandrescu via Digitalmars-d wrote:On 1/4/15 5:07 PM, weaselcat wrote:When are we going to fix this? T -- Nothing in the world is more distasteful to a man than to take the path that leads to himself. -- Herman HesseWhy does reduce! take the seed as its first parameter btw? It sort of messes up function chaining.Mistake. -- Andrei
Jan 04 2015
H. S. Teoh:When are we going to fix this?Soon. Bye, bearophile
Jan 04 2015
On Monday, 5 January 2015 at 04:10:41 UTC, H. S. Teoh via Digitalmars-d wrote:On Sun, Jan 04, 2015 at 07:25:28PM -0800, Andrei Alexandrescu via Digitalmars-d wrote:monarch dodra tried to make a reduce that was backward compatible while moving the seed but it didn't work out in the end. He was working on a "fold" which was basically reduce with the arguments swapped but I'm not sure what happened to it.On 1/4/15 5:07 PM, weaselcat wrote:When are we going to fix this? TWhy does reduce! take the seed as its first parameter btw? It sort of messes up function chaining.Mistake. -- Andrei
Jan 05 2015
On Mon, Jan 05, 2015 at 06:12:41PM +0000, Brad Anderson via Digitalmars-d wrote:On Monday, 5 January 2015 at 04:10:41 UTC, H. S. Teoh via Digitalmars-d wrote:Should somebody take over the implementation of "fold"? This is something that ought to be fixed. T -- Laissez-faire is a French term commonly interpreted by Conservatives to mean 'lazy fairy,' which is the belief that if governments are lazy enough, the Good Fairy will come down from heaven and do all their work for them.On Sun, Jan 04, 2015 at 07:25:28PM -0800, Andrei Alexandrescu via Digitalmars-d wrote:monarch dodra tried to make a reduce that was backward compatible while moving the seed but it didn't work out in the end. He was working on a "fold" which was basically reduce with the arguments swapped but I'm not sure what happened to it.On 1/4/15 5:07 PM, weaselcat wrote:When are we going to fix this? TWhy does reduce! take the seed as its first parameter btw? It >sort of messes up function chaining.Mistake. -- Andrei
Jan 05 2015
On 1/5/15 11:03 AM, H. S. Teoh via Digitalmars-d wrote:On Mon, Jan 05, 2015 at 06:12:41PM +0000, Brad Anderson via Digitalmars-d wrote:If you could that would be great but please fix groupBy first :o) -- AndreiOn Monday, 5 January 2015 at 04:10:41 UTC, H. S. Teoh via Digitalmars-d wrote:Should somebody take over the implementation of "fold"? This is something that ought to be fixed.On Sun, Jan 04, 2015 at 07:25:28PM -0800, Andrei Alexandrescu via Digitalmars-d wrote:monarch dodra tried to make a reduce that was backward compatible while moving the seed but it didn't work out in the end. He was working on a "fold" which was basically reduce with the arguments swapped but I'm not sure what happened to it.On 1/4/15 5:07 PM, weaselcat wrote:When are we going to fix this? TWhy does reduce! take the seed as its first parameter btw? It >sort of messes up function chaining.Mistake. -- Andrei
Jan 05 2015
weaselcat:Why does reduce! take the seed as its first parameter btw? It sort of messes up function chaining.It's a design mistake, but there's a "fold" function replacement for reduce that has the right order of arguments. I don't know why "fold" isn't in Phobos yet. Bye, bearophile
Jan 04 2015
It's a design mistake, but there's a "fold" function replacement for reduce that has the right order of arguments. I don't know why "fold" isn't in Phobos yet.https://github.com/D-Programming-Language/phobos/pull/1955 https://issues.dlang.org/show_bug.cgi?id=10670 Bye, bearophile
Jan 04 2015
On Sunday, 4 January 2015 at 18:10:52 UTC, Jonathan wrote:Hey folks, I've been recently checking out Nim/rod and feel like it takes a lot of inspiration from D (I think the creator was in the D community too as some point). How do you think it compares? What areas does D, in principle, makes it a better choice? To give you my background, I like creating games (mostly using SDL bindings) using new languages, aiming for the most efficient yet concise way to write the engine and game logic. FYI, this is NOT a language war thread. I'm just curious about what separates them from a principle level.D and Nim have similar goals (conciseness, CTFE, other advanced metaprogramming features to reduce code redundancies to zero..), but although Nim has cool ideas it's not without some drawbacks: - Only limited polymorphism, Nim doesn't use virtual tables but dispatch trees for performance, and that means that you can't have "opaque" base classes running derived methods if the overriding methods are unknown to the compiler: http://nim-lang.org/manual.html#multi-methods http://forum.nimrod-lang.org/t/278 - No conditional evaluation of code - No type traits - Declarations are order-dependent - Generics are redundant with templates (they are going to be removed though: http://forum.nimrod-lang.org/t/638 ) IMHO the two languages are similar but D is more advanced, and apart from AST macros I don't see any notable appealing features from Nim compared to D.
Jan 04 2015
On 1/4/15 8:32 PM, Elie Morisse wrote:On Sunday, 4 January 2015 at 18:10:52 UTC, Jonathan wrote:- No conditional evaluation of codeIt has 'when', which is similar to static if. I would say that's conditional evaluation of code.
Jan 04 2015
On Sunday, 4 January 2015 at 18:10:52 UTC, Jonathan wrote:Hey folks, I've been recently checking out Nim/rod and feel like it takes a lot of inspiration from D (I think the creator was in the D community too as some point).I'm pretty sure that D was not a big inspiration to Nim, even though Araq (Andreas Rumpf) has commented here on occasion.How do you think it compares?Overall, I much prefer Nim. The obvious first difference is syntax (Nim uses an offside rule like Python/Haskell/ISWIM) and for some people that's a huge difference which determines which they'll prefer. Nim's parametric polymorphism is less powerful than D's I think (the words 'generic' and 'template' are used differently in the two communities so I'll try and be extra clear) but Nim has a powerful macro system and a (still unfinished) kind of "type classes" which give it an edge on D. D has a simple class based OO that looks a lot like Java, and ties reference semantics to classes. D has a rather unique multi method based OO system. There are quite a few more things (concurrency, effect system, iterators vs ranges, ..) but I'll just advise you to look.What areas does D, in principle, makes it a better choice?Larger language community. Lower bus factor too, I think. Subjectively, D feels to me like an attempt to fix and improve C++. Nim feels more like a language in the Delphi/Modula-3 tradition with Python syntax. If you can't stand that syntax, stay away. It's not changing.To give you my background, I like creating games (mostly using SDL bindings) using new languages, aiming for the most efficient yet concise way to write the engine and game logic.Nim's GC was designed with games in mind. D's GC (which can be disabled) is not usually considered a strong point of the language implementation.FYI, this is NOT a language war thread. I'm just curious about what separates them from a principle level.Quite a lot separates them, even though they both target similar areas. Best to read a few tutorials and write some small programs in each. You might also try asking on the Nim forum. I realize you say you're not starting a language flame war, but the etiquette of the question is a bit problematic. Hopefully I don't fan any flames with my answer.
Jan 04 2015
On Monday, 5 January 2015 at 01:12:29 UTC, Brian Rogoff wrote:Nim's parametric polymorphism is less powerful than D's I think (the words 'generic' and 'template' are used differently in the two communities so I'll try and be extra clear) but Nim has a powerful macro system and a (still unfinished) kind of "type classes" which give it an edge on D.Could you elaborate on the difference between D's templates/mixins and Nim's macros/type classes?
Jan 04 2015
On Monday, 5 January 2015 at 01:21:07 UTC, Vlad Levenfeld wrote:Could you elaborate on the difference between D's templates/mixins and Nim's macros/type classes?I'd suggest you read the available documentation on each feature; for example Nim's user defined type classes are described here http://nim-lang.org/manual.html#user-defined-type-classes and the Nim's templates/macros are also described with examples in the manual. One caveat is that user defined type classes are not really useable now and will probably be feature gated (not removed as some other poster here suggested) so it's not fair to talk about them as though they actually exist now. They're more like multiple alias this or D's precise GC ;-). D templates (what is called generics in Nim) are more powerful than Nim generics. Maybe Nim will pick up some of those features (HKTs are a desired feature in Rust and maybe in Nim too) and maybe not. It's really difficult to compare languages and features. Like I said, pick a small project and write some code in each. I found Nim really easy to pick up for small projects; a bit easier than D and much easier than Rust, which I like, but find slow going.
Jan 04 2015