Co to jest OUX/C+?
OUX to technologia sterowania przepływem wykonania w programie komputerowym, natomiast C+ to język programowania używający tej technologii.
OUX to skrót od liter: D, Q, U, X. Oznaczają one odpowiednio: ‹zadanie›, ‹obiekt›, ‹znacznik stanu›, ‹raport›. Język programowania C+ został zbudowany na składni języka C, ale biblioteka standardowa została odrzucona.
Ze strony Wiki projektu OUX/C+, Wstęp o OUX / C+
Budowanie
Systemy uruchamiania
Programy środowiska OUX/C+ mogą być uruchamiane teoretycznie w każdym systemie uniksopodobnym. Natomiast zostały przetestowane w systemach Linux, FreeBSD i OpenBSD. Środowisko OUX/C+ (projekt ‟oux” na GitHub) jest rozwijane przez autora w systemie Gentoo Linux.
Istnieje też projekt ‟oux-windows” na GitHub, który umożliwia uruchomienie części funkcjonalności środowiska OUX/C+ w systemie Windows, ale zbudowanie tego projektu jest skomplikowane.
Przełączniki i konfiguracja
Po pobraniu plików źródłowych środowiska OUX/C+ zbudowanie i uruchomienie przykładowego programu (“ui”) można wykonać poleceniem “make run”.
Przed zbudowaniem programu można zmodyfikować przełączniki globalne środowiska OUC/C+. Można dodawać wraz z odpowiednią konfiguracją własne ‹moduły› oraz programy (wewnątrz katalogu “oux” lub na zewnątrz).
Początek programowania w OUX / C+, Zarządzanie kompilacją programu i podsystemu OUX
Funkcjonalności
Przepływ wykonania
‹Zadania›
Program środowiska OUX/C+ uruchamia się w synchronicznym ‹zadaniu› głównym (“main”), ale można definiować inne procedury ‹zadań›, które będą wykonywane po utworzeniu danego ‹zadania›.
Są trzy rodzaje ‹zadań›:
- • ‹zadania› synchroniczne
- • ‹zadania› wątkowane
- • ‹zadania› asynchroniczne
‹Zadania› synchroniczne wykonują się zawsze niejednocześnie względem innych ‹zadań› synchronicznych, więc nie ma potrzeby stosowania mechanizmów synchronizacji. ‹Zadania› wątkowane zostają uruchomione w osobnym wątku procesora, ale wykonują się w większości też niejednocześnie, z wyjątkiem bloku oczekiwania na raport systemowy. ‹Zadania› asynchroniczne zostają uruchomine w osobnym wątku procesora i wykonują się w większości jednocześnie, z wyjątkiem bloków synchronizacji.
‹Zadania› synchroniczne zostały pomyślane jako podstawowy element dzielenia przepływu wykonania, natomiast pozostałe rodzaje ‹zadań› są wykorzystywane wtedy, gdy nie można zastosować ‹zadań› synchronicznych. ‹Zadania› wątkowane są używane wtedy, gdy ‹zadanie› musi czekać na ‹raport› systemowy w blokującej procedurze systemu operacyjnego. ‹Zadania› asynchroniczne służą do uruchamiania procesów obliczeniowych koniecznych do wykonania jak najszybciej (korzystając z osobnego wątku rzeczywistego ‘cpu’).
W programie środowiska OUX/C+ może też być co najwyżej jedno wystąpienie szczególnej odmiany ‹zadania› synchronicznego: ‹zadanie› z ‹raportem› typu “itimer”. Jest to ‹zadanie›, które oczekuje na ‹raport› systemowy, gdy w blokującej procedurze systemu operacyjnego można podać maksymalny czas blokowania.
‹Znaczniki stanu› i ‹raporty›
W trakcie wykonywania się ‹zadania› w zależności od bieżącej sytuacji, bieżących danych, może już być wiadomo, że jakiś stan lub ‹raport› ma być zasygnalizowany. Do zapisu tego służą zmienne nazywane ‹znacznikami stanu›. Pod koniec wykonywania się pętli własnej ‹zadania› te ‹znaczniki stanu› są zamieniane w emisje ‹raportów›.
‹Raporty› to: punkty oczekiwania ‹zadania› na emisję ‹raportu› z innego ‹zadania›, oraz emisje. ‹Raporty› informują o konieczności wykonania ‹zadania›.
Oprócz zwykłych ‹raportów› istnieją też odmiany automatyczne, nie wymagające emisji. Są to ‹cyklery› i ‹impulsatory›. ‹Cykler› to ‹raport› emitowany w regularnych odstępach czasu, a ‹impulsator› zostaje wyemitowany raz po upływie danego czasu ustawionego podczas jego wzbudzania.
Przełączanie zadań w programie OUX / C+, Zadania wątkowane oraz raporty typu “itimer”, Zadania asynchroniczne
Kontrola błędów
Komunikaty linii
Można wypisywać w oknie pseudo‐terminala komunikaty przejścia przez program oznaczonych linii. Do tego należy użyć makra “G_()” dla komunikatu synchronicznego albo “G()” dla komunikatu asynchronicznego. Komunikat synchroniczny jest wysyłany do pseudo‐terminala natychmiast. Natomiast asynchroniczny jest kolejkowany i wypisywany zbiorowo, zachowując kolejność względem innych komunikatów asynchronicznych.
W komunikacie linii można dołączyć wypisywanie wartości zmiennych odpowiednimi makrami.
‹Nierealizacje›
Wywołania procedur systemu operacyjnego obejmuje się odpowiednim do procedury makrem ‹nierealizacji›, które sprawdza poprawność wykonania procedury i ewentualnie wypisuje komunikat linii z opisem błędu.
‹Nierealizacje› mogą być blokowe oraz zakańczające wykonywanie programu. Dla pierwszego rodzaju w przypadku błędu jest wykonywany zdefiniowany blok instrukcji.
Instrukcje wbudowane technologii OUX / języka C+
Wywołania programu
Każdy program środowiska OUX/C+, jeżeli jest uruchomiony, może zostać wywołany z innego programu środowiska OUX/C+. Przesyłanie danych odbywa się przez pamięć współdzieloną: program wywoływany czyta dane z przekazanej mu pamięci współdzielonej oraz zapisuje do niej dane dla programu wołającego.
Język C+
Typy danych
Podstawowymi typami danych są “N” i “S”. Służą one do przechowywania liczby całkowitej odpowiednio bez znaku i ze znakiem. Gdy wymagany jest konkretny rozmiar zmiennej całkowitej, to można użyć jednego z dodatkowych typów danych: “N64”/“S64”, “N32”/“S32”, “N16”/“S16”, “N8”/“S8”, w których liczba oznacza rozmiar bitowy.
Typ danych dla wartości tak‐nie to “B”. Dla znaku Unicode – “U”, a dla znaku bajtowego – “C”.
Identyfikatory ‹obiektów› zarządzanych przez menedżerów przechowuje się w typie danych “I”.
Dla liczb zmienno‐przecinkowych jest typ danych “F”.
Wskaźnik do dowolnych danych reprezentuje typ “P”, a do danych w arytmetyce bajtowej – “Pc”.
Instrukcje wbudowane technologii OUX / języka C+
Stałe
Zostały zdefiniowane stałe “no”/“yes” dla wartości typu tak‐nie.
Dla typów danych “N” i “I” zastała określona nie zdefinowana przez nazwę stała ‘empty’ o wartości “~0”. Ponadto dla typów “N” zwracanych przez procedury przeznaczony jest do definiowania numerów błędów otwarty zakres od wartości “~0” w dół.
Obiektowość ogólna
Nazwy identyfikatorów w języku C+ tworzy się w systemie obiektowości ogólnej. Polega on na dołączaniu (po znaku podkreślenia) do nazwy identyfikatora kolejnych fragmentów o wzorcu: duża litera, znak podkreślenia, tekst nazwy fragmentu. Duża litera we fragmencie służy do oznaczenia typu nazywanego następującym po niej tekstem. W ten sposób można nazwać wszystkie byty programowania obiektowego.
Obiektowość ogólna w technologii OUX / języku C+, Ze strony Wiki projektu OUX/C+
Biblioteka
‹Menedżerzy›
Menedżer bloków pamięci
Menedżer pamięci może przydzielać dane jednostkowe jak i dane tablicowe. Dla tych ostatnich posiada także procedury zmiany elementów tablic: dołączenie, wstawienie, usunięcie.
Ponadto zostało zaimplementowanie zastępowanie systemowego menedżera pamięci, z którego korzystają biblioteki dołączane do programu środowiska OUX/C+.
Menedżer bloków pamięci — “mem-blk.cx”
Menedżer tablic
Menedżer tablic służy do przydzielania i zarządzania nieliniowymi tablicami (kolekcjami) elementów o identyfikatorach nie zmienianych w czasie istnienia elementu.
Menedżer tablic — “mem-tab.cx”
Menedżer plików
Menedżer plików opiera się na koncepcji jednorazowego odczytu z pamięci niezanikającej danych, do których realizowany jest dostęp, i przechowywania ich w pamięci podręcznej. Obsługuje losowy i strumieniowy dostęp do tego samego otwartego pliku.
Menedżer plików — “mem-file.cx”
Procedury
Tworzenie procesu potomnego
Zostały zdefiniowane procedury służące do bezpiecznego utworzenia procesu potomnego.
Parser plików tekstowych
Parser plików tekstowych UTF-8 działa w oparciu o zdefiniowany plik opisu składni. Jedynym warunkiem dla formatu parsowanych danych jest ich poprawność w całości. Można dzięki temu użyć tego parsera do większości formatów danych tekstowych.
Parser plików tekstowych – “text-syntax.cx”
‹Moduły› dodatkowe
Duże liczby jakby zmiennoprzecinkowe
‹Moduł› ten służy do obliczeń na liczbach przekraczających rozmiar typu danych “S” i “F”. Przechowuje liczby w postaci zbliżonej do liczb zmiennoprzecinkowych, o precyzji zależnej od rodzaju obliczeń.
Duże liczby jakby zmiennoprzecinkowe – “math-bignum.cx”
Klient HTTP/1.1 i HTTP/2
Jest to klient służący do prostych żądań przez jeden z wymienionych protokołów negocjowany automatycznie.