XL (eXtensible Language) | |
Data pierwszej wersji | 2000 |
---|---|
Paradygmaty | Programowanie imperatywne |
Deweloper | Christophe de Dinechin |
Ostatnia wersja | 0,1 (2010) |
Pisanie na maszynie | Silny |
Wpływem | Ada , C ++ |
System operacyjny | Typ uniksowy |
Licencja | LPG |
Stronie internetowej | XLR |
XL , którego litery pochodzą z e X tensible L anguage , to język programowania , oparty na programowaniu przez pojęć rozwijany od 2000 roku przez Christophe de Dinechin .
XL oferuje możliwość modyfikowania i programowania składni i semantyki języka . Niektóre skompilowane wtyczki mogą służyć do dodawania nowych funkcji do języka. Możemy na przykład odnotować zestaw wtyczek umożliwiających implementację imperatywnego języka . Użytkownicy mogą sami pisać własne wtyczki, aby umożliwić użycie określonej składni, na przykład dla pochodnych , których można używać w taki sam sposób, jak oryginalne funkcje.
XL jest zdefiniowany na czterech różnych poziomach:
XL nie ma pierwotnego typu ani słowa kluczowego . Wszystkie operatory i typy danych, takie jak liczby całkowite lub dodatki, są zdefiniowane w standardowej bibliotece XL2 . XL1 jest przenośny w różnych środowiskach wykonawczych. Czego nie gwarantuje XL2, który nie daje takich gwarancji: jeśli dany procesor nie implementuje mnożenia zmiennoprzecinkowego , w bibliotece standardowej może brakować definicji odpowiedniego operatora, a użycie tej funkcji może generować błąd kompilacji.
W XL program Hello World można zapisać w następujący sposób:
use XL.TEXT_IO WriteLn "Hello World"Bardziej odpowiednim sposobem w przypadku większych programów byłoby:
import IO = XL.TEXT_IO IO.WriteLn "Hello World"Realizacja przez indukcję funkcji silni :
0! → 1 N! → N * (N-1)!Składnia jest zdefiniowana na poziomie XL0 . Fazę XL0 kompilatora można skonfigurować za pomocą pliku opisu składni, w którym zdefiniowane są właściwości, takie jak reprezentacja tekstu i priorytety operatorów. Podstawowy plik składni definiuje typowe notacje matematyczne, takie jak + do dodawania, a także pierwszeństwo operacji .
Drzewa składni składa się z 7 typów węzłów: 4 typy liści (całkowitą, rzeczywistych, tekst i symbolu) i 3 typów węzłów wewnętrznych ( infiks prefiks i bloków).
W przypadku domyślnego pliku składni następujący kod jest prawidłowy dla XL0 , niezależnie od semantyki:
A = B + "Salut"Dzieli się na:
infix("=", symbol("A"), infix("+", symbol("B"), text("Salut")))Poziom XL1 jest zdefiniowany jako sekwencja operacji na drzewie składni poziomu XL0 . Operacje te są wykonywane przez różne wtyczki kompilatora, które są wywoływane zgodnie z postacią drzewa składni.
Specjalne konstrukcje translatei translationsą dostarczane przez wtyczkę ułatwiającą pisanie innych wtyczek. Konstrukcja quotegeneruje drzewo składni. Oto jak te konstrukcje mogą być użyte do zaimplementowania nazwanej wtyczki ZeroRemoval, która usuwa dodawanie i mnożenie przez zero:
translation ZeroRemoval when 'X' + 0 then return X when 'X' * 0 then return parse_tree(0)Wtyczkę można wywołać na kompletnym pliku z wiersza poleceń lub bardziej lokalnie w źródle kodu przy użyciu notacji pragma , jak tutaj:
X := {Differentiate} d(sin(omega * T) * exp(-T/T0)) / dTPoziom XL1 zawiera duży zestaw wtyczek, łącznie XLSemanticsdając wspólne abstrakcje takie jak funkcja , typ danych i oświadczenia o zmiennej i definicji , a także podstawowe rozkazy programowania strukturalnego , takich jak pętle i warunków.
XL1 kontroluje typ statyczny, z ogólnymi możliwościami programowania, które wykraczają poza możliwości C ++ lub Ady. Typy, takie jak tablice lub wskaźniki, które są typami pierwotnymi w C ++, są deklarowane w bibliotece w XL. Na przykład typ tablicy jednego wymiaru można zdefiniować przez:
generic [Item : type; Size : integer] type arrayZatwierdzony typ rodzajowy jest typem generycznym gdzie stan wskazuje, jak typ może być używany. Takie typy nie powinny mieć parametrów ogólnych. Na przykład możemy zadeklarować typ jako ordered(uporządkowany), jeśli obecny jest niższy operator :
// Un type est ordonné en présence d'un opérateur inférieur generic type ordered if A, B : ordered Test : boolean := A < BNastępnie można zadeklarować funkcję, która jest niejawnie ogólna, ponieważ orderedsam typ jest uporządkowany.
// Function générique pour au moins un élément function Min(X : ordered) return ordered is return XDotyczy to również typów ogólnych, które mają parametry, takie jak array. Funkcję obliczającą sumę elementów tablicy można zapisać:
function Sum(A : array) return array.Item is for I in 0..array.Size-1 loop result += A[I]Funkcje mogą być przeciążone . Funkcja może być zadeklarowana ze zmienną liczbą argumentów dzięki słowu otherznajdującemu się na liście parametrów. W takiej funkcji otherpozwala na przekazanie zmiennej liczby argumentów do innej funkcji:
// Fonction générique pour le minimum de N éléments function Min(X : ordered;…) return ordered is result := Min(…) if X < result then result := XGdy wywoływana jest funkcja tego rodzaju, kompilator wywołuje funkcje rekurencyjnie, aby dopasować listę:
// Exemple d'utilisation de la fonction Min précédente X : real := Min(1.3, 2.56, 7.21) Y : integer := Min(1, 3, 6, 7, 1, 2)Operatory można definiować za pomocą formularza writtendeklaracji funkcji. Oto kod, który deklaruje dodawanie liczb całkowitych:
function Add(X, Y: integer) return integer written X+YTakie pisemne formularze mogą mieć więcej niż dwa parametry. Na przykład liniową transformację macierzową można zapisać:
function Linear(A, B, C : matrix) return matrix written A+B*CForma pisemna może używać stałych, a ten typ formy jest bardziej wyspecjalizowany niż bez stałych. Na przykład :
function Equal(A, B : matrix) return boolean written A=B function IsNull(A : matrix) return boolean written A=0 function IsUnity(A : matrix) return boolean written A=1Ten mechanizm jest używany do opisania wszystkich podstawowych operatorów. Wyrażenie jest stopniowo redukowane do rozmów za pomocą formularzy pisemnych. Z tego powodu ten mechanizm jest nazywany raczej redukcją wyrażeń niż przeciążeniem operatora.
Iterators XL może być zaprogramowany oba generatory z iteratorami .
import IO = XL.UI.CONSOLE iterator IntegerIterator (var out Counter : integer; Low, High : integer) written Counter in Low..High is Counter := Low while Counter <= High loop yield Counter += 1 // I doit être déclaré, car indiqué comme 'var out' dans l'itérateur // Une déclaration implicite de I comme entier est alors faite ici for I in 1..5 loop IO.WriteLn "I=", IXLR to język dynamiczny, pierwotnie zaprojektowany jako back-end dla XL1 kompilatora (stąd nazwa, która reprezentuje XL czas pracy ). Dzieli podstawową składnię XL0 z XL1 , ale zachowuje się bardziej jak język funkcjonalny, chociaż XL1 ma wyglądać bardziej jak język imperatywny. XLR ma praktycznie tylko jeden operator konstrukcji, „→”, który wskazuje na nadpisanie. Notacja po lewej stronie notacji przepisywania jest przekształcana w notację po prawej stronie przepisywania.
Ten mechanizm służy do implementacji standardowych notacji:
si vrai alors PartieVraie sinon PartieFausse → PartieVraie si faux alors PartieVraie sinon PartieFausse → PartieFausseProjekt XL rozpoczął się około 1992 roku pod nazwą LX (język eksperymentalny). Projekt został przeniesiony do sfery wolnego oprogramowania w 2000 roku , jako część projektu „Mozart”, którego celem było zapewnienie wielojęzycznych możliwości metaprogramowania . Najwcześniejsze kompilatory zostały napisane w C ++, ale to utrudniało pisanie rozszerzeń kompilatora, ponieważ C ++ nie zapewniał pożądanego poziomu abstrakcji (np. Odpowiednika ). Aspekty wielojęzyczne utrudniały manipulowanie drzewami składni przy jednoczesnym poszanowaniu semantyki każdego języka. translate
Całkowite przepisanie kompilatora rozpoczęło się w 2003 r. , Porzucając koncepcję obsługi wielu języków, która pokazała swoje ograniczenia, i skupiając się na łatwości pisania rozszerzeń. Drzewo składniowe został zredukowany do zaledwie siedmiu typów węzłów do reprezentowania wszystkich programów. Ten nowy kompilator został samodzielnie skompilowany w 2004 r. (Aczkolwiek z ograniczonymi możliwościami i zależnością od języka C ++ w generowanym kodzie). Od tego czasu cały rozwój odbywa się w XL.
Od 2007 roku język oferuje dużą liczbę zaawansowanych funkcji, ale nadal brakuje mu funkcjonalnej biblioteki.
XL został zainspirowany wieloma innymi językami. W porządku alfabetycznym: