XL (język)

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.

Język

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

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")))

Semantyka XL1

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)) / dT

Poziom 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.

System pisania

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 array

Zatwierdzony 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 < B

Nastę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 X

Dotyczy 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]

Chroniony typ listy zmiennych argumentów

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 := X

Gdy 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)

Redukcja wyrażeń (przeciążenie operatora)

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+Y

Takie 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*C

Forma 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=1

Ten 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.

Iteratory

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=", I

Semantyka XLR

XLR 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 → PartieFausse

Stan rozwoju i historia

Projekt 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.

Przodkowie

XL został zainspirowany wieloma innymi językami. W porządku alfabetycznym:

  • Ada zainspirowała niektóre funkcje stosowane w całym programie, takie jak zarządzanie wyjątkami , zadania, przenośność.
  • Basic , głównie w nowoczesnych wersjach, które eliminują numery linii i pozwalają na programowanie strukturalne, pokazał, jak prosty może być język programowania. Podstawowy jest jednym z pierwszych języków nowożytnych, który nie wymaga nawiasów wokół rutynowych wywołań.
  • C został użyty jako standard do wykonania (runtime) i na poziomie maszyny. XL nie działa na maszynie wirtualnej.
  • C ++ poprzez swoje biblioteki modeli standardowych wykazał potrzebę dobrej implementacji typów generycznych, niejawnie włączając w to instancje typów generycznych (których Ada brakuje).
  • Fortran osiąga i przewyższa wydajność C i C ++ w aplikacjach obliczeniowych o wysokiej wydajności, pomagając zidentyfikować konstrukcje językowe, które uniemożliwiłyby użyteczne optymalizacje.
  • Java demonstruje znaczenie przenośnego systemu bibliotecznego. Kontenery Java pokazują również ograniczenia podejścia nieopartego na programowaniu ogólnym. Współpraca z kodem Java pozostaje interesującym wyzwaniem dla XL.
  • Rozszerzalność Lispa do dziś była postrzegana jako kluczowy czynnik w jego przetrwaniu i zainteresowaniu. Lisp był pierwszym językiem, który wprowadził funkcjonalność zorientowaną obiektowo, chociaż został zaprojektowany na wiele lat przed wynalezieniem programowania zorientowanego obiektowo.
  • Prolog wykazał, że alternatywne paradygmaty programowania są czasami przydatne i bardzo produktywne. Zrobiono wszystko, aby wtyczka w stylu Prologu mogła być napisana dla XL.
  • Visual Basic zademonstrował, w jaki sposób reprezentację drzewa analizy można oddzielić od jego prezentacji wizualnej. Niewiele osób edytuje formularze VB w formie tekstowej. Miejmy nadzieję, że wtyczki XL Edition pewnego dnia zapewnią podobną funkcjonalność, bezpośrednio manipulując drzewem analizy.

Uwagi i odniesienia

  1. (w) Phil Manchester , „  Dip Into Programming Concept  ” , The Register ,16 stycznia 2008( czytaj online , sprawdzono 3 lutego 2010 )

Linki zewnętrzne