Simula 67 je nejspíš první funkční objektově orientovaný programovací jazyk, odvozený podobně jako Pascal z Algolu (kterému se syntaxí velmi podobá).

Jazyk byl navržen v roce 1967 speciálně pro simulování systémů hromadné obsluhy. Proto byl vybaven možností kvaziparalelního výpočtu a kalendářem událostí.

Jazyk se prakticky neuplatnil mimo akademické prostředí, ale měl významný vliv na další vývoj objektového programování. Mnoho rysů Simuly (speciálně celé pojetí tříd a dědičnosti) bylo totiž později převzato jazykem C++ nebo Java. Jazyk Java byl sice odvozen z jazyka C++, nicméně v některých rysech se blíží Simule.[1] Simula, stejně jako Java a některé další jazyky, obsahuje garbage collector, což je mechanismus pro automatické uvolňování nepoužívaných objektů z paměti.

Charakteristika jazyka

editovat

Základní datové typy

editovat
  • Integer
  • Short Integer
  • Real
  • Long Real
  • Boolean
    Integer a;
    Real b;
    Boolean c;
    a:=25;
    b:=6.2;
    c:=True;
    a:=a+20;
    b:=b/2;
    c:=c and (a<20);
    

Řídící struktury

editovat

Příkaz: je ukončen středníkem.

Přiřazení hodnot: A:=B převzaté z Algolu.

Přiřazení referencí: A:-B.

Blok: begin.....end.

Podmínka: if výraz then příkaz nebo blok (else příkaz nebo blok).

Cyklus while: while výraz do příkaz nebo blok.

Cyklus for: velmi obecný

Procedury

editovat

Přístup k parametrům procedury

editovat
Hodnotou
editovat

Implicitní pro jednoduché typy, možné pro texty a pole.

! toto je komentář
procedure X(Param); value Param; text Param; ! text předávaný hodnotou

Procedura pracuje s kopií proměnné.

Referencí
editovat

Implicitní pro nejednoduché typy.

procedure X(Param); text Param; ! text předávaný referencí

Procedura pracuje přímo s proměnnou, předává se jí reference na proměnnou. Pokud je proměnná v proceduře změněna, projeví se změna i v původní proměnné.

Jménem
editovat

Povolené pro všechny typy.

procedure X(Param); name Param; text Param; ! text předávaný jménem

Podobné jako předávání referencí, ale proměnná se při každém použití znovu vyhodnotí.

Příklad procedury

editovat
Procedure FormatujText(T, N, Ok); Text T; Integer N; ! Vypíše text T zarovnaný zprava, N je maximální počet sloupců
               Name Ok; Boolean Ok; ! Pomocí Ok se vrátí, jestli se text vešel do N sloupců
Begin
    Integer I;
    Ok := N >= T.Length; ! ověření, zda se text vejde do N sloupců
    For i:=1 step 1 until N-T.Length do ! výpis mezer zleva
    Begin
        OutText(" ");
    End
    OutText(T); ! výpis textu
End of FormatujText;

Pro deklaraci funkce se před procedure napíše typ, který funkce vrací. Pro předávání parametrů platí totéž co pro procedury.

Příklad funkce

editovat
Integer Procedure Umocni(Zaklad, Exponent); Integer Zaklad; Integer Exponent; ! Umocni Zaklad na Exponent
Begin
    Umocni:=Zaklad**Exponent; ! Operátor ** slouží k umocnění
End

Třídy

editovat

Třída v Simule je tvořená čtyřmi částmi: parametry, atributy, metody a životní pravidla.

Deklarace

editovat
Class Obdelnik (Width, Height); Real Width, Height; ! třída se dvěma parametry
 Begin
    Real Obsah, Obvod; ! atrubuty;

    Procedure Aktualizuj; ! metody
    Begin
      Obsah := Width * Height;
      Obvod := 2*(Width + Height)
    End of Aktualizuj;

    Boolean Procedure JsemCtverec;
    Begin
        JsemCtverec := Width=Height;
    End of JsemCtverec;
    ! životní pravidla
    Aktualizuj;
    OutText("Vytvořen obdélník: ");
    OutFix(Width,2,6);
    OutFix(Height,2,6);
    OutImage
 End of Obdelnik;

Vytvoření objektu

editovat
Ref(Obdelnik) obd;
obd:-New Rectangle(20, 30);

Objektu se přiřadí paměť zkopírují se hodnoty parametrů a začnou se provádět životní pravidla.

Vytvoření podtřídy

editovat
Obdelnik Class GrafickyObdelnik(Viditelny); Boolean Viditelny;
Begin
    If Viditelny Then
        OutText("Tento obdelnik je viditelný");
    Else
        OutText("Tento obdelnik není viditelný");
    OutImage;
End of GrafickyObdelnik;

Při vytvoření objektu se nejdříve provedou životní pravidla nadtřídy a potom podtřídy. Lze to změnit příkazem inner.

Vytvoření objektu podtřídy

editovat
Ref(GrafickyObdelnik) obdelnik;
obdelnik:-New GrafickyObdelnik(40, 10, True);

Pokud do nadtřídy umístíme příkaz inner, budou se nejdříve provádět pravidla nadtřídy, ale až se narazí na inner, provedou se pravidla podtřídy a pak se bude pokračovat v příkazech nadtřídy za inner.

Class A
Begin
    !kod A1
    Inner;
    !kod A2
End of A;

A Class B
Begin
    !kod B1
    Inner;
    !kod B2
End of B;

B Class C
Begin
    !kod C1
    Inner;
    !kod C2
End of C;

Provede se nejdříve kód A1, potom se narazí na inner a začnou se provádět pravidla B, provede se kód B1, až se narazí na inner provede se kód C1. Inner ve třídě C nemá žádný efekt, takže se provede kód C2. Pak program pokračuje zpět do třídy B a provede se B2 a nakonec se provede A2.

Ukázka kódu

editovat

Program Hello world vypadá takto:

Begin
  OutText("Hello World!");
  OutImage;
End;

Reference

editovat
  1. Garbage Collection, Simula 67, Java. www.cs.uiowa.edu [online]. [cit. 2007-02-20]. Dostupné v archivu pořízeném dne 2007-02-08. 

Externí odkazy

editovat