Czynnik (język programowania) - Factor (programming language)

Czynnik
NowyFactorLogo.png
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 ( 2018-07-31 )
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

printto słowo w iosł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 duppowiela 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