* Real time environment w/ 300K+ lines?
@ 1988-09-06 22:07 MFHorn
1988-09-07 9:01 ` Ada exceptions Daniel M Floyd
0 siblings, 1 reply; 5+ messages in thread
From: MFHorn @ 1988-09-06 22:07 UTC (permalink / raw)
[I'm posting this for someone else and I don't read this newsgroup.
So, please mail to me any/all replies. Don't post.]
Does anyone have a running real time environment using more then
300,000 lines of Ada? I'd also like to know what the performance
is like versus other languages.
Adthanksvance.
Andy Rosen | arosen@hawk.ulowell.edu | "I got this guitar and I
ULowell, Box #3031 | ulowell!arosen | learned how to make it
Lowell, Ma 01854 | | talk" -Thunder Road
RD in '88 - The way it should be
^ permalink raw reply [flat|nested] 5+ messages in thread
* Ada exceptions
1988-09-06 22:07 Real time environment w/ 300K+ lines? MFHorn
@ 1988-09-07 9:01 ` Daniel M Floyd
1988-09-07 22:28 ` Robert Eachus
1988-09-09 16:57 ` Carl-Lykke Pedersen
0 siblings, 2 replies; 5+ messages in thread
From: Daniel M Floyd @ 1988-09-07 9:01 UTC (permalink / raw)
This *must* be the right newsgroup.
In discussing the woes of other languages, I posted an
article about excpetion handling. I thought (and still think)
that some way should be available to specify what action
to take when an exception occurs.
For example:
I'd like to say to the compiler
/* exceptions sqrt(x) */
/* if -x then do_this_process */
/* if overflow then scale_routine_error */
/* if underflow then return 0 */
/* exceptions + */
/* if overflow ...
I don't care what syntax is used. There are times when a halt
on a fatal error can be ... fatal. I can't tolerate it at times, so
I end up doing alot of firewalling before calling procedures, and
if I do alot of math, it can get ugly fast.
I've had two messages that say "go Ada".
Can Ada really do it? If it can, I'll likely become a devotee, investing
within the month.
Could some Ada-ite post an Ada example like the one above, in Ada.
Thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Ada exceptions
1988-09-07 9:01 ` Ada exceptions Daniel M Floyd
@ 1988-09-07 22:28 ` Robert Eachus
1988-09-09 16:57 ` Carl-Lykke Pedersen
1 sibling, 0 replies; 5+ messages in thread
From: Robert Eachus @ 1988-09-07 22:28 UTC (permalink / raw)
In article <5701@utah-cs.UUCP> u-dmfloy%sunset.utah.edu.UUCP@utah-cs.UUCP (Daniel M Floyd) writes:
>This *must* be the right newsgroup.
>In discussing the woes of other languages, I posted an
>article about excpetion handling. I thought (and still think)
>that some way should be available to specify what action
>to take when an exception occurs.
>For example:
>I'd like to say to the compiler
>/* exceptions sqrt(x) */
>/* if -x then do_this_process */
>/* if overflow then scale_routine_error */
>/* if underflow then return 0 */
>/* exceptions + */
>/* if overflow ...
>I don't care what syntax is used. There are times when a halt
>on a fatal error can be ... fatal. I can't tolerate it at times, so
>I end up doing alot of firewalling before calling procedures, and
>if I do alot of math, it can get ugly fast.
What you want can be done easily in Ada, but it is not the
normal Ada style. It is however very useful as a means of handling
certain functions. For example, if I write a program which opens
several files, I usually overload the OPEN call to provide reasonable
handling of the "normal" error conditions.
The more normal case is to have a handler cover a region of code
(for example all the statements of a procedure) and do something
sensible if an exception occurs in that region. Belt and suspenders
types (and that includes most Ada software engineers) also put
catastropic error handlers on the entire program.
>I've had two messages that say "go Ada".
>Can Ada really do it? If it can, I'll likely become a devotee, investing
>within the month.
Yes, but you still have to do the hard part... (Ada syntax and
semantics are a big help, but you have to figure out what to do with
the error. :-)
>Could some Ada-ite post an Ada example like the one above, in Ada.
First you need a square root routine. Most compilers come with
math packages, but they are not strictly part of the language, and you
can roll your own. Assume that the package you use says something
like this:
with MATH_EXCEPTIONS;
generic
type REAL is digits <>; -- some floating point type
package MATHEMATICAL_FUNCTIONS is
subtype NON_NEGATIVE is REAL range 0.0..REAL'LAST;
...
function SQRT(L: in NON_NEGATIVE) return NON_NEGATIVE;
-- Returns the positive square root of L. Result is accurate to
-- within +/- 2.0*REAL'EPSILON times the correct result. Result is
-- guarenteed to be greater than L for small positive L. SQRT(0.0)
-- is always exactly 0.0. If 1.0 is a model number of type REAL,
-- then SQRT(REAL(N*N)) = REAL(N) for any integer N if N*N is a
-- model number of type REAL.
...
end MATHEMATICAL_FUNCTIONS;
-- Now for your program:
with MATHEMATICAL_FUNCTIONS;
with MATH_EXCEPTIONS; use MATH_EXCEPTIONS;
procedure MAIN is
X, Y, Z: FLOAT;
package MATH is new MATHMATICAL_FUNCTIONS(FLOAT);
procedure DO_THIS_PROCESS;
...
function SQRT(X: in FLOAT) is
begin
if X < 0.0 then Do_This_Process; else return MATH.SQRT(X); end if;
-- Your other cases don't arise...
end SQRT;
function "+" (L,R: FLOAT) is -- hides STANDARD."+"
begin
return STANDARD'"+"(L,R);
exception
when others => ...
end "+";
...
begin
...
Y := sqrt(X); -- Strong typing assures that no other error can
-- occur. Even nicer than handling errors is to
-- be able to guarentee that they can't happen.
Z := X + Y; -- Your "+" which presumably doesn't overflow.
end MAIN;
You may think that the specification of SQRT is overkill, but it
is "normal" Ada practice to specify which exceptions can be raised,
and under what conditions, by any function in a library package.
Robert I. Eachus
with STANDARD_DISCLAIMER;
use STANDARD_DISCLAIMER;
function MESSAGE (TEXT: in CLEVER_IDEAS) return BETTER_IDEAS is...
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Ada exceptions
1988-09-07 9:01 ` Ada exceptions Daniel M Floyd
1988-09-07 22:28 ` Robert Eachus
@ 1988-09-09 16:57 ` Carl-Lykke Pedersen
1988-09-12 16:10 ` Robert Eachus
1 sibling, 1 reply; 5+ messages in thread
From: Carl-Lykke Pedersen @ 1988-09-09 16:57 UTC (permalink / raw)
u-dmfloy%sunset.utah.edu@utah-cs.UUCP (Daniel M Floyd) writes:
>I've had two messages that say "go Ada".
"Go (PL/1), MESA, CLU, ML"
PL/1:
FACTORIAL: PROCEDURE;
DECLARE (N, F) FIXED FIN (31) INIT (1);
ON FINISH BEGIN;
PUT LIST (N, "FACTORIAL =", F);
PUT SKIP;
N = N + 1;
F = N * F;
STOP;
END;
STOP;
END FACTORIAL;
Ada:
function DIVIDE_CHECK(X, Y: REAL) return REAL is
begin
if X = 0 then
raise SILLY;
else X/Y;
endif;
exception
when NUMERIC_ERROR => return 0;
when SILLY => return -1;
end;
Sorry if the syntax isn't correct. I do not have an Ada-compiler (or a PL/1-
compiler).
Regards
CLp
.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Ada exceptions
1988-09-09 16:57 ` Carl-Lykke Pedersen
@ 1988-09-12 16:10 ` Robert Eachus
0 siblings, 0 replies; 5+ messages in thread
From: Robert Eachus @ 1988-09-12 16:10 UTC (permalink / raw)
In article <4055@freja.dk> carllp@freja.dk (Carl-Lykke Pedersen) writes:
>PL/1:
> FACTORIAL: PROCEDURE;
> DECLARE (N, F) FIXED FIN (31) INIT (1);
> ON FINISH BEGIN;
> PUT LIST (N, "FACTORIAL =", F);
> PUT SKIP;
> N = N + 1;
> F = N * F;
> STOP;
> END;
> STOP;
> END FACTORIAL;
I'm not sure what the PL/I example is trying to demonstrate, so I
won't try to rewrite it in PL/I, but it is very simple in Ada:
with TEXT_IO;
procedure FACTORIALS is
type My_Int is range -2**31..2**31-1;
-- Since the program's behavior depends on 32 bit integers,
-- force a type and subtype with the range expected.
N, F: My_Int := 1;
begin
loop
TEXT_IO.Put_Line(My_Int'IMAGE(N) & "FACTORIAL =" & My_Int'IMAGE(F));
N := N + 1;
F := F * N;
end loop;
exception
when others => TEXT_IO.Put_line(" That's all folks!");
end FACTORIALS;
>Ada:
> function DIVIDE_CHECK(X, Y: REAL) return REAL is
> begin
> if X = 0 then
> raise SILLY;
> else X/Y;
> endif;
> exception
> when NUMERIC_ERROR => return 0;
> when SILLY => return -1;
> end;
>Sorry if the syntax isn't correct. I do not have an Ada-compiler (or a PL/1-
>compiler).
There is a missing "return" before X/Y. If REAL is not an
integer type, the constants need to contain decimal points. There is
a syntactic problem is much more subtle. A compiler is allowed to
generate code which computes X/Y in a type with wider range and then
convert the result to REAL. (This is not just a theoretical case, it
happens all the time with IEEE floating point.) This results in
CONSTRAINT_ERROR being raised in some cases, and NUMERIC_ERROR in
others. There may also be a programming mistake. I assume that you
want to raise SILLY when Y is zero, but I'm not sure, since raising
SILLY when X is zero is certainly silly. :-)
There are also two problems of style. You surely want the
function named "/", unless it is generic, and it is bad form to
declare an exception like SILLY (you did intend to declare it, didn't
you?) just to handle it locally. So:
generic
type REAL is digits <>;
DIVIDE_BY_ZERO_RETURN_VALUE: in REAL := -1.0;
OVERFLOW_RETURN_VALUE: in REAL := 0.0;
function DIVIDE_WITH_ERROR_HANDLING (X, Y: REAL) return REAL is
begin
if Y = 0.0
then return DIVIDE_BY_ZERO_RETURN_VALUE;
else return X/Y;
endif;
exception
when CONSTRAINT_ERROR | NUMERIC_ERROR =>
return OVERFLOW_RETURN_VALUE;
end DIVIDE_WITH_ERROR_HANDLING;
-- Now it can be instantiated as follows. I've changed the overflow
-- default to show how it's done.
function "/" is new Divide_with_Error_Handling
(Float, Overflow_return_value => Float'LAST);
Robert I. Eachus
with STANDARD_DISCLAIMER;
use STANDARD_DISCLAIMER;
function MESSAGE (TEXT: in CLEVER_IDEAS) return BETTER_IDEAS is...
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~1988-09-12 16:10 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1988-09-06 22:07 Real time environment w/ 300K+ lines? MFHorn
1988-09-07 9:01 ` Ada exceptions Daniel M Floyd
1988-09-07 22:28 ` Robert Eachus
1988-09-09 16:57 ` Carl-Lykke Pedersen
1988-09-12 16:10 ` Robert Eachus
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox