Skip to content
overcq edited this page Jul 23, 2022 · 7 revisions

Projekt OUX/C+ rozszerza składnię języka C o struktury przełączania wykonania oraz zawiera bibliotekę funkcji. W implementacji wymagane jest stosowanie ustalonego standardu nazewnictwa zmiennych i funkcji globalnych.

Nazwa OUX pochodzi od liter D Q U X oznaczających kolejno: ‹zadanie›, ‹obiekt›, ‹znacznik stanu›, ‹raport›.

Symbole

Symbole z wielkich liter są piktogramami, w których są dwa kierunki: pionowy i poziomy. Pionowy z góry na dół to przepływ wykonania, a poziomy z lewej oznacza program, a z prawej system. Wszystkie proste symbole to:

  • A - deklaracja czegoś
  • B - czekanie na coś
  • C - przełącznik (‘preprocesora’)
  • D - ‹zadanie›
  • E - ‹moduł›
  • F - aktywacja czegoś
  • G - wstępny przebieg przepływu wykonania / ‹raport linii›
  • H - ‹system›
  • I - ‹procedura›
  • J - definicja ‘preprocesora’
  • K - ‹zdarzenie›
  • L - dezaktywacja czegoś
  • M - utworzenie czegoś
  • N - wytworzenie formy czegoś stratnie
  • O - pętla
  • P - zmiana czegoś
  • Q - ‹obiekt›
  • R - odczyt czegoś (wywołujący zmianę)
  • S - ‹zmienna›
  • T - sprawdzenie czegoś (test)
  • U - ‹znacznik stanu›
  • V - ‹nierealizacja›
  • W - wyrzucenie czegoś
  • X - ‹raport›
  • Y - ‹cykler›
  • Z - ‹typ› ‹zmiennej›

Stosowane w składni symbole są zawarte w plikach: “compile/E_cplus_S_machine.h” i “compile/E_cplus_S_language.h”.

Nazwy globalne mają format: “E_” nazwa ‹modułu› “_” symbol “_” nazwa, i dowolna ilość “_” symbol “_” nazwa.

Struktury przepływu wykonania i inne

System gwarantuje wykonywanie się w każdej chwili tylko jednej struktury wykonania, a przełączanie następuje w wyznaczonych liniach, np. w instrukcji oczekiwania na ‹raport›.

Moduły

Na ‹moduł› składa zwykle kilka plików mających wspólny początek nazwy do znaku “-”.

Zadania

‹Zadanie› definiuje się następująco:

D( moduł, nazwa_zadania )
{
    I_D
    {
    }
}

Zwykle definiuje się ‹zadanie› czekające na ‹raport› i wykonujące coś po jego otrzymaniu:

D( moduł, nazwa_zadania )
{   X_M( moduł, nazwa_raportu );
    I_D
    {   X_B( moduł, nazwa_raportu )
            break;

    }
    X_W( moduł, nazwa_raportu );
}

‹Zadanie› tworzy i usuwa ‹raport›, na który czeka, a inne ‹zadanie› deklaruje użycie ‹raportu›, który emituje.

Obiekty

‹Obiekt› definiuje się w osobnym pliku ‹modułu›, zawierającym zwykle kilka ‹obiektów›.

‹Obiekt› składa się z ‹procedur› jego utworzenia, wyrzucenia i funkcji ‹obiektu›.

Znaczniki stanu

‹Znacznik stanu› najpierw się definiuje i inicjuje:

struct
{   unsigned U_R( nazwa, nazwa_stanu ) :1
}struktura;
U_L( struktura.nazwa, nazwa_stanu );

albo:

B U_L( nazwa, nazwa_stanu );

A następnie w pętli wykonania wzbudza go:

U_F( struktura.nazwa, nazwa_stanu );

albo:

U_F( nazwa, nazwa_stanu );

Po to, by później, poza pętlą, go obsłużyć:

if( U_E( nazwa, nazwa_stanu ))
{
}

albo obsłużyć go w innym ‹zadaniu›:

if( U_E( struktura.nazwa, nazwa_stanu ))
{
}

Nierealizacje

Dostępne jest szereg instrukcji ‹nierealizacji›, które odpowiadają sposobowi obsługi błędów wywołań ‘uniksowych’.

Instrukcją ‹nierealizacji› otacza się instrukcję wywołania systemowego, na przykład:

VO1( read( fd, buf, count ))
{   VO1( close(fd) ){}
    return 1;
}

W przypadku nierealizacji (błędu) wywołania ‘uniksowego’ jest wypisywany ‹raport linii› ze standardowym opisem błędu.

Raporty linii

‹Raport linii› jest to linia tekstu wypisywana po wykonaniu danej linii. Są dwa rodzaje ‹raportów linii›:

  • synchroniczny
  • asynchroniczny, ale zachowujący kolejność w grupie raportów asynchronicznych

Definiuje się je odpowiednio:

G_();

oraz

G();

Po której to definicji następuje w tej samej linii dowolna liczba definicji wypisywania wartości zmiennych, na przykład:

G(); Gd( zmienna_liczbowa );

Programy OUX/C+

Programy znajdują się i mogą być dodawane w podkatalogach katalogu “program”.

W katalogu należy utworzyć łącze do pliku “Makefile” z obecnego już podkatalogu innego programu.

Programy i środowisko potrzebne do ‘kompilacji’

  • GNU “make”
  • “perl”
  • “awk”
  • narzędzia podstawowe środowiska ‘unix’ z katalogów “/bin” i “/usr/bin”
  • zainstalowana dokumentacja “man” wywołań ‘uniksowych’

Podczas pierwszej ‘kompilacji’ jest tworzona baza danych plików nagłówkowych potrzebnych dla każdego wywołania. Dlatego nie trzeba dodawać instrukcji #include dla tak znalezionych wywołań.