From: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
To: johan.baltie@wanadoo.fr
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Statically detecting arrays bound exceptions ?? (was: Universal Serializer)
Date: Wed, 17 Jul 2002 15:46:49 +0900 [thread overview]
Message-ID: <20020717154649S.garrigue@kurims.kyoto-u.ac.jp> (raw)
In-Reply-To: <20020717061954.M92611@wanadoo.fr>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: Text/Plain; charset=us-ascii, Size: 2454 bytes --]
From: "Johan Baltié" <johan.baltie@wanadoo.fr>
> Well, Ada does. The strong typing gives information to the compiler for it to
> deduce when range checking is not needed:
>
> declare
> subtype Index is Integer range 1..10;
> type Arr is array (Index) of Integer;
> a : Arr;
> element : Integer;
> j : Index := 1;
> k : Integer := 11;
> begin
> for i in a'Range loop
> element := a(i); -- no range checking needed, i is in range by definition
> end loop;
> a(j); -- range checking not needed, j is within Index by definition
> a(k); -- range checking needed due possibility of k being outside of Index
> exception
> when Constraint_Error =>
> -- process the out-of-range error from a(k)
> end;
This is similar to Pascal ranges.
The trouble is that typical code doesn't look like that, but rather
let bubble_once arr =
for i = 0 to Array.length arr - 2 do
if arr.(i) > arr.(i+1) then begin
let tmp = arr.(i) in
arr.(i) <- arr.(i+1);
arr.(i+1) <- tmp
end
done
or worse
let bubble_one arr last =
assert (last < Array.length arr);
let swap i =
let tmp = arr.(i) in
arr.(i) <- arr.(i+1);
arr.(i+1) <- tmp
in
for i = 0 to last - 1 do
if arr.(i) < arr.(i+1) then swap i
done
In the first case, that's not too difficult: you just have to know
that Array.length returns the length of an array, and do a bit of
arithmetic.
In the second case, you should propagate the information from the
assertion to the loop bound, and additionally treat swap as if it were
inlined (we know it is its only call context). And it's fragile:
if you move "swap" out of the function, then it might be used on any
array, and you have to do the bound check.
By the way: if you forgot the assertion, would it be ok to have the
compiler insert it automagically and fail early? As I see an
out-of-bound error as fatal, this would seem reasonnable to me, but
this should be somewhere in the semantics of the language.
There are lots of things you can do without real type inference, but
the real trouble is that what is a reasonable target is not clear...
Jacques Garrigue
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
next prev parent reply other threads:[~2002-07-17 6:47 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-07-17 6:19 Johan Baltié
2002-07-17 6:46 ` Jacques Garrigue [this message]
2002-07-17 7:14 ` Johan Baltié
2002-07-17 7:32 ` Jacques Garrigue
2002-07-17 7:53 ` [Caml-list] Sub{range,type} (was: Statically detecting arrays bound exceptions ??) Johan Baltié
-- strict thread matches above, loose matches on Subject: below --
2002-07-08 19:53 [Caml-list] productivity improvement Oleg
[not found] ` <15657.61603.221054.289184@spike.artisan.com>
2002-07-09 4:43 ` [Caml-list] Universal Serializer (was: productivity improvement) Oleg
2002-07-09 7:59 ` Nicolas Cannasse
2002-07-10 16:06 ` John Max Skaller
2002-07-10 22:29 ` Michael Vanier
2002-07-12 12:41 ` John Max Skaller
2002-07-14 12:25 ` [Caml-list] Statically detecting arrays bound exceptions ?? (was: Universal Serializer) Berke Durak
2002-07-14 13:24 ` Alessandro Baretta
2002-07-15 8:23 ` Xavier Leroy
2002-07-15 8:39 ` Noel Welsh
2002-07-15 21:22 ` Oleg
2002-07-15 22:44 ` Michael Vanier
2002-07-16 6:43 ` Florian Hars
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20020717154649S.garrigue@kurims.kyoto-u.ac.jp \
--to=garrigue@kurims.kyoto-u.ac.jp \
--cc=caml-list@inria.fr \
--cc=johan.baltie@wanadoo.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox