Niezawodne Systemy Informatyczne

Podobne dokumenty
Niezawodne Systemy Informatyczne

Wstęp do programowania. Różne różności

Ada 95 #1/5 - typy. Typy skalarne. Hierarchia typów w Adzie. Typ znakowy. Typy dyskretne. Plan wykładu

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Niezawodne Systemy Informatyczne

Wstęp do programowania

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Wstęp do Informatyki i Programowania (kierunek matematyka stosowana)

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Układy reprogramowalne i SoC Język VHDL (część 4)

PL/SQL. Część 1 Bloki PL/SQL. Piotr Medoń

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Bloki anonimowe w PL/SQL

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Modelowanie złożonych układów cyfrowych (1)

Elementy języka VHDL. obiekty typy danych atrybuty pakiety i biblioteki instrukcje współbieżne instrukcje sekwencyjne. PUE-w3 1

Programowanie strukturalne

Podstawy i języki programowania

PODSTAWY BAZ DANYCH 13. PL/SQL

Ada-95. Dariusz Wawrzyniak

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Język HDL - VERILOG. (Syntetyzowalna warstwa języka) Hardware Description Language Krzysztof Jasiński PRUS PRUS

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

1. ELEMENTY JĘZYKA PL/SQL

Programowanie obiektowe

Zmienne, stałe i operatory

Wstęp do programowania 2

Wstęp do programowania 2

MATERIAŁY DO ZAJĘĆ II

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Podstawy programowania w języku C

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

LibreOffice Calc VBA

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Mechanizmy komunikacji. spotkania symetryczne (język CSP) spotkania asymetryczne (Ada) przestrzenie krotek (Linda) potoki, komunikaty i kanały (Unix)

Programowanie obiektowe

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

typ zakres sposob zapamietania shortint integer bajty (z bitem znaku) longint byte word

Podstawy programowania

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Laboratorium 10 Temat: Zaawansowane jednostki testowe. Operacje na plikach. Funkcje.

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Programowanie. Projektowanie funkcje programu tworzenie algorytmu i struktur danych. Programowanie implementacja algorytmu kompilacja programu

Plan wykładu PL/SQL. PL/SQL - historia TWORZENIE APLIKACJI BAZODANOWYCH

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Kiedy i czy konieczne?

Podstawy Programowania Podstawowa składnia języka C++

Niezawodne Systemy Informatyczne

Programowanie w Logice Przykłady programów. Przemysław Kobylański

Oracle Developer Suite. Budowa aplikacji użytkownika końcowego

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Wstęp do programowania 2

Jerzy Nawrocki, Wprowadzenie do informatyki

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Język PL/SQL Wprowadzenie

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Algorytmika i Programowanie VBA 1 - podstawy

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Wprowadzenie do języka PL/SQL. Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL. Zmienne rekordowe.

Podstawowe elementy języka Python III. Wykład 3. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 50 / 277

PL/SQL. Zaawansowane tematy PL/SQL

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Programowanie RAD Delphi

15. Funkcje i procedury składowane PL/SQL

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

Język PL/SQL Wprowadzenie

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

Wykład 4. Algorytmy i programy. Algorytmy + struktury danych = programy. Niklaus Wirth. Algorytm = logika + sterowanie.

Język PL/SQL Procedury i funkcje składowane

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

PL/SQL. Lidia Małkiewicz i Cezary Skubała

Podstawy programowania skrót z wykładów:

Stałe definiuje się używając funkcji define. Przykład: define( PODATEK, 22); define( INSTALACJAOS, 70); define( MS, Microsoft );

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Podstawy Programowania C++

EMN. dr Wojtek Palubicki

Python wstęp do programowania dla użytkowników WCSS

Visual Basic for Application (VBA)

Materiały do laboratorium MS ACCESS BASIC

Wstęp do programowania 2

VHLD Very High Speed Integrated Circuit (VHSIC) Hardware Description Language (VHDL)

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Jerzy Nawrocki, Wprowadzenie do informatyki

Informatyka 1. Procedury i funkcje, struktura programu w Pascalu

Transkrypt:

Niezawodne Systemy Informatyczne Przemysław Kobylański Katedra Informatyki (W11/K2) Politechnika Wrocławska Na podstawie I. Sommerville Inżynieria oprogramowania J.W. McCormick, P.C. Chapin. Building High Integrity Applications with SPARK K.R. Apt, F.S. de Boer, E-R Olderog Verification of Sequential and Concurrent Programs SPARK (14g) SPARK Elementy języka SPARK Elementy języka SPARK Ada 2012 Ada SPARK a) SPARK 83, SPARK 95 i SPARK 2005 SPARK 2014 b) SPARK 2014

Poniższe własności języka Ada 2012 nie są obecnie dostępne w SPARK: aliasy nazw wskaźniki instrukcja goto wyrażenia i funkcje z efektami ubocznymi obsługa wyjątków typy sterowane (tworzenie, przypisania, niszczenie) zadania/wielowątkowość Instrukcja if: if A < 0 then A := -A; D := 1; if A in 1.. 12 then B := 17; Struktury sterowania if A = B then F := 3; elsif A > B then F := 4; F := 5; if A > B then E := 1; F := A; E := 2; F := B; if A >= B and A >= C then G := 6; elsif B > A and B > C then G := 7; elsif C > A and C > B then G := 8; Operator równości: = równe /= różne Operatory relacji: < mniejsze niż <= mniejsze lub równe > większe >= większe lub równe Operatory logiczne: not logiczna negacja and logiczna koniunkcja or logiczna alternatywa xor alternatywa wykluczająca and then leniwa koniunkcja or leniwa alternatywa Operatory przynależenia: in należy not in nie należy

Instrukcja case: Success := True; case Ch is when 'a'.. 'z' => H := 1; when 'A'.. 'Z' => H := 2; when '0'.. '9' => H := 3; when '.' '!' '?' => H := 4; when others => H := 5; Success := False; end case; Warunkowe wyrażenia if: if A > B then C := (if A > B then D + 5 F / 2); C := D + 5; C := F / 2; if A > B then C := (if A > B then D + 5 elsif A = B then 2 * A C := D + 5; F / 2); elsif A = B then C := 2 * A; C := F / 2; if X >= 0.0 then Y := Sqrt (if X >= 0.0 then X -2.0 * X); Y := Sqrt (X); Y := Sqrt (-2.0 * X); Koniecznie w nawiasach i bez end if. Jeśli wyrażenie warunkowe ma wartość logiczną, to część może być pominięta: (if C - D = 0 then E > 2 True) (if C - D = 0 then E > 2) Logiczne wyrażenia warunkowe if często są stosowane w warunkach pre, post i inwariantach pętli: Pre => (if A < 0 then B < 0);

Warunkowe wyrażenie case: Value := (case Letter is when 'A' 'E' 'I' 'L' 'U' 'N' 'O' 'R' 'S' T' => 1, when 'D' 'G' => 2, when 'B' 'C' 'M' 'P' => 3, when 'F' 'H' 'V' 'W' 'Y' => 4, when 'K' => 5, when 'J' 'X' => 8, when 'Q' 'Z' => 10); Logiczne wyrażenia warunkowe case często występują w warunkach pre, post i niezmiennikach pętli. Instrukcja pętli: loop ADC.Read (Temperature); -- Read the temperature from the ADC Calculate_Valve (Current_Temp => Temperature, -- Calculate the new New_Setting => Valve_Setting); -- gas valve setting DAC.Write (Valve_Setting); -- Change the gas valve setting Sum := 0; loop Ada.Integer_Text_IO.Get (Value); exit when Value < 0; Sum := Sum + Value; Approx := X / 2.0; while abs (X - Approx ** 2) > Tolerance loop Approx := 0.5 * (Approx + X / Approx); for Count in Integer range 5.. 8 loop Ada.Integer_Text_IO.Put (Count); for Count in reverse Integer range 5.. 8 loop Ada.Integer_Text_IO.Put (Count); A := 9; B := 2; for Count in Integer range A.. B loop Ada.Integer_Text_IO.Put (Count); -- With a null range, this -- loop iterates zero times for Count in reverse Integer range A.. B loop Ada.Integer_Text_IO.Put (Count); -- With a null range, this -- loop iterates zero times

with Ada.Text_IO; with Ada.Integer_Text_IO; procedure Example is Podprogramy Limit : constant Integer := 1_000; procedure Bounded_Increment (Value : in out Integer; -- A value to increment Bound : in Integer; -- The maximum that Value may take Changed : out Boolean) -- Did Value change? is begin if Value < Bound then Value := Value + 1; Changed := True; Changed := False; end Bounded_Increment; Value : Integer; Modified : Boolean; begin -- procedure Example Ada.Text_IO.Put_Line ("Enter a number:"); Ada.Integer_Text_IO.Get (Value); Bounded_Increment (Bound => Limit / 2, Value => Value, Changed => Modified); if Modified then Ada.Text_IO.Put_Line ("Your number was changed to "); Ada.Integer_Text_IO.Put (Item => Value, Width => 1); end Example; Tryby parametrów: in Używa się do przekazywania danych od wywoływacza do procedury. W procedurze parametr w trybie in traktowany jest jako stała. Argumentem wywołania może być dowolne wyrażenie, którego wartość odpowiada typowi formalnego parametru. out Używa się do przekazania danych z procedury do wywoływacza. Powinno się uważać formalny parametr w procedurze jako niezainicjowana zmienna. Argument wywołania musi być zmienną, której typ jest zgodny z typem parametru formalnego. in out Używa się do modyfikowania argumentu wywołania. Wartość jest przekazywana do procedury, modyfikowana przez nią i zwracana do wywoływacza. Argument musi być zmienną.

Zasięg identyfikatora określa się następującymi dwiema regułami: Zasięg identyfikatora zawiera wszystkie instrukcje następujące po jego definicji, wewnątrz regionu zawierającego definicję (region ten to jednostka programu taka jak pakiet, procedura albo funkcja). Zawiera on wszystkie zagnieżdżone regiony za wyjątkiem tych, których dotyczy druga reguła. Zasięg identyfikatora nie rozszerza się do zagnieżdżonego regionu, jeśli zdefiniowano w nim homograf. Regułę tę nazywa się regułą przesłaniania (ang. name precedence). Funkcje w SPARK mogą mieć tylko parametry w trybie in. Mogą one korzystać ze zmiennych globalnych ale nie mogą ich zmieniać. Te ograniczenia zapewniają, że funkcje nie mają efektów ubocznych. function Sqrt (X : in Float; Tolerance : in Float) return Float is Approx : Float; -- An approximation of the square root of X begin Approx := X / 2.0; while abs (X - Approx ** 2) > Tolerance loop Approx := 0.5 * (Approx + X / Approx); return Approx; end Sqrt; Funkcje zapisane w postaci jednego wyrażenia: function Double (First : in Integer; Second : in Integer) return Boolean is (abs Second = 2 * abs First); Wyrażenie musi być w nawiasie. Typy danych SPARK Data Types Atomic Composite Scalar Array Record Discrete Real Enumeration Integer Floating Point Fixed Point Character Boolean Signed Modular Ordinary Decimal

Typy skalarne Typ skalarny jest typem atomowym z dodatkową własnością uporządkowania. Wartości mogą być porównywane operatorami relacji (<, <=, > i >=). Są dwa rodzaje typów skalarnych: liczby rzeczywiste i typ dyskretny, który ma dodatkową własność jednoznacznego następnika i poprzednika. Liczby rzeczywiste Liczby rzeczywiste nie mogą być reprezentowane dokładnie w pamięci komputera. Liczby które mają dokładną reprezentację nazywa się liczbami modelowymi. Każda liczba inna niż modelowa jest przybliżona i reprezentowana najbliższą liczbą modelową. Błąd reprezentacji danej liczby jest równy różnicy między nią a modelową liczbą ją reprezentującą. Dla przykładu w przedziale od 10,000.0 do 10,001.0 tylko 1,024 liczby reprezentowane są dokładnie w reprezentacji IEEE 754 pojedynczej precyzji. with Ada.Text_IO; procedure Good_Types is -- Declarations of two floating point types type Feet is digits 4 range 0.0.. 100.0; type Inches is digits 3 range 0.0.. 12.0; -- Instantiation of input/output packages for feet and inches package Feet_IO is new Ada.Text_IO.Float_IO (Feet); package Inch_IO is new Ada.Text_IO.Float_IO (Inches); function To_Feet (Item : in Inches) return Feet is begin return Feet (Item) / 12.0; end To_Feet; Room_Length : Feet; Wall_Thickness : Inches; Total : Feet; Liczby rzeczywiste zmiennopozycyjne co najmniej 4 cyfry dziesiętne w mantysie co najmniej 3 cyfry dziesiętne w mantysie begin Feet_IO.Get (Room_Length); Inch_IO.Get (Wall_Thickness); Total := Room_Length + 2.0 * To_Feet (Wall_Thickness); Feet_IO.Put (Item => Total, Fore => 1, Aft => 1, Exp => 0); end Good_Types;

Liczby rzeczywiste stałopozycyjne W większości języków programowania dostępne są tylko liczby zmiennopozycyjne. Liczby zmiennopozycyjne reprezentują szerszy zakres wartości. Arytmetyka na liczby stałopozycyjne wykonywana jest standardowymi instrukcjami maszynowymi na liczbach całkowitych (dużo większa szybkość niż zmiennopozycyjne). Wiele tanich wbudowanych mikroprocesorów, mikrokontrolerów i cyfrowych procesorów sygnałów nie wspiera arytmetyki zmiennopozycyjnej. W liczbach stałopozycyjnych maksymalny błąd reprezentacji jest stały w całym zakresie, natomiast w reprezentacji zmiennopozycyjnej rośnie wraz ze wzrostem wartości. 0 1 2 3 4 5 6 7 8 9 10 a) liczby rzeczywiste zmiennopozycyjne (digits = 1) 0 1 2 3 4 5 6 7 8 9 10 b) liczby rzeczywiste stałopozycyjne (delta = 0.25) Rozkład liczb modelowych Przykład 25.02.1991 Nieudane przechwycenie rakiety Scud przez baterię Patriot podczas operacji Pustynna Burza (śmierć 28 amerykańskich żołnierzy). Ilustracje z raportu GAO/IMTEC-92-26 Patriot Missile Software Problem. Złe działanie systemu spowodowane było reprezentacją czasu w postaci 24-bitowych liczb zmiennopozycyjnych, w której rozkład liczb modelowych skupiony jest w dolnym zakresie wartości.

Przykład cd. Hours Seconds Absolute inaccuracy (Seconds) Approximate shift in missile range gate 0 0.0 0.0000 0 1 3600.0 0.0034 7 8 28800.0 0.0275 55 20 72000.0 0.0687 137 48 172800.0 0.1648 330 72 259200.0 0.2472 494 100 360000.0 0.3433 687 Deklarując typ stałopozycyjny specyfikujemy maksymalny odstęp między liczbami modelowymi jaki możemy zaakceptować (maksymalny błąd reprezentacji jest wówczas połową tej odległości): type Thirds is delta 1.0 / 3.0 range 0.0.. 100_000.0; type Volts is delta 2.0**(-12) range 0.0.. 5.0; Chociaż w typie Thirds zadano odstęp 1/3, to faktycznie będzie on równy 1/4 (najwyższa potęga 2 nieprzekraczająca wartości 1/3). Z tego powodu typy takie są nazywane binarnymi typami stałopozycyjnymi. W dziesiętnym typie stałopozycyjnym zadany odstęp jest potęgą 10 oraz zadaje się łączną liczbę cyfr dziesiętnych: type Dollars is delta 0.01 digits 12; Operacje wejścia/wyjścia można wykonywać dzięki rodzajowym pakietom Ada.Text_IO.Fixed_IO i Ada.Text_IO.Decimal_IO: package Thirds_IO is new Ada.Text_IO.Fixed_IO (Thirds); package Volts_IO is new Ada.Text_IO.Fixed_IO (Volts); package Dollars_IO is new Ada.Text_IO.Decimal_IO (Dollars);