6 ms·
It's possible to argue here that the problem is not so much the order of type-then-name but the overloaded meanings of * and < at the grammar level.
by stormbrew 7y ago
It's possible to argue here that the problem is not so much the order of type-then-name but the overloaded meanings of * and < at the grammar level.
- lilott8 7y agoMore generally this falls into a discussion of context-specific vs context-free grammars. Of which C++ falls into the former, Java falls into the latter.
- MaxBarraclough 7y agoThe grammar of C++ is not a context-sensitive grammar. It's Turing-complete, on account of its template metaprogramming capabilities. I'd be very surprised if Java's grammar were context-free. Do you have a source for this? I wasn't able to find one with a quick search.
- battery_cowboy 7y agoIt's Turing complete because it could simulate a Turing machine, not because of metaprogramming. The language brainfuck is Turing complete, for example.
- saagarjha 7y agoChecking if a Brainfuck program is well formed (i.e. can be run) is a linear time operation. In C++ this can take forever. They have different complexities.
- battery_cowboy 7y agoThe original comment was about Turing completeness, and it was defined incorrectly. I was giving an example of a dead-simple language that was Turing complete, because the claim was that metaprogramming made C++ Turing complete.
- tom_mellior 7y agoNo, the claim was that metaprogramming made the grammar of C++ Turing complete.
- deleted 7y ago[deleted]
- battery_cowboy 7y agoMetaprogramming in C++ is TC, but it's not what makes C++ TC by itself.
- MaxBarraclough 7y agoYou misunderstand. C++ is Turing-complete at compile time, due to template metaprogramming. This demonstrates that it isn't a context-free grammar. This isn't true of all programming languages.
- battery_cowboy 7y agoThanks, i see what you were saying now, i misunderstood your original comment.
- tom_mellior 7y agoYes, but it is the difference to other programming languages. In C you cannot encode a Turing machine that is executed by the compiler at compile time. In Brainfuck you cannot encode a Turing machine that is executed by the compiler at compile time. In C++ you can encode a Turing machine that is executed by the compiler at compile time. That is the difference we are discussing here.
- benibela 7y ago>In C you cannot encode a Turing machine that is executed by the compiler at compile time. But you can get quite close with macros
- tom_mellior 7y agoPretty much every programming language has a nicely parseable context-free "rough syntax" (my term I just invented) that can be written down formally for the language documentation and a parsing tool. And then every language also has a notion of "well-formed programs", which introduces a whole bunch of additional constraints on what programs should actually be accepted by compiler frontend. Well-formedness includes type checking. But even without full type checking that can be done later, it also includes things like being aware, in C, of whether a given identifier is declared as a typedef in the current scope. So while C has a nice context-free "rough syntax" formally specified in the standard, its actual input language is context sensitive. As for Java, the first example that comes to mind is that constructors must have the same name as the class they belong to. This "choose whatever identifier you like, but at some later point repeat that exact same identifier" is a very typical example of something that is not context-free. You might disagree whether this constraint is part of what you consider Java's "grammar". So the answer to your question depends on what language level you are thinking of. But whichever level you apply to Java, you should apply the same to C++. C++ also has a context-free "rough syntax" in its standard.
- battery_cowboy 7y agohttps://stackoverflow.com/questions/14589346/is-c-context-free-or-context-sensitive https://stackoverflow.com/questions/14589346/is-c-context-fr... Context free means something different to what you're saying here. This is a good discussion of this topic, I never knew C++ was so irregular and informal.