Op Sat, 2 Dec 2006, schreef John Coppens:

> On Sat, 02 Dec 2006 08:01:04 -0500
> David Mears <[EMAIL PROTECTED]> wrote:
> 
> >  From the first pascal program that I wrote in the late 80s to today, 
> > I've only used Goto once and that was because I was still learning the 
> > language - it was essentially a repeat loop and I replaced it in later 
> > versions.
> 
> Same here...
> 
> But, I wonder. With modern optimizing compilers doing almost what they
> want with the original source code, I'm quite sure some semantic
> optimiser will replace parts of codes by goto's anyway.

> So why would it
> ever be necessary to worry about optimising the source code with
> 'spaghetti' code, as we are shifting the responsability for optimising
> execution to the compiler writers anyway?

The answer is clearly yes. The reason is simple, a perfect compiler does 
not exist, you can prove that for each compiler, there exists a better 
compiler. This is not pure theory, situations where the compiler 
doesn't make the ideal decision are very common. Of course, if a modern 
compiler isn't good enough, your code must be extremely speed critical, so 
assembler code might be the best option 
(which is full of jumps=goto).

However, assembler coded is not portable. A hand optimized Pascal 
based solution with goto statements might be preferable over assembler 
code. For example, in the file rtl/unix/video.pp , the procedure 
update_vcsa uses a goto for speed reasons.

There are a few other situations you might run into where a goto can be 
more practical than a goto-less solution. For example, jumping out of 
nested loops, or jumping in case of an error condition. It is always 
possible to avoid goto, but there exist cases where using it can be a good 
engineering decision.

> If fact, if the optimiser is good, spaghetti (goto-)programs and 'nice'
> code should generate the same executable anyway, shouldn't they?

No. A program which determines if two programs are the same cannot exist, 
this is an uncomputable problem. Because of this, a compiler cannot 
transform unoptimized code into the most ideal "spaghetti" form.

Actually, FPC makes good use of this knowledge. Unlike most compilers, FPC 
doesn't convert high level constructions into gotos internally. This gives 
the code generator more information to decide the right instructions to 
generate, for example for loops generate different code than while loops, 
because in the case of the for loops, the compiler knows more about the 
loop termination criterium.

> So,
> doesn't it make sense to try and make the source as readable as possible?

If the question is wether you should for example use a while loop, or 
emulate it with a goto, the answer is a loud and clear yes. Only in very 
seldom situations you want to have more control over what exact code is 
generated.

However, the situations were a goto is sometimes preferred is when 
avoiding it needs extra variables or statements. In this case, it is 
mostly a matter of taste wether the goto makes the code more readable.

To sum it up: Theoretically nobody needs goto. For each use of goto, it 
can be replaced with a goto-less construction. For each case where 
the goto is more efficient, you can write an optimization. And for each 
situation where a high level construction looks worse than a goto-based 
construction, one can design a high-level construction that makes the goto 
obsolete.

Practically however, one has to deal with that compilers are not, will 
not, and cannot be perfect, and in some situations, the goto-less solution 
feels like a work-around.

> (Which is why I use Pascal in the first place - without gotos)

Well, no modern language is goto based :) 

But... Pascal pioneered it, and it is nice to know that all modern 
languages carry a Pascal legacy in them.

Daniël Mantione
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to