digitalmars.D - =?UTF-8?B?V2hhdOKAmXM=?= Wrong with OOP and FP
- =?UTF-8?B?Ikx1w61z?= Marques" (3/3) Nov 12 2013 I think you will be pleased with the argument, given D's
- Jonathan M Davis (13/17) Nov 12 2013 Yeah. Both OO and functional programming are useful, but trying to use a...
- =?UTF-8?B?Ikx1w61z?= Marques" (3/3) Nov 12 2013 Also, in the spirit of non-technical discussion, pro-D stuff, see
- Paulo Pinto (9/12) Nov 12 2013 Yes, Go has a big PR rolling machine on the web.
- logicchains (12/25) Nov 12 2013 There seem to be a lot of developers who genuinely believe that
- Paulo Pinto (3/34) Nov 12 2013 It just shows the kind of distortion field Go developers suffer
- logicchains (7/9) Nov 12 2013 To be fair, there is a kind of mental satisfaction that comes
- Froglegs (3/3) Nov 12 2013 Go is a boring language, kind of like Dart, I guess Google just
- logicchains (9/12) Nov 13 2013 If you were working in an Enterprise (TM) with coworkers who were
- Paulo Pinto (6/18) Nov 13 2013 Speaking from my enterprise seat, there are lots of "potentially
- Jonathan M Davis (19/38) Nov 13 2013 This conversation definitely seems to be taking a turn for the worse. Go...
- Paulo Pinto (12/70) Nov 13 2013 Point taken. I should have thought better before posting. Just
- logicchains (18/30) Nov 13 2013 For the record, I wasn't making fun of Go when I spoke of its
- eles (2/5) Nov 13 2013 It is in our guidelines too. I almost never write "->".
- logicchains (7/13) Nov 13 2013 Ah, right. I just tested, and turns out Go does actually
- John Colvin (5/20) Nov 13 2013 nope. a pointer can be indexed like in C. ptr[n] is equivalent to
- Andrei Alexandrescu (6/18) Nov 13 2013 If the purpose was to make it clear dereference is happening (presumably...
- logicchains (7/13) Nov 13 2013 Looking through the Go spec, it seems I was confused. A pointer
- Paulo Pinto (3/18) Nov 13 2013 Because slices are always references, so you have a double
- logicchains (6/8) Nov 14 2013 Right, that makes sense. Note though that this double indirection
- logicchains (6/8) Nov 14 2013 Right, that makes sense. Note though that this double indirection
- deadalnix (3/18) Nov 13 2013 I don't think so. D would index the pointer (as if it pointer to
- eles (13/22) Nov 13 2013 Unfortunately, yes, you did hit a nail here. I don't really like
- Paulo Pinto (10/35) Nov 12 2013 If Java takes OO too far, what to say about Smalltalk and
- bearophile (17/19) Nov 12 2013 Global type inference is too much complex in D, because of
- Don (18/58) Nov 14 2013 Well, Smalltalk and friends are truly Object oriented, as opposed
- Jacob Carlborg (5/11) Nov 14 2013 I think the most useful parts of OOP is encapsulation and have the data
- Paulo Pinto (14/28) Nov 14 2013 Actually no different than using ADT (Abstract Data Types)
- Jacob Carlborg (6/9) Nov 14 2013 I had a look at this:
- Paulo Pinto (13/23) Nov 14 2013 But OO is imperative programing at heart.
- Chris (31/62) Nov 14 2013 I agree that encapsulation and having logic and data in the same
- Andrei Alexandrescu (5/11) Nov 14 2013 Compilers (ours included) are a good example where OOP (with some
- bearophile (5/20) Nov 12 2013 Do you want to inform that author about the purity in D? :-)
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (9/10) Nov 12 2013 The author claims to have done programming language research. So, I
- bearophile (6/8) Nov 12 2013 From what I am seeing in the last years in the good Lambda the
- Dicebot (4/12) Nov 12 2013 Sometimes I have feeling language researchers live in some
- eles (2/6) Nov 12 2013 Lambda the Ultimate and Javaland.
- Paulo Pinto (18/24) Nov 12 2013 Well, in defence of Javaland, it is a consequence how easy it is for
- eles (11/22) Nov 12 2013 I hesitated to add Javaland to the list, exactly because of that.
- JN (15/38) Nov 13 2013 Java is popular because it's a general purpose language and an
- eles (3/10) Nov 12 2013 Encountered that too. Nobody ever tried to re-factor afterwards.
- Jacob Carlborg (4/5) Nov 12 2013 There's always a framework to put on top of another :)
- Ary Borenszweig (2/17) Nov 12 2013 It isn't just a feeling :)
- bearophile (22/23) Nov 12 2013 Researchers are mostly judged and paid (and career advancements
- Froglegs (1/1) Nov 12 2013 bearophile how much do you love haskell
- Rikki Cattermole (14/17) Nov 12 2013 Before learning D I was using Groovy as main language. At this
- Dejan Lekic (10/13) Nov 13 2013 Yep, 100% agree. We should use both, and think ahead whether to
- Max Samukha (3/6) Nov 13 2013 “functions are also objects”. Yes, they are.
- Dicebot (17/20) Nov 13 2013 The thing I don't like with many such "pure paradigm" languages
I think you will be pleased with the argument, given D's philosophy: https://yinwang0.wordpress.com/2013/11/09/oop-fp/
Nov 12 2013
On Tuesday, November 12, 2013 12:09:23 =?UTF-8?B?Ikx1w61z?=.Marques <luis luismarques.eu> puremagic.com wrote:I think you will be pleased with the argument, given D's philosophy: https://yinwang0.wordpress.com/2013/11/09/oop-fp/Yeah. Both OO and functional programming are useful, but trying to use any one paradigm exclusively always ends up contorting things. To make this clean, you really need to be able to mix and match paradigms as appropriate. On a related note, a classic blog post that I quite like on how Java takes OO too far is http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html The balanced approach that C++ and D take is definitely the better one IMHO (and D tends to do it better IMHO, since it better supports functional programming than C++ does, meaning that you end up with fewer FP solutions in C++ even when they'd be appropriate). - Jonathan M Davis
Nov 12 2013
Also, in the spirit of non-technical discussion, pro-D stuff, see slide 26: http://www.slideshare.net/jpetazzo/docker-and-go-why-did-we-decide-to-write-docker-in-go
Nov 12 2013
On Tuesday, 12 November 2013 at 11:39:23 UTC, Luís Marques wrote:Also, in the spirit of non-technical discussion, pro-D stuff, see slide 26: http://www.slideshare.net/jpetazzo/docker-and-go-why-did-we-decide-to-write-docker-in-goYes, Go has a big PR rolling machine on the web. Given its spartan set of features and religious decisions, I doubt anyone would care, if it wasn't being developed at Google. On the other hand, more people using strong typed languages with GC support as C and C++ replacement, is always positive. Hopefully D will also have a piece of the pie. -- Paulo
Nov 12 2013
There seem to be a lot of developers who genuinely believe that Go increases their productivity, for what it's worth. This thread is quite interesting: https://groups.google.com/forum/#!topic/golang-nuts/29RsB_nfTYA; a developer there finds the productivity benefits from using Go sufficient to justify going through the process of converting objdump'd c assembly into opcodes written in Plan 9 assembly syntax just to use AVX2 instructions (which the Plan 9 assembler used by Go doesn't support). Not to mention that they're also directly writing assembly themselves, due to the Go compiler's lack of intrinsics. On Tuesday, 12 November 2013 at 12:24:23 UTC, Paulo Pinto wrote:On Tuesday, 12 November 2013 at 11:39:23 UTC, Luís Marques wrote:Also, in the spirit of non-technical discussion, pro-D stuff, see slide 26: http://www.slideshare.net/jpetazzo/docker-and-go-why-did-we-decide-to-write-docker-in-goYes, Go has a big PR rolling machine on the web. Given its spartan set of features and religious decisions, I doubt anyone would care, if it wasn't being developed at Google. On the other hand, more people using strong typed languages with GC support as C and C++ replacement, is always positive. Hopefully D will also have a piece of the pie. -- Paulo
Nov 12 2013
On Wednesday, 13 November 2013 at 03:46:17 UTC, logicchains wrote:There seem to be a lot of developers who genuinely believe that Go increases their productivity, for what it's worth. This thread is quite interesting: https://groups.google.com/forum/#!topic/golang-nuts/29RsB_nfTYA; a developer there finds the productivity benefits from using Go sufficient to justify going through the process of converting objdump'd c assembly into opcodes written in Plan 9 assembly syntax just to use AVX2 instructions (which the Plan 9 assembler used by Go doesn't support). Not to mention that they're also directly writing assembly themselves, due to the Go compiler's lack of intrinsics. On Tuesday, 12 November 2013 at 12:24:23 UTC, Paulo Pinto wrote:It just shows the kind of distortion field Go developers suffer from.On Tuesday, 12 November 2013 at 11:39:23 UTC, Luís Marques wrote:Also, in the spirit of non-technical discussion, pro-D stuff, see slide 26: http://www.slideshare.net/jpetazzo/docker-and-go-why-did-we-decide-to-write-docker-in-goYes, Go has a big PR rolling machine on the web. Given its spartan set of features and religious decisions, I doubt anyone would care, if it wasn't being developed at Google. On the other hand, more people using strong typed languages with GC support as C and C++ replacement, is always positive. Hopefully D will also have a piece of the pie. -- Paulo
Nov 12 2013
To be fair, there is a kind of mental satisfaction that comes from being able to hold the language spec in one's head. I've used Go about as much as I've used D, and while I understand the semantics of Go and its stdlib almost completely, I've probably not familiar with even a tenth of the functionality in D (which is of course because D has a lot more functionality). On Wednesday, 13 November 2013 at 07:23:40 UTC, Paulo Pinto wrote:It just shows the kind of distortion field Go developers suffer from.
Nov 12 2013
Go is a boring language, kind of like Dart, I guess Google just sucks at language design? The do use an awful lot of Java, perhaps it has caused irreparable damage
Nov 12 2013
On Wednesday, 13 November 2013 at 07:55:59 UTC, Froglegs wrote:Go is a boring language, kind of like Dart, I guess Google just sucks at language design? The do use an awful lot of Java, perhaps it has caused irreparable damageIf you were working in an Enterprise (TM) with coworkers who were potentially competence-challenged, would you want them having access to the power of D's compile time code generation? Would you like to read and debug code that randomly intermingled D's different function call methods; having to determine whether foo.bar represents calling the bar method of foo, calling the function bar with foo as an argument, or accessing the field bar on object foo?
Nov 13 2013
On Wednesday, 13 November 2013 at 08:39:06 UTC, logicchains wrote:On Wednesday, 13 November 2013 at 07:55:59 UTC, Froglegs wrote:Speaking from my enterprise seat, there are lots of "potentially competence-challenged coworkers" in off-shore projects. Maybe Google's target audience? -- PauloGo is a boring language, kind of like Dart, I guess Google just sucks at language design? The do use an awful lot of Java, perhaps it has caused irreparable damageIf you were working in an Enterprise (TM) with coworkers who were potentially competence-challenged, would you want them having access to the power of D's compile time code generation? Would you like to read and debug code that randomly intermingled D's different function call methods; having to determine whether foo.bar represents calling the bar method of foo, calling the function bar with foo as an argument, or accessing the field bar on object foo?
Nov 13 2013
On Wednesday, November 13, 2013 09:51:33 Paulo Pinto wrote:On Wednesday, 13 November 2013 at 08:39:06 UTC, logicchains wrote:This conversation definitely seems to be taking a turn for the worse. Go was created by folks who believe in its goals and paradigms and believed that they could better serve those by creating a new language than by using existing ones. As I understand it, it was completely an engineering-driven solution and not business-driven at all. Google really had very little to do with its creation. It's just that the engineers who created it happened to be working at Google. And while we may not like the direction that Go went in, that doesn't mean that it's worthless or primarily intended to prevent bad programmers from fouling things up. Clearly, it does a good enough job that many programmers have taken a liking to it and written good, useful programs in it. Personally, I have no interest in it and think that its designers made some very poor choices, but that doesn't mean that we should be making fun of it or make fun of Google for being the place where the engineers who created it work. The fact that Google let its engineers spend company time on creating a new programming langueg says very good things about Google, even if the language itself ultimately isn't what we'd like. - Jonathan M DavisOn Wednesday, 13 November 2013 at 07:55:59 UTC, Froglegs wrote:Speaking from my enterprise seat, there are lots of "potentially competence-challenged coworkers" in off-shore projects. Maybe Google's target audience?Go is a boring language, kind of like Dart, I guess Google just sucks at language design? The do use an awful lot of Java, perhaps it has caused irreparable damageIf you were working in an Enterprise (TM) with coworkers who were potentially competence-challenged, would you want them having access to the power of D's compile time code generation? Would you like to read and debug code that randomly intermingled D's different function call methods; having to determine whether foo.bar represents calling the bar method of foo, calling the function bar with foo as an argument, or accessing the field bar on object foo?
Nov 13 2013
On Wednesday, 13 November 2013 at 09:12:40 UTC, Jonathan M Davis wrote:On Wednesday, November 13, 2013 09:51:33 Paulo Pinto wrote:Point taken. I should have thought better before posting. Just got carried away due to some of our project's status. Sorry about that and my excuses to anyone that felt bad with my remark. Despite my critic, I do see lots of use cases where Go might be useful and would happily used it over C, although D would be even better. :) No more replies from me on this thread. .. PauloOn Wednesday, 13 November 2013 at 08:39:06 UTC, logicchains wrote:This conversation definitely seems to be taking a turn for the worse. Go was created by folks who believe in its goals and paradigms and believed that they could better serve those by creating a new language than by using existing ones. As I understand it, it was completely an engineering-driven solution and not business-driven at all. Google really had very little to do with its creation. It's just that the engineers who created it happened to be working at Google. And while we may not like the direction that Go went in, that doesn't mean that it's worthless or primarily intended to prevent bad programmers from fouling things up. Clearly, it does a good enough job that many programmers have taken a liking to it and written good, useful programs in it. Personally, I have no interest in it and think that its designers made some very poor choices, but that doesn't mean that we should be making fun of it or make fun of Google for being the place where the engineers who created it work. The fact that Google let its engineers spend company time on creating a new programming langueg says very good things about Google, even if the language itself ultimately isn't what we'd like. - Jonathan M DavisOn Wednesday, 13 November 2013 at 07:55:59 UTC, Froglegs wrote:Speaking from my enterprise seat, there are lots of "potentially competence-challenged coworkers" in off-shore projects. Maybe Google's target audience?Go is a boring language, kind of like Dart, I guess Google just sucks at language design? The do use an awful lot of Java, perhaps it has caused irreparable damageIf you were working in an Enterprise (TM) with coworkers who were potentially competence-challenged, would you want them having access to the power of D's compile time code generation? Would you like to read and debug code that randomly intermingled D's different function call methods; having to determine whether foo.bar represents calling the bar method of foo, calling the function bar with foo as an argument, or accessing the field bar on object foo?
Nov 13 2013
On Wednesday, 13 November 2013 at 09:12:40 UTC, Jonathan M Davis wrote:Personally, I have no interest in it and think that its designers made some very poor choices, but that doesn't mean that we should be making fun of it or make fun of Google for being the place where the engineers who created it work. The fact that Google let its engineers spend company time on creating a new programming langueg says very good things about Google, even if the language itself ultimately isn't what we'd like. - Jonathan M DavisFor the record, I wasn't making fun of Go when I spoke of its readability being a particular virtue. If I was managing a large project with programmers of divergent ability then I might well pick it for that reason alone. The design choices might seem poor from the perspective of someone looking for a language that gives them lots of power, but if you look at it from the perspective of a language designed to minimise the power of co-workers (and anybody else) to write difficult-to-understand code, it's designed magnificently. An example of this is how, in order to avoid ambiguity, both automatic dereferencing and the -> operator from C were omitted from the language. This means that if pt is a pointer to a struct, then I have to write (*pt).X to access field X of that struct, as opposed to pt.X in D or pt->X in C, making it completely clear to anybody glancing at the code that pt is a pointer.
Nov 13 2013
On Wednesday, 13 November 2013 at 10:19:34 UTC, logicchains wrote:On Wednesday, 13 November 2013 at 09:12:40 UTC, Jonathan M Davis wrote:struct, then I have to write (*pt).X to access field X of thatIt is in our guidelines too. I almost never write "->".
Nov 13 2013
On Wednesday, 13 November 2013 at 11:30:14 UTC, eles wrote:On Wednesday, 13 November 2013 at 10:19:34 UTC, logicchains wrote:Ah, right. I just tested, and turns out Go does actually automatically dereference pointers to structs, but not to arrays. So if arrp is a pointer to an array, writing arrp[0] is a syntax error in Go, and it must be written as (*arrp)[0]. D on the other hand, as far as I'm aware (correct me if I'm wrong), would automatically dereference the pointer.On Wednesday, 13 November 2013 at 09:12:40 UTC, Jonathan M Davis wrote:struct, then I have to write (*pt).X to access field X of thatIt is in our guidelines too. I almost never write "->".
Nov 13 2013
On Wednesday, 13 November 2013 at 12:05:51 UTC, logicchains wrote:On Wednesday, 13 November 2013 at 11:30:14 UTC, eles wrote:nope. a pointer can be indexed like in C. ptr[n] is equivalent to *(ptr + n) irrespective of what the target type of the pointer is. Fully expanded for T* ptr : *(cast(T*)( (cast(void*)ptr) + (T.sizeof * n) ))On Wednesday, 13 November 2013 at 10:19:34 UTC, logicchains wrote:Ah, right. I just tested, and turns out Go does actually automatically dereference pointers to structs, but not to arrays. So if arrp is a pointer to an array, writing arrp[0] is a syntax error in Go, and it must be written as (*arrp)[0]. D on the other hand, as far as I'm aware (correct me if I'm wrong), would automatically dereference the pointer.On Wednesday, 13 November 2013 at 09:12:40 UTC, Jonathan M Davis wrote:struct, then I have to write (*pt).X to access field X of thatIt is in our guidelines too. I almost never write "->".
Nov 13 2013
On 11/13/13 4:05 AM, logicchains wrote:On Wednesday, 13 November 2013 at 11:30:14 UTC, eles wrote:If the purpose was to make it clear dereference is happening (presumably to have people understand the efficiency issues associated), I wonder why they didn't make memory allocation or indirect calls (both of which abound in Go) more visible. Was there some other intent behind (*pt).X? AndreiOn Wednesday, 13 November 2013 at 10:19:34 UTC, logicchains wrote:Ah, right. I just tested, and turns out Go does actually automatically dereference pointers to structs, but not to arrays. So if arrp is a pointer to an array, writing arrp[0] is a syntax error in Go, and it must be written as (*arrp)[0]. D on the other hand, as far as I'm aware (correct me if I'm wrong), would automatically dereference the pointer.On Wednesday, 13 November 2013 at 09:12:40 UTC, Jonathan M Davis wrote:struct, then I have to write (*pt).X to access field X of thatIt is in our guidelines too. I almost never write "->".
Nov 13 2013
On Wednesday, 13 November 2013 at 16:12:01 UTC, Andrei Alexandrescu wrote:If the purpose was to make it clear dereference is happening (presumably to have people understand the efficiency issues associated), I wonder why they didn't make memory allocation or indirect calls (both of which abound in Go) more visible. Was there some other intent behind (*pt).X? AndreiLooking through the Go spec, it seems I was confused. A pointer to a struct can be used with just pt.X, and a pointer to an array *arrp can be used with just arrp[0], but a pointer to a _slice_ *slcp can only be used with (*slcp)[0], not slcp[0]. I have no idea why this is.
Nov 13 2013
On Thursday, 14 November 2013 at 02:37:52 UTC, logicchains wrote:On Wednesday, 13 November 2013 at 16:12:01 UTC, Andrei Alexandrescu wrote:Because slices are always references, so you have a double indirection.If the purpose was to make it clear dereference is happening (presumably to have people understand the efficiency issues associated), I wonder why they didn't make memory allocation or indirect calls (both of which abound in Go) more visible. Was there some other intent behind (*pt).X? AndreiLooking through the Go spec, it seems I was confused. A pointer to a struct can be used with just pt.X, and a pointer to an array *arrp can be used with just arrp[0], but a pointer to a _slice_ *slcp can only be used with (*slcp)[0], not slcp[0]. I have no idea why this is.
Nov 13 2013
On Thursday, 14 November 2013 at 07:24:32 UTC, Paulo Pinto wrote:Because slices are always references, so you have a double indirection.Right, that makes sense. Note though that this double indirection is necessary if you're passing a slice into a function that will modify its length, such as one that will append to it. It's more idiomatic to just have the function return a new slice, but that's slightly less inefficient.
Nov 14 2013
On Thursday, 14 November 2013 at 07:24:32 UTC, Paulo Pinto wrote:Because slices are always references, so you have a double indirection.Right, that makes sense. Note though that this double indirection is necessary if you're passing a slice into a function that will modify its length, such as one that will append to it. It's more idiomatic to just have the function return a new slice, but that's slightly less efficient.
Nov 14 2013
On Wednesday, 13 November 2013 at 12:05:51 UTC, logicchains wrote:On Wednesday, 13 November 2013 at 11:30:14 UTC, eles wrote:I don't think so. D would index the pointer (as if it pointer to an array of slices).On Wednesday, 13 November 2013 at 10:19:34 UTC, logicchains wrote:Ah, right. I just tested, and turns out Go does actually automatically dereference pointers to structs, but not to arrays. So if arrp is a pointer to an array, writing arrp[0] is a syntax error in Go, and it must be written as (*arrp)[0]. D on the other hand, as far as I'm aware (correct me if I'm wrong), would automatically dereference the pointer.On Wednesday, 13 November 2013 at 09:12:40 UTC, Jonathan M Davis wrote:struct, then I have to write (*pt).X to access field X of thatIt is in our guidelines too. I almost never write "->".
Nov 13 2013
On Wednesday, 13 November 2013 at 08:39:06 UTC, logicchains wrote:On Wednesday, 13 November 2013 at 07:55:59 UTC, Froglegs wrote:If you were working in an Enterprise (TM) with coworkers who were potentially competence-challenged, would you want them having access to the power of D's compile time code generation? Would you like to read and debug code that randomly intermingled D's different function call methods; having to determine whether foo.bar represents calling the bar method of foo, calling the function bar with foo as an argument, or accessing the field bar on object foo?Unfortunately, yes, you did hit a nail here. I don't really like this way of "calling" functions. If they were only properties, OK, but for general functions... I dunno if it is implemented, but I recall Walter beign quite supportive of accepting that: foo.bar; is a function call... A lot of confusion stems from the fact that properties are seen more like functions than variables (in the D community). I feel it should be the other way around. Or, simply, get rid of properties completely until better ideas come.
Nov 13 2013
On Tuesday, 12 November 2013 at 11:27:51 UTC, Jonathan M Davis wrote:On Tuesday, November 12, 2013 12:09:23 =?UTF-8?B?Ikx1w61z?=.Marques <luis luismarques.eu> puremagic.com wrote:If Java takes OO too far, what to say about Smalltalk and derivatives?I think you will be pleased with the argument, given D's philosophy: https://yinwang0.wordpress.com/2013/11/09/oop-fp/Yeah. Both OO and functional programming are useful, but trying to use any one paradigm exclusively always ends up contorting things. To make this clean, you really need to be able to mix and match paradigms as appropriate. On a related note, a classic blog post that I quite like on how Java takes OO too far is http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.htmlThe balanced approach that C++ and D take is definitely the better one IMHO (and D tends to do it better IMHO, since it better supports functional programming than C++ does, meaning that you end up with fewer FP solutions in C++ even when they'd be appropriate). - Jonathan M DavisThe future belongs to multi-paradigm languages, I would say. What I miss still in languages like D, is the Hindley–Milner type inference, algebraic data types and pattern matching. -- Paulo
Nov 12 2013
Paulo Pinto:What I miss still in languages like D, is the Hindley–Milner type inference, algebraic data types and pattern matching.Global type inference is too much complex in D, because of Turing-complete templates, OOP, very weak interfaces between modules in presence of separate compilation, etc, so it can't be done or it will become too much hard/complex/slow to do, so it's better to forget about it. Also, even in Haskell it's a good practice to write down the type signature of all global functions. The algebraic data types are handy, and Algebraic should improve (and if needed some feature should be added to D to make Algebraic better!). Regarding pattern matching, it introduces a significant complexity, but a limited form of it could be a good idea for D, with improvements in the switch and introducing an optional standard method unapply for structs and classes: https://d.puremagic.com/issues/show_bug.cgi?id=596 Bye, bearophile
Nov 12 2013
On Tuesday, 12 November 2013 at 12:19:56 UTC, Paulo Pinto wrote:On Tuesday, 12 November 2013 at 11:27:51 UTC, Jonathan M Davis wrote:Well, Smalltalk and friends are truly Object oriented, as opposed to C++/Java/D etc which are Class oriented. So it is a little different. But something I've been wondering for years - is there a solid rebuttal anywhere to Stepanov's criticism of OOP? He takes the extreme position that (class oriented) OOP is useless. Surely that can't be right, but... It's trivial to find good procedural code. It's trivial to find good generic code. It's trivial to find good functional code. But finding top-quality OOP code is extremely difficult. Eg, the code in the GoF Design Patterns book is widely criticised. I just can't escape the feeling that class-based runtime polyphorphism is almost never an ideal solution, and that most of the benefits and success of OOP languages comes from things other than OOP itself. And I think it's because OOP is philosophically nonsense -- in the real world, similarities between things are everywhere, but almost none of them are is-A relationships.On Tuesday, November 12, 2013 12:09:23 =?UTF-8?B?Ikx1w61z?=.Marques <luis luismarques.eu> puremagic.com wrote:If Java takes OO too far, what to say about Smalltalk and derivatives?I think you will be pleased with the argument, given D's philosophy: https://yinwang0.wordpress.com/2013/11/09/oop-fp/Yeah. Both OO and functional programming are useful, but trying to use any one paradigm exclusively always ends up contorting things. To make this clean, you really need to be able to mix and match paradigms as appropriate. On a related note, a classic blog post that I quite like on how Java takes OO too far is http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.htmlThe balanced approach that C++ and D take is definitely the better one IMHO (and D tends to do it better IMHO, since it better supports functional programming than C++ does, meaning that you end up with fewer FP solutions in C++ even when they'd be appropriate). - Jonathan M DavisThe future belongs to multi-paradigm languages, I would say. What I miss still in languages like D, is the Hindley–Milner type inference, algebraic data types and pattern matching. -- Paulo
Nov 14 2013
On 2013-11-14 10:37, Don wrote:I just can't escape the feeling that class-based runtime polyphorphism is almost never an ideal solution, and that most of the benefits and success of OOP languages comes from things other than OOP itself. And I think it's because OOP is philosophically nonsense -- in the real world, similarities between things are everywhere, but almost none of them are is-A relationships.I think the most useful parts of OOP is encapsulation and have the data and methods in the same place. -- /Jacob Carlborg
Nov 14 2013
On Thursday, 14 November 2013 at 10:01:34 UTC, Jacob Carlborg wrote:On 2013-11-14 10:37, Don wrote:Actually no different than using ADT (Abstract Data Types) popularized by modular languages like Modula-2, with the added benefit of type extension and polymorphism. Just because OOP has objects in the name, it doesn't need to be real objects, but concepts actually. The main problem was that OOP productivity was oversold hype, in the same vein as web 2.0, cloud computing, agile and whatever might come next. People need to sell books and certifications. And that the early OO design approaches focused too much in implementation inheritance instead of interfaces and delegation. -- PauloI just can't escape the feeling that class-based runtime polyphorphism is almost never an ideal solution, and that most of the benefits and success of OOP languages comes from things other than OOP itself. And I think it's because OOP is philosophically nonsense -- in the real world, similarities between things are everywhere, but almost none of them are is-A relationships.I think the most useful parts of OOP is encapsulation and have the data and methods in the same place.
Nov 14 2013
On 2013-11-14 11:51, Paulo Pinto wrote:Actually no different than using ADT (Abstract Data Types) popularized by modular languages like Modula-2, with the added benefit of type extension and polymorphism.I had a look at this: http://en.wikipedia.org/wiki/Abstract_data_type#Example:_implementation_of_the_stack_ADT I don't see the difference compared to basic imperative programming. -- /Jacob Carlborg
Nov 14 2013
On Thursday, 14 November 2013 at 12:23:29 UTC, Jacob Carlborg wrote:On 2013-11-14 11:51, Paulo Pinto wrote:But OO is imperative programing at heart. Picking the stack example you linked to, any ADT type that can provide the stack_T operations can be used on its place. Hence the added benefit OO offers of separating the ADT concept of a stack, from its concrete implementation. This is the real benefit over plain ADTs. It has nothing to do with real physical objects, although it was sold like that in the beginning, because it was easier for people to understand it. -- PauloActually no different than using ADT (Abstract Data Types) popularized by modular languages like Modula-2, with the added benefit of type extension and polymorphism.I had a look at this: http://en.wikipedia.org/wiki/Abstract_data_type#Example:_implementation_of_the_stack_ADT I don't see the difference compared to basic imperative programming.
Nov 14 2013
On Thursday, 14 November 2013 at 10:51:31 UTC, Paulo Pinto wrote:On Thursday, 14 November 2013 at 10:01:34 UTC, Jacob Carlborg wrote:I agree that encapsulation and having logic and data in the same place is a nice feature of OOP. Also, OOP is a tool that helps to create an architecture or an infrastructure like Data-Controller-Components, which is quite useful. However, it happens again and again that a program gets tangled with inter-dependencies. No matter how careful the planning is, as in "this component (class) doesn't need to know anything about XYZ.". Sooner or later there will be a case where this is no longer doable. There are valid solutions like proxies etc. but still it somehow doesn't feel right. At the moment I'm using a mixture where I use structs and ranges for tasks that can be performed independently, like for example a filter that removes comments from a text file. There is no need to put that behavior into a class. In other words it's a "blind" component, that doesn't need to see anything else but the incoming text. Being "blind", it can be reused out of the box. OOP is still useful for having a central data pool (resources) that can be accessed from anywhere by any component - if needs be - delegating tasks etc. This said, I sometimes have to implement an initially "blind" component (struct, range) as an internal class to get the references that exist within the class that uses it. This, or pass the data to the component (bah!). Either way, it creates dependencies. I tend to blame myself (bad planning, insufficient understanding of the matter), but I wonder whether it is possible at all to have a reasonably complex program without inter-dependencies of some sort, FP or OOP. Is there, in reality, only a certain amount of really independent components, whereas the bulk of the program is invariably inter-dependent to varying degrees?On 2013-11-14 10:37, Don wrote:Actually no different than using ADT (Abstract Data Types) popularized by modular languages like Modula-2, with the added benefit of type extension and polymorphism. Just because OOP has objects in the name, it doesn't need to be real objects, but concepts actually. The main problem was that OOP productivity was oversold hype, in the same vein as web 2.0, cloud computing, agile and whatever might come next. People need to sell books and certifications. And that the early OO design approaches focused too much in implementation inheritance instead of interfaces and delegation. -- PauloI just can't escape the feeling that class-based runtime polyphorphism is almost never an ideal solution, and that most of the benefits and success of OOP languages comes from things other than OOP itself. And I think it's because OOP is philosophically nonsense -- in the real world, similarities between things are everywhere, but almost none of them are is-A relationships.I think the most useful parts of OOP is encapsulation and have the data and methods in the same place.
Nov 14 2013
On 11/14/13 1:37 AM, Don wrote:I just can't escape the feeling that class-based runtime polyphorphism is almost never an ideal solution, and that most of the benefits and success of OOP languages comes from things other than OOP itself. And I think it's because OOP is philosophically nonsense -- in the real world, similarities between things are everywhere, but almost none of them are is-A relationships.Compilers (ours included) are a good example where OOP (with some visitor pizzazz) is a good fit. There are obvious hierarchies (addition is-a expression etc). Andrei
Nov 14 2013
Luís Marques:https://yinwang0.wordpress.com/2013/11/09/oop-fp/From the article:but you can also write pure functions in C, for example: int f(int x) { int y = 0; int z = 0; y = 2 * x; z = y + 1; return z / 3; } You can do the same with assembly language too. Pure functions don’t just belong to purely functional languages. You can write pure functions in any language, but the important thing is, you should be allowed to use side-effects too.Do you want to inform that author about the purity in D? :-) Bye, bearophile
Nov 12 2013
On 11/12/2013 04:20 AM, bearophile wrote:Do you want to inform that author about the purity in D? :-)The author claims to have done programming language research. So, I guess he knows about D. (Come to think of it, people who created the Go language supposedly had such research as well but they did not (!) know about D. ;) ) I am surprised that the Reddit thread has not mentioned D yet: http://www.reddit.com/r/programming/comments/1qg5x8/whats_wrong_with_oop_and_fp/ Ali
Nov 12 2013
Ali Çehreli:The author claims to have done programming language research. So, I guess he knows about D.From what I am seeing in the last years in the good Lambda the Ultimate Blog, most people doing programming language research know everything about monads and zippers, but ignore D :-) Bye, bearophile
Nov 12 2013
On Tuesday, 12 November 2013 at 15:27:36 UTC, bearophile wrote:Ali Çehreli:Sometimes I have feeling language researchers live in some strange imaginary world and never actually check how their ideas work in production code.The author claims to have done programming language research. So, I guess he knows about D.From what I am seeing in the last years in the good Lambda the Ultimate Blog, most people doing programming language research know everything about monads and zippers, but ignore D :-) Bye, bearophile
Nov 12 2013
On Tuesday, 12 November 2013 at 15:35:48 UTC, Dicebot wrote:On Tuesday, 12 November 2013 at 15:27:36 UTC, bearophile wrote:Lambda the Ultimate and Javaland.Ali Çehreli:Sometimes I have feeling language researchers live in some strange imaginary world and never actually check how their
Nov 12 2013
Am 12.11.2013 17:10, schrieb eles:On Tuesday, 12 November 2013 at 15:35:48 UTC, Dicebot wrote:Well, in defence of Javaland, it is a consequence how easy it is for enterprise architects to try out their crazy ideas in Java. Except for a few years at CERN, I always worked in enterprise land, so I have seen FactoryFactoryAbstractThingy being done in: - C based platform which used its own concept of pointers, requiring conversions between framework pointers and C pointers - A Frankenstein framework done in CORBA with a healthy mix of C++ and Perl code - A Perl framework for generating code for control of telecommunication networks with a thousands plugins, which affected the way the whole code generation was done, requiring multiple passes - A transformation engine done in XML/XSLT (yes really!) with a JavaScript API being called from a Java driver application - A framework done on top of J2EE, as if J2EE wasn't enough Better stop here. :) -- PauloOn Tuesday, 12 November 2013 at 15:27:36 UTC, bearophile wrote:Lambda the Ultimate and Javaland.Ali Çehreli:Sometimes I have feeling language researchers live in some strange imaginary world and never actually check how their
Nov 12 2013
On Tuesday, 12 November 2013 at 17:59:50 UTC, Paulo Pinto wrote:Am 12.11.2013 17:10, schrieb eles:I hesitated to add Javaland to the list, exactly because of that. I believe it was successful because, first, was designed *by a like C++ but with increased verbosity (and that means less cryptic and easier to follow a diff). I am not the first to consider that Java's verbosity is a good thing for a company. But, I confirm that: in my day-to-day job, we use C (and some C++). You would be amazed how much our guidelines lead us towards increased verbosity (names, annotations/comments, declarations).On Tuesday, 12 November 2013 at 15:35:48 UTC, Dicebot wrote:Well, in defence of Javaland, it is a consequence how easy itOn Tuesday, 12 November 2013 at 15:27:36 UTC, bearophile wrote:Lambda the Ultimate and Javaland.Ali Çehreli:Sometimes I have feeling language researchers live in some strange imaginary world and never actually check how their
Nov 12 2013
On Wednesday, 13 November 2013 at 02:54:05 UTC, eles wrote:On Tuesday, 12 November 2013 at 17:59:50 UTC, Paulo Pinto wrote:Java is popular because it's a general purpose language and an alternative to c++ with following advantages: - much better IDE support - OOP by default, all libraries and frameworks follow it - rich standard library, so that everyone uses java.lang.String and it's over, while C/C++ libs still try to reinvent their own string classes (which often have completely different interfaces), XML, HTTP etc. built-in to the language - easy to learn, easy to write (no .h/.cpp madness, no cryptic template errors, no 10 ways to initialize a variable) - good performance, slightly behind C/C++ in most cases, way ahead of Python/Ruby/etc. - mature GUI frameworks with great RAD tools and many more.Am 12.11.2013 17:10, schrieb eles:I hesitated to add Javaland to the list, exactly because of that. I believe it was successful because, first, was designed mostly like C++ but with increased verbosity (and that means less cryptic and easier to follow a diff). I am not the first to consider that Java's verbosity is a good thing for a company. But, I confirm that: in my day-to-day job, we use C (and some C++). You would be amazed how much our guidelines lead us towards increased verbosity (names, annotations/comments, declarations).On Tuesday, 12 November 2013 at 15:35:48 UTC, Dicebot wrote:Well, in defence of Javaland, it is a consequence how easy itOn Tuesday, 12 November 2013 at 15:27:36 UTC, bearophile wrote:Lambda the Ultimate and Javaland.Ali Çehreli:Sometimes I have feeling language researchers live in some strange imaginary world and never actually check how their
Nov 13 2013
On Tuesday, 12 November 2013 at 17:59:50 UTC, Paulo Pinto wrote:Am 12.11.2013 17:10, schrieb eles:On Tuesday, 12 November 2013 at 15:35:48 UTC, Dicebot wrote:On Tuesday, 12 November 2013 at 15:27:36 UTC, bearophile wrote:Ali Çehreli:- C based platform which used its own concept of pointers, requiring conversions between framework pointers and C pointersEncountered that too. Nobody ever tried to re-factor afterwards. We ended up rewriting everything from scratch.
Nov 12 2013
On 2013-11-12 18:59, Paulo Pinto wrote:- A framework done on top of J2EE, as if J2EE wasn't enoughThere's always a framework to put on top of another :) -- /Jacob Carlborg
Nov 12 2013
On 11/12/13 12:35 PM, Dicebot wrote:On Tuesday, 12 November 2013 at 15:27:36 UTC, bearophile wrote:It isn't just a feeling :)Ali Çehreli:Sometimes I have feeling language researchers live in some strange imaginary world and never actually check how their ideas work in production code.The author claims to have done programming language research. So, I guess he knows about D.From what I am seeing in the last years in the good Lambda the Ultimate Blog, most people doing programming language research know everything about monads and zippers, but ignore D :-) Bye, bearophile
Nov 12 2013
Ary Borenszweig:It isn't just a feeling :)Researchers are mostly judged and paid (and career advancements are mostly based) on the amount and "impact" of papers written. It's uncommon for "how ideas work in production code" to have a positive influence on career. To this you have to add the fact that if they pay you to study and invent new ideas, and you want to have fun inventing them, you will go look where are the cutest puzzles to solve (like very complex functional tricks). This is causing a bad and costly disconnect between practice and research in computer science and coding, and this is hurting our society. Even researchers in the private sector like at Microsoft are plagued with a very low ROI because of that. To solve this problem there is a growing need to tie the career advancements and pay of computer science researchers to the solution of practical problems. I love free basic research, but here there is a growing problem in need to be solved, for the society. The situation is improving only a little, but this far from enough: http://wattsupwiththat.com/2012/04/17/the-journal-science-free-the-code/ Bye, bearophile
Nov 12 2013
On Tuesday, 12 November 2013 at 11:09:24 UTC, Luís Marques wrote:I think you will be pleased with the argument, given D's philosophy: https://yinwang0.wordpress.com/2013/11/09/oop-fp/Before learning D I was using Groovy as main language. At this point I had fullen in love with the three big paradigms functional, oop and proceduel. Neither true versions but nether the less loved it. When it came to wanting efficiency and exploring new ideas I even considered my own language. Since Groovy I actually dont use much functional but still very useful. This is why I no longer understand reasoning behind any one paradigm. A great example of why I hate pure oop is singletons. To me they are just a hack for procedural style. One that also confuses new developers. These are just some reasons behind my love for D. And why I believe it is an appropriate first language.
Nov 12 2013
On Tuesday, 12 November 2013 at 11:09:24 UTC, Luís Marques wrote:I think you will be pleased with the argument, given D's philosophy: https://yinwang0.wordpress.com/2013/11/09/oop-fp/Yep, 100% agree. We should use both, and think ahead whether to take first or the second approach to solve the problem at hand. Regarding Java rumbling about nouns and verbs... I think in the long run it is a better practice to name your class/method in a way that helps developers understand what it does. Yes, some people write long names, but that most often comes from their company/team coding style. Nothing wrong with that really, and it is not just Java community that does this... (first that comes to mind: thread_stackTop() )
Nov 13 2013
On Tuesday, 12 November 2013 at 11:09:24 UTC, Luís Marques wrote:I think you will be pleased with the argument, given D's philosophy: https://yinwang0.wordpress.com/2013/11/09/oop-fp/“functions are also objects”. Yes, they are. http://en.wikipedia.org/wiki/Category_theory
Nov 13 2013
On Tuesday, 12 November 2013 at 11:09:24 UTC, Luís Marques wrote:I think you will be pleased with the argument, given D's philosophy: https://yinwang0.wordpress.com/2013/11/09/oop-fp/The thing I don't like with many such "pure paradigm" languages is not actually the fact that they stick to a single approach and harm the toolset. It is the fact that they define set of abstractions and then try to tie those to existing computer hardware. With modern insanely clever optimizing compilers it may even work performance-wise but it harms learning curve in least pleasant way. If language is built as bottom-up abstraction, it is relatively trivial to learn for someone familiar with assembly level. Any such language. If it is built top-down from imaginary abstraction set, it is always a completely new thing every time and you often have no idea what certain concept actually means (like, is "function" here really a function or some obscure wrapper that emulates it?) I would favor pure FP languages much more if computers would have existed that operated in similar matter on hardware level but it does not seem like a real thing to happen ;)
Nov 13 2013