urbiscript

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 ; 20 lat temu ( 2003 )
Wersja stabilna
2.7.4 / 17 listopada 2011 ; 11 lat temu ( 17.11.2011 )
Dyscyplina pisania kaczka , dynamiczny
system operacyjny Międzyplatformowe
Licencja Licencje BSD
Rozszerzenia nazw plików .u
Strona internetowa github.com/urbiforge/urbi _ _ _
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, wraz else .
  • 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 klauzula else 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ż bloki asercji , których można użyć do uwzględnienia kilku instrukcji asercji .

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