Czynnik (język programowania) - Factor (programming language)
Paradygmat | wieloparadygmat : funkcjonalny , konkatenacyjny , zorientowany na stos stack |
---|---|
Deweloper | Sława Pestov |
Po raz pierwszy pojawiły się | 2003 |
Wersja stabilna | 0,98 / 31 lipca 2018
|
Dyscyplina pisania | silny , dynamiczny |
OS | Windows , macOS , Linux, |
Licencja | Licencja BSD |
Stronie internetowej | factorcode.org |
Wpływem | |
Radość , naprzód , seplenienie , self |
Factor to zorientowany na stos język programowania stworzony przez Slavę Pestov. Factor jest wpisywany dynamicznie i ma automatyczne zarządzanie pamięcią , a także potężne funkcje metaprogramowania. Język ma pojedynczą implementację z samoobsługowym kompilatorem optymalizującym i interaktywnym środowiskiem programistycznym . Dystrybucja Factor zawiera dużą bibliotekę standardową .
Historia
Slava Pestov stworzył Factor w 2003 roku jako język skryptowy do gry wideo . Początkowa implementacja, teraz nazywana JFactor, została zaimplementowana w Javie i działała na wirtualnej maszynie Javy . Chociaż wczesny język przypominał nowoczesny Factor powierzchownie pod względem składni , współczesny język jest bardzo inny pod względem praktycznym, a obecna implementacja jest znacznie szybsza.
Język z biegiem czasu znacznie się zmienił. Pierwotnie programy Factor koncentrowały się na manipulowaniu obiektami Javy za pomocą możliwości odbicia Javy . Od samego początku filozofią projektowania było modyfikowanie języka tak, aby pasował do napisanych w nim programów. W miarę jak implementacja Factor i biblioteki standardowe stały się bardziej szczegółowe, zapotrzebowanie na pewne funkcje językowe stało się jasne i zostały one dodane. JFactor nie miał systemu obiektów, w którym można by definiować własne klasy , a wczesne wersje natywnego Factora były takie same; pod tym względem język był podobny do Scheme . Dziś system obiektowy jest centralną częścią Factora. Inne ważne cechy języka, takie jak klasy krotek , wstawianie kombinatorów, makra , zdefiniowane przez użytkownika słowa do analizowania i nowoczesny system słownictwa, zostały dodane fragmentarycznie, gdy ich użyteczność stała się jasna.
Interfejs funkcja zagranicznych był obecny od bardzo wczesnych wersjach czynnik, a analogiczny układ istniał w JFactor. Zostało to wybrane zamiast tworzenia wtyczki do części C implementacji dla każdej zewnętrznej biblioteki, z którą Factor powinien się komunikować, i ma tę zaletę, że jest bardziej deklaratywna , szybsza w kompilacji i łatwiejsza do napisania.
Implementacja Javy początkowo składała się tylko z interpretera , ale później dodano kompilator kodu bajtowego Javy . Ten kompilator działał tylko na niektórych procedurach. Wersja Java Factor została zastąpiona wersją napisaną w C i Factor. Początkowo składał się tylko z interpretera, ale interpreter został zastąpiony dwoma kompilatorami, używanymi w różnych sytuacjach. Z biegiem czasu wdrożenie Faktora rosło znacznie szybciej.
Opis
Factor to dynamicznie typowany , funkcjonalny i obiektowy język programowania . Kod jest zbudowany wokół małych procedur, zwanych słowami. W typowym kodzie mają one długość od 1 do 3 wierszy, a procedura o długości powyżej 7 wierszy jest bardzo rzadka. Coś, co byłoby idiomatycznie wyrażone za pomocą jednej procedury w innym języku programowania, zostałoby zapisane jako kilka słów w Factor.
Każde słowo ma ustaloną liczbę argumentów i ma ustaloną liczbę zwracanych wartości. Argumenty do słów są przekazywane na stos danych przy użyciu odwrotnej notacji polskiej . Stos służy tylko do organizowania wywołań słów, a nie jako struktury danych. Stos w Factor jest używany w podobny sposób do stosu w Forth ; w tym celu oba są uważane za języki stosu . Na przykład poniżej znajduje się fragment kodu, który wyświetla „hello world” w bieżącym strumieniu wyjściowym:
"hello world" print
print
to słowo w io
słowniku, które pobiera łańcuch ze stosu i nic nie zwraca. Drukuje ciąg w bieżącym strumieniu wyjściowym (domyślnie terminal lub graficzny odbiornik).
Funkcja silni może być zaimplementowana w Factor w następujący sposób:
: factorial ( n -- n! ) dup 1 > [ [1,b] product ] [ drop 1 ] if
Nie wszystkie dane muszą być przekazywane tylko ze stosem. Zmienne lokalne o zakresie leksykalnym umożliwiają przechowywanie i dostęp do tymczasowych elementów tymczasowych używanych w ramach procedury. Zmienne o zakresie dynamicznym są używane do przekazywania rzeczy między wywołaniami procedur bez użycia stosu. Na przykład bieżące strumienie wejściowe i wyjściowe są przechowywane w zmiennych o zakresie dynamicznym.
Factor kładzie nacisk na elastyczność i umiejętność rozszerzania języka. Istnieje system makr, a także dowolnego rozszerzenia składni Factor. Składnia Factor jest często rozszerzana, aby uwzględnić nowe typy definicji słów i nowe typy literałów dla struktur danych. Jest również używany w bibliotece XML, aby zapewnić dosłowną składnię do generowania XML. Na przykład następujące słowo pobiera ciąg i tworzy obiekt dokumentu XML, który jest dokumentem HTML z naciskiem na ciąg:
: make-html ( string -- xml )
dup
<XML
<html>
<head><title><-></title></head>
<body><h1><-></h1></body>
</html>
XML> ;
Słowo dup
powiela górną pozycję na stosie. <->
Stoi za wypełnienie tej części dokumentu XML z elementu ze stosu.
Wdrożenia i biblioteki
Factor zawiera dużą standardową bibliotekę napisaną w całości w tym języku. Obejmują one
- Wieloplatformowy zestaw narzędzi GUI, zbudowany na bazie OpenGL i różnych systemach okienkowych, używany w środowisku programistycznym.
- Powiązania z kilkoma bibliotekami baz danych, w tym PostgreSQL i SQLite .
- HTTP serwera i klienta, z ramami internetowej pieca.
- Wydajne jednorodne tablice liczb całkowitych, pływaków i struktur C.
- Biblioteka implementująca wyrażenia regularne, generująca kod maszynowy w celu dopasowania.
W Factor wbudowany jest interfejs funkcji obcych , umożliwiający komunikację z programami C , Objective-C i Fortran . Istnieje również wsparcie dla wykonywania i komunikacji z shaderami napisanymi w GLSL .
Factor jest zaimplementowany w Factor i C++ . Pierwotnie został załadowany z wcześniejszej implementacji Javy. Obecnie parser i kompilator optymalizujący są napisane w tym języku. Pewne podstawowe części języka są zaimplementowane w C++, takie jak garbage collector i niektóre prymitywy.
Factor wykorzystuje model oparty na obrazie , analogiczny do wielu implementacji Smalltalk , w których skompilowany kod i dane są przechowywane w obrazie. Aby skompilować program, program jest ładowany do obrazu i obraz jest zapisywany. Specjalne narzędzie pomaga w procesie tworzenia minimalnego obrazu do uruchomienia konkretnego programu, pakując wynik w coś, co można wdrożyć jako samodzielną aplikację.
Kompilator Factor implementuje wiele zaawansowanych optymalizacji i jest używany jako cel do badań nad nowymi technikami optymalizacji.
Bibliografia
Linki zewnętrzne
- Oficjalna strona internetowa
- Slava Pestov (27 października 2008). Czynnik: rozszerzalny język interaktywny (flv) (rozmowa techniczna). Google .
- Zed Shaw (2008). Lista ACL jest martwa (flv) (CUSEC 2008). CUSEC. – prezentacja napisana w Factorze, która wspomina i chwali Factor