urbiscript
Paradygmat | wieloparadygmat : obiektowy , sterowany zdarzeniami , imperatywny , funkcjonalny , proceduralny , refleksyjny |
---|---|
Zaprojektowany przez | Jean-Christophe Baillie |
Deweloper | Gostai i in. |
Po raz pierwszy pojawiły się | 2003 |
Wersja stabilna | 2.7.4 / 17 listopada 2011
|
Dyscyplina pisania | kaczka , dynamiczny |
system operacyjny | Międzyplatformowe |
Licencja | Licencje BSD |
Rozszerzenia nazw plików | .u |
Strona internetowa | |
Pod wpływem | |
C++ , Self , Io |
urbiscript to język programowania dla robotyki. Oferuje obsługę składni dla programowania współbieżnego i opartego na zdarzeniach. Jest to zorientowany obiektowo język skryptowy oparty na prototypach . Jest dynamiczny: rozpoznawanie nazw odbywa się podczas wykonywania programu ( późne wiązanie ); gniazda ( zmienne składowe ) można dodawać/usuwać w czasie wykonywania, a nawet prototypy ( klasy nadrzędne ) obiektu można zmieniać w czasie wykonywania.
Zarządzanie pamięcią odbywa się poprzez zliczanie referencji .
Ściśle powiązany z platformą Urbi, obsługuje bezproblemową integrację komponentów C++/Java.
Składnia i semantyka
Inspiracja
Z syntaktycznego punktu widzenia urbiscript należy do rodziny języków programowania C.
Na jego zorientowany obiektowo projekt oparty na prototypach wpłynęły języki programowania Self i Io .
Jest przeznaczony do programowania, ale także interakcji z robotami; jako taki jest pod wpływem powłok Unix i innych języków, które zapewniają interaktywny najwyższy poziom w stylu pętli odczyt-ocena-wydruk . Jednak w przeciwieństwie do innych, nie ma monitu o wprowadzenie danych przez użytkownika, ale odpowiedzi z systemu są poprzedzone znacznikiem czasu (w milisekundach) w nawiasach kwadratowych:
1 + 1; sen(1s); 1 + 2 * 3;
- [00005420] 2
- [00006420] 7
Instrukcje sekwencyjne i przepływ sterowania
Instrukcje urbiscript obejmują (między innymi):
- Instrukcja
if
z , która warunkowo wykonuje blok kodu, wrazelse
. - Tradycyjna instrukcja
for
, jak w C, która iteruje po iterowalnym obiekcie, przechwytując każdy element do zmiennej lokalnej do użycia przez dołączony blok. - Kolejna instrukcja
for
, która wykonuje iterację po iterowalnym obiekcie, przechwytując każdy element do zmiennej lokalnej do wykorzystania przez dołączony blok. - Instrukcja
while
. , która wykonuje blok kodu, o ile jego warunek jest prawdziwy - Instrukcja
try
klauzule , która umożliwia przechwytywanie wyjątków zgłoszonych w dołączonym bloku kodu i obsługę ich przez catch.
Opcjonalna klauzulaelse
jest uruchamiana, jeśli nie został zgłoszony żaden wyjątek. Można zagwarantować, że kod czyszczący zostanie uruchomiony w każdym przypadku, jeśli zostanie podany w klauzuli-finale
. - Instrukcja
assert
. używana podczas debugowania w celu sprawdzenia warunków, które powinny mieć zastosowanie urbiscript zawiera również blokiasercji
, których można użyć do uwzględnienia kilku instrukcjiasercji
.
Właściwie, w przeciwieństwie do większości języków podobnych do C i pomimo tego, co sugeruje składnia, instrukcje „mają wartość”, a zatem są wyrażeniami, pod warunkiem, że są osadzone w nawiasach klamrowych:
var status = { if ( zamknięty ) "zamknięty" else "otwarty" }; var pass = { try { foo } catch { false } else { true } };
Jednoczesne instrukcje i przepływ sterowania
W urbiscript niektóre konstrukcje sterowania przepływem występują w kilku „smakach”: dwóch typach kompozycji sekwencyjnej i dwóch typach kompozycji współbieżnej. Pod maską współbieżność jest implementowana przy użyciu coroutines .
Skład oświadczenia
Podobnie jak w C, średnik oznacza sekwencyjną kompozycję: a;b
oznacza „uruchom instrukcję a
następnie uruchom instrukcję b
. Inne zadania mogą być uruchamiane między a
i b
. Inny separator instrukcji, rura, oznacza „ciasną kompozycję sekwencyjną”: żadne inne zadanie można uruchomić między a
i b
w a|b
.
Podobnie urbiscript oferuje dwa sposoby jednoczesnego tworzenia instrukcji. W przypadku a,b
najpierw uruchamiane jest a
, aw pewnym momencie b
będzie --- prawdopodobnie, gdy a
nadal działa. Jest to bardzo podobne do &
w powłokach systemu Unix. Alternatywnie
, z a&b
, zarówno aib są
uruchamiane razem; w sesjach interaktywnych oznacza to, że a
nie zostanie uruchomione, dopóki b nie
zostanie w pełni wprowadzone i odpowiednio poprzedzone albo a ;
lub ,
.
Zakresy są granicami zadań w tle, jak pokazano w poniższym przykładzie:
{ { sen ( 2 s ); echo ( 2 ) }, { sen ( 1s ); echo ( 1 ) }, }; echo ( 3 );
- [00012451] *** 1
- [00013447] *** 2
- [00013447] *** 3
Równoległe smaki konstruktów sekwencyjnych
Większość zapętlonych konstrukcji w urbiscript występuje w kilku „odmianach”, które są oparte na czterech separatorach instrukcji: ;
, |
, ,
, oraz &
.
Na przykład
0
// Właściwie to jest "dla;". for ( var ja : [ , 1 , 2 ]) { echo ( ja ); echo ( ja ** 2 ); };
wyświetla
- [00002919] *** 0
- [00002921] *** 0
- [00002921] *** 1
- [00002922] *** 1
- [00002922] *** 2
- [00002922] *** 4
tzn. treści pętli nie są wykonywane sekwencyjnie, podczas gdy słowo kluczowe for&
uruchamia treści pętli jednocześnie:
0
for& ( var i : [ , 1 , 2 ]) { echo ( ja ); echo ( ja ** 2 ); };
- [00021680] *** 0
- [00021680] *** 1
- [00021680] *** 2
- [00021682] *** 0
- [00021682] *** 1
- [00021682] *** 4
Programowanie oparte na zdarzeniach
Dążąc do rozwoju przenośnych aplikacji robotów, urbiscript opiera się na określonych konstrukcjach składniowych w celu określenia reaktywnych zachowań, takich jak „idź do stacji ładującej, gdy bateria jest słaba”, „odtwórz przyjazny dźwięk, gdy rozpoznana zostanie znajoma twarz” lub „zatrzymaj po wykryciu przeszkody”.
Jawna obsługa zdarzeń
Obsługa zdarzeń składa się z trzech etapów. Najpierw zdefiniuj wydarzenie
var e = Zdarzenie . nowy ;
Po drugie, określ procedury obsługi zdarzeń
at ( e ?) echo ( "odebrano zdarzenie e" );
Po trzecie, „emituj” to zdarzenie
e !;
- [00014333] *** odebrane zdarzenie np
Zdarzenia mogą mieć ładunki, a procedury obsługi zdarzeń korzystają z dopasowywania wzorców w ładunku:
0
at ( e ?( 1 , var x ) if x % 2 == ) echo ( "odebrano zdarzenie e(1, %s)" % x ); mi !( 1 , 1 );
- [00014336] *** odebrane zdarzenie np
mi !( 1 , 2 );
- [00014336] *** odebrane zdarzenie e
- [00014336] *** odebrane zdarzenie e(1, 2)
Niejawne zdarzenia
Język urbiscript umożliwia również monitorowanie wyrażeń:
w ( poziom baterii <= 0,2 ) robota . przejdź do stacji ładującej ;
Poniższy przykład demonstruje tę funkcję:
0 zmienna x = ;
- [00002165] 0
0 zmienna y = ;
- [00002166] 0
0 var z = ;
- [00002167] 0
w ( x + y == z ) echo ( "%s + %s == %s" % [ x , y , z ]);
- [00002168] *** 0 + 0 == 0
x = 1 ;
- [00002169] 1
z = 1 ;
- [00002170] 1
- [00002170] *** 1 + 0 == 1
Zobacz też
Linki zewnętrzne
- Rodzina języków programowania C
- Bezpłatne oprogramowanie międzyplatformowe
- Dynamicznie typowane języki programowania
- Darmowe kompilatory i interpretery
- Języki programowania wysokiego poziomu
- Obiektowe języki programowania
- Języki programowania stworzone w 2003 roku
- Języki programowania oparte na prototypach
- Języki programowania robotów
- Języki skryptowe
- Tekstowe języki programowania