3 ms·
> In object-oriented languages like Java or C++, you can implement your AST as an abstract base class and a set of subclasses, and do matching using straightfor
by jcelerier 6y ago
> In object-oriented languages like Java or C++, you can implement your AST as an abstract base class and a set of subclasses, and do matching using straightforward type tests — instanceof in Java, or dynamic_cast in C++.
but at a pretty large cost : now everything has to be boxed, will be dynamically allocated by default (yes, object pools and small-size optimization, but that does not produce very readable code and needs constant care), you risk slicing, every access has an indirection, etc.
Migrating some C++ code from OOP inheritance to variant-like stack-allocated value types has always resulted in n-fold improvements to runtime performance in my case.
- tom_mellior 6y ago> now everything has to be boxed [...] every access has an indirection, etc. The article makes clear that it is speaking of compiler intermediate representations. Those are pretty much by definition boxed, linked data structures that live on the heap. > Migrating some C++ code from OOP inheritance to variant-like stack-allocated value types has always resulted in n-fold improvements to runtime performance in my case. Was this in the context of processing some form of programming language IR?
- otabdeveloper4 6y agoYes, C++ is not an "object-oriented language" and never was. The OO features were added because at the time it was the raging fad and people thought that every language simply must have "OOP". But "OOP" was never a foundational principle for C++, more like a tacked-on sidecar.
- tom_mellior 6y agoYou're arguing that a language that arose specifically to add classes to C was not meant to be object-oriented? I'd be interested in seeing that argument fleshed out in more detail.
- gpderetta 6y agoIt is true that subsequent c++ evolution de-emphasised OOP, but you are completely right that the original selling point of C++ over C definitely was (Simula style) OOP.
- otabdeveloper4 6y agoThree points: a) 'Simula style' isn't at all like the Smalltalk-derived programming patterns we call 'OOP'. (Simula was about actor-oriented programming anyways, hence the name.) b) The unique differentiator for C++ was the STL, and not the OOP features that were done better and cleaner in other languages. c) The killer feature for early C++ adoption was operator overloading, not inheritance. (Pretty much nobody liked using inheritance in C++ even back in the day.)
- tom_mellior 6y ago> Simula was about actor-oriented programming anyways, hence the name. Nothing about the name "Simula" suggests actors. > The unique differentiator for C++ was the STL https://en.wikipedia.org/wiki/C%2B%2B#History https://en.wikipedia.org/wiki/C%2B%2B#History isn't very clear, but it seems to suggest that templates weren't added to C++ until 1990 or later. The STL came around 1993, eleven years after the development of C++ started, not even counting its previous life as C with Classes. Surely in those eleven years people found other differentiators that kept up interest?
- antonvs 6y ago> The unique differentiator for C++ was the STL This involves such a level of ignorance of the history of C++ that you should consider deleting your comment. The STL didn't exist in C++ for the first decade of its existence. > Pretty much nobody liked using inheritance in C++ even back in the day. What is your basis for this claim? Don't bother responding, the answer is that it's nothing more than your fantasizing.
- gpderetta 6y agoSimula and Smalltalk were the two original OO languages. C++ firmly takes its OO capabilities from Simula (the virtual keyword literally comes from there with the same semantics), and is quite distinct from the OO flavour of Smalltalk. Objective-C, with its selector based late binding for example, is clearly Smalltalk inspired.
- antonvs 6y agoEvery statement in your comment is factually incorrect. See: http://www.cplusplus.com/info/history/ http://www.cplusplus.com/info/history/