strong/weak typing and pointers
Steven Bethard
steven.bethard at gmail.com
Tue Nov 2 12:14:06 EST 2004
Diez B. Roggisch <deets.nospaaam <at> web.de> writes:
> Strong/weak typing is about how much you care of types at all - in php, its
> perfectly legal to add strings to numbers - the string simply gets
> converted to a number beforehand, that conversion yielding 0 when there is
> nothing useful and numberlike can be extracted from the string. So typing
> is weak, as it doesn't constrain the possible operations on variables with
> certain values.
By this definition, Python is also weakly typed:
>>> 2.0 + 1
3.0
Your defintion above calls PHP weakly typed because it performs implicit
string->number conversions. The Python code above performs an implicit
int->float conversion.
This is not the definition of strongly- and weakly-typed that I'm used to. When
I use strongly-typed, I mean that a block of memory associated with an object
cannot be reinterpreted as a different type of object. For example, in a
weakly-typed language like C, we can do:
struct A {
char c;
int i;
};
struct B {
float f;
char c;
};
int main(int argc, char* argv) {
struct A a = {'c', 1024};
struct B* b = (struct B*)&a;
printf("'%c' %d %f '%c'\n", a.c, a.i, b->f, b->c);
}
And get the following ouptut:
'c' 1024 149611321247666274304.000000 ' '
C allows me to reinterpret a char as a float and an int as a char. In the first
case, we get the floating-point number that is represented by the bits that
represent the character 'c'. In the second case, we get the space character
because that's how C prints a character with an ASCII value larger than it's
allowed to be (1024 when the max is 255).
The point here is that I consider C weakly typed because, with no error of any
sort, it allows me to reinterpret a block of memory in as many ways as I like.
A strongly typed language like Python does not allow this. Even in my Python
example above, we're not *reinterpreting* the block of memory representing 1 as
a floating point value; we're *coerceing* the integer 1 into the floating point
value 1.0 (which probably means allocating a new float variable at the C level)
before performing the addition.
Steve
More information about the Python-list
mailing list