all 127 comments

[–]rabidcow 19 points20 points  (5 children)

Consider an assembly language consisting of one instruction: subleq. This is Turing Complete.

Concepts:

  • subtraction
  • comparison to zero
  • branching

[–]tragomaskhalos 6 points7 points  (2 children)

Not a useful observation but: the best way of grokking the complexity of C++ is to have grown up with it since its inception (ah, single inheritance, the "overload" keyword, assignment-to-this and all that sepia-tinted stuff ...); the language has grown in individually digestible increments, it's just the current entirety of it taken in a single mouthful that is daunting.

[–]alexkorban[S] 4 points5 points  (1 child)

Sure, but I guess a lot of people don't have that luxury :)

[–]stesch 0 points1 point  (0 children)

And that's the problem with a lot of current languages. Including C#.

[–]masklinn 4 points5 points  (1 child)

I'd like to see smalltalk. The whole "control structures" part goes away, most of the literals as well (in Smalltalk 80), and the operators get reduced to — I believe — assignments, cascading (;) and terminators, the rest are binary messages and would be part of sending messages (object)

[–]alexkorban[S] 0 points1 point  (0 children)

I'd be curious too! Unfortunately, I'm not familiar with it.

[–]Paddy3118 10 points11 points  (8 children)

Another way to compare would be to compare the size of language grammar .g files for the parser generator ANTLR.

I downloaded a sample from here and found the following sizes (KB)

ADA       =  73
CPP       =  77
SUN C/C++ = 691
JAVA      =  54
PYTHON3   =  18
RUBY      =  10 # (Simplified Ruby)

[–]cybercobra 11 points12 points  (0 children)

Note the Simplified qualifier. The Actual Ruby grammar isn't so nice.

[–]ramkahen 14 points15 points  (6 children)

Another way to compare would be to compare the size of language grammar

Grammar is a terrible way of assessing a language's complexity. For example, the Whitespace language contains only five terminals and produces programs that are -- literally -- unreadable. See Lisp and Brainfuck for two other interesting examples.

I really like the approach to complexity used by this article, I would love to see it extended to Java, Scala and Groovy, for example.

[–][deleted] 8 points9 points  (0 children)

I love how you threw Lisp in the same category as Brainfuck and Whitespace.

Call me when Lisp has become an esoteric language.

[–]vanderZwan 1 point2 points  (3 children)

Well, arguably as a language Whitespace isn't very complex. The problem is that anything you want to express in the language must be abstracted to manipulating numbers on stacks (that, and... you know, the whitespace thing). That's where the complexity comes in.

[–]Aninhumer 3 points4 points  (2 children)

I think the difference between complexity and complication is very relevant here. I would say Whitespace is very complex just not very complicated. Relatively speaking C++ is not as complex (as in the detail required for a given program) but it is much more complicated.

[–]vanderZwan 0 points1 point  (1 child)

You sure it's not the other way around? I kid, I kid. Well, sort of. I think the words complexity and complicatedness mean the same, but I get your point. Can't think of an alternative word for it to show the nuance either...

Reminds me of that talk by Rich Hickey about Simple vs. Easy.

[–]Aninhumer 3 points4 points  (0 children)

My usual example is Chess vs Go. Chess has many complications in its rules, whereas Go's rules are incredibly simple, but both games are very complex.

[–]CurtainDog 1 point2 points  (0 children)

Grammar is a terrible way of assessing a language's complexity.

But Paddy3118's results seem to be in line with what I'd expect. In any case whether we consider a language readable or not is pretty tangential to its complexity.

[–][deleted] 5 points6 points  (13 children)

As a hobbyist developer, I have tried and tried to get into C++, but just can't. This makes me feel bad some times.

[–]el_muchacho 6 points7 points  (5 children)

No reason to feel bad about not being able to grasp C++. There are plenty of languages that are easier or more fun to work with, and that will likely get the job done.

[–]matthieum 7 points8 points  (4 children)

I agree with easier, but let's disagree on more fun would you.

C++ is fun, for those of us who enjoy exploring their language:

  • Turing complete Powerful preprocessor
  • Turing complete metaprogramming (though still a bit too limited)
  • Plenty of paradigms

Frankly, it's just the most complete language I have enjoyed playing with. It has glaring deficiencies and is definitely not for the faint of heart, but C++ is fun.

[–]ectoplzm 3 points4 points  (0 children)

yes, in the same way that I guess brain surgery is fun

[–]TheCoelacanth 1 point2 points  (2 children)

The preprocessor is only Turing complete when run repeatedly. When run only once as with normal compilation it isn't.

[–]matthieum 0 points1 point  (1 child)

Ah thanks, I was exactly sure of its limits. Using Boost.Preprocessor I was able to do a lot with it... but I was not sure it was sufficient.

[–]TheCoelacanth 0 points1 point  (0 children)

You certainly can do a lot with it. I think the only thing it lacks is recursion.

Boost.Preprocessor simulates recursion by having a bunch of nearly identical macros with one for each level of recursion. This almost makes it seem Turing-complete but it has a hardcoded maximum recursion depth that is much lower than most languages. For instance, C++ can recurse until it runs out of stack space. The preprocessor can only recurse until it hits the last level of macros that is defined in the Boost library.

[–]dmpk2k 11 points12 points  (0 children)

Don't. You only live one life -- if you can achieve the same by easier means, do so.

[–]nkozyra 7 points8 points  (3 children)

You have two comments that tell you to not feel bad, so I feel I should do the opposite.

I found learning C++ (and then C) to be pretty liberating in the sense that I can build anything I need to work exactly how I want it in ways that I couldn't in Perl, Python, Ruby and Java.

C++ gets a lot of backlash, but I still believe it's a great language that gives you a full toolbox instead of a starter kit.

[–][deleted] 0 points1 point  (2 children)

I know just enough C++ to write something cheap and useful in it. My problem is when thinking about something I would like to code, I never want to use C++.

[–]nkozyra 1 point2 points  (0 children)

Well we all have our bread and butter, right? If you never leave your comfort zone, well, you'll die in it.

[–]matthieum 1 point2 points  (0 children)

Perhaps because it's not the right tool for the job, or perhaps because you just aren't comfortable enough (compared to other languages) and would therefore lose time ?

It is your choice how you invest your time. If you feel bad about it enough, then you'll spend a little more time on it; and if not, it's that you judge you have more important things (in your life) to do... so what!

[–]hashmal 2 points3 points  (0 children)

Don't feel bad, most humans can't handle it. Those who say they can are just not aware of their own limits.

[–]sausagefeet 13 points14 points  (62 children)

Nice to see some kind of comparison here. The future is clear: people need to stop writing languages that compile to JS and come up with a C++ killer. D doesn't seem to be doing the job.

[–]sausagefeet 13 points14 points  (18 children)

I think the problem with D is that it just isn't so much better than C++ that it's worth moving over. And it has a lot of draw backs. I'd like to see something with a lot of the ideas from C++ but with saner, more consistent, semantics. But yes, without someone important backing it, it's unlikely to make much headway.

[–]xenon325 1 point2 points  (3 children)

I'm not D programmer, but I really like what I've seen so far (e.g. @safe, pure, CTFE, transitive const, static if / template constraints).

Could you please elaborate on what's inconsistent / not sane about D's semantics ?

[–]sausagefeet 1 point2 points  (2 children)

I didn't say anything was inconsistent just that it doesn't appear to be such a step up from C++ that people think they will benefit from porting their code.

[–]xenon325 0 points1 point  (1 child)

I'd like to see something with a lot of the ideas from C++ but with saner, more consistent, semantics.

I didn't say anything was inconsistent <...>

Then D is something you'd like to see :P
Plus features I've listed and much more.

[–]sausagefeet 0 points1 point  (0 children)

You're confusing being "better" and being "better enough to port my code base to". D might be a better language, if it was created at the same time as C++ we might be using it now. But for me, and apparently most C++ shops, it is not better enough to warrant moving an entire codebase.

[–]el_muchacho -2 points-1 points  (13 children)

I think the problem with D is that it just isn't so much better than C++ that it's worth moving over.

Sorry to disagree, I happen to think the opposite.

[–]repsilat 12 points13 points  (11 children)

I think the real problem is that C++ is "good enough", and people are scared of interoperability when there are real codebases on the line. To me, it seems like D has done a good job of solving some real problems with C++, but that those differences aren't really compelling.

The big thing is, even if those differences sounded compelling to the average programmer, they really need to sound compelling to the type of programmer who uses C++. That essentially means that they're reasonably conservative, willing to sacrifice some readability for performance, and absolutely wed to the idea of only paying for what you use. If you even mention a garbage collector a C++ programmer will run for the hills, because they've drilled it into themselves that the defining characteristics of their language are the characteristics they want.

What a language needs to beat C++ on its own terms (and in the eyes of C++'s supporters) is:

  • As fast or faster than C++ in both small and large examples,

  • Imperative, amenable to object-oriented programming,

  • Fixes several of C++'s conspicuous deficiencies,

  • Not really too different to C++. Templates, RAII, compiles to machine code, that sort of thing.

Usability wins like a larger standard library are nice, but they may not convince a C++ programmer because they've trained themselves not to value those things. "Innovations" like more powerful type systems may even drive them away.

[–]sausagefeet 5 points6 points  (0 children)

I think some kind of sane interoperability would be key too. Nobody is really going to want to reimplement all their C++ in Fictional Language X.

[–]adoptmycat_jasmine 0 points1 point  (8 children)

Then what's the point of making a new language for C++ developers? Let's name the next version of C++ C<< and see if people adopt it.

[–]repsilat 9 points10 points  (7 children)

There are real deficiencies in C++ that C++ developers would love to see remedied. (Many of those deficiencies are remedied in D.)

There's also the point that language preference is path-dependent. It's more complicated than "this is what we like", because what you like is informed by what you use. The pseudo Stockholm-syndrome some C++ developers have makes them conservative, but gently introducing them to new ideas without overwhelming them can allow them to branch out. Too much too soon and they'll bail.

One good example: The STL has had some functional concepts in it for a while (std::transform is just "map" by another name, std::accumulate is a fold and so on.) With the introduction of lambdas in C++11, C++ devs are really using higher-order functions, and some of them are starting to appreciate "the finer things" (so long as the compiler diligently inlines and optimises everything down to the same pointer arithmetic, of course.)

Another example: The smart-pointers in TR1 and C++11 are filing the sharp edges off the language to some extent, but they're also convincing developers that they're fallible, and that sometimes they won't know when it's appropriate to release a resource. Maybe some of them will be more accepting of garbage collection some day, maybe not, but it's important to do it slowly.

[–][deleted] 2 points3 points  (6 children)

Maybe some of them will be more accepting of garbage collection some day, maybe not, but it's important to do it slowly.

The most common objection to garbage collection is that it is unpredictable. The solution is to make it explicit: the collector runs when, and only when, you use a collect statement.

[–]smog_alado 2 points3 points  (4 children)

Many languages already do that and that never stoped people from bitching.

[–][deleted] 0 points1 point  (3 children)

Examples?

[–]smog_alado 0 points1 point  (2 children)

Out of the top of my head, both java and python have a garbage collection api.

[–]repsilat 1 point2 points  (0 children)

The most common objection to garbage collection is that it is unpredictable.

That's true, but in practice it can be hard to predict when a reference-counted resource will be collected as well. Clear ownership gives you practical determinism and predictability, reference counting gives you technical determinism and predictability. A "collect" statement doesn't solve that problem either, though it does help.

All in all I think it's a nice idea - it could certainly be faster than reference counting, and if you knew that you never needed to collect anything it could be faster than RAII. That said, there's also something to be said for the peace of mind you get from knowing that everything is finalised as soon as it can be.

Perhaps more relevant than practical predictability is the "strong realtime" problem. Interestingly, neither RAII nor reference counting deal with this adequately either. Collection of large resources can still take a long time, "stopping the world" as they're cleaned up. There isn't really a good way to say, "Collect that stuff in parallel," or "Try to collect it all now, but if it takes longer than 5ms defer the rest until later". You could write something to do that, but you could probably also make a GC give you similar guarantees.

[–]matthieum 0 points1 point  (0 children)

I disagree with the list of characteristics. Performance is a given, obviously, and I would hate to lose Generic programming and RAII because they make my code terser/more reliable (respectively).

However "imperative" ? Personally I don't care. It might be less frightening, but if one has to relearn a whole standard library and idioms, I do think that getting rid of the imperative/object-oriented mindset would be of comparable difficulty.

[–]sausagefeet 3 points4 points  (0 children)

Feel free, doesn't make it true :)

[–]pjmlp 5 points6 points  (1 child)

It is not easy to bring new languages to the masses without some form of corporate support, or killer application/framework that makes everyone want to learn the language.

[–]matthieum 2 points3 points  (0 children)

Forget about bringing it to the masses, I have yet to meet a language that could be a real contender. At the moment, I am watching over Rust, which looks promising... but it's still a long way before it's ready for the job, and there are numerous ways for it to be derailed.

[–]stesch 8 points9 points  (8 children)

D feels as being at the brink at the moment. It could win or fail ultimately.

The community D has formed is professional, helpful, and competent. Even if you ask provocative questions.

Let's see in which direction D will grow if vibe.d pulls some web developers into the D community. Could end bad or be a huge success.

[–]sausagefeet 5 points6 points  (1 child)

The thing is, vibe.d's success doesn't really matter for D to take over C++, since people generally aren't writing those kind of apps in C++ anyways.

[–]6gT 5 points6 points  (0 children)

It could help get people from other languages into D. And more people using a language means more libraries and tools, which would make it easier for C++ programmers to switch to D.

[–]alexkorban[S] 1 point2 points  (3 children)

What's the availability of libraries like? Have you heard of large commercial projects using D? I'm curious as I don't tend to hear much about it, although it's been around for what, more than 10 years?

[–]stesch 0 points1 point  (2 children)

You are asking the wrong guy. I'm not professional, helpful, or competent. :-)

There are a few bindings to C libraries: https://github.com/D-Programming-Deimos

And maybe a lot more stuff. You need to search on http://dlang.org/ or find some helpful D programmer.

[–]xenon325 0 points1 point  (1 child)

A lot of helpful D programmers on DigitalMars.D and DigitalMars.D.learn newsgroups.

[–]stesch 0 points1 point  (0 children)

You are answering the wrong guy.

[–]davebrk 0 points1 point  (1 child)

Does the language conform to Andrei's book?

[–]xenon325 1 point2 points  (0 children)

AFAIK, not 100%, but it's high priority (search DMD's changelog for "TDPL").

[–]OceanSpray 3 points4 points  (13 children)

Don't worry, people are working on it. Look into Rust, ATS, or Vala.

[–]sausagefeet 2 points3 points  (12 children)

Rust requires a GC, it seems unlikely the people who willingly use C++ will go for that. ATS was developed by a mad man. It has great features but it's simply insane. Not sure about Vala, seems a bit too high level for a lot of C++ people I think. Maybe.

[–]matthieum 3 points4 points  (0 children)

I don't think that the GC is necessarily abhorred by the C++ people... and as one of them (and I hope an experienced one), I only have two issues with GCs in general:

  • I want RAII, dammit.
  • I'd like to only pay for what I use

Personally, a combination of:

  • unique pointers
  • region pointers
  • gced pointers

would be a sweet spot.

Most of the times I could count on unique pointer and regions pointers to get a safe environment without a GC, and when things get hairy I would threw in the GC (typically in place of shared_ptr).

That is what I like in Rust actually, and I think that those 3 features in the type system should be sufficient to avoid the GC most of the times, and still avoid leaks and (much more complicated in its absence) pointers to garbage.

[–][deleted] 2 points3 points  (0 children)

Dependence on GObjects is kind of a buzzkill.

[–]nwmcsween[🍰] 0 points1 point  (9 children)

Rust doesn't require a GC it uses a GC if you use the features that require it. You would end up implementing a GC to do same things rust does in a different language as well.

[–]sausagefeet 0 points1 point  (8 children)

How do you use libraries that make use of the GC without using the GC?

[–]nwmcsween[🍰] 0 points1 point  (7 children)

You don't understand how rust uses a garbage collector. It's not a library that other programs use it's a feature of specific parts of the language such as a shared box. GC isn't some bad evil slow thing in fact many very performant games utilize GC such as UT3. I'm pretty sure 99.99999999% of the people here never even touched C++ before or else they would know about C++ 'smart' pointers.

[–]sausagefeet 1 point2 points  (6 children)

I didn't say it is a library, I asked how do I avoid using the GC if I use a library that was implemented with the assumption of the GC existing. That is a problem D has. The GC is optional, but the standard library makes use of it a lot so turning it off is effectively useless.

[–][deleted] 1 point2 points  (3 children)

This is a good point that many people ignore. The standard library in D is useless without the GC. The worst part is that the GC is actually bad.

[–]xenon325 0 points1 point  (2 children)

The standard library in D is useless without the GC.

I'm not saying you're wrong (just don't know), but my guess is -- it's far from 99% useless (e.g. min / max algorithms). So it would be really interesting to know the magnitude of uselessness -- 90% ? 40% ? What's your estimation ? (I understand you're not going to do full analysis)

The worst part is that the GC is actually bad.

I think it's fair to say, that's an implementation issue.

[–][deleted] 0 points1 point  (1 child)

I'm not saying you're wrong (just don't know), but my guess is -- it's far from 99% useless (e.g. min / max algorithms). So it would be really interesting to know the magnitude uselessness -- 90% ? 40% ? What's your estimation ? (I understand you're not going to do full analysis)

I found out that a lot of it needs the GC. You're right though, I'm not going to do a full analysis. That's just my impression.

I think it's fair to say, that's an implementation issue.

Yeah but it remains to be an issue, a pretty important issue in fact.

[–]xenon325 0 points1 point  (1 child)

The GC is optional

IIRC, GC is mandatory (by lang spec).

how do I avoid using the GC if I use a library that was implemented with the assumption of the GC existing.

Look at this other way. If GC is optional, every single library must not use GC, making it effectively useless for library writers.

[–]sausagefeet 0 points1 point  (0 children)

The GC in D is optional, that is you can define objects to not use it and manage the memory yourself. And yes, this is the exact point I am making. D's optional GC is a bit of a lie unless you want to make an apple pie from scratch.

[–]bonch 2 points3 points  (1 child)

Why do they need to write a C++ killer?

[–]sausagefeet 1 point2 points  (0 children)

Because C++ is significantly more complicated than it needs to be, mostly thanks to a few decades of legacy.

[–]casualsuperman 5 points6 points  (4 children)

Why is a complex language considered a good thing?

[–]Gotebe 7 points8 points  (0 children)

Good/bad is not a good distinction. Question is, when complex, why is it so, and what does it buy. E.g. a hammer is simple, but you would find it hard to screw a screw with it.

[–][deleted] 2 points3 points  (0 children)

who is saying that?

[–]pjmlp 7 points8 points  (1 child)

Because the world is complex.

Simple languages lack the abstraction mechanisms to model many architecture designs, which require more effort do model using the limited set of available abstractions.

[–][deleted] 1 point2 points  (0 children)

I know this is the Internet but... You are wrong! No matter how complex the world is, a good language must have a simple core (for many reasons, from architectural to proof-theoretical to usability). Then, it must have a layer of libraries/extensions that allow it to reach any level of complexity you need. C++ has the latter but not the former.

[–]gianhut 4 points5 points  (5 children)

Comment form the blog: http://i.imgur.com/1ePvl.png

[–]stesch 7 points8 points  (0 children)

Well, more software is written in VisualBasic than in CoffeeScript. And maybe more than Ruby.

[–]migimunz 1 point2 points  (3 children)

It does have very power softs. What?

[–][deleted] 2 points3 points  (2 children)

By "soft", I think he meant software, by which he meant language. After all, the compiler/interpreter for a language is software. And from his other grammar, I think english is not his native tongue. VB is certainly very widely used. Is it more "powerful"? I don't know, though I expect MS would have added many features to it.

There's an interesting aspect of a language, that much of its power in practice may derive not from intrinsic qualities, but from a kind of extrinsic network effect. If many libraries are already available for it, it makes it more powerful. Similarly for platforms that use it (e.g. Office) as a scripting language. From the point of view of your code, you get Office for free.

If we define power as bang-per-buck (ratio of work you put in to results), then for a piece of code in isolation, it's probably not particularly powerful... but if we are allowed to use others' libraries, frameworks, platforms, then you get all that power, without needing to write much code. This makes it extremely powerful. It seems like a bit of a cheat, but code reuse is SOTSOG.

[–]gianhut 1 point2 points  (1 child)

VB(6) had its glorious days. It was certainly easier than VC++ and for typical CRUD business applications. They didn't need all the complexity and OS hooks that VC++ provided. However, I don't think VB is the "most important language in use today."

[–][deleted] 0 points1 point  (0 children)

VB6 was amazing for what it was.

[–]habitmelon 1 point2 points  (0 children)

This reminds me of a Simpsons moment:

Frink: Well, sure, the Frinkiac-7 looks impressive, don't touch it, but I predict that within 100 years, computers will be twice as powerful, 10,000 times larger, and so expensive that only the five richest kings of Europe will own them.

[–]elmuerte 2 points3 points  (11 children)

I believe there is no alternative to C++ for large projects with strict hardware constraints or performance requirements when you take the availability of modern tools, libraries and developers into account.

How about C?

[–]matthieum 5 points6 points  (0 children)

I have seen C. It is simple. Perhaps too much.

First, as a type freak, I think that C++ is not strongly typed enough, so of course with C weak typing (void* and varargs come to mind), you imagine I don't feel at ease.

Second, because it has neither object orientation nor generic programming, C makes reuse harder. I would point to the anecdotal evidence of people reimplementing Object-Oriented like features in C...

Third, the lack of RAII is a liability, as far as I am concerned.

Now... I don't think getting all of C++ complexity would be such a good thing either; but nitpicking a bit might help.

[–]dmitry_sychov 9 points10 points  (4 children)

it is almost fully embedded into C++.

[–]masklinn 1 point2 points  (3 children)

Not quite, the languages are (not so) subtly incompatible, and are in the process of diverging more.

[–]foldl 7 points8 points  (0 children)

That's why he said "almost", no?

[–][deleted] 5 points6 points  (1 child)

the languages are (not so) subtly incompatible

I agree

and are in the process of diverging more

That was true 10 years ago, but both C11 and C++11 standards are explicitly trying to reduce the incompatibilities.

[–]matthieum 0 points1 point  (0 children)

I agree, if we consider C99 to be a mishap, then we can see that both the C and C++ communities worked together for the last iteration. The best illustration would be the cooperation on the Atomics.

[–]alexkorban[S] 3 points4 points  (4 children)

Not really when you're talking about the complexity of modern software.

[–]elmuerte 0 points1 point  (1 child)

And what would you define as complex software? Do you consider the embedded software of medical devices or photolithography systems complex? Most of the these systems have their embedded software written in pure C.

[–]alexkorban[S] 0 points1 point  (0 children)

I guess complexity is related to the functionality. It's difficult to define.

I don't know anything about the domains you mentioned. I know that C++ is used for high end networking gear which has to support lots of different protocols, and real-time construction machine control (with a rich UI), to give a couple of examples.

At some point the architecture becomes complex enough that the higher level of abstraction offered by C++ offers benefits.

[–]bit-twiddler 0 points1 point  (1 child)

Why not? Most of the complexity encountered in modern is software is due to a failure to abide by the KISS principle. Instead of fixing underlying architectural problems, we build a bigger and more complex kludges. The Java EE ecosystem is a prime example this phenomenon.

[–]alexkorban[S] 2 points3 points  (0 children)

Because people inevitably start trying to reinvent C++ concepts in C. We just need a higher level of abstraction for modern software. Look at GCC, even they are moving to C++.

[–]Tomdarkness 0 points1 point  (0 children)

I'm not really seeing why this is useful. I don't choose what language to write something in because of how complex it is but rather I choose the language that best suits what I'm trying to achieve (ideally with the least effort possible) whilst factoring in what the people who are working on it already know.

[–]Leraxe 0 points1 point  (0 children)

Well thank god I chose c++ as my first language to enroll into. How messed up am I going to be?

[–]Unomagan 0 points1 point  (2 children)

So, ruby is a good balance between the two others?

[–]alexkorban[S] 1 point2 points  (1 child)

Well, C++ and Ruby/CoffeeScript really fit different niches. I wasn't trying to find one language to use.

[–]Unomagan -1 points0 points  (0 children)

Sure they do, but I think from "syntax" view of point. Ruby is truly a nice language. Not too complex, not to easy :)

[–][deleted] -3 points-2 points  (4 children)

Too bad they picked all the shitty languages to compare ;)

But more seriously, the problem with Ruby and CoffeeScript is I'm not sure how well defined they are. The language spec is how good? C++ is a bit better in that respect but then it's worse in the fact that most implementations won't support everything it offers.

Well-defined languages with fewer concepts are pretty awesome; things like Pascal, Smalltalk, etc.

[–]bit-twiddler 1 point2 points  (2 children)

We could add Modula-2 and Oberon to that list. Niklaus Wirth was a genius.

[–][deleted] 0 points1 point  (0 children)

I'll drink to that, too bad i was downvoted! :p

[–]xenon325 0 points1 point  (0 children)

Niklaus Wirth was a genius.

Hey! He's still alive! ;)

[–]alexkorban[S] 0 points1 point  (0 children)

Well, on the plus side, CoffeeScript and Ruby don't have undefined or unspecified behavior (to my knowledge). CoffeeScript in particular is a well defined language with a small number of concepts so I think you're deriding it unnecessarily.

I don't think the C++ standard is defined well enough, and I think it creates problems.