StaDyn (język programowania)

StaDyn
StaDyn-logo.png
Paradygmat Zorientowany obiektowo
Zaprojektowany przez Franciszka Ortina
Deweloper Grupa badawcza Computational Reflection z Uniwersytetu w Oviedo
Po raz pierwszy pojawiły się 2007 ; 16 lat temu ( 2007 )
Wersja stabilna
2.2.1 / 11 maja 2022 ; 10 miesięcy temu ( 11.05.2022 )
Dyscyplina pisania Hybrydowe pisanie statyczne i dynamiczne, pisanie stopniowe, mocne, wywnioskowane
Język implementacji C#
Platforma Infrastruktura wspólnego języka ( .NET Framework )
Licencja Licencja MIT
Strona internetowa odbicie .uniovi .es /stadyn
Główne implementacje
C#
Pod wpływem
C# , OCaml , StrongTalk , Boo

StaDyn to zorientowany obiektowo język programowania ogólnego przeznaczenia dla platformy .NET , który obsługuje zarówno pisanie statyczne, jak i dynamiczne w tym samym języku programowania.

Kompilator StaDyn zbiera informacje o typie dla dynamicznie pisanego kodu. Informacje o tym typie są używane do wykrywania błędów typu w czasie kompilacji i przeprowadzania znaczących optymalizacji. W tym celu zapewnia rekonstrukcję typu (wnioskowanie), typy wrażliwe na przepływ, typy łączące i przecięcia, typowanie oparte na ograniczeniach, analizę aliasów i specjalizację metod. Jego pierwszy prototyp pojawił się w 2007 roku jako modyfikacja C# 3.0. Wnioskowanie o typie było obsługiwane przez włączenie var jako nowego typu, w przeciwieństwie do C#, który oferuje tylko var do definiowania zainicjowanych zmiennych lokalnych. Wrażliwe na przepływ typy var referencje są wywnioskowane przez kompilator, zapewniając bezpieczne pisanie kaczki. Gdy programista wymaga łagodniejszego podejścia, zamiast var można użyć typu dynamicznego . Chociaż wnioskowanie o typie jest nadal wykonywane, dynamiczne zachowują się bliżej tych w językach dynamicznych.

StaDyn został zaprojektowany przez Francisco Ortina z Uniwersytetu w Oviedo . Język został zaimplementowany przez różnych członków grupy badawczej Computational Reflection, w tym Miguela Garcię, Jose Baltasara Garcíę Pereza-Schofielda i Jose Quirogę, oprócz Francisco Ortina.

Nazwa StaDyn jest połączeniem słów statycznych i dynamicznych, co wskazuje na jej cel polegający na zapewnieniu korzyści płynących zarówno z pisania statycznego, jak i dynamicznego.

Próbki kodu

Zmienne o różnych typach

Podobnie jak języki dynamiczne, zmienne mogą zawierać różne typy w tym samym zakresie:

 
  
        
        
           
          

           przy użyciu  Systemu  ;  klasa  Program  {  public  static  void  Main  ()  {  Console  .  Napisz  (  "Liczba: "  );  var  wiek  =  Konsola  .  w  .  Odczyt wiersza  ();  Konsola  .  WriteLine  (  "Cyfry: "  +  wiek  .  Długość  );  wiek  =  Konwertuj  .  ToInt32  ( 
        

           
                          
            
    
 wiek  );  wiek  ++;  Konsola  .  WriteLine  (  "Wszystkiego najlepszego, masz teraz "  +  wiek  +  " lat."  );  int  długość  =  wiek  .  długość  ;  // * Błąd kompilatora  }  } 

Zmienna wieku jest najpierw wywnioskowana jako łańcuch, więc można bezpiecznie pobrać jej właściwość Length . Następnie zawiera liczbę całkowitą, więc age++ jest poprawnym wyrażeniem. Kompilator wykrywa błąd w ostatnim wierszu, ponieważ Length nie jest już dostarczany przez age .

Wygenerowany kod nie używa pojedynczej zmiennej Object do reprezentowania wieku, ale dwie różne zmienne, których typy to string i int. Osiąga się to poprzez modyfikację algorytmu obliczania postaci SSA . Dzięki temu wygenerowany kod jest bardziej wydajny, ponieważ konwersje typów w czasie wykonywania nie są wymagane.

Typy wrażliwe na przepływ

var i zmienne dynamiczne mogą przechowywać typy wrażliwe na przepływ:

 
  
         
         
           0
               
        
                przy użyciu  Systemu  ;  klasa  Program  {  public  static  void  Main  (  String  []  args  )  {  var  wyjątek  ;  if  (  args  .  Length  >  )  wyjątek  =  new  ApplicationException  (  "Wyjątek aplikacji."  );  inny  wyjątek  =  nowy  wyjątek systemowy  ( 
        
    
 „Wyjątek systemowy”.  );  Konsola  .  WriteLine  (  wyjątek  .  Wiadomość  );  }  } 

Message z wyjątku jest bezpieczne, ponieważ zarówno ApplicationException, jak i SystemException udostępniają tę właściwość. W przeciwnym razie zostanie wyświetlony błąd kompilatora. W ten sposób StaDyn zapewnia bezpieczny system statycznego pisania typu kaczka.

W poniższym programie:

 
  
         
         
          
         0 
               
            
         
              przy użyciu  Systemu  ;  klasa  Program  {  public  static  void  Main  (  String  []  args  )  {  var  wyjątek  ;  switch  (  args  .  Length  )  {  case  :  wyjątek  =  new  ApplicationException  (  "Wyjątek aplikacji."  );  przerwa  ;  przypadek  1  :  wyjątek  =   
            
        
              
            
        
         
         
    
 new  SystemException  (  "Wyjątek systemowy."  );  przerwa  ;  default  :  wyjątek  =  "To nie jest wyjątek."  ;  przerwa  ;  }  Konsola  .  WriteLine  (  wyjątek  .  Wiadomość  );  // * Błąd kompilatora z var, ale nie z dynamic  Console  .  WriteLine  (  wyjątek  .  Nieznany  );  // * Błąd kompilatora  }  } 

Właściwość Message nie jest dostarczana przez String , więc dla wyjątku jest wyświetlany błąd kompilatora.Message . Jeśli jednak zadeklarujemy wyjątek jako dynamic , poprzedni program zostanie zaakceptowany przez kompilator. dynamic jest łagodniejszy niż var , zgodnie ze smakiem języków dynamicznych. Jednak nadal wykonywane jest statyczne sprawdzanie typów. Jest to pokazane w ostatnim wierszu kodu, gdzie kompilator pokazuje błąd wyjątku. Nieznany , nawet jeśli wyjątek jest zadeklarowany jako dynamiczny . Wynika to z faktu, że żaden z trzech możliwych typów ( ApplicationException , SystemException i String ) nie obsługuje komunikatu Unknown .

Chociaż typy dynamiczne i var mogą być używane jawnie w celu uzyskania bezpieczniejszej lub łagodniejszej kontroli typów, dynamikę pojedynczych odwołań do zmiennych można również modyfikować za pomocą opcji wiersza poleceń, plików konfiguracyjnych XML i wtyczki do programu Visual Studio.

Wnioskowanie typu pól

var i dynamiczne mogą być używane jako pola obiektowe:

  
      

       
          
    

       
         
    

        
           class  Wrapper  {  prywatny  atrybut  var  ;  public  Wrapper  (  atrybut  var  )  {  this  .  atrybut  =  atrybut  ;  }  public  var  get  ()  {  return  atrybut  ;  }  public  void  set  (  var  atrybut  )  {  this  .  atrybut  =  atrybut  ; 
    


  
        
         
         
            
          
           

         }  }  class  Test  {  public  static  void  Main  ()  {  string  aString  ;  int  aInt  ;  Wrapper  wrapper  =  new  Wrapper  (  "Hello"  );  aString  =  opakowanie  .  dostać  ();  aInt  =  opakowanie  .  dostać  ();  // *  Opakowanie błędu kompilatora   .  zestaw  (  3 
           
          
    
 );  aString  =  opakowanie  .  dostać  ();  // * Błąd kompilatora  aInt  =  wrapper  .  dostać  ();  }  } 

Klasa Wrapper może zawijać dowolny typ. Za każdym razem, gdy wywołujemy set , typ atrybutu jest określany jako typ argumentu. Każdy obiekt ma potencjalnie inny typ atrybutu , więc jego typ jest przechowywany dla każdej pojedynczej instancji, a nie dla całej klasy. W ten sposób dwie linie wskazane w powyższym kodzie zgłaszają błędy kompilacji. W celu obsługi tego zachowania zaimplementowano algorytm analizy aliasów oparty na typach.

Typy oparte na ograniczeniach

Przeanalizujmy następującą metodę:

     
     
 public  static  var  górna  (  parametr  var  )  {  parametr  powrotu  .  DoGórnej  ();  } 

Typ parametru i wartość zwracana przez funkcję są wywnioskowane przez kompilator. W tym celu do typu upper dodano ograniczenie : argument musi zawierać metodę ToUpper bez parametrów. Przy każdym wywołaniu ograniczenie będzie sprawdzane. Ponadto typ zwracany przez upper zostanie wywnioskowany jako zwracany typ odpowiedniej metody ToUpper zaimplementowanej przez argument.

Programista może użyć var ​​lub dynamic do zadeklarowania parametru , zmieniając sposób przeprowadzania sprawdzania typu po wywołaniu metody. Załóżmy, że argument przekazany do upper zawiera typ wrażliwy na przepływ (np. ApplicationException , SystemException lub String zmienna wyjątku w powyższym kodzie). W przypadku var wszystkie możliwe typy argumentów muszą zawierać ToUpper ; z dynamicznym , co najmniej jeden typ musi zapewniać ToUpper .

Wydajność w czasie wykonywania

Informacje o typach zebrane przez StaDyn są wykorzystywane do przeprowadzania znaczących optymalizacji w generowanym kodzie: zmniejsza się liczbę inspekcji typów i rzutowań typów, unika się refleksji, często występujące typy są buforowane, a metody z ograniczeniami są specjalizowane. Celem wszystkich optymalizacji jest zmniejszenie liczby operacji sprawdzania typu wykonywanych w czasie wykonywania, co jest głównym ograniczeniem wydajności większości języków dynamicznych. Wiele z tych kontroli typu jest przeprowadzanych wcześniej przez kompilator StaDyn. Szczegółowa ocena wydajności środowiska uruchomieniowego StaDyn jest szczegółowo opisana w.

Zobacz też

  1. Bibliografia _ _ _ _ uniovi.es . Źródło 17 maja 2022 r .
  2. ^ a b „Grupa badawcza refleksji obliczeniowej” . uniovi.es . Źródło 17 maja 2022 r .
  3. ^ „Pobieranie StaDyn” . uniovi.es . Źródło 17 maja 2022 r .
  4. ^ a b Francisco Ortin; Miguela Garcii; Seana McSweeneya. „Specjalizacja programu oparta na regułach w celu optymalizacji stopniowo wpisanego kodu” . doi.org . Źródło 17 maja 2022 r .
  5. Bibliografia _ Franciszka Ortina. „Transformacje SSA ułatwiające wnioskowanie o typie w kodzie o typie dynamicznym” . doi.org . Źródło 17 maja 2022 r .
  6. Bibliografia _ Miguela Garcii. „Typy związkowe i skrzyżowania do obsługi pisania dynamicznego i statycznego” . doi.org . Źródło 19 maja 2022 r .
  7. Bibliografia _ Francisco Morero; Antona Moranta. „Informacje o typie statycznym w celu ulepszenia funkcji IDE hybrydowych języków o typie dynamicznym i statycznym” . doi.org . Źródło 19 maja 2022 r .
  8. Bibliografia _ Daniela Zapico; JBG Perez-Schofield; Miguela Garcii. „W tym pisanie statyczne i dynamiczne w tym samym języku programowania” . doi.org . Źródło 20 maja 2022 r .
  9. Bibliografia _ „Wnioskowanie o typie w celu optymalizacji hybrydowego języka o typie statycznym i dynamicznym” . doi.org . Źródło 20 maja 2022 r .
  10. Bibliografia _ Franciszka Ortina; Jose Quiroga. „Projektowanie i implementacja wydajnego hybrydowego dynamicznego i statycznego języka pisania” . doi.org . Źródło 20 maja 2022 r .

Linki zewnętrzne