[Aldor-l] Compiling setup
Gabriel Dos Reis
gdr at integrable-solutions.net
Sat Aug 12 09:24:08 EDT 2006
"Christian Aistleitner" <tmgisi at gmx.at> writes:
| Hello,
|
| On Fri, 11 Aug 2006 12:52:33 +0200, Gabriel Dos Reis
| <gdr at integrable-solutions.net> wrote:
|
| > "Christian Aistleitner" <tmgisi at gmx.at> writes:
| >
| > [...]
| >
| > | However, you might also consider my test.as to be of extremely
| > | miserable style.
| > | After all, I am assigning a constant ("abcdefghij") to a variable (a).
| > | Afterwards I use a destructive function( set! via a.3) on the variable
| > | (actually, the constant "abcdefghij"). Replacing
| > | local a: String := "abcdefghij";
| > | by
| > | local a: String := copy "abcdefghij";
| > | gives code that's working even without -fwritable-strings.
| >
| > But, in the face of it, the issue is not that of "bad style" versus
| > "good style". It is a pure bug in the translation the compiler does.
|
| I guess you simplify the problem to much.
| First off, I am not a fan of the fact that you cannot use current gcc's
| with Aldor. I would like everything to work out of the box.
|
| True is: everything works with old enough gcc's.
What value would you put in a theorem whose sole known proof is incorrect?
| True is: The Aldor compiler relied on gcc's behaviour in a part where it
| should not have.
| True is: gcc changed its behaviour in this part.
GCC enforced the standard definition of C, and gave warning telling
people they were relying on undefined behaviour.
[...]
| Faulty user source code:
| ------------------------
|
| Maybe the user is doing something he/she is not supposed to do. And maybe
| that's just what the file I provided did, because as I already wrote in my
| last email, it effectively tries to modify a constant. The compiler could
| mock about it, you are right, but the modification is hidden in the Aldor
| library ...
|
| However, you where trying to tell me, it is not an issue of the source
| code and thereby did not consider
| local a:String = "abc";
| a.3 := char "X";
| bad style.
*If* the declaration of a above is valid and makes 'a' a modifiable
string, *then* the program is correct and *should function correctly*.
There is no "bad style" excuse to invoke. If the proram cannot work
correctly, then either the language is defective or the compiler is
buggy -- FWIW, I conisder the runtime system part of the compiler.
| Assume,
| local a: String = "abc"
| is considered bad style and
| local a: String = copy "abc"
| is considered good style, then the whole problem *is* a style problem.
I am sorry to strongly disagree. This is not theology. You can't
define a programming language semantics in terms of "bad style".
Either a construct is well-defined and have a meaning, or it does not.
What is "bad" varies from people to people.
I, for one, consider the verbose
local a: String = copy "abc"
very silly, but correct. It is probably the only way to write it to
have a correct program, behaving correctly because the only known Aldor
compiler fails to do its job.
| And it is valid to declare things to be bad style. Even gcc treats the
| problem the same way in C:
|
| #include <stdio.h>
| int main( int argc, char *argv[] )
| {
| char * str = "abcdefghij";
| str[ 4 ] = 'X';
| return 0;
| }
That is comparing orange and apple. The above program is
*explicitly ruled by the C definition* as invoking undefined
beahviour. First, you would have to say whether the Aldor program you
presented has a well-defined semantics of not. You can't hide behing
"bad style", I'm sorry to say.
[...]
| > "a" above is not a constant -- or else the language could have
| > forbidden its modification.
|
| Refer to §5.2 AUG. It is a constant.
Back to my question: Is the program you presented correct or not?
Here, I mean correct accordinig to the Aldor programming language.
Second, you said that
# Aldor's domain String however is _not_ meant for read-only strings
which implies that it is modifiable. If that is correct, then 'a' is
NOT constant.
| IIRC, there is *no* function to modify a literal directly.
But, the type of 'a' is not a literal; it is String.
| Whet else could the compiler do?
| The modification is hidden in the Aldor library. The compiler only links
| this library, so he has no chance to realize the modification of the
| constant.
I don't quite follow this reasoning.
| > The declaration above *initializes* the
| > variable with a certain (immutable) value. Consequently, it is a
| > plain erroneous translation that the compiler compiles the code to
| > modify the immutable value.
|
| No. The error is in the Aldor library (for this very problem).
|
| > Given that the language allows modification of a, consider that the
| > declaration
| >
| > local a: String := "abcdefghij";
| >
| > should have been translated to the equivalent of
| >
| > char a[] = "abcdefghij";
| >
| > and *NOT*
| >
| > char *a = "abcdefghij";
|
| Yes. But you completely omit the domain String. From my point of view
| local litA: Literal := "abcdefghij";
| local strA: String := "abcdefghij";
| should be translated to
| char * litA = "abcdefghij";
| char strA[] = "abcdefghij";
| or _something equivalent_ (as things get more complicated).
We are in violent agreement there. The failure is translated String
properly is the cause of the error. Not that -fwritable-strings has
disappears.
| > aldor.conf is a workaround about an erroneous translation. It has
| > proven to be quite fragile and non-scalable.
|
| Well ... no. "-fwritable-stirngs" makes the life of library developers
| easier. And the library (possible) more performant (no superfluous copying
| of strings) but (possible) more insecure (more writable data sections).
| So it may even have been a design decision to use this behaviour.
How good is a quick but wrong translation.
GCC is widely used and has become quite a "standard" C compiler, used
to compile quite a large base or source programs. The flag went away
a long time ago; I have not seen a complaint that it should be
resurected.
| > I'm quite amazed that such a plain error in the translation is
| > being hidden by "bad or good style of programming" rhetorics.
|
| Hopefully you now see, that it may not just be a "plain translation error".
Many thanks for elaborating. I still maintain that it is a plain
translation error. Whethere or not the error is in the front-end or
in the supporting runtime system.
-- Gaby
More information about the Aldor-l
mailing list