StaDyn (język programowania)
Paradygmat | Zorientowany obiektowo |
---|---|
Zaprojektowany przez | Franciszka Ortina |
Deweloper | Grupa badawcza Computational Reflection z Uniwersytetu w Oviedo |
Po raz pierwszy pojawiły się | 2007 |
Wersja stabilna | 2.2.1 / 11 maja 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 | |
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ż
- Bibliografia _ _ _ _ uniovi.es . Źródło 17 maja 2022 r .
- ^ a b „Grupa badawcza refleksji obliczeniowej” . uniovi.es . Źródło 17 maja 2022 r .
- ^ „Pobieranie StaDyn” . uniovi.es . Źródło 17 maja 2022 r .
- ^ 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 .
- 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 .
- 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 .
- 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 .
- 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 .
- Bibliografia _ „Wnioskowanie o typie w celu optymalizacji hybrydowego języka o typie statycznym i dynamicznym” . doi.org . Źródło 20 maja 2022 r .
- 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
- Języki programowania .NET
- Oprogramowanie z 2007 roku
- Języki programowania oparte na klasach
- Dynamicznie typowane języki programowania
- Darmowe kompilatory i interpretery
- Obiektowe języki programowania
- Języki programowania
- Języki programowania stworzone w 2007 roku
- Oprogramowanie korzystające z licencji MIT
- Hiszpańskie wynalazki
- Statycznie typowane języki programowania