a minimalistic ada-tutorial filea minimalistic ada-tutorial christian forler bauhaus-university...
TRANSCRIPT
A Minimalistic Ada-Tutorial
Christian Forler
Bauhaus-University Weimar
October 18, 2011
Ada-Compiler
GNAT GPL Ada compiler from Ada Core(http://libre.adacore.com/libre/).
Enables all warnings: -W und -Wall.
Enable overflow checking: -gnato
Using Ada’05: -gnat05
Example: # gnatmake -W -gnat05 -gnato foobar.adb
Output gnatmake usage: # gnatmake -help
Package Specification
Package Specification
File extension .ads
(Un)Like a header file (.h) in C/C++
Contains:
New (sub-)typesFunction/procedure signaturesPrivate part
Example
package Foobar i stype Age i s p r i va te ;funct ion T o S t r i n g (A : Age ) return S t r i n g ;
pr i va tetype Age i s new N a t u r a l ;
end Foobar ;
Package Body
Package Body
File extension .adb
Contains implementation of specified functions and procedures
Example
with Ada . Text IO ;package body Foobar i s
funct ion T o S t r i n g (A : Age ) return S t r i n g i sbegin
return A’ Img ; −− gnatend T o S t r i n g ;
end Foobar ;
Basic Types
package B a s i c T y p e s i sI : I n t e g e r ; −− s i g n ed i n t e g e rN : N a t u r a l ; −− uns i gned i n t e g e r ;P : P o s i t i v e ; −− uns i gned i n t e g e r > 0M : mod 2∗∗32 ;B : Boolean := True ;S : S t r i n g := ” H e l l o World ! ” ;C : C h a r a c t e r := ’A ’ ;subtype Age i s N a t u r a l range 0 . . 1 3 0 ;type C o l o r i s ( Red , Green , Ye l low ) ;
R e d C o l o r : constant C o l o r := Red ;end B a s i c T y p e s ;
Arrays and Records
type P o i n t i s recordX : I n t e g e r := 1 ;Y : I n t e g e r := 2 ;
end record ;
A : array ( 0 . . 1 0 ) of I n t e g e r :=(2 => 23 , 4=> 16#2a#, others => 2#11 00 #);
P : P o i n t ;
−− AccessA( 7 ) := 1 0 ;A ( 0 . . 3 ) := A ( 6 . . 9 ) ;P . X := 4 ;
Operators
Operators
Logical (and, or, xor, not)
Relation (/=, =, <, <=, >, >=)
Arithmetic (+, -, *, /, mod, rem, **)
Assignment is :=
Function
package Sum i sfunct ion Add ( L : I n t e g e r ;
R : I n t e g e r := 1) return I n t e g e r ;end Sum ;
package body Sum i sfunct ion Add ( L : I n t e g e r ;
R : I n t e g e r := 1) return I n t e g e r i sR e s u l t : I n t e g e r ;
beginR e s u l t := L + R ;return R e s u l t ;
end Add ;end Sum ;−− UsageC := Add (A, B ) ; −− I n t e g e r o r subtype o f I n t e g e rC := Add (R => B, L => A ) ;C := Add (A ) ;
Procedure
−− S i gn a t u r eprocedure Copy ( Src : i n I n t e g e r ; Dest : out I n t e g e r ) ;−− Imp l ementa t i onprocedure Copy ( Src : i n I n t e g e r ; Dest : out I n t e g e r ) i sbegin
Dest := Src ;end Copy ;
Copy (A, B ) ; −− B can be u n i n i t i a l i z e d
Parameter Types
in: Right side parameter
out: Left side parameter
in out: Left and right side parameter
Using Packages
with and use clause
with: Provides visibility for the public part of packagespecification.
use: Using the namspace of a visible package specification.
Example
with Ada . Text IO ;use Ada . Text IO ;
procedure H e l l o W i t h u s e i sbegin
Put ( ” H e l l o World ! ” ) ;New Line ;
end H e l l o W i t h U s e ;
Package Renaming
with Ada . Text IO ;
procedure H e l l o W i t h u s e i spackage A t i renames Ada . Text IO ;−− use At i ;
beginA t i . P u t L i n e ( ” H e l l o World ! ” ) ;−−Put L ine (” He l l o World ! ” ) ;
end H e l l o W i t h U s e ;
A C Program in Ada
package Weak Typing i sfunct ion Get Time ( D i s t a n c e , Speed : N a t u r a l )
return N a t u r a l ;. . .
end Weak Typing ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
with Weak Typing ; use Weak Typing ;procedure Test Weak Typing i s
Speed : N a t u r a l := 1 0 ;D i s t a n c e : N a t u r a l := 1 0 0 ;Time : N a t u r a l ;
beginT := Get Time ( S ,D) ;S := D/T ;Run ( S ) ;
end Test Weak Typing ;
A C Program in Ada (cont’d)
Strong Typing
Specification
package S t r o n g T y p i n g i stype Time i s new N a t u r a l ;type Speed i s new N a t u r a l ;type D i s t a n c e i s new N a t u r a l ;funct ion Get Time (D : D i s t a n c e ; S : Speed )
return Time ;end S t r o n g T y p i n g ;
S : Speed := 1 0 ;D : D i s t a n c e := 1 0 0 ;T : Time ;
beginT := Get Time ( S ,D) ; −−> Syntax E r r o rS := D/T −−> Syntax E r r o rRun ( S ) ;
The Ada Approach
Specification
package S t r o n g T y p i n g i stype Time T i s new N a t u r a l ;type Speed T i s new N a t u r a l ;type D i s t a n c e T i s new N a t u r a l ;funct ion Get Time ( D i s t a n c e : D i s t a n c e T ;
Speed : Speed T )return Time T ;
end S t r o n g T y p i n g ;
S : Speed T := 1 0 ;D : D i s t a n c e T := 1 0 0 ;T : Time T ;
beginT := Get Time ( Speed => S , D i s t a n c e => D) ;S := Speed T ( N a t u r a l (D) / N a t u r a l (T ) ) ;Run ( S ) ;
Private Types & Operator Overloading
package P o i n t i stype P o i n t i s p r i va te ;
procedure Put ( Item : P o i n t ) ;funct ion ”+” ( L e f t : P o i n t ; R i g h t : P o i n t ) return P o i n t ;funct ion ”=” ( L e f t : P o i n t ; R i g h t : P o i n t ) return Boolean ;funct ion To Point (X : I n t e g e r ; Y : I n t e g e r ) return P o i n t ;
pr i va te−− Only v i s i b l e / a c c e s i b l e i n the package bodytype P o i n t i s record
X : I n t e g e r ;Y : I n t e g e r ;
end record ;end P o i n t ;
If-else Statement
with Ada . Text IO ;use Ada . Text IO ;
procedure Test i sAnswer : C h a r a c t e r ;
beginPut ( ”a , b , o r c ?” ) ;Get ( Answer ) ;i f Answer = ’ a ’ then
P u t L i n e ( ”A” ) ;e l s i f Answer = ’ b ’ then
P u t L i n e ( ”B” ) ;e l s e
P u t L i n e ( ”C” ) ;end i f ;
end Test ;
Case-Statement
type Day i s (Mon , Tue , Wen, Thu , F r i , Sat , Sun ) ;case ( Today ) i s
when Mon . . Thu => Work ;when F r i =>
Work ;Pa r t y ;
when Sat | Sun => Pa rt y ;end case ;
Notes
All cases must be covered!
If not: syntax error! (Compiler helps you to discover flaws.)
Default clause: when others.
Don’t use it! (Except for very special situations.)
Loop
loopWork ;Eat ;S l e e p ;Day = Day+1;i f I s H o l i d a y ( Day ) then
ex i t ;end i f ;
end loop ;
For- and While-Loop
f o r I i n 1 . . N loopSum := Sum+I ;
end loop ;
whi le A /= B loopi f A < B then
A := A+1;e l s e
A := A−1;end i f ;
end loop ;
Define Exceptions
package Dbz i sD i v s i o n B y Z e r o e r r o r : exception ;
type P o i n t i s p r i va te ;
funct ion To Point (A : I n t e g e r ; B : I n t e g e r ) return P o i n t ;
funct ion ”/” (A : P o i n t ; B : P o i n t ) return P o i n t ;
pr i va tetype P o i n t i s record
X : I n t e g e r ;Y : I n t e g e r ;
end record ;end Dbz ;
Define Exceptions (cont’d)
package body Dbz i sfunct ion To Point (A : I n t e g e r ; B : I n t e g e r ) return P o i n t i s
P : P o i n t := (X => A, Y=> B ) ;begin
return P ;end To Point ;
funct ion ”/” (A : P o i n t ; B : P o i n t ) return P o i n t i sP : P o i n t ;
begini f B . X=0 or B . Y=0 then
r a i s e D i v s i o n B y Z e r o E r r o r ;e l s e
P . X := A . X / B . X ;P . Y := A . Y / B . Y ;
end i f ;return P ;
end ”/” ;end Dbz ;
Raise Exception
with Dbz ; use Dbz ;procedure R a i s e E x c e p t i o n i s
A : P o i n t := To Point ( 4 , 5 ) ;B : P o i n t := To Point ( 0 , 1 ) ;C : P o i n t ;
beginC := A/B ;
end R a i s e E x c e p t i o n ;
Output
raised DBZ.DIVSION BY ZERO ERROR : dbz.adb:12
Nice Attributes
with Ada . Text IO ; use Ada . Text IO ;with Ada . I n t e g e r T e x t I O ; use Ada . I n t e g e r T e x t I O ;
procedure T i c k s i stype Foo i s ar ray ( 4 . . 9 ) of N a t u r a l ;X : Foo := ( 1 , 2 , 3 , 4 , 5 , 6 ) ;
beginPut (X’ F i r s t ) ; −− p r i n t 4Put (X’ L a s t ) ; −− p r i n t 9Put (X’ Length ) ; −− p r i n t 6New Line ;f o r I i n X’ Range loop
P u t L i n e (X( I ) ’ Img ) ;end loop ;
end T i c k s ;
Nice Attributes (cont’d)
with Ada . Text IO ; use Ada . Text IO ;with Ada . I n t e g e r T e x t I O ; use Ada . I n t e g e r T e x t I O ;
procedure T i c k s 2 i stype C o l o r i s ( Red , Blue , Ye l low ) ;
−− s t r i n g to n a t u r a lN : N a t u r a l := Natura l ’ Value ( ”10” ) ;
beginPut ( Natura l ’ F i r s t ) ; −−p r i n t 0New Line ;−−p r i n t 16#7FFFFFFF#Put ( Natura l ’ Last , Base => 1 6 ) ;New Line ;P u t L i n e ( Color ’ Pred ( Blue ) ’ Img ) ; −−p r i n t REDP u t L i n e ( Color ’ Succ ( Blue ) ’ Img ) ; −−p r i n t YELLOW
end T i c k s 2 ;
Generic Types Specification
gener ictype Base Type i s mod <>;
M u l t i p l y e r , Adder : Base Type ;O u t p u t D i v i s o r : Base Type := 1 ;
package LCG i sprocedure I n i t i a l i z e ( Seed : Base Type ) ;funct ion Random return Base Type ;
end LCG ;
Generic Types Implementation
package body LCG i sS t a t e : Base Type := Base Type ’ F i r s t ;
procedure I n i t i a l i z e ( Seed : Base Type ) i sbegin
S t a t e := Seed ;end I n i t i a l i z e ;
funct ion Random return Base Type i sbegin
S t a t e := S t a t e ∗ M u l t i p l y e r + Adder ;return S t a t e / O u t p u t D i v i s o r ;
end Random ;end LCG ;
Generic Types Using
with Ada . Text IO , LCG ;
procedure Test LCGs i stype M31 i s mod 2∗∗31 ;package MS Rand i s new LCG
( Base Type => M31 ,M u l t i p l y e r => 214013 ,Adder => 2531011 ,O u t p u t D i v i s o r => 2∗∗1 6 ) ;
beginMS Rand . I n i t i a l i z e ( 2 3 ) ;f o r I i n 1 . . 10 loop
Ada . Text IO . P u t L i n e (M31 ’ Image ( MS Rand . Random ) ) ;end loop ;
end Test LCGs ;
Further Information
Ada Distilled by Richard Riehle (ebook)
Ada 95: The Craft of Object-Oriented Programming by JohnEnglish (online textbook)
Course homepage for Software Development for Safe andSecure Systems
Ada 2005 by John Barnes (ISBN:0321340787).
Ada wiki(http://en.wikibooks.org/wiki/Ada_Programming).
...
The End.
Questions?
It’s Your Turn
Tasks
1 Write a specification for a private point type.
2 Implement the specification.
3 Write a application using your point type package.
Git for windows
1 Read the How to use TortoiseGit manual.(https://github.com/multitheftauto/multitheftauto/wiki/how-to-use-tortoisegit)
2 Install Putty. (http://www.chiark.greenend.org.uk/~sgtatham/putty/).
3 Install TortoiseGit.(http://code.google.com/p/tortoisegit/).
4 Generate a RSA/DSA keypair.(http://theillustratednetwork.mvps.org/Ssh/copSSH-WinSCP-KeyPair.html)
5 Send me the public key and use TortoiseGit with the privatekey.