Czym jest S-Lang i dlaczego warto go poznać
S-Lang to język interpretowany, który prawdopodobnie używasz codziennie, nawet o tym nie wiedząc. Jeśli kiedykolwiek korzystałeś z edytora jednano, Midnight Commander, Mutt albo SLRN — korzystałeś z S-Lang. To język wbudowany (embedded) w dziesiątki narzędzi terminalowych na Linux i Unix, pełniący rolę skryptowego silnika w aplikacjach, które potrzebują interaktywnego interfejsu tekstowego.
S-Lang jest językiem proceduralnym z dynamicznym typowaniem, zaprojektowanym specjalnie do embedowania w większych aplikacjach. Jego interpreter jest lekki, szybki i łatwy do zintegrowania z kodem C. Ale S-Lang to nie tylko język embedded — to też biblioteka do tworzenia zaawansowanych interfejsów terminalowych (S-Lang library), która konkuruje z ncurses i oferuje więcej funkcji.
Dlaczego warto go poznać? Bo S-Lang to fascynujący przykład języka, który odniósł sukces “w ukryciu”. Nie jest modny, nie ma konferencji ani T-shirtów, ale napędza narzędzia, z których codziennie korzystają miliony użytkowników Linuxa. Poza tym, jeśli kiedykolwiek będziesz budować aplikację terminalową z rozszerzalnym skryptowaniem, S-Lang jest doskonałym kandydatem na silnik embedded.
Krótka historia i ewolucja
S-Lang został stworzony przez Johna E. Davisa w 1992 roku. Davis, fizyk i programista, potrzebował prostego języka skryptowego do rozbudowy edytora jednano (JED). Istniejące języki embedded — Tcl, Lua (wtedy jeszcze młody) — nie do końca spełniały jego wymagania. S-Lang miał być lekki, szybki i łatwy do zintegrowania z C.
Nazwa “S-Lang” to gra słów: “Slang” oznacza żargon, a “S” odnosi się do “stack” — bo S-Lang jest językiem zorientowanym wokół stosu. Pierwotnie S-Lang miał postfixową notację (jak Forth), ale z czasem ewoluował w stronę bardziej konwencjonalnej składni infix, zachowując niektóre cechy stosowe.
Biblioteka S-Lang (libslang) stała się osobnym, ważnym projektem. Oferuje zaawansowane funkcje terminalowe: kolory, okna, obsługę myszy w terminalu, menedżer ekranu. Midnight Commander, Mutt i wiele innych narzędzi używa libslang zamiast ncurses do renderowania interfejsu. S-Lang jest standardem w większości dystrybucji Linux.
Kluczowe cechy i filozofia
S-Lang łączy elementy różnych paradygmatów. Składnia jest proceduralna z infixowymi operatorami (+, -, *, /), ale pod spodem operacje często odbywają się na stosie. Funkcje mogą być wywoływane w stylu postfix (3 4 add) lub infix (add(3, 4)). Ta dualność jest unikalna i daje elastyczność.
Typowanie jest dynamiczne, ale S-Lang ma silniejszy system typów niż wiele języków skryptowych. Zmienne mają jawne typy w runtime: Integer, Double, String, Array, Struct, Ref (referencja). Konwersje nie zawsze są automatyczne — S-Lang wymaga, żebyś wiedział, z jakim typem pracujesz. To redukuje “magiczne” zachowania, ale wymaga więcej uwagi.
Filozofia S-Lang to “lekkość i embedowalność”. Interpreter S-Lang waży kilkaset kilobajtów i integruje się z aplikacją C w kilku linijkach kodu. Aplikacja host może wystawiać własne funkcje do S-Lang, tworząc domain-specific scripting environment. To podejście, które dziś widzimy w Lua (który wygrał wyścig embedded), ale S-Lang robił to wcześniej.
Biblioteka S-Lang oferuje unikalne możliwości terminalowe. W przeciwieństwie do ncurses, libslang ma wbudowany interpreter S-Lang, co pozwala na dynamiczne skryptowanie interfejsu. Możesz zmienić keybindings, kolory i zachowanie aplikacji bez rekompilacji — po prostu edytując plik konfiguracyjny w S-Lang.
Gdzie S-Lang sprawdza się najlepiej
Narzędzia terminalowe to dominujące zastosowanie S-Lang. JED (edytor tekstu), Midnight Commander (menedżer plików), Mutt (klient email), SLRN (czytnik news), i wiele innych narzędzi używają S-Lang jako silnika skryptowego i biblioteki terminalowej. Jeśli używasz Linuxa na co dzień, prawdopodobnie korzystasz z S-Lang wielokrotnie dziennie.
S-Lang sprawdza się też w aplikacjach naukowych. John Davis jest fizykiem, i S-Lang był używany w narzędziach do analizy danych astronomicznych (ISIS — interaktywny system analizy spektralnej). Wydajność operacji na tablicach i wektorach w S-Lang jest dobra, co czyni go użytecznym do obliczeń numerycznych.
Embedded scripting to trzeci obszar. Aplikacje C/C++, które potrzebują rozszerzalności przez skrypty, mogą użyć S-Lang jako轻量kiego interpretera. Choć Lua dominuje w tej niszy, S-Lang pozostaje alternatywą z bogatszą biblioteką terminalową.
Jak wygląda kod w S-Lang
Prosty skrypt konfiguracyjny dla JED:
% Konfiguracja edytora JED
set_color("normal", "white", "black");
set_color("status", "yellow", "blue");
define keymap_function () {
variable key = getkey();
if (key == "e[A") {
go_up_1();
} else if (key == "e[B") {
go_down_1();
}
}
custom_setkey("^X^S", "save_buffer");
custom_setkey("^X^F", "find_file");
set_color konfiguruje kolory terminala, define tworzy funkcję, variable deklaruje zmienną. % to komentarz. custom_setkey mapuje skróty klawiszowe.
Operacje na tablicach:
variable arr = [1:100]; % tablica od 1 do 100
variable squares = arr * arr; % kwadraty wszystkich elementów
variable total = sum(squares); % suma kwadratów
message(sprintf("Suma kwadratow 1-100: %d", total));
% Filtrowanie
variable evens = arr[where(arr mod 2 == 0)];
message(sprintf("Liczb parzystych: %d", length(evens)));
[1:100] tworzy zakres, operacje na tablicach działają wektorowo (jak w NumPy), where zwraca indeksy spełniające warunek. To potężne operacje tablicowe w stylu APL/NumPy, ale w składni bliższej C.
Ekosystem i narzędzia
Biblioteka S-Lang (libslang) jest dostępna w repozytoriach praktycznie każdej dystrybucji Linux. Instalacja to zazwyczaj apt install libslang2 lub dnf install slang. Interpreter S-Lang (slsh) jest dostępny jako samodzielny REPL i narzędzie do uruchamiania skryptów.
JED to najważniejsza aplikacja zbudowana na S-Lang. To zaawansowany edytor tekstowy z trybami dla różnych języków programowania, makrami w S-Lang i pełną konfigurowalnością. JED jest szczególnie popularny wśród administratorów systemów, którzy potrzebują edytora działającego w terminalu.
Dokumentacja S-Lang jest dostępna na stronie projektu i jest kompletna, choć nie najnowsza. Społeczność jest mała — głównie użytkownicy narzędzi opartych na S-Lang, którzy chcą dostosować je do swoich potrzeb. Mailing listy i forum są aktywne, ale ruch jest niewielki.
Mocne i słabe strony
Największą zaletą S-Lang jest lekkość i embedowalność. Interpreter jest mały, szybki i łatwy do zintegrowania z aplikacjami C. Biblioteka terminalowa oferuje więcej niż ncurses w wielu scenariuszach. Operacje na tablicach z wektoryzacją to unikalna cecha, której brakuje wielu językom skryptowym.
Kolejną zaletą jest stabilność. S-Lang jest rozwijany od 30+ lat i jest backward-compatible. Skrypty S-Lang sprzed dekady działają bez zmian. Dla narzędzi systemowych, które muszą być stabilne, to kluczowa zaleta.
Największą wadą jest niszowość. S-Lang jest praktycznie nieznany poza ekosystemem narzędzi terminalowych. Nie ma tu frameworków webowych, data science ani AI. Rynek pracy dla “programisty S-Lang” nie istnieje — S-Lang to narzędzie, nie kariera.
Kolejnym problemem jest konkurencja z Lua w niszy embedded scripting. Lua jest mniejszy, szybszy, lepiej udokumentowany i ma większą społeczność. Większość nowych projektów wybiera Lua jako silnik skryptowy, co marginalizuje S-Lang.
Podsumowanie
S-Lang to cichy bohater ekosystemu Linux. Jeśli używasz Midnight Commander, JED, Mutt albo innych narzędzi terminalowych, S-Lang pracuje dla ciebie codziennie. Warto go poznać, żeby lepiej rozumieć i konfigurować narzędzia, z których korzystasz. A jeśli budujesz aplikację terminalową z potrzebą embedded scripting, S-Lang jest wart rozważenia.
Przyszłość S-Lang jest stabilna w jego niszy. Narzędzia, które go używają, nie znikną prędko, a libslang pozostaje solidną biblioteką terminalową. S-Lang nie zdobędzie mainstreamu, ale nie musi — jego wartość jest w narzędziach, które napędza po cichu, bez fanfar.

