* C++ *for Git*
@ 2007-09-22 10:42 Dmitry Kakurin
2007-09-22 11:11 ` David Kastrup
` (2 more replies)
0 siblings, 3 replies; 34+ messages in thread
From: Dmitry Kakurin @ 2007-09-22 10:42 UTC (permalink / raw)
To: Git
We've had this theoretical (and IMHO pointless) discussion C vs. C++ *in
general*.
In no way I want to restart it. But *very specifically*, and *for Git*:
We already have strbuf "class" to do string/buffer manipulations.
Kudos to Pierre Habouzit for doing the refactoring work!
Now, what I fail to understand is how this:
static void write_global_extended_header(const unsigned char *sha1)
{
struct strbuf ext_header;
strbuf_init(&ext_header, 0);
strbuf_append_ext_header(&ext_header, "comment", sha1_to_hex(sha1), 40);
write_entry(NULL, NULL, 0, ext_header.buf, ext_header.len);
strbuf_release(&ext_header);
}
is better than this:
static void write_global_extended_header(const unsigned char *sha1)
{
strbuf ext_header;
ext_header.append_ext_header("comment", sha1_to_hex(sha1), 40);
write_entry(NULL, NULL, 0, ext_header.buf, ext_header.len);
}
?
Note, there is no Boost/multiple inheritance/template
metaprogramming/std::string/whatever-else-scares-you-in-C++ in the second
piece of code.
Just a very straight-forward usage of only 3 C++ features:
1. Constructors
2. Destructors
3. Better syntax (ext_header.append_ext_header vs.
strbuf_append_ext_header(&ext_header, )
The generated code will be exactly the same.
Yet the source code becomes more readable and MUCH less error prone. How is
this not a win?
One (sensible) argument that I've heard in the previous discussion was: you
let a little bit of C++ in and then it gets more and more complex and the
code quality decreases.
This problem is solved by having "quality gates".
Again, *for Git* these quality gates already exist: only few people have
"commit access".
If/when somebody tries to be too fancy, what stops Junio from replying "we
don't use Library-X/C++-feature-Y in Git, please change your code and
resubmit" and throwing that fix away? Nothing.
- Dmitry
^ permalink raw reply [flat|nested] 34+ messages in thread* Re: C++ *for Git* 2007-09-22 10:42 C++ *for Git* Dmitry Kakurin @ 2007-09-22 11:11 ` David Kastrup 2007-09-22 12:48 ` Johannes Schindelin 2007-09-22 15:15 ` Kyle Rose 2 siblings, 0 replies; 34+ messages in thread From: David Kastrup @ 2007-09-22 11:11 UTC (permalink / raw) To: Dmitry Kakurin; +Cc: Git Dmitry Kakurin <dmitry.kakurin@gmail.com> writes: > We've had this theoretical (and IMHO pointless) discussion C vs. C++ > *in general*. > In no way I want to restart it. Then don't. > Just a very straight-forward usage of only 3 C++ features: > 1. Constructors > 2. Destructors > 3. Better syntax (ext_header.append_ext_header > vs. strbuf_append_ext_header(&ext_header, ) > > The generated code will be exactly the same. It won't. It will _do_ exactly the same (modulo the tenfold likelihood of compiler bugs) but hardly using the same code. > Yet the source code becomes more readable and MUCH less error > prone. How is this not a win? Because it is just your claim that this is more readable. > One (sensible) argument that I've heard in the previous discussion > was: you let a little bit of C++ in and then it gets more and more > complex and the code quality decreases. > This problem is solved by having "quality gates". > Again, *for Git* these quality gates already exist: only few people > have "commit access". > If/when somebody tries to be too fancy, what stops Junio from replying > "we don't use Library-X/C++-feature-Y in Git, please change your code > and resubmit" and throwing that fix away? Nothing. Well, what stops him from replying "we don't use C++ in Git, please change your code and resubmit"? -- David Kastrup, Kriemhildstr. 15, 44793 Bochum ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: C++ *for Git* 2007-09-22 10:42 C++ *for Git* Dmitry Kakurin 2007-09-22 11:11 ` David Kastrup @ 2007-09-22 12:48 ` Johannes Schindelin 2007-09-22 15:23 ` Marco Costalba 2007-09-22 15:15 ` Kyle Rose 2 siblings, 1 reply; 34+ messages in thread From: Johannes Schindelin @ 2007-09-22 12:48 UTC (permalink / raw) To: Dmitry Kakurin; +Cc: Git Hi, On Sat, 22 Sep 2007, Dmitry Kakurin wrote: > We've had this theoretical (and IMHO pointless) discussion C vs. C++ *in > general*. I think "pointless" is more to the point. We don't want C++. Why is that so hard to accept? Ciao, Dscho ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: C++ *for Git* 2007-09-22 12:48 ` Johannes Schindelin @ 2007-09-22 15:23 ` Marco Costalba 2007-09-23 4:54 ` Dmitry Kakurin 0 siblings, 1 reply; 34+ messages in thread From: Marco Costalba @ 2007-09-22 15:23 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Dmitry Kakurin, Git On 9/22/07, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > > We don't want C++. Why is that so hard to accept? > Dmitry, I think what Johannes says in the above line is 100% the core point of this (sad) discussion. You cannot force/convince someone to use something he hates. That's it. And there's no point in trying to do this. git developers were also kind enough to give explanations on 'why' C++ is not a good language for them. Do you don't agree? do you find the arguments not totally satisfying for you? That's not their problem. I like C++ (a my little git related GUI tool called qgit is done in C++) and at the same time I understand also much of the concerns that where expressed in the list. Your position will never be successful for a number of reasons, some clear expressed other less clear but at the same time, perhaps more important. So I really don't understand why you insist. Thanks Marco P.S: The example you show is a pity for C++, it's like to advertise a 1000cc 200Hp motorbike saying "...and you will no have problems in parking in your box." ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: C++ *for Git* 2007-09-22 15:23 ` Marco Costalba @ 2007-09-23 4:54 ` Dmitry Kakurin 0 siblings, 0 replies; 34+ messages in thread From: Dmitry Kakurin @ 2007-09-23 4:54 UTC (permalink / raw) To: Marco Costalba; +Cc: Johannes Schindelin, Git On 9/22/07, Marco Costalba <mcostalba@gmail.com> wrote: > On 9/22/07, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > > > > We don't want C++. Why is that so hard to accept? > > > > Dmitry, I think what Johannes says in the above line is 100% the core > point of this (sad) discussion. Actually after a couple of responses to this thread I had a BFO (Blinding Flash of Obvious). I cannot believe I was so naive :-). Now I have my answer. P.S. Mysteries like this could drive me crazy. Now I'm much happier. -- - Dmitry ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: C++ *for Git* 2007-09-22 10:42 C++ *for Git* Dmitry Kakurin 2007-09-22 11:11 ` David Kastrup 2007-09-22 12:48 ` Johannes Schindelin @ 2007-09-22 15:15 ` Kyle Rose 2007-09-22 18:08 ` Miles Bader 2007-09-22 22:24 ` Martin Langhoff 2 siblings, 2 replies; 34+ messages in thread From: Kyle Rose @ 2007-09-22 15:15 UTC (permalink / raw) To: Dmitry Kakurin; +Cc: Git You know, git *is* free software. Feel free to fork it and add all the C++ code you want. FWIW, I am of the opinion that Python or Ruby (or god forbid, Perl) would have been a better choice for something like git that does lots of text processing... furthermore, I think the exception handling, garbage collection, and implicit object destruction provided by those languages (and by C++, as overwrought as it is) makes any codebase easier to understand and maintain. But that's irrelevant: git is written in C. That's the way it is, and you should accept that or fork. Kyle Dmitry Kakurin wrote: > We've had this theoretical (and IMHO pointless) discussion C vs. C++ *in > general*. > In no way I want to restart it. ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: C++ *for Git* 2007-09-22 15:15 ` Kyle Rose @ 2007-09-22 18:08 ` Miles Bader 2007-09-22 18:25 ` [OT] " Kyle Rose 2007-09-22 22:24 ` Martin Langhoff 1 sibling, 1 reply; 34+ messages in thread From: Miles Bader @ 2007-09-22 18:08 UTC (permalink / raw) To: Kyle Rose; +Cc: Dmitry Kakurin, Git Kyle Rose <krose@krose.org> writes: > I think the exception handling, garbage collection, and implicit > object destruction provided by those languages (and by C++, as > overwrought as it is) makes any codebase easier to understand and > maintain. Of course, some of the most horrid unreadable source code I've ever seen is in one of git's competitors -- written in python.... -Miles -- ===== (^o^; (())) *This is the cute octopus virus, please copy it into your sig so it can spread. ^ permalink raw reply [flat|nested] 34+ messages in thread
* [OT] Re: C++ *for Git* 2007-09-22 18:08 ` Miles Bader @ 2007-09-22 18:25 ` Kyle Rose 2007-09-22 19:11 ` David Kastrup 2007-09-22 22:50 ` Alex Unleashed 0 siblings, 2 replies; 34+ messages in thread From: Kyle Rose @ 2007-09-22 18:25 UTC (permalink / raw) To: Miles Bader; +Cc: Dmitry Kakurin, Git Miles Bader wrote: > Of course, some of the most horrid unreadable source code I've ever seen > is in one of git's competitors -- written in python.... Indeed. :-) At the office, people constantly badmouth Perl, which has some admittedly evil syntax (especially around exception handling). My view is that good Perl programmers can produce good, readable, maintainable Perl programs, while bad Perl programmers can produce spaghetti the likes of which can't be found outside Italy. OTOH, I think it is much harder to hang one's self with Python, though admittedly possible, as it is when you combine a bad coder with *any* language. Still, typical bad programmer + Perl is much worse than typical bad programmer + Python. C++ is in the same category as Perl IMO: too easy to produce unreadable code. I contend that C is pretty much just as bad, though in a different way: while C lacks C++'s ability to bury code in multiple layers of opaque abstractions, C makes up for it by providing absolutely no GC-type structures (i.e., I do this now, you clean it up later when I'm no longer interested in it). C is all explicit, which is nice when you have a good handle on everything that is going on *or* an explicit system for remembering to do those types of cleanup tasks that is well-understood by all developers involved. I like Ruby, except for the performance problems. Once they have those worked out, Ruby will be "Perl done right." ;-) Kyle ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-22 18:25 ` [OT] " Kyle Rose @ 2007-09-22 19:11 ` David Kastrup 2007-09-22 22:50 ` Alex Unleashed 1 sibling, 0 replies; 34+ messages in thread From: David Kastrup @ 2007-09-22 19:11 UTC (permalink / raw) To: Kyle Rose; +Cc: Miles Bader, Dmitry Kakurin, Git Kyle Rose <krose@krose.org> writes: > Miles Bader wrote: >> Of course, some of the most horrid unreadable source code I've ever seen >> is in one of git's competitors -- written in python.... > > Indeed. :-) > > At the office, people constantly badmouth Perl, which has some > admittedly evil syntax (especially around exception handling). Since Perl has agglomerated pretty much _every_ syntax, it is not surprising that evil syntax is included. > C++ is in the same category as Perl IMO: too easy to produce > unreadable code. Not quite. Perl gives you a hundred illegible ways to _say_ the same thing, C++ gives you a hundred illegible ways to _achieve_ the same thing, but using different means. > I like Ruby, except for the performance problems. Once they have > those worked out, Ruby will be "Perl done right." ;-) Ruby again is in the "throw every syntactical idiom I can think of together" ballpark. I find that a design mistake in Perl, a design mistake in Ruby, and even in C++ (Ada syntax for templates was just stupid, but at least there is no alternative syntax for it). That's one of the things I like about Lua: its syntax fits on one page in the reference manual. And the reference manual has a paper size of about A5. While the syntax for Lisp would probably fit in the margin, it does so at a cost in legibility. -- David Kastrup, Kriemhildstr. 15, 44793 Bochum ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-22 18:25 ` [OT] " Kyle Rose 2007-09-22 19:11 ` David Kastrup @ 2007-09-22 22:50 ` Alex Unleashed 2007-09-23 2:09 ` Frank Lichtenheld 1 sibling, 1 reply; 34+ messages in thread From: Alex Unleashed @ 2007-09-22 22:50 UTC (permalink / raw) To: Kyle Rose; +Cc: Miles Bader, Dmitry Kakurin, Git On 9/22/07, Kyle Rose <krose@krose.org> wrote: > C++ is in the same category as Perl IMO: too easy to produce unreadable > code. I contend that C is pretty much just as bad, though in a > different way: while C lacks C++'s ability to bury code in multiple > layers of opaque abstractions, C makes up for it by providing absolutely > no GC-type structures (i.e., I do this now, you clean it up later when > I'm no longer interested in it). C is all explicit, which is nice when > you have a good handle on everything that is going on *or* an explicit > system for remembering to do those types of cleanup tasks that is > well-understood by all developers involved. I'd say being forced to be explicit is a good thing here, so that the programmer at least has some sort of good understanding of what is going on, and chances are that if he doesn't really know, things just won't work out (quite unlike a lot of other languages where this programmer might actually end up with something half-assed that "mostly" works). For some reason it seems to me a lot harder to find bad programmers surviving using C than a lot of the other languages. Alex ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-22 22:50 ` Alex Unleashed @ 2007-09-23 2:09 ` Frank Lichtenheld 2007-09-23 6:25 ` David Brown 0 siblings, 1 reply; 34+ messages in thread From: Frank Lichtenheld @ 2007-09-23 2:09 UTC (permalink / raw) To: Alex Unleashed; +Cc: Kyle Rose, Miles Bader, Dmitry Kakurin, Git On Sun, Sep 23, 2007 at 12:50:00AM +0200, Alex Unleashed wrote: > I'd say being forced to be explicit is a good thing here, so that the > programmer at least has some sort of good understanding of what is > going on, and chances are that if he doesn't really know, things just > won't work out (quite unlike a lot of other languages where this > programmer might actually end up with something half-assed that > "mostly" works). > For some reason it seems to me a lot harder to find bad programmers > surviving using C than a lot of the other languages. Idiot-proofness-by-complexity is a myth IMHO. Idiots can be quite persistent... Gruesse, -- Frank Lichtenheld <frank@lichtenheld.de> www: http://www.djpig.de/ ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 2:09 ` Frank Lichtenheld @ 2007-09-23 6:25 ` David Brown 2007-09-23 7:23 ` David Kastrup 0 siblings, 1 reply; 34+ messages in thread From: David Brown @ 2007-09-23 6:25 UTC (permalink / raw) To: Frank Lichtenheld Cc: Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On Sun, Sep 23, 2007 at 04:09:51AM +0200, Frank Lichtenheld wrote: >On Sun, Sep 23, 2007 at 12:50:00AM +0200, Alex Unleashed wrote: >> I'd say being forced to be explicit is a good thing here, so that the >> programmer at least has some sort of good understanding of what is >> going on, and chances are that if he doesn't really know, things just >> won't work out (quite unlike a lot of other languages where this >> programmer might actually end up with something half-assed that >> "mostly" works). >> For some reason it seems to me a lot harder to find bad programmers >> surviving using C than a lot of the other languages. > >Idiot-proofness-by-complexity is a myth IMHO. Idiots can be quite >persistent... I work with plenty of them :-) It's all C. All of the same things happen, with management looking for magic bullets to solve problems caused by bad programmers. Dave ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 6:25 ` David Brown @ 2007-09-23 7:23 ` David Kastrup 2007-09-23 9:29 ` Marco Costalba 0 siblings, 1 reply; 34+ messages in thread From: David Kastrup @ 2007-09-23 7:23 UTC (permalink / raw) To: Frank Lichtenheld Cc: Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git David Brown <git@davidb.org> writes: > On Sun, Sep 23, 2007 at 04:09:51AM +0200, Frank Lichtenheld wrote: >>On Sun, Sep 23, 2007 at 12:50:00AM +0200, Alex Unleashed wrote: >>> I'd say being forced to be explicit is a good thing here, so that the >>> programmer at least has some sort of good understanding of what is >>> going on, and chances are that if he doesn't really know, things just >>> won't work out (quite unlike a lot of other languages where this >>> programmer might actually end up with something half-assed that >>> "mostly" works). >>> For some reason it seems to me a lot harder to find bad programmers >>> surviving using C than a lot of the other languages. >> >>Idiot-proofness-by-complexity is a myth IMHO. Idiots can be quite >>persistent... > > I work with plenty of them :-) It's all C. All of the same things > happen, with management looking for magic bullets to solve problems > caused by bad programmers. C++ is good for creating black boxes. A black box that has been fitted into its environment and that has good innards is fine. A black box with rotten innards, or not really being well-suited for the job at hand, isn't. For a project where people come and go, black boxes might hide a lot about bad design and implementation. In particular, changing an algorithm to require different black boxes is something that is very unpleasant to do. Having everything in the open is an advantage as long as the complexity to be managed is at a reasonable level. -- David Kastrup, Kriemhildstr. 15, 44793 Bochum ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 7:23 ` David Kastrup @ 2007-09-23 9:29 ` Marco Costalba 2007-09-23 9:42 ` David Kastrup 2007-09-23 10:45 ` Pierre Habouzit 0 siblings, 2 replies; 34+ messages in thread From: Marco Costalba @ 2007-09-23 9:29 UTC (permalink / raw) To: David Kastrup Cc: Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On 9/23/07, David Kastrup <dak@gnu.org> wrote: > David Brown <git@davidb.org> writes: > > > On Sun, Sep 23, 2007 at 04:09:51AM +0200, Frank Lichtenheld wrote: > >>On Sun, Sep 23, 2007 at 12:50:00AM +0200, Alex Unleashed wrote: > >>> I'd say being forced to be explicit is a good thing here, so that the > >>> programmer at least has some sort of good understanding of what is > >>> going on, and chances are that if he doesn't really know, things just > >>> won't work out (quite unlike a lot of other languages where this > >>> programmer might actually end up with something half-assed that > >>> "mostly" works). > >>> For some reason it seems to me a lot harder to find bad programmers > >>> surviving using C than a lot of the other languages. > >> Well, according to your reasoning assembly should be the gotha of elite programmers, only very disciplined and meticulous programmers survive, much more then in C. Is this a good way to measure a language? > > C++ is good for creating black boxes. Object oriented languages creates black boxes: that's the reason why object oriented exsists and also the reason why Linus hates it ;-) Difference between C++ and other OO languages is mostly in the size of the applications written in that language IMHO. C++ noramlly has the bigger code bases, so problem you mention are enanched and perhaps seem to depend on the language itself not on the size of application. IOW a Python (Ruby) app probably does not have the size of Firefox or Open Office, this _could_ induce the naive idea that the python app is cleaner or easier to understand just becasue of Python vc C++. I really don't think so. I think this could be true for toy problems, but for real, for big applications is the design of the appllcation, not the language, that at 90% state the difference between clean and crap. >A black box that has been > fitted into its environment and that has good innards is fine. A > black box with rotten innards, or not really being well-suited for the > job at hand, isn't. I really agree here. The biggset downside of OO is that for it to work you should have a much deeper knowledge of the problem you want to handle. OO force you to analyze more and know more because a bad design normally means throwing everything in the trash can and start again. Procedural programming as C is more immune to this 'good problem analysis' dependency. Marco ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 9:29 ` Marco Costalba @ 2007-09-23 9:42 ` David Kastrup 2007-09-23 9:50 ` Marco Costalba 2007-09-23 10:45 ` Pierre Habouzit 1 sibling, 1 reply; 34+ messages in thread From: David Kastrup @ 2007-09-23 9:42 UTC (permalink / raw) To: Marco Costalba Cc: Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git "Marco Costalba" <mcostalba@gmail.com> writes: > On 9/23/07, David Kastrup <dak@gnu.org> wrote: >> David Brown <git@davidb.org> writes: >> >> > On Sun, Sep 23, 2007 at 04:09:51AM +0200, Frank Lichtenheld wrote: >> >>On Sun, Sep 23, 2007 at 12:50:00AM +0200, Alex Unleashed wrote: >> >>> I'd say being forced to be explicit is a good thing here, so that the >> >>> programmer at least has some sort of good understanding of what is >> >>> going on, and chances are that if he doesn't really know, things just >> >>> won't work out (quite unlike a lot of other languages where this >> >>> programmer might actually end up with something half-assed that >> >>> "mostly" works). >> >>> For some reason it seems to me a lot harder to find bad programmers >> >>> surviving using C than a lot of the other languages. >> >> > > Well, according to your reasoning Who is "you"? You are replying to a post of mine, yet commenting on Alex. > assembly should be the gotha of elite programmers, only very > disciplined and meticulous programmers survive, much more then in C. I am neither disciplined nor meticulous, yet have designed and programmed applications and complete systems in assembly language. Programmers can easily survive assembly language without being disciplined or meticulous. Their projects can't: they get tied to the programmers. Porting an assembly language application to a different processor might be easier than porting it to another programmer. > Is this a good way to measure a language? It is a good way to measure programmers, at least concerning some interesting metrics. -- David Kastrup, Kriemhildstr. 15, 44793 Bochum ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 9:42 ` David Kastrup @ 2007-09-23 9:50 ` Marco Costalba 0 siblings, 0 replies; 34+ messages in thread From: Marco Costalba @ 2007-09-23 9:50 UTC (permalink / raw) To: David Kastrup Cc: Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On 9/23/07, David Kastrup <dak@gnu.org> wrote: > > > > Well, according to your reasoning > > Who is "you"? You are replying to a post of mine, yet commenting on > Alex. > Sorry, you are right, I'm not meticolus either ;-) Marco ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 9:29 ` Marco Costalba 2007-09-23 9:42 ` David Kastrup @ 2007-09-23 10:45 ` Pierre Habouzit 2007-09-23 13:42 ` Marco Costalba 1 sibling, 1 reply; 34+ messages in thread From: Pierre Habouzit @ 2007-09-23 10:45 UTC (permalink / raw) To: Marco Costalba Cc: David Kastrup, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git [-- Attachment #1: Type: text/plain, Size: 4098 bytes --] On Sun, Sep 23, 2007 at 09:29:45AM +0000, Marco Costalba wrote: > On 9/23/07, David Kastrup <dak@gnu.org> wrote: > > David Brown <git@davidb.org> writes: > > > > > On Sun, Sep 23, 2007 at 04:09:51AM +0200, Frank Lichtenheld wrote: > > >>On Sun, Sep 23, 2007 at 12:50:00AM +0200, Alex Unleashed wrote: > > >>> I'd say being forced to be explicit is a good thing here, so that the > > >>> programmer at least has some sort of good understanding of what is > > >>> going on, and chances are that if he doesn't really know, things just > > >>> won't work out (quite unlike a lot of other languages where this > > >>> programmer might actually end up with something half-assed that > > >>> "mostly" works). > > >>> For some reason it seems to me a lot harder to find bad programmers > > >>> surviving using C than a lot of the other languages. > > >> > > Well, according to your reasoning assembly should be the gotha of > elite programmers, only very disciplined and meticulous programmers > survive, much more then in C. This non argument was raised before in the recent thread we just had. Could we at least wait say, a month, before spawning the same trolls again and again ? > > C++ is good for creating black boxes. > > Object oriented languages creates black boxes: that's the reason why > object oriented exsists and also the reason why Linus hates it ;-) This is just nonsense. This has been proved, though I can't find the paper about this anymore, than modules (or packages whichever name you give them) plus abstract types are as good as OO languages at creating black boxes. I mean it has been proved that it gives the exact same amount of expressiveness. So please stop with this myth. And don't speak for people, I would be very surprised that Linus would dislike "black boxes". Abstractions are good, when used wisely, and I would be much surprised to see Linus pretend otherwise. The real problem with big applications, is not that they are written with C, C++, D, APL or Perl, but that they are big. Most of the time, big means that many people are not able to grok the big picture, and you end up with 102 implementations of base64, 10 string libraries, 4 general purpose buffers, and at least half of the common lisp features[0]. And for the record git is _not_ big. It's around 100k slocs, which rougly the size of postfix or mutt. I for one do believe that bad programmers will write bad code whichever language they use, and that what is wrong is to end with code bases in one monolithic thing like in [1]. OO design patterns and other craps of the like helps you generate insane amount of codelines, and hide all the simplicity under huge loads of proxies and interfaces. In C, when your API suck, you usually need to refactor it under the pressure of the huge amount of code you have to repeat each time you use the API. in an OO language, you add a new class for that purpose. In C++ it's even worse, you just hide it in a copy constructor, or an operator so that when you write: Foo a = b; Instead of a simple memcpy, you end up with an horrible pile of crap to be started and run behind your back. C++ is very good at hiding bad code. At least in C, when someone writes bad code, it's obvious to any reader. C has many many quirks, I don't discuss that, but OO programming solves none of them, and the problems OO addresses are not the one that may interfere in the git development. I mean, the two really interesting things in OO (that haven't a tremendous cost in return) are member overloading and inheritance. I see very few places where git would benefit from that, and believe me, I looked at git's code with refactoring in mind and only that. Can we go back to git now ? [0] http://en.wikipedia.org/wiki/Greenspun's_Tenth_Rule [1] http://www.ohloh.net/projects/29/analyses/latest -- ·O· Pierre Habouzit ··O madcoder@debian.org OOO http://www.madism.org [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 10:45 ` Pierre Habouzit @ 2007-09-23 13:42 ` Marco Costalba 2007-09-23 14:23 ` Nicolas Pitre ` (2 more replies) 0 siblings, 3 replies; 34+ messages in thread From: Marco Costalba @ 2007-09-23 13:42 UTC (permalink / raw) To: Pierre Habouzit, Marco Costalba, David Kastrup, Frank Lichtenheld, Alex Unleashed On 9/23/07, Pierre Habouzit <madcoder@debian.org> wrote: > > > > Object oriented languages creates black boxes: that's the reason why > > object oriented exsists and also the reason why Linus hates it ;-) > > This is just nonsense. This has been proved, though I can't find the > paper about this anymore, than modules (or packages whichever name you > give them) plus abstract types are as good as OO languages at creating > black boxes. I mean it has been proved that it gives the exact same > amount of expressiveness. So please stop with this myth. And don't speak > for people, I would be very surprised that Linus would dislike "black > boxes". Abstractions are good, when used wisely, and I would be much > surprised to see Linus pretend otherwise. > >From a Linus recent thread: > - inefficient abstracted programming models where two years down the road > you notice that some abstraction wasn't very efficient, but now all > your code depends on all the nice object models around it, and you > cannot fix it without rewriting your app. > >In other words, the only way to do good, efficient, and system-level and >portable C++ ends up to limit yourself to all the things that are >basically available in C. And limiting your project to C means that people >don't screw that up, and also means that you get a lot of programmers that >do actually understand low-level issues and don't screw things up with any >idiotic "object model" crap. Perhaps I have misunderstood, but the idea I got is that for Linus OO brings in more problems than what it tries to fix. > The real problem with big applications, is not that they are written > with C, C++, D, APL or Perl, but that they are big. I have said exactly this, I don't understand where's your point in repeating the same concept. > C has many many quirks, I don't discuss that, but OO programming > solves none of them, and the problems OO addresses are not the one that > may interfere in the git development. I really don't get how you made up your mind I'm advocating OO ? The only comment I made on OO until now was to highlight one of its downsides. > I mean, the two really interesting > things in OO (that haven't a tremendous cost in return) are member > overloading and inheritance. You have listed two things that are a world apart one from each other. member overload is just syntactic sugar for name mangling, while inheritance and the _strictly_ related virtual member functions (AKA polymorphism) is what opens the gates to all the stuff you have deeply blamed in your post. >I see very few places where git would > benefit from that Instead I see none. But probably you have looked at git code better then me. > Can we go back to git now ? > You are not forced to follow this thread if this bores you. Thanks Marco ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 13:42 ` Marco Costalba @ 2007-09-23 14:23 ` Nicolas Pitre 2007-09-23 14:45 ` Marco Costalba 2007-09-23 14:37 ` David Kastrup 2007-09-23 16:54 ` Linus Torvalds 2 siblings, 1 reply; 34+ messages in thread From: Nicolas Pitre @ 2007-09-23 14:23 UTC (permalink / raw) To: Marco Costalba Cc: Pierre Habouzit, David Kastrup, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On Sun, 23 Sep 2007, Marco Costalba wrote: > From a Linus recent thread: > > > - inefficient abstracted programming models where two years down the road > > you notice that some abstraction wasn't very efficient, but now all > > your code depends on all the nice object models around it, and you > > cannot fix it without rewriting your app. > > > >In other words, the only way to do good, efficient, and system-level and > >portable C++ ends up to limit yourself to all the things that are > >basically available in C. And limiting your project to C means that people > >don't screw that up, and also means that you get a lot of programmers that > >do actually understand low-level issues and don't screw things up with any > >idiotic "object model" crap. > > Perhaps I have misunderstood, but the idea I got is that for Linus OO > brings in more problems than what it tries to fix. You must have misunderstood. Why? The linux kernel is itself very heavily "object oriented" already, even if it is written in C. You don't need C++ for that. Nicolas ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 14:23 ` Nicolas Pitre @ 2007-09-23 14:45 ` Marco Costalba 0 siblings, 0 replies; 34+ messages in thread From: Marco Costalba @ 2007-09-23 14:45 UTC (permalink / raw) To: Nicolas Pitre Cc: Pierre Habouzit, David Kastrup, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On 9/23/07, Nicolas Pitre <nico@cam.org> wrote: > You must have misunderstood. Why? The linux kernel is itself very > heavily "object oriented" already, even if it is written in C. You > don't need C++ for that. > Yes it's true, you don't need it. Object oriented in C is achived using function pointers. In C you fill a struct of function pointers with proper values instead of inherithing from an (abstract) base class as you would do in C++. The results are more or less the same modulo some type safe. Marco ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 13:42 ` Marco Costalba 2007-09-23 14:23 ` Nicolas Pitre @ 2007-09-23 14:37 ` David Kastrup 2007-09-23 15:15 ` Marco Costalba 2007-09-23 17:49 ` Paul Franz 2007-09-23 16:54 ` Linus Torvalds 2 siblings, 2 replies; 34+ messages in thread From: David Kastrup @ 2007-09-23 14:37 UTC (permalink / raw) To: Marco Costalba Cc: Pierre Habouzit, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git "Marco Costalba" <mcostalba@gmail.com> writes: > On 9/23/07, Pierre Habouzit <madcoder@debian.org> wrote: >> > >> > Object oriented languages creates black boxes: that's the reason >> > why object oriented exsists and also the reason why Linus hates >> > it ;-) >> So please stop with this myth. And don't speak for people, I would >> be very surprised that Linus would dislike "black >> boxes". Abstractions are good, when used wisely, and I would be >> much surprised to see Linus pretend otherwise. > > From a Linus recent thread: > >>In other words, the only way to do good, efficient, and system-level >>and portable C++ ends up to limit yourself to all the things that >>are basically available in C. And limiting your project to C means >>that people don't screw that up, and also means that you get a lot >>of programmers that do actually understand low-level issues and >>don't screw things up with any idiotic "object model" crap. > > Perhaps I have misunderstood, but the idea I got is that for Linus > OO brings in more problems than what it tries to fix. I read that as OO bringing in more programmers capable of creating problems than those capable of fixing them. It is not the fault of OO in itself, but it is the bottom line that counts: if it draws the wrong audience for the wrong reasons, it better had great benefits to offset that. Not quite unsimilar with communism: the idea is great in principle, but the idea has no built-in self-check. Capitalism, in contrast, is a distasteful idea at its heart, but it is rooted soundly in individual egoism. Which does not make it any less distasteful, but at least it tends to work. -- David Kastrup, Kriemhildstr. 15, 44793 Bochum ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 14:37 ` David Kastrup @ 2007-09-23 15:15 ` Marco Costalba 2007-09-23 17:49 ` Paul Franz 1 sibling, 0 replies; 34+ messages in thread From: Marco Costalba @ 2007-09-23 15:15 UTC (permalink / raw) To: David Kastrup Cc: Pierre Habouzit, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On 9/23/07, David Kastrup <dak@gnu.org> wrote: > > > > Perhaps I have misunderstood, but the idea I got is that for Linus > > OO brings in more problems than what it tries to fix. > > I read that as OO bringing in more programmers capable of creating > problems than those capable of fixing them. > > It is not the fault of OO in itself, but it is the bottom line that > counts: if it draws the wrong audience for the wrong reasons, it > better had great benefits to offset that. Perhaps I'm wrong, but I think one of the advantages of big projects written in C vs comparable size projects in an OO language (read C++) it's exactly the opposite. Because C lets a random developer to understand, quickly enough, and do little local modifications also to big projects like Linux, it attracts a lot of developers that have the possibility to start with some janitorial work or some little patch without incurring in the very steep learning curve you have understanding the object hierarchy of a big C++ code base, an almost mandatory step, before to start hacking as example in Firefox. This is, IMHO, a big advantage: fresh meat is always welcomed, the damage it can potentially create is more then compensated by the long term benefit of a large and live developer community. Marco ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 14:37 ` David Kastrup 2007-09-23 15:15 ` Marco Costalba @ 2007-09-23 17:49 ` Paul Franz 1 sibling, 0 replies; 34+ messages in thread From: Paul Franz @ 2007-09-23 17:49 UTC (permalink / raw) To: Git To me the methods that an OO class defines is the same thing as an API. And you can screw up an API whether it is C++ or C. Both give you the same opportunity to screw up the model and create code that needs to be re-written. Paul Franz David Kastrup wrote: > "Marco Costalba" <mcostalba@gmail.com> writes: > > >> On 9/23/07, Pierre Habouzit <madcoder@debian.org> wrote: >> >>>> Object oriented languages creates black boxes: that's the reason >>>> why object oriented exsists and also the reason why Linus hates >>>> it ;-) >>>> > > >>> So please stop with this myth. And don't speak for people, I would >>> be very surprised that Linus would dislike "black >>> boxes". Abstractions are good, when used wisely, and I would be >>> much surprised to see Linus pretend otherwise. >>> >> From a Linus recent thread: >> >> >>> In other words, the only way to do good, efficient, and system-level >>> and portable C++ ends up to limit yourself to all the things that >>> are basically available in C. And limiting your project to C means >>> that people don't screw that up, and also means that you get a lot >>> of programmers that do actually understand low-level issues and >>> don't screw things up with any idiotic "object model" crap. >>> >> Perhaps I have misunderstood, but the idea I got is that for Linus >> OO brings in more problems than what it tries to fix. >> > > I read that as OO bringing in more programmers capable of creating > problems than those capable of fixing them. > > It is not the fault of OO in itself, but it is the bottom line that > counts: if it draws the wrong audience for the wrong reasons, it > better had great benefits to offset that. Not quite unsimilar with > communism: the idea is great in principle, but the idea has no > built-in self-check. Capitalism, in contrast, is a distasteful idea > at its heart, but it is rooted soundly in individual egoism. Which > does not make it any less distasteful, but at least it tends to work. > > -- ------------------------------------------- There are seven sins in the world. Wealth without work. Pleasure without conscience. Knowledge without character. Commerce without morality. Science without humanity. Worship without sacrifice. Politics without principle. -- Mohandas Gandhi ------------------------------------------- ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 13:42 ` Marco Costalba 2007-09-23 14:23 ` Nicolas Pitre 2007-09-23 14:37 ` David Kastrup @ 2007-09-23 16:54 ` Linus Torvalds 2007-09-23 18:05 ` Marco Costalba 2007-09-23 21:22 ` Dmitry Potapov 2 siblings, 2 replies; 34+ messages in thread From: Linus Torvalds @ 2007-09-23 16:54 UTC (permalink / raw) To: Marco Costalba Cc: Pierre Habouzit, David Kastrup, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On Sun, 23 Sep 2007, Marco Costalba wrote: > > Perhaps I have misunderstood, but the idea I got is that for Linus OO > brings in more problems than what it tries to fix. Not really. I'm a huge believer in OO, and if you look at the kernel, for example, there's just a ton of interfaces that are basically object-oriented. All the VFS is, for example, is really just a object model around low-level filesystems. The same largely goes for virtual memory mappings, or indeed for things like the interrupt or DMA controller abstractions, the network packet filtering etc etc etc. But I'm also a huge believer in *explicit*syntax*. People should see what is going on, and the abstraction should be explicit. [ Honesty in advertising: we do end up often hiding *some* abstractions. Sometimes it happens for historical reasons: if the code didn't have any indirection/abstraction initially, we may end up using macros and inline functions to hide the fact that it now is actually going through an indirect object-oriented interface. And sometimes it happens because the thing is *so* common or *so* obvious that making the indirection explicit is just syntactically too intrusive. ] And we do all of this in C. There is no need to go to C++ for any "object oriented principles". It really is just a syntactic issue, and in many ways the syntax "advantage" of C++ is actually a big *disadvantage*. I'm one of those people who think that interactions should be *locally* visible. If you need to understand the "big picture" in order to understand what a line of code does, that's usually a bad idea. So syntactic tricks that hide what is actually going on are bad. You can see some of my opinions on C in the extensions I did for sparse. I think the C type system is a bit too sloppy, and much of what sparse does is more totally static type checking. Things like being able to decorate types statically, and having to explicitly carry those decorations around is a *good* thing - because it does the opposite of hiding. Having to say struct somestruct __user *p to explicitly say that it's a pointer to user space - and then having every function that takes that pointer have to have that "__user" there is a VERY GOOD THING. That's very different from having "accessor functions" and making "p" an abstract type, and having the compiler automatically generate the right kind of access. That kind of stuff is TOTAL CRAP, and it's an example of how C++ has a horrible design, where you carry around _implicit_ knowledge instead of making the knowledge explicit and visible locally too. (And no, C doesn't do it very well. The C type system makes it too hard to add explicit markers that get statically checked, and you generally have to do it by making the code unreadable by turning things into special structures, one for each use, or something like that). The same goes for things like memory allocation. Memory allocation issues are often some of the *biggest* performance issues, and that means that they have to be explicit. I'm actually a big fan of GC, but most languages that implement GC do it exactly the wrong way in my opinion: they make it a fundamental thing that covers everything, and it all happens implicitly, instead of making it explicit. I don't know how many people have noticed that git internally actually does do some garbage collection. It's just that we call it "caches", and we do it explicitly. I'd love to have a language that helps me with that, but I would *hate* to have a language that does it for everything. As it is, we *could* do garbage collection much more, but we don't, just because it's a bit too painful. In practice, it means that I'm considering writing some helper routines in C, which actually would do exactly what I want them to do: make the (reasonably few) data structures that want to have a dynamic cache use that dynamic cache explicitly, the way we now do for delta caching etc. There are a few features of C++ that I really really like. For example, I think the C preprocessor is absolutely horrid, and a preprocessor that is built into the language - and integrates with the syntax - would be wonderful. And while C++ doesn't improve on that, at least templates are an example of something like that. Not perfect, but that's the kind of feature that C really would like. In the kernel, we (ab-)use the C preprocessor a lot for things like that. Some of our macros are really disgusting. I'm not proud, but it works well, and together with gcc extensions like "__typeof__" and thigns like "__builtin_constant_p()" you can do some rather powerful things. But other parts of C++ are just nasty. The whole OO layer seems designed to do a lot of things implicitly and in the wrong way. I also disagree with exception handling, and the "new" keyword kind of exemplifies a lot of what is wrong in C++. So in short: - the one big feature that I think really makes a huge difference to people, C++ does not have: garbage collection. Yes, there are GC modules, but let's face it, you can do that equally well in C too, it's just slightly different syntax. - the stuff C++ *does* have is usually nasty. Implicit initializers and destructors and the magic lifetime rules of objects etc are all just a piece of incredible bogosity. And that all comes from the OO stuff that is totally worthless, because it's really just syntactic fluff that can be done easily in C. - the C preprocessor really is horrible, and every single language beats C handily in this area. Except for C++, which didn't fix anything at all in that area. Even assemblers have macro languages that allow conditionals, repetition, nesting, etc etc. C and C++? Not so much. (Some languages don't need it, because the language itself is dynamic and you can do everything from within the language - ie you just evaluate an expression that you built up dynamically as in LISP etc). (And don't tell me about m4. It's a better preprocessor, but it's not syntactically integrated, and it's too complex, imho) There are other problems in C. The implicit type conversions should at least have some way to be disabled on a type-for-type basis. Linus ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 16:54 ` Linus Torvalds @ 2007-09-23 18:05 ` Marco Costalba 2007-09-23 18:30 ` David Kastrup 2007-09-23 21:22 ` Dmitry Potapov 1 sibling, 1 reply; 34+ messages in thread From: Marco Costalba @ 2007-09-23 18:05 UTC (permalink / raw) To: Linus Torvalds Cc: Pierre Habouzit, David Kastrup, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On 9/23/07, Linus Torvalds <torvalds@linux-foundation.org> wrote: > > There are a few features of C++ that I really really like. For example, I > think the C preprocessor is absolutely horrid, and a preprocessor that is > built into the language - and integrates with the syntax - would be > wonderful. And while C++ doesn't improve on that, at least templates are > an example of something like that. Not perfect, but that's the kind of > feature that C really would like. > Yes, I really agree. IMO templates are the thing that more resembles procedural programming, a common way of using them is to split data structures (containers) from functions that operates on them (algorithms). I find them very similar to the struct + functions classical approach of C. And BTW template <typename T> is the thing in C++ that more remembers me of opaque pointers and their use in C, the difference is that the first is fully type checked. Marco ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 18:05 ` Marco Costalba @ 2007-09-23 18:30 ` David Kastrup 2007-09-23 18:43 ` Marco Costalba 0 siblings, 1 reply; 34+ messages in thread From: David Kastrup @ 2007-09-23 18:30 UTC (permalink / raw) To: Marco Costalba Cc: Linus Torvalds, Pierre Habouzit, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git "Marco Costalba" <mcostalba@gmail.com> writes: > On 9/23/07, Linus Torvalds <torvalds@linux-foundation.org> wrote: >> >> There are a few features of C++ that I really really like. For example, I >> think the C preprocessor is absolutely horrid, and a preprocessor that is >> built into the language - and integrates with the syntax - would be >> wonderful. And while C++ doesn't improve on that, at least templates are >> an example of something like that. Not perfect, but that's the kind of >> feature that C really would like. >> > > Yes, I really agree. IMO templates are the thing that more resembles > procedural programming, a common way of using them is to split data > structures (containers) from functions that operates on them > (algorithms). I find them very similar to the struct + functions > classical approach of C. > > And BTW > > template <typename T> > > is the thing in C++ that more remembers me of opaque pointers and > their use in C, the difference is that the first is fully type > checked. Not really. The difference is that the first generates new (and optimized) code for every type which is something you can only do using macros in C. Class programming is similar to opaque pointers (in particular concerning the generated code) but templates are really more like macros, as their instantiation generates specialized code, not at all like the handling of opaque pointers. While I tend to agree that templates are probably the one thing actually worth having, it was stupid to lift the restrictions syntax along with the concept of generics from the Ada shop. Borrowing syntax along with features is such a Perlesque approach. -- David Kastrup, Kriemhildstr. 15, 44793 Bochum ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 18:30 ` David Kastrup @ 2007-09-23 18:43 ` Marco Costalba 2007-09-23 19:11 ` David Kastrup 0 siblings, 1 reply; 34+ messages in thread From: Marco Costalba @ 2007-09-23 18:43 UTC (permalink / raw) To: David Kastrup Cc: Linus Torvalds, Pierre Habouzit, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On 9/23/07, David Kastrup <dak@gnu.org> wrote: > "Marco Costalba" <mcostalba@gmail.com> writes: > > > On 9/23/07, Linus Torvalds <torvalds@linux-foundation.org> wrote: > >> > >> There are a few features of C++ that I really really like. For example, I > >> think the C preprocessor is absolutely horrid, and a preprocessor that is > >> built into the language - and integrates with the syntax - would be > >> wonderful. And while C++ doesn't improve on that, at least templates are > >> an example of something like that. Not perfect, but that's the kind of > >> feature that C really would like. > >> > > > > Yes, I really agree. IMO templates are the thing that more resembles > > procedural programming, a common way of using them is to split data > > structures (containers) from functions that operates on them > > (algorithms). I find them very similar to the struct + functions > > classical approach of C. > > > > And BTW > > > > template <typename T> > > > > is the thing in C++ that more remembers me of opaque pointers and > > their use in C, the difference is that the first is fully type > > checked. > > Not really. The difference is that the first generates new (and > optimized) code for every type which is something you can only do > using macros in C. Class programming is similar to opaque pointers > (in particular concerning the generated code) but templates are really > more like macros, as their instantiation generates specialized code, > not at all like the handling of opaque pointers. > Probably if I had written like this was more clear: template <typename T> int some_function(T* p); And regarding 'new' code for each type I would like to remember that template instantations of different types can be removed by compiler/linker when the instantations are the same (i.e. produce the same binary instuctions), this could happen for function templates that handle pointers, as example. Marco ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 18:43 ` Marco Costalba @ 2007-09-23 19:11 ` David Kastrup 0 siblings, 0 replies; 34+ messages in thread From: David Kastrup @ 2007-09-23 19:11 UTC (permalink / raw) To: Marco Costalba Cc: Linus Torvalds, Pierre Habouzit, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git "Marco Costalba" <mcostalba@gmail.com> writes: > On 9/23/07, David Kastrup <dak@gnu.org> wrote: >> "Marco Costalba" <mcostalba@gmail.com> writes: >> >> > And BTW >> > >> > template <typename T> >> > >> > is the thing in C++ that more remembers me of opaque pointers and >> > their use in C, the difference is that the first is fully type >> > checked. >> >> Not really. The difference is that the first generates new (and >> optimized) code for every type which is something you can only do >> using macros in C. Class programming is similar to opaque pointers >> (in particular concerning the generated code) but templates are really >> more like macros, as their instantiation generates specialized code, >> not at all like the handling of opaque pointers. > > Probably if I had written like this was more clear: > > template <typename T> int some_function(T* p); Huh? How is this supposed to support your point? There is nothing like an opaque pointer involved here. The point of opaque pointers is that they can stand for a variety of types, whereas each template instantiation can only substitute a single type. > And regarding 'new' code for each type I would like to remember that > template instantations of different types can be removed by > compiler/linker when the instantations are the same (i.e. produce > the same binary instuctions), this could happen for function > templates that handle pointers, as example. Hardly. The type constraints/virtual function tables of any called function depending on T will be different. And if indeed nothing depends on T at all inside of the template, it is pointless not to declare it as void *p in the first place: the type of *p will never be used then. -- David Kastrup, Kriemhildstr. 15, 44793 Bochum ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 16:54 ` Linus Torvalds 2007-09-23 18:05 ` Marco Costalba @ 2007-09-23 21:22 ` Dmitry Potapov 2007-09-23 21:31 ` David Kastrup 2007-09-23 22:25 ` Reece Dunn 1 sibling, 2 replies; 34+ messages in thread From: Dmitry Potapov @ 2007-09-23 21:22 UTC (permalink / raw) To: Linus Torvalds Cc: Marco Costalba, Pierre Habouzit, David Kastrup, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On Sun, Sep 23, 2007 at 09:54:10AM -0700, Linus Torvalds wrote: > > And we do all of this in C. There is no need to go to C++ for any "object > oriented principles". It really is just a syntactic issue, and in many > ways the syntax "advantage" of C++ is actually a big *disadvantage*. Certainly, in this respect, C++ provides only syntactic sugar over C, and there is a real danger of abuse, which leads to horrible programs. This is especially likely to happen to those who think that the evil of C++ is lying in templates, exceptions, or something other feature of C++, because they start to abuse the only "good" feature they know and inevitably end up with horrible code. > struct somestruct __user *p > > to explicitly say that it's a pointer to user space - and then having > every function that takes that pointer have to have that "__user" there is > a VERY GOOD THING. user_ptr<somestruct> p; > > That's very different from having "accessor functions" and making "p" an > abstract type, and having the compiler automatically generate the right > kind of access. That kind of stuff is TOTAL CRAP, and it's an example of > how C++ has a horrible design, where you carry around _implicit_ knowledge > instead of making the knowledge explicit and visible locally too. Whether it will convert to something or not depends entirely on the definition of user_ptr. So, it can be as explicit as you wish, or completely implicit. C++ does not impose anything on you here. So, the problem is not in C++ but in the crappy mentality -- "let's hide everything behind 'higher' abstraction" or "let's hide this thing too because we can". Yes, these people end up with total crap. And yes, those people tend to prefer C++ over C, just because C++ is better at hiding. But I don't think that C++ forces anyone to do that... > The same goes for things like memory allocation. Memory allocation issues > are often some of the *biggest* performance issues, and that means that > they have to be explicit. I'm actually a big fan of GC, but most languages > that implement GC do it exactly the wrong way in my opinion: they make it > a fundamental thing that covers everything, and it all happens implicitly, > instead of making it explicit. Stroustrup was not a big fan of GC, so he made the language to be useful in absence of any GC, and it allows to manage memory and some other resources though not automatically, but with much less efforts than in C. Maybe, your idea of more explicit GC is better than what C++ offers. It is difficult for me to say without trying, but as you said most languages implement GC in the wrong way in your opinion, so I don't think I will have a chance to try any language that does it right. As to "caches" in Git, it works really nicely, but Git is not a programming language. > But other parts of C++ are just nasty. The whole OO layer seems designed > to do a lot of things implicitly and in the wrong way. It could do a lot of things implicitly, but it does not force you, except calling destructor when the control leaves the scope of declaration, but I hardly can consider it as implicit. > I also disagree with exception handling, Perhaps, you look at it from the kernel point of view. Otherwise, I would like to hear your arguments against it. In fact, I don't think it is possible to write generic algorithms without exceptions. Of course, if you write a program that can print an error to stderr and exit, there is no much need for them. So, it may depend on the task. > - the stuff C++ *does* have is usually nasty. Implicit initializers and > destructors and the magic lifetime rules of objects etc I am not sure what is wrong with initializers and destructors in C++, but certainly there is no magic lifetime rules in C++, as it is fully determined by the scope. In fact, other high level languages that use GC have much more unpredictable lifetime rules for objects. Dmitry Potapov PS Please, do not confuse me with Dmitry Kakurin, who started this thread, because my position is opposite to his. Though I like C++, I fully understand most of your consideration in choosing C for Git. ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 21:22 ` Dmitry Potapov @ 2007-09-23 21:31 ` David Kastrup 2007-09-23 23:10 ` Robin Rosenberg 2007-09-23 22:25 ` Reece Dunn 1 sibling, 1 reply; 34+ messages in thread From: David Kastrup @ 2007-09-23 21:31 UTC (permalink / raw) To: Dmitry Potapov Cc: Linus Torvalds, Marco Costalba, Pierre Habouzit, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git Dmitry Potapov <dpotapov@nbs-eng.ru> writes: > On Sun, Sep 23, 2007 at 09:54:10AM -0700, Linus Torvalds wrote: > >> - the stuff C++ *does* have is usually nasty. Implicit >> initializers and destructors and the magic lifetime rules of >> objects etc > > I am not sure what is wrong with initializers and destructors in > C++, but certainly there is no magic lifetime rules in C++, as it is > fully determined by the scope. It has been some time since I last looked, but the lifetime of objects constructed in return statements was a moving target through several standards. The last standard I bothered looking at had the object survive until the statement with the function call expression ended: quite a strange synchronization point with regard to language design. > In fact, other high level languages that use GC have much more > unpredictable lifetime rules for objects. Mostly objects are alive as long as you can refer to them. Not really complicated. -- David Kastrup, Kriemhildstr. 15, 44793 Bochum ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 21:31 ` David Kastrup @ 2007-09-23 23:10 ` Robin Rosenberg 0 siblings, 0 replies; 34+ messages in thread From: Robin Rosenberg @ 2007-09-23 23:10 UTC (permalink / raw) To: David Kastrup Cc: Dmitry Potapov, Linus Torvalds, Marco Costalba, Pierre Habouzit, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git söndag 23 september 2007 skrev David Kastrup: > Dmitry Potapov <dpotapov@nbs-eng.ru> writes: > > > On Sun, Sep 23, 2007 at 09:54:10AM -0700, Linus Torvalds wrote: > > > >> - the stuff C++ *does* have is usually nasty. Implicit > >> initializers and destructors and the magic lifetime rules of > >> objects etc > > > > I am not sure what is wrong with initializers and destructors in > > C++, but certainly there is no magic lifetime rules in C++, as it is > > fully determined by the scope. > > It has been some time since I last looked, but the lifetime of objects > constructed in return statements was a moving target through several > standards. The last standard I bothered looking at had the object > survive until the statement with the function call expression ended: > quite a strange synchronization point with regard to language design. The idea is that you should be able to use temporaries by reference and trust them to be valid over function calls end even function returns, so you can write efficient matrix math libraries that do not copy data much while retaining value semantics with overloaded operators. It is a purely practical matter, what actually works and is efficient, not dogmatic language "design". Earlier versions failed to make up something useful here. > > In fact, other high level languages that use GC have much more > > unpredictable lifetime rules for objects. > > Mostly objects are alive as long as you can refer to them. Not really > complicated. What could be simpler, besides all static variables. -- robin ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 21:22 ` Dmitry Potapov 2007-09-23 21:31 ` David Kastrup @ 2007-09-23 22:25 ` Reece Dunn 2007-09-24 10:46 ` Dmitry Potapov 1 sibling, 1 reply; 34+ messages in thread From: Reece Dunn @ 2007-09-23 22:25 UTC (permalink / raw) To: Dmitry Potapov Cc: Linus Torvalds, Marco Costalba, Pierre Habouzit, David Kastrup, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On 23/09/2007, Dmitry Potapov <dpotapov@nbs-eng.ru> wrote: > On Sun, Sep 23, 2007 at 09:54:10AM -0700, Linus Torvalds wrote: > > The same goes for things like memory allocation. Memory allocation issues > > are often some of the *biggest* performance issues, and that means that > > they have to be explicit. I'm actually a big fan of GC, but most languages > > that implement GC do it exactly the wrong way in my opinion: they make it > > a fundamental thing that covers everything, and it all happens implicitly, > > instead of making it explicit. > > Stroustrup was not a big fan of GC, so he made the language to be useful > in absence of any GC, and it allows to manage memory and some other > resources though not automatically, but with much less efforts than in C. The next version of C++ is going to have garbage collection that the user can enable, disable or remain neutral about. However, this is program-wide and has many traps that you could fall into. > > But other parts of C++ are just nasty. The whole OO layer seems designed > > to do a lot of things implicitly and in the wrong way. > > It could do a lot of things implicitly, but it does not force you, > except calling destructor when the control leaves the scope of > declaration, but I hardly can consider it as implicit. You have to add the explicit keyword to any constructor to prevent an automatic conversion. Therefore, the constructors that are called are implicit by default. If you have a conversion operator, this is always implicitly called when there is a match by the compiler. I agree with Linus here, there are a lot of things that happen implicily. > > I also disagree with exception handling, > > Perhaps, you look at it from the kernel point of view. Otherwise, I > would like to hear your arguments against it. In fact, I don't think > it is possible to write generic algorithms without exceptions. Of > course, if you write a program that can print an error to stderr and > exit, there is no much need for them. So, it may depend on the task. There are many issues with exceptions. Firstly, there is throwing an exception from a destructor, which is warned against in any good C++ book, but does not prevent you from doing so (even if it is inadvertantly)! If the program is in the process of handling an exception, the program is toast. More importantly though, is the loss of contextual information. Consider throwing the same exception on all calls to API that return the same error code type. The code that processes this may be anywhere in the system. This makes it impossible to do any sensible recovery (if possible), or error reporting. The exception can be rethrown or translated to another exception, making it impossible to find the originator of the exception. This makes it harder, if not impossible, to track the exception back to the source when you are at a breakpoint in the exception handler. Then there is dealing with caller boundaries. That is, when a callback or interface function in the application will return to the operating system (e.g. when handling a draw request from X11), or another language such as Python. Also, because different compiler vendors and versions handle exceptions differently, if you want to support different compilers (and you have resolved the name mangling incompatibilities), you need to handle exceptions correctly in these cases, or risk having major problems that would be impossible to trace. Not to mention that anywhere new, dynamic_cast and other language features are used may throw exceptions. - Reece ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: [OT] Re: C++ *for Git* 2007-09-23 22:25 ` Reece Dunn @ 2007-09-24 10:46 ` Dmitry Potapov 0 siblings, 0 replies; 34+ messages in thread From: Dmitry Potapov @ 2007-09-24 10:46 UTC (permalink / raw) To: Reece Dunn Cc: Linus Torvalds, Marco Costalba, Pierre Habouzit, David Kastrup, Frank Lichtenheld, Alex Unleashed, Kyle Rose, Miles Bader, Dmitry Kakurin, Git On Sun, Sep 23, 2007 at 11:25:01PM +0100, Reece Dunn wrote: > The next version of C++ is going to have garbage collection that the > user can enable, disable or remain neutral about. However, this is > program-wide and has many traps that you could fall into. Sure. C++ has not been design to be garbage collection friendly, in fact, even now, you can use some GC with C++, but it can be painful. I don't think that the new standard will change much in this respect. > > > But other parts of C++ are just nasty. The whole OO layer seems designed > > > to do a lot of things implicitly and in the wrong way. > > > > It could do a lot of things implicitly, but it does not force you, > > except calling destructor when the control leaves the scope of > > declaration, but I hardly can consider it as implicit. > > You have to add the explicit keyword to any constructor to prevent an > automatic conversion. Therefore, the constructors that are called are > implicit by default. Yes, I would prefer if it were opposite by default, but it was an initial mistake in design, and you cannot change it without breaking a lot of people code. > If you have a conversion operator, this is always > implicitly called when there is a match by the compiler. Conversation operator should be written only if you do want an implicit conversation, and that may be useful sometimes, albeit very rarely. > > I agree with Linus here, there are a lot of things that happen implicily. > > > > I also disagree with exception handling, > > > > Perhaps, you look at it from the kernel point of view. Otherwise, I > > would like to hear your arguments against it. In fact, I don't think > > it is possible to write generic algorithms without exceptions. Of > > course, if you write a program that can print an error to stderr and > > exit, there is no much need for them. So, it may depend on the task. > > There are many issues with exceptions. > > Firstly, there is throwing an exception from a destructor, which is > warned against in any good C++ book, but does not prevent you from > doing so (even if it is inadvertantly)! In general, the compiler does not have all information to know whether a destructor can or cannot throw an exception, and even less it knows about your real intentions. There are many ways to write something that will not work. You can create an infinite recursion, but I don't think it is a good argument against recursion. > > More importantly though, is the loss of contextual information. Do you think that an error code contains much more contextual information? > Consider throwing the same exception on all calls to API that return > the same error code type. I did not mean that all error codes should be returned as an exception. Exception in C++ is something that should not normally happen, like failure to allocate memory. So, you usually do not want to handle this situation immediate. > The code that processes this may be anywhere > in the system. This makes it impossible to do any sensible recovery > (if possible), or error reporting. The exception can be rethrown or > translated to another exception, making it impossible to find the > originator of the exception. This makes it harder, if not impossible, > to track the exception back to the source when you are at a breakpoint > in the exception handler. In gdb, you can catch all exception when thrown using "catch throw". And again, I don't see how it is better when a program returns an error code, especially if this error code is recoded couple times in the process of returning. So the problem is not with exceptions, but usually with bad design. > Then there is dealing with caller boundaries. That is, when a callback > or interface function in the application will return to the operating > system (e.g. when handling a draw request from X11), or another > language such as Python. Also, because different compiler vendors and > versions handle exceptions differently, if you want to support > different compilers (and you have resolved the name mangling > incompatibilities), you need to handle exceptions correctly in these > cases, or risk having major problems that would be impossible to > trace. You named some interoperability issues with C++ (and there are many of them), but it is not an argument against exceptions per se. > Not to mention that anywhere new, dynamic_cast and other > language features are used may throw exceptions. dynamic_cast throws an exception only for references, but not for pointers, and there is a good reason for that -- references should not be NULL; and if you want to avoid bad_alloc exception, you can use "T* p = new (std::nothrow) T;" but it is rarely needed. Dmitry Potapov ^ permalink raw reply [flat|nested] 34+ messages in thread
* Re: C++ *for Git* 2007-09-22 15:15 ` Kyle Rose 2007-09-22 18:08 ` Miles Bader @ 2007-09-22 22:24 ` Martin Langhoff 1 sibling, 0 replies; 34+ messages in thread From: Martin Langhoff @ 2007-09-22 22:24 UTC (permalink / raw) To: Kyle Rose; +Cc: Dmitry Kakurin, Git On 9/23/07, Kyle Rose <krose@krose.org> wrote: > But that's irrelevant: git is written in C. That's the way it is, and > you should accept that or fork. Or - as Marco's done - write complementary bits to git. I'm a Perl-head, and I've ended up writing bits of Perl for git, some of them have been reimplemented in C, some have stayed in Perl. Arguing is a waste of time -- code! Help Marco, or write something new and glorious. Make it useful for people who don't care what it's written in, and beautiful so that the infidels are enlightened with how elegant C++ can be. Codefest > Flamefest cheers, m ^ permalink raw reply [flat|nested] 34+ messages in thread
end of thread, other threads:[~2007-09-24 10:46 UTC | newest] Thread overview: 34+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2007-09-22 10:42 C++ *for Git* Dmitry Kakurin 2007-09-22 11:11 ` David Kastrup 2007-09-22 12:48 ` Johannes Schindelin 2007-09-22 15:23 ` Marco Costalba 2007-09-23 4:54 ` Dmitry Kakurin 2007-09-22 15:15 ` Kyle Rose 2007-09-22 18:08 ` Miles Bader 2007-09-22 18:25 ` [OT] " Kyle Rose 2007-09-22 19:11 ` David Kastrup 2007-09-22 22:50 ` Alex Unleashed 2007-09-23 2:09 ` Frank Lichtenheld 2007-09-23 6:25 ` David Brown 2007-09-23 7:23 ` David Kastrup 2007-09-23 9:29 ` Marco Costalba 2007-09-23 9:42 ` David Kastrup 2007-09-23 9:50 ` Marco Costalba 2007-09-23 10:45 ` Pierre Habouzit 2007-09-23 13:42 ` Marco Costalba 2007-09-23 14:23 ` Nicolas Pitre 2007-09-23 14:45 ` Marco Costalba 2007-09-23 14:37 ` David Kastrup 2007-09-23 15:15 ` Marco Costalba 2007-09-23 17:49 ` Paul Franz 2007-09-23 16:54 ` Linus Torvalds 2007-09-23 18:05 ` Marco Costalba 2007-09-23 18:30 ` David Kastrup 2007-09-23 18:43 ` Marco Costalba 2007-09-23 19:11 ` David Kastrup 2007-09-23 21:22 ` Dmitry Potapov 2007-09-23 21:31 ` David Kastrup 2007-09-23 23:10 ` Robin Rosenberg 2007-09-23 22:25 ` Reece Dunn 2007-09-24 10:46 ` Dmitry Potapov 2007-09-22 22:24 ` Martin Langhoff
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).