From Ada 2012

bearophile bearophileHUGS at lycos.com
Thu May 3 07:04:39 PDT 2012


Ada shares many purposes with D: correctness from the language 
design too, mostly imperative, native compilation, efficiency of 
the binary, closeness to the metal (even more, because not 
requiring a GC, it's probably usable in more situations), generic 
programming, OOP, strong static typing, and both languages share 
many small features (like array slicing syntax, and so on).

Coding in Ada is a bit boring, because you have to specify every 
small detail and to write a lot, but for certain programming 
tasks, like code that can't have too many bugs, it's maybe the 
best language. As Ada vendors say, if your life depends on a 
program, you often prefer that code to be written in good Ada 
instead of good C. Even if writing Ada is slower than writing C 
or C++, you save some time later debugging less. Today for 
certain tasks Haskell seems to produce reliable code, but it uses 
a GC and it's lazy, so it's quite less strict compared to Ada.

I've found another pack of slides about the Ada 2012 language:
http://www.slideshare.net/AdaCore/ada-2012

Come quotations and comments from/about the slides:

[page 3] >In High-Reliable Software, choice is usually being made 
between C C++ Java Ada<

Maybe someday D too will be among those.


[p.6] >Applying these skills to any programming language should 
be easy for any developer<

Good luck with programming in Haskell :-)


[p.7] >Is the language properly supported by tools?<

Right, some bugs are avoided thanks to the supporting tools too.


[p.8] >Can the language full development cycle 
(specification/code/verification)?<

I don't know, regarding D.


[p.15] >Put as much (formal) information as possible in the code<

This is quite important for a language that wants to enforce more 
correctness.


[p.17] >Values are checked at run-time (can be deactivated)<

This often saves the programmer ass.


[p.19] >Arrays can be indexed by any discrete types (integers, 
enumeration)<

This is quite handy for enums (and sometimes chars), and 
reliable. Currently in D if you define an array with enum index 
you get an associative array, that is wasteful in both memory and 
performance for most enums that have contiguous values (but I 
think maybe D implementations will be free to use a more 
efficient array here, because the interface of AAs is opaque).


[p.21]
> Three parameter modes : in (input), out (output) and in-out 
> (input/output)
>
> procedure Do_Something
>   (P1 : in     Integer; --  P1 can’t be changed
>    P2 : out    Integer; --  No initial value on P2

In D P2 is initialized...


[p.21]
> The compiler decides if it has to be passed by reference of copy
> 
> procedure Do_Something
>   (P1 : in Huge_Structure) –-  Passed by reference if too big

D offers more low-level knowlege/control here, it doesn't decide 
to pass by value or reference, leaving the decision to the 
programmer, I prefer D here.
But in D code like this, where a large value is passed, I'd like 
the D compiler to give a warning (despite once in a while that's 
exactly what you want?):

alias int[1_000] TA;
void int(TA a) {}


[p.22]
> Generalized contracts are available through pre and 
> post-conditions
> 
> procedure P (V : in out Integer)
>    with Pre  => V >= 10,
>         Post => V'Old /= V;

So there's the Old (prestate) too in the Ada2012 built-in 
contract programming.


[p.30]
> * Pointers are typed, associated with accessibility checks
> * Objects that can be pointed are explicitly identifed
> * Pointers constraints can be specified
> – Is null value expected?
> – Is the pointer constant?
> – Is the object pointed by the pointer constant?

Ada has severl kinds of pointers, according to how much freedom 
they have.


[p.36]
> Ada 2012 detects "obvious" aliasing problems
> 
> function Change (X, Y : in out Integer) return Integer is
>    begin
>       X := X * 2;
>       Y := Y * 4;
> 
>       return X + Y;
>    end;
> 
>    One, Two : Integer := 1;
> 
> begin
> 
>    Two := Change (One, One);
>    -- warning: writable actual for "X" overlaps with actual for 
> "Y“
> 
>    Two := Change (One, Two) + Change (One, Two);
>    --  warning: result may differ if evaluated after other 
> actual in expression

Are such warnings/tests useful in D too?
D compiles this with no warnings/errors:

int change(ref int x, ref int y) {
     x *= 2;
     y *= 4;
     return x + y;
}
void main() {
     int one = 1, two;
     two = change(one, one);
     two = change(one, two) + change(one, two);
}


[p.42]
> if C in 'a' | 'e' | 'i'
>       | 'o' | 'u' | 'y' then

Sometimes Ada2012 is succint too.


[p.43]
> Function implementation can be directly given at specification 
> time if it represents only an "expression"
> 
> function Even (V : Integer) return Boolean
>    is (V mod 2 = 0);

It's related to:
http://d.puremagic.com/issues/show_bug.cgi?id=7176

Bye,
bearophile


More information about the Digitalmars-d mailing list