judoskrypt
Paradygmat | proceduralne , obiektowe , skryptowe |
---|---|
Zaprojektowany przez | Jamesa Jianbo Huanga |
Deweloper | Jamesa Jianbo Huanga |
Po raz pierwszy pojawiły się | listopad 2001 |
Wersja stabilna | v0.9 / listopad 2005 |
Dyscyplina pisania | dynamiczny , statyczny , mocny |
Platforma | JVM |
Licencja | LGPL |
Strona internetowa | judoscript.com |
Pod wpływem | |
SQR , Perl , JavaScript , Java |
Judoscript to język programowania ogólnego przeznaczenia przeznaczony głównie do zadań skryptowych na platformie Java . Został wymyślony i opracowany przez Jamesa Jianbo Huanga ( chiński uproszczony : 黄剑波 ; chiński tradycyjny : 黃劍波 ; pinyin : Huáng Jiànbō ), począwszy od końca 2001 roku. Judoscript był jednym z pierwszych tak zwanych języków skryptowych Java; ale jego najbardziej uderzającą cechą jest odważna filozofia i praktyka obsługi wielu domen.
Do końca 2005 roku Judoscript zrealizował wszystkie wyznaczone funkcje aplikacji. Sytuacja z językami skryptowymi Java szybko się zmieniła, gdy JavaSoft ogłosił stworzenie własnego języka w 2003 roku. Rozwój Judoscript został zatrzymany, gdy własny język Groovy firmy JavaSoft był bliski wydania.
Historia
Huang pracował nad narzędziem do tworzenia raportów komercyjnych, SQR , które jest szeroko stosowane w PeopleSoft . Technicznie rzecz biorąc, SQR jest archaicznym językiem skryptowym ogólnego przeznaczenia z wbudowanym SQL i dyrektywami raportowania do tworzenia raportów opartych na znakach i manipulacji danymi. Napisany w C, jest przenoszony do prawie wszystkich wersji głównych systemów operacyjnych i współpracuje ze wszystkimi głównymi RDBMS . Wraz z pojawieniem się Javy i JDBC , Huang szybko zdał sobie sprawę, że pojedyncza wersja takiego oprogramowania wyeliminowałaby całą gamę różnych portów SQR. To było ziarno idei Judoscript .
Nawet pod koniec lat 90. wbudowany SQL nie był nowym pomysłem; na przykład Pro*C firmy Oracle właśnie to zrobił. Co ciekawe, osadzony SQL jest rzeczywiście funkcją specyficzną dla domeny ( RDBMS ) wbudowaną w język ogólnego przeznaczenia. Wyrażenia regularne w Perlu to kolejny dobry przykład w dziedzinie obsługi tekstu. Wizja Judoscript zaczęła nabierać kształtu, aby być językiem skryptowym ogólnego przeznaczenia z deklaratywną ekspresją dla wielu popularnych dziedzin programowania w spójny sposób . Na przełomie tysiącleci, Internet zaczął przenikać nasze życie, a rosnąca liczba kluczowych technologii była powszechnie stosowana, dlatego wybór konkretnych domen do obsługi w Judoscript nie był zbyt trudny. W pewnym sensie ta wizja pojawiła się we właściwym czasie. Funkcje specyficzne dla domeny, które były zawarte w okresie istnienia Judoscript, obejmowały skrypty JDBC, programowanie SGML i XML w stylu SAX , skrypty WSDL, skrypty Ant, ujednolicony system plików i skrypty archiwów, skrypty Microsoft COM , uruchamianie natywnego systemu operacyjnego wykonywalnych, wysyłanie poczty, skrypty HTTP i SCP, a także skrypty Java. Gdyby Judoscript nadal się rozwijał, przewidywalnie zawierałby coraz więcej wsparcia specyficznego dla domeny w miarę upowszechniania się nowych technologii, takich jak NoSQL , AI itp.
Będąc językiem skryptowym opartym na JVM, Judoscript ma skrypty Java jako obywatel pierwszej klasy. Judoscript jest pionierem natywnej Ant , umożliwiając użytkownikom korzystanie z ogromnej puli narzędzi w ekosystemie Ant . Dzięki natywnym możliwościom tworzenia skryptów w językach Java, Ant, WSDL, HTTP i Microsoft COM użytkownicy Judoscript mogą łatwo korzystać z zasobów pochodzących z heterogenicznych źródeł. Podstawowym językiem Judoscript jest w dużej mierze JavaScript plus statyczna deklaracja klas. Jak każdy język skryptowy , Judoscript ma różne cukry składniowe , wielowierszowe literały łańcuchowe, literały XML i wyrażeń regularnych, uniwersalna instrukcja print
itp. Jednak chociaż te aspekty dominują w projektowaniu większości innych języków, ogólna programowalność jest mniej istotnym tematem w porównaniu z kluczowymi, unikalnymi cechami języka.
Początkowe perspektywy Judoscript skrystalizowały się, a rozwój rozpoczął się pod koniec 2001 roku; pierwsza wersja została wydana w listopadzie. Judoscript stał się jednym z pierwszych języków skryptowych ogólnego przeznaczenia zaprojektowanych specjalnie do użytku z platformą Java, wraz z Rhino , BeanShell , Jython i kilkoma innymi.
W 2004 roku Judoscript zbliżył się do wersji 0.9. Rozwój trwał do 2005 roku, kiedy to wdrożono większość ostatecznych funkcji. Brakującą kluczową funkcją jest generowanie kodu bajtowego Java w trybie offline lub w czasie wykonywania, co uznano za niezbędne, aby taki język osiągnął wersję 1.0. W tym celu Huang wynalazł język asemblera makr Java, Jamajka. Ale ta praca dla Judoscript nigdy nie została osiągnięta.
W JavaOne 2003, w czerwcu, JavaSoft ogłosił zamiar stworzenia języka skryptowego będącego w całości własnością platformy Java. Ten monopolistyczny ruch zdusił życie większości jego konkurentów. W rezultacie powstał język Groovy, którego nazwa jest najwyraźniej fonetyczną odmianą „jruby”, a jego pierwsza wersja została wydana w 2007 roku. Wbudowana obsługa Ant jest podejrzanie powiązana z funkcją skryptową Ant w Judoscript, mówiąc chronologicznie . Kiedy Groovy miał zostać uwolniony, Judoscript stracił impet pójścia naprzód. Pod koniec 2005 roku, po zaledwie czterech latach, rozwój Judoscript został zatrzymany.
Mimo to judoscript pozostał drogi projektantom i miłośnikom języków i zajmuje miejsce w historii języków programowania , będąc pierwszym i prawdopodobnie jedynym językiem ogólnego przeznaczenia z wbudowanymi tak wieloma natywnymi funkcjami specyficznymi dla domeny. Przyczyna tego zostanie omówiona później.
Projektowanie języka
Projekt języka Judoscript łączy w sobie dwa różne smaki. Przede wszystkim jest to język skryptowy ogólnego przeznaczenia, jak każdy nowoczesny język programowania, wykorzystujący dynamiczne pisanie i notację kropkową do uzyskiwania dostępu do elementów obiektów. Obsługuje zarówno paradygmaty proceduralne, jak i obiektowe, obsługuje statyczne deklaracje klas i dziedziczenie. Różne cukry składniowe i wszechstronna print
charakteryzują jego język skryptowy.
Judoscript jest w pełni zdolny do skryptowania zasobów Java. Jego funkcja statycznego pisania została wprowadzona głównie do wywoływania przeciążonych metod Java.
Drugi smak, który dystansuje Judoscript od reszty tłumu, jest ucieleśnieniem wielu natywnych stwierdzeń specyficznych dla domeny, z których każde ma zupełnie inny wygląd. Niektóre zwracają wartość, inne nie. Większość z tych specjalnych instrukcji może być używana jako zwykłe instrukcje w dowolnym miejscu programu.
Wyrażenia mogą być osadzone w instrukcjach specyficznych dla domeny tam, gdzie jest to stosowne. Wyrażenia można również osadzać w literałach tekstowych, takich jak ciągi znaków i wartości XML, co skutecznie czyni je szablonami tekstowymi.
Funkcje językowe I: potężny język skryptowy
Język bazowy
Podstawowy język Judoscript jest prawie identyczny z JavaScript w zakresie deklaracji zmiennych i stałych, instrukcji kontroli przepływu i notacji kropkowej w celu uzyskania dostępu do elementów obiektów. Oprócz dwóch komentarzy w stylu C++ ma trzecią formę, /? ?/
, przydatne do wyłączenia fragmentu kodu. Parametry funkcji mogą mieć wartości domyślne, a wywołanie może przyjmować nazwane wartości parametrów. Podobnie jak w JavaScript, funkcje są również obiektami i mogą być przekazywane jako wartości. Programowanie dynamiczne jest dostępne za pomocą eval
i evalExternal
.
Programowanie obiektowe
W przeciwieństwie do JavaScript, klasy zdefiniowane przez użytkownika są deklarowane statycznie, ale składowe danych są dynamiczne. Obsługiwane jest dziedziczenie wielokrotne, a programiści powinni radzić sobie z potencjalnymi problemami związanymi z dziedziczeniem diamentów. Instancje klas można transponować do innego typu.
klasa Węzeł { konstruktor { assert ( nazwa != null ); // nakazuje, aby 'nazwa' była zainicjalizowana children = []; } funkcja addDziecko dziecko { dzieci . dodaj ( dziecko ); } funkcja toString { nazwa powrotu ; } }
Organizacja kodu
Judoscript ma dyrektywę !include
, aby dołączyć inne skryptlety. Jest to jedyny mechanizm udostępniania kodu napisanego w Judoscript.
Brak obsługi pakietu lub modułu typu Java w innych językach jest celowy, aby zniechęcić do tworzenia bibliotek napisanych w Judoscript. Biblioteki wielokrotnego użytku są zachęcane do pisania w Javie i używania Judoscript (lub dowolnego języka skryptowego Java).
Cechy języka II: skrypty Java
Skrypty Java to obywatele pierwszej klasy w Judoscript. Poniżej wymieniono niektóre z najważniejszych funkcji skryptów Java. Zapoznaj się z dokumentacją, aby zobaczyć wszystkie zastosowania i przykłady.
Skryptowanie obiektów Java
a = nowa java :: java . utylizacja _ HashMap ; za . put ( „ data ” , data ( 2001 , 1 , 1 )); za . put ( ' liczba całkowita ' , 1 ); za . put ( ' podwójne ' , 10.01 );
za . put ( ' string ' , ' Witaj , świecie ! ' ); za . put ( „ Wymiar ” , nowy java :: java . awt . Wymiar ( 10 , 20 )); dla k w . _ klucze () { println k
: > 10 , ' = ' , za . dostać ( k ); } props = new java :: Properties ( a . b . c . d . e . f . g = ' a thru g ' , h . i . j . k .
ja . m . n = ' h do n ' ); println rekwizyty ;
Aliasowanie statycznych metod Java
Możliwość aliasowania statycznych metod Javy jako funkcji Judoscript jest ważnym mechanizmem, odpowiedzialnym za wiele wbudowanych funkcji.
funkcja prop dla java :: System . pobierzWłaściwość (); funkcja teraz dla Java :: System . bieżący CzasMillis (); funkcja rt dla java :: Runtime . getRuntime (); println teraz (), nl ; println prop ( 'java.class.path' ), nl ; rt (). gc ();
Używanie klas Java jako wartości
Klasy Java są również wartościami obiektowymi i można je przypisywać do zmiennych lub stałych.
const # Typy = java :: java . sql . typy ; pola = [ 'BIT' , 'MAŁE CAŁKOWITE' , 'MAŁE' , 'LICZBY CAŁKOWITE' , 'DUŻE' , 'FLOAT' , 'REAL' , 'PODWÓJNE ' , 'LICZBOWE' , 'DZIESIĘTNE' , 'ZNAK' ,
„VARCHAR” , „LONGVARCHAR” , „DATA” , „CZAS” , „ZNACZNIK CZASU” , „ BINARNY” , „ZMIENNY” , „ DŁUGIZMIENNY” , „NULL” , „INNE” , „JAVA_OBJECT” , „DISTINCT” , „STRUCT” ' , 'TABLICA' , 'BLOB' , 'BLOB'
, 'REF' ]; println 'Typy JDBC w Javie' , sysProperty ( 'java.version' ), ':' ; dla fld w polach { println fld :< 13 , ': ' , # Typy .( fld ); }
Rozszerzanie klas Java i implementacja interfejsów Java
Możliwe jest zdefiniowanie klas Judoscript, które rozszerzają klasy Java lub implementują interfejsy Java.
class MyHashMap rozszerza java :: HashMap { // Test nadpisywania istniejącej metody int hashCode () { return super . hashCode () ^ 1 ; } // Nowa metoda. String [] getKeys () { tablica = [] ; dla x w tym { przyp . dodaj ( x ); }
plan powrotu _ toStringArray (); } // Nowa metoda. Obiekt [] getValues () { tablica = [] ; dla x w wartościach () { arr . dodaj ( x ); } powrót arr . toObjectArray (); } }
Można tworzyć i używać anonimowych adapterów interfejsu Java.
0
importuj java.awt.Frame ; import java.awt.event.* ; f = nowa java :: Ramka ; fa . addWindowListener ( nowy java :: WindowListener { void windowClosing ( WindowEvent e ) { exit ; } } ); fa . setVisible ( prawda );
Funkcje językowe III: obsługa specjalnych domen
Ta część języka sprawia, że Judoscript jest wyjątkowy. Każda główna obsługa domeny zostanie krótko omówiona, zwykle z przykładami.
skrypty JDBC
Skrypty JDBC są centralną cechą Judoscript, a także kluczową motywacją dla samego języka. Sprawia, że operacje na bazie danych są intuicyjne i wygodne.
Poniżej znajduje się przykład, który łączy się z bazą danych i uruchamia niektóre instrukcje SQL.
db :: połącz się z 'jdbc:oracle:thin:@dbsvr:1521:dbname' , 'user' , 'pass' ; if tableExists ( 'EMP' ) { db :: sql : DROP TABLE emp ; } db :: sql { UTWÓRZ TABELĘ emp ( emp_no INTEGER PRIMARY KEY , imię VARCHAR
( 100 ), // Imię nazwisko VARCHAR ( 100 ), // Nazwisko data_ urodzenia DATA , -- Data urodzenia wynagrodzenie LICZBA ); -- Wynagrodzenie CREATE INDEX emp_fname ON emp ( imię ); UTWÓRZ INDEKS emp_lname ON emp ( nazwisko_ ); WSTAW DO emp (
0
numer_zatrudnienia , imię , nazwisko , data_urodzenia , wynagrodzenie ) WARTOŚCI ( 100 , 'Jim' , 'Malone' , to_date ( '1-3-1954' , 'dd-mm-rrrr' ), 86500 . ); } println 'db::sql wynik: ' , $ _ ; rozłącz ();
Korzystanie z procedur składowanych odbywa się za pomocą instrukcji db:any
.
db :: any [[ * CREATE PROCEDURA test_proc ( param_io IN OUT NUMBER , param_i IN VARCHAR , param_o OUT VARCHAR ) AS BEGIN param_o : = param_i ; JEŚLI param_io NIE JEST NULL TO param_io : = param_io + 1 ; ELSE param_io
: = - 1000 ; KONIEC JEŻELI ; KONIEC ; * ]];
Bardziej interesującym zastosowaniem są sparametryzowane zapytania i aktualizacje. Zapytania i aktualizacje mogą być uruchamiane bezpośrednio lub z wyprzedzeniem.
db :: preparate ins : INSERT INTO emp ( praca_nr , imię , nazwisko , data_urodzenia , wynagrodzenie ) WARTOŚCI ( : numer_pracownika ,: imię ,: nazwisko ,: data urodzenia ,: wynagrodzenie ) ; _ _ _ dla wiersza w wierszach { db :: sql
0
ins with @empNr : liczba całkowita = id ++ , @ imię = wiersz [ ], @nazwisko = wiersz [ 1 ] , @data urodzenia : data = wiersz [ 2 ], @ wynagrodzenie : liczba = wiersz [ 3 ]; }
Poniżej znajduje się przykład zapytania.
db :: zapytanie qry : SELECT numer_zatrudnienia , imię , nazwisko , data_ urodzenia , wynagrodzenie Z pracownik ; println 'Imię Nazwisko Wynagrodzenie Data Urodzenia' , nl , '--- ---------- ----------- -------- ----------' ; podczas gdy qry . następny () { println qry [ 1 ]. liczba całkowita ()
: < 5 , qry . imię : < 12 , qry . nazwisko_nazwisko : < 12 , qry . wynagrodzenie : * 7 . 1 , ' ' , qry . data_urodzenia . fmtDate ( 'rrrr-MM-dd' ); }
Przetwarzanie dokumentów SGML i XML
SGML to ogólny format hipertekstu, który zawiera HTML i XML. Istnieją dwa API do przetwarzania dokumentów XML: Simple API for XML (lub SAX) i Document Object Model (lub DOM). Przetwarzanie SAX skanuje cały tekst jako strumień i uruchamia zdarzenia dla każdego napotkanego znacznika lub segmentu tekstu. Judoscript ma urocze małe oświadczenie, które skutecznie wykorzystuje tę funkcję dla danych XML i SGML.
Kolejny przykład pokazuje istotę scrapingu HTML. Dzięki temu napisanie robota indeksującego witrynę internetową nie jest dalekie od rzeczywistości!
zrób 'http://www.judoscript.org' as sgml { < a > : if $_.href != null { println 'Znaleziono hiperłącze:', $_.href; } < p > : println 'Znaleziono znacznik akapitu.'; TEKST: println 'Znaleziono jakiś tekst:', $_.length(); }
Poniższy przykład przetwarza dane XML, które są dołączane na końcu skryptu.
do $$local as xml { < book > : println ($_.hardcover=='true')?"Hard":"Soft", '-cover Book ------------'; < data > TEKST: println ' Data: ', $_, ' (', $_.type, ')'; < tytuł > TEKST: println ' Tytuł: ', $_; < autor > TEKST: println 'Autor: ', $_; < isbn >
TEKST: println ' ISBN: ', $_; } EndScript ------------------------------------------------ ------- < lista książek > < książka > < tytuł > UNIX w pigułce </ tytuł > < autor > Daniel Gilly </ autor > < wydawca > O ' Reilly & Associates, Inc. </ wydawca >
< isbn > 1-56592-001-5 </ isbn > < typ daty = "wydanie pierwsze" > 1986-12 </ data > < typ daty = "wydanie drugie" > 1992-06 </ data > </ książka > < książka w twardej oprawie = "true" > < tytuł
> Zaawansowane programowanie w środowisku UNIX </ title > < autor > Richard Stevens </ autor > < wydawca > Addison-Wesley </ wydawca > < isbn > 0-201-56317-7 </ isbn > < date type = "copyright " > 1993 </ data >
< typ daty = "dwunasty druk" > 1996-12 </ data > </ książka > </ lista książek >
Judoscript obsługuje również przetwarzanie DOM i XSLT dokumentów XML.
Skrypt Apache Ant
Apache Ant był przez długi czas systemem kompilacji dla Javy ; firmy i programiści stworzyli wiele rozszerzeń zwanych Task s, w żargonie Ant, a ekosystem Ant staje się skarbnicą wszelkiego rodzaju narzędzi, zarówno ogólnych, jak i zastrzeżonych. Judoscript zawiera mechanizm bezpośredniego wywoływania dowolnych zadań Ant. Poniżej znajduje się przykład.
a = „mrówki”; anttask:: < echo message = "Witaj, ${a}!" /> anttask:: < echo > Witaj, więcej ${a}! </ echo >
Istnieją sposoby uruchamiania natywnych plików wykonywalnych w Judoscript, ale możesz także skorzystać ze skryptów Ant, jak pokazano poniżej.
źródło = '.'; anttask:: < exec dir = "${src}" plik wykonywalny = "cmd.exe" os = "Windows 2000" output = "dir.txt" > < arg line = "/c dir" /> </ exec >
Zunifikowany system plików i skrypty archiwów
Manipulowanie plikami jest jednym z najczęstszych zadań pracowników przetwarzających informacje. Judoscript stara się zapewnić spójną obsługę plików zarówno w systemach plików, jak i archiwach, takich jak pliki ZIP i kulki TAR.
Poniższe przykłady sprawdzają pliki w archiwum ZIP.
listFiles '*' w katalogu 'awebapp.zip' Tylko; for x in $_ { // pobierz status dla każdego katalogu listFiles '*.java, *.jj' in x recursive size compressorSize; println $_[0]:>8, '', $_[1]:>8, '', x; }
Następny przykład kopiuje pliki do archiwum ZIP. Nieznacznie zmieniając wyrażenia, możesz skopiować pliki do innej lokalizacji w systemie plików.
skopiuj „*.java, *.properties” w „C:/temp/classes/” rekurencyjnie do manifestu sklepu „judo.jar” [[* Manifest-Version: 1.0 Main-Class: judo Utworzony przez: James Jianbo Huang ( c) 2001-(* #rok *) *]] ;
Kolejny przykład ZIP z lepszą kontrolą.
zf = createZip('~/archives/work-'+Date().fmtDate('rrrrMMdd')+'.zip'); skopiuj „*” do „c:/judo/src/” oprócz „*/alfa*, */beta*, */save/*” rekurencyjne echo noHidden do zf pod „src/”; skopiuj „*” do „c:/judo/docs/” oprócz „*/alfa*, */beta*, */save/*” rekurencyjne echo noHidden do zf pod „docs/”; skopiuj „*” do „c:/judo/examples/” oprócz „*/alfa*, */beta*, */save/*” rekurencyjne echo noHidden do zf pod „examples/”; zf.zamknij();
I możesz kopiować zasoby internetowe do systemów plików lub archiwów, pokazanych poniżej.
tar = createTar('yahoo_comp.tar.gz'); zip = createZip('yahoo_comp.zip'); urls = [ 'http://dir.yahoo.com/Computers_and_Internet/index.html', 'http://dir.yahoo.com/Computers_and_Internet/Internet/index.html', 'http://dir.yahoo. com/Computers_and_Internet/Internet/WAIS/index.html' ]; dla ciebie w adresach URL { skopiuj cię do tar keepDirs; skopiuj u do zip keepDirs; } tar.zamknij(); zip.zamknij();
Skrypty usługi sieciowej SOAP
W czasach Judoscript usługa sieciowa SOAP była standardem branżowym dla zdalnych wywołań, zanim pojawił się RESTful API. Judoscript ułatwia korzystanie z usług sieciowych SOAP.
svc = wsdl::'http://coldrooster.com/dhtmldude/mathservice.asmx?WSDL'; println '3 + 2 = ', svc.Add(3, 2); println '3 - 2 = ', svc.Subtract(3, 2); println '3 * 2 = ', svc.Multiply(3, 2); println '3 / 2 = ', svc.Divide(3, 2);
Inne funkcje aplikacji
Judoscript ma wszelkiego rodzaju gadżety programistyczne, które obejmują większość codziennych zadań pracowników informatycznych, takich jak wykonywanie natywnych plików wykonywalnych systemu operacyjnego, wysyłanie e-maili, uruchamianie zaplanowanych zadań, dostęp do zasobów internetowych przez HTTP, SSH, SCP, uruchamianie własnego serwera HTTP, itp.
Możliwość tworzenia skryptów Microsoft COM otwiera drzwi do dokumentów Microsoft Office, wykorzystując ich DOM do uzyskiwania dostępu do zawartych w nich danych i manipulowania nimi oraz integracji z innymi magazynami i źródłami danych.
Realizacja
Gramatyka języka judoscript i jego parser są wykonywane za pomocą narzędzia JavaCC . Wiele skomplikowanych instrukcji specyficznych dla domeny stanowi własny podjęzyk, który gwarantuje osadzony podrzędny parser. Inne takie instrukcje i niektóre cukry składniowe wymagają natywnych metod w JavaCC . Ze względu na te złożoności parser bezpośrednio tworzy wewnętrzną reprezentację programu, która jest łatwo wykonywalna przez silnik języka.
Środowisko uruchomieniowe języka zawiera wiele bibliotek pomocniczych; niektóre pochodzą od stron trzecich, inne są opracowywane wewnętrznie.
Zobacz też
- Lista języków skryptowych Java
- JavaCC
- Framework skryptów fasoli
- Mrówka Apache
- JSR223
- Nosorożec
- Skorupa Fasoli
- Groovy
- SQR
- 4GL
Linki zewnętrzne
- Muzeum Judoscript
- Zrekonstruowana witryna judoscript.com
- Język judoscript na Sourceforge
- JudoScript: tworzenie skryptów dla języka Java i nie tylko
- Skrypty JDBC z JudoScript, część 2
- Programowanie deklaratywne
- Języki programowania specyficzne dla domeny
- Dynamicznie typowane języki programowania
- Języki programowania JVM
- Rodzina języków programowania Java
- Obiektowe języki programowania
- Języki skryptowe
- Oprogramowanie korzystające z licencji LGPL
- Statycznie typowane języki programowania