Lit
Literatura i źródła wiedzy
Slajd prezentuje kanon literatury technicznej i źródłowej z zakresu automatyzacji, powłok systemowych oraz języków skryptowych.

Podręczniki, monografie i dokumentacja

Literatura przedmiotu: zestawienie recenzowanych monografii i podręczników stanowiących formalne źródło wiedzy z zakresu powłok systemowych oraz języków interpretowanych. Materiały te definiują standardy składniowe, idiomy programistyczne i wzorce architektoniczne wykorzystywane w automatyzacji środowisk operacyjnych.
+-----------------------------------------------------+
|           KANON LITERATURY: JĘZYKI SKRYPTOWE        |
+-----------------------------------------------------+
| 1. Bash. Leksykon kieszonkowy (A. Robbins)          |
| 2. Linux. Wiersz poleceń i skrypty (Bresnahan, Blum)|
| 3. Skrypty powłoki Linux. Zaawansowane (Ebrahim)    |
| 4. Genialne skrypty powłoki (Taylor, Perry)         |
| 5. Linux. Podręcznik dewelopera (Cohen, Sturm)      |
+-----------------------------------------------------+
        
1/30
Historia skryptowania - wstęp
Slajd przedstawia ewolucję paradygmatu automatyzacji od mechanicznego konfigurowania maszyn do współczesnych języków skryptowych.

Od operatorów maszyn do inteligentnych algorytmów

  • Automatyzacja jako paradygmat: skryptowanie narodziło się z konieczności minimalizacji nakładu pracy ręcznej oraz eliminacji błędów ludzkich w powtarzalnych procesach obliczeniowych.
  • Warstwy abstrakcji: ewolucyjny proces odrywania programisty od fizycznego sterowania sprzętem na rzecz operowania na logicznych strukturach oprogramowania.
  • Wysoka produktywność: języki skryptowe umożliwiają natychmiastowe testowanie hipotez i szybkie wdrażanie rozwiązań bez czasochłonnego cyklu kompilacji.
  • Ewolucja środowisk wykonawczych: przejście od przetwarzania wsadowego na maszynach mainframe do rozproszonych środowisk chmurowych i kontenerowych.
Język skryptowy: język programowania wysokiego poziomu zaprojektowany głównie do automatyzacji zadań, sterowania aplikacjami oraz integracji zróżnicowanych komponentów programowych. Zazwyczaj kod skryptowy jest interpretowany w czasie rzeczywistym lub kompilowany w locie (JIT), co ułatwia dynamiczną modyfikację logiki działania. Skrypty odgrywają kluczową rolę w administracji systemami operacyjnymi i praktykach DevOps.
Historia skryptowania - wstęp
[ Manual Work ] -> [ Batch ] -> [ Scripting ]
   Lata 40.        Lata 60.       Dzisiaj
        
2/30
Fundamenty - co to jest skrypt?
Slajd definiuje pojęcie skryptu oraz porównuje jego cechy techniczne z tradycyjnym oprogramowaniem kompilowanym.

Skrypt a tradycyjny język programowania

  • Interpretacja w czasie wykonania: instrukcje skryptu są analizowane i wykonywane sekwencyjnie przez dedykowany interpreter bez wcześniejszej kompilacji do postaci binarnej.
  • Późne wiązanie typów: dynamiczne sprawdzanie typów danych i rozwiązywanie zależności bibliotecznych w fazie runtime zapewnia wysoką elastyczność programowania.
  • Funkcja spajająca (glue logic): skrypty stanowią pomost integrujący niezależne moduły binarne, biblioteki systemowe oraz narzędzia wiersza poleceń w jeden spójny proces.
  • Optymalizacja czasu tworzenia: przedkładanie szybkości implementacji i czytelności kodu źródłowego nad surową wydajność obliczeniową środowiska sprzętowego.
Klej systemowy (glue language): kategoria języków programowania zoptymalizowanych pod kątem łączenia i orkiestracji odrębnych komponentów oprogramowania lub programów narzędziowych. Języki te charakteryzują się elastyczną składnią przetwarzania tekstu oraz wbudowanymi mechanizmami obsługi procesów potomnych i potoków systemowych. Standardowymi przykładami są powłoka Unix/Linux, Perl oraz Python.
Fundamenty - co to jest skrypt?
[Binary Program]      [Script]
 |  Kompilacja  |      | Interpretacja |
 |  Szybkość    |  vs  | Elastyczność  |
 |  Maszyna     |      | Człowiek      |
        
3/30
Epoka kamienia łupanego (lata 40-50)
Slajd opisuje początki komputeryzacji, gdy proces programowania wymagał fizycznego konfigurowania obwodów maszyny liczącej.

Programowanie poprzez modyfikację okablowania

  • Fizyczne łączenie obwodów: algorytm maszyny ENIAC był definiowany przez ręczne przepinanie setek kabli krosowych i manipulację przełącznikami dekadowymi.
  • Wąskie gardło von Neumanna: brak koncepcji programu przechowywanego w pamięci operacyjnej uniemożliwiał automatyczną zmianę wykonywanych instrukcji.
  • Wysoki koszt rekonfiguracji: przestawienie maszyny do realizacji nowego zadania matematycznego zajmowało zespołowi badawczemu od kilkunastu godzin do kilku dni.
  • Geneza języka instrukcji: drastyczna nieefektywność fizycznego programowania dała bezpośredni impuls do zaprojektowania architektury programu zapisanego w pamięci (EDVAC).
Architektura programu zapisanego w pamięci: model komputera sformułowany przez Johna von Neumanna, w którym zarówno dane, jak i rozkazy programu są przechowywane w tej samej przestrzeni adresowej pamięci operacyjnej. Rozwiązanie to wyeliminowało konieczność fizycznego krosowania obwodów w celu zmiany algorytmu. Architektura ta stanowi fundament wszystkich współczesnych procesorów i systemów operacyjnych.
Epoka kamienia łupanego (lata 40-50)
HAND-WIRING THE ALGORITHM
    (No software layer yet)
    [PUMP] <---> [CABLE] <---> [GATE]
        
4/30
Człowiek-system (era operatorów)
Slajd wyjaśnia rolę operatora komputera mainframe jako ręcznego mechanizmu sterowania sekwencją zadań obliczeniowych.

Operator jako pętla sterująca pracą maszyny

  • Pośrednictwo w obsłudze maszyny: programista nie posiadał bezpośredniego kontaktu ze sprzętem, lecz przekazywał pakiety kart perforowanych personelowi operatorów.
  • Ręczne zarządzanie zadaniami: operator decydował o kolejności uruchamiania kompilatorów, montowaniu taśm magnetycznych oraz czyszczeniu rejestrów procesora.
  • Straty czasu procesora: jednostka centralna pozostawała bezczynna przez większość czasu, oczekując na fizyczną wymianę nośników danych i papieru drukarki.
  • Potrzeba automatyzacji nadzoru: rosnący koszt godziny pracy mainframe wymusił opracowanie programów rezydentnych zastępujących decyzje człowieka.
Operator komputera: wykwalifikowany pracownik centrum obliczeniowego odpowiedzialny za fizyczną obsługę maszyn mainframe, załadunek kart perforowanych i taśm magnetycznych oraz ręczną synchronizację zadań. W początkowym okresie informatyki operator pełnił funkcję analogiczną do współczesnego systemu operacyjnego. Zautomatyzowanie jego rutynowych czynności doprowadziło do powstania monitorów wsadowych.
Człowiek-system (era operatorów)
USER -> PUNCH CARDS -> [OPERATOR]
                             |
                             V
                          COMPUTERS
        
5/30
Nośniki - karty perforowane
Slajd omawia strukturę kart perforowanych jako pierwszego sformalizowanego nośnika kodu źródłowego i komend sterujących.

Instrukcje zaprogramowane w układzie otworów

  • Format 80 kolumn IBM: standardowa karta perforowana mieściła 80 znaków tekstu, z czego kolumny 73-80 były rezerwowane na sekwencyjną numerację linii kodu.
  • Fizyczna postać oprogramowania: talia setek kart stanowiła namacalny program, w którym kolejność fizyczna determinowała sekwencję wykonania instrukcji.
  • Karty sterujące: prekursory współczesnych skryptów, zawierające komendy informujące czytnik o typie kompilatora i granicach zadania użytkownika.
  • Separacja wprowadzania i przetwarzania: możliwość przygotowywania kodu na dziurkarkach poza salą maszyn znacząco zoptymalizowała harmonogram pracy centrum obliczeniowego.
Karta perforowana: sztywny kartonik o znormalizowanych wymiarach, na którym informacje były kodowane za pomocą obecności lub braku otworów w określonych pozycjach kolumn. Wykorzystywana od lat 20. XX wieku w maszynach tabulacyjnych, a następnie w komputerach cyfrowych jako podstawowy nośnik wejściowy. Stała się pierwowzorem zapisu sekwencyjnych instrukcji dla monitorów wsadowych.
Nośniki - karty perforowane
[ ] [ ] [ ] [x] [ ] [ ] 
  [ ] [x] [ ] [ ] [ ] [x] 
  [ ] [ ] [ ] [ ] [x] [ ] 
  KARTA TO LINIJKA KODU
        
6/30
Systemy wsadowe (lata 60.)
Slajd charakteryzuje architekturę wczesnych systemów wsadowych oraz rolę monitora rezydentnego w automatyzacji sekwencji zadań.

Początek zautomatyzowanego przetwarzania zadań

  • Monitor rezydentny: program stale rezydujący w wydzielonym obszarze pamięci RAM, automatycznie przełączający kontekst między kolejnymi zadaniami.
  • Strumień zadań (job stream): przetwarzanie ciągłego ciągu zadań obliczeniowych z taśmy magnetycznej lub czytnika bez konieczności resetowania procesora.
  • Minimalizacja przerw technologicznych: zautomatyzowanie ładowania translatorów i programów użytkowych podniosło utylizację procesora z 10% do ponad 70%.
  • Standaryzacja protokołów zadań: wprowadzenie sformalizowanych nagłówków i znaczników końca pracy użytkownika, co stworzyło podwaliny pod języki kontroli zadań.
Monitor rezydentny (resident monitor): najwcześniejsza forma jądra systemu operacyjnego, która rezydowała w pamięci maszyny i odpowiadała za sekwencyjne ładowanie, uruchamianie oraz zwalnianie programów użytkownika. Po zakończeniu jednego zadania monitor natychmiast inicjalizował kolejne, eliminując czasochłonną interwencję operatora. Zapoczątkował on epokę zautomatyzowanego przetwarzania wsadowego.
Systemy wsadowe (lata 60.)
REZYDENTNY MONITOR:
    1. Read JCL Card
    2. Load Compiler
    3. Run Program
    4. Repeat...
        
7/30
Filozofia "Batch"
Slajd analizuje paradygmat przetwarzania wsadowego nakierowany na maksymalizację przepustowości jednostki centralnej kosztem interaktywności.

Maksymalizacja przepustowości kosztem responsywności

  • Brak interakcji z użytkownikiem: przetwarzanie wsadowe wykluczało zadawanie pytań w czasie pracy programu - wszelkie parametry musiały być podane a priori.
  • Zarządzanie priorytetami i kolejkami: zadania były sortowane według zapotrzebowania na zasoby pamięci, czas procesora oraz wymaganą liczbę napędów taśmowych.
  • Optymalizacja przepustowości (throughput): głównym kryterium projektowym systemu była całkowita liczba przetworzonych zadań w jednostce czasu, a nie czas odpowiedzi.
  • Deterministyczne raportowanie błędów: każdy błąd wykonania powodował zrzut pamięci (core dump) na drukarkę wierszową i natychmiastowe przejście do kolejnej pracy.
Przetwarzanie wsadowe (batch processing): metoda wykonywania programów komputerowych polegająca na gromadzeniu zadań w pakiety (wsady) i ich sekwencyjnym lub priorytetowym uruchamianiu przez system bez bieżącego udziału użytkownika. Paradygmat ten optymalizuje utylizację sprzętu poprzez eliminację opóźnień związanych z czasem reakcji człowieka. Stanowi fundament współczesnych platform analityki danych Big Data oraz klastrów obliczeniowych.
Filozofia
THROUGHPUT (Wydajność)
             ^
             |   [ JOB A ]
             |   [ JOB B ]
             |   [ JOB C ]
             +-------------->
                  CZAS
        
8/30
Job Control Language (JCL)
Slajd omawia strukturę i funkcjonalność języka JCL jako pierwszego ustandaryzowanego języka skryptowego sterowania systemem mainframe.

Język instrukcji wykonawczych dla komputerów mainframe

  • Deklaratywny opis zasobów: JCL nie definiował algorytmów obliczeniowych, lecz mapował logiczne nazwy zasobów aplikacji na fizyczne urządzenia i zestawy danych.
  • Trzy podstawowe instrukcje: instrukcja JOB identyfikowała właściciela pracy, EXEC wskazywała uruchamiany program, a DD (Data Definition) opisywała pliki wejścia/wyjścia.
  • Warunkowość kroków: mechanizm parametrów COND pozwalał na pomijanie kolejnych kroków przetwarzania w zależności od kodu wyjścia (return code) poprzedniego etapu.
  • Pionier automatyzacji systemowej: JCL po raz pierwszy oddzielił logikę programu w COBOL lub PL/I od fizycznej topologii dysków i taśm magnetycznych.
Job Control Language (JCL): wyspecjalizowany język skryptowy stworzony przez IBM w latach 60. dla systemów operacyjnych OS/360, służący do instruowania systemu, jak ma wykonać zgłoszone zadanie wsadowe. Definiuje on wymagania sprzętowe, alokację plików dyskowych oraz strukturę zależności między kolejnymi etapami przetwarzania. Do dzisiaj jest wykorzystywany w środowiskach bankowych i ubezpieczeniowych opartych na architekturze IBM z/OS.
Job Control Language (JCL)
//PRACA1 JOB CLASS=A
 //KROK1  EXEC PGM=ANALIZA
 //DANE   DD DSN=MOJE.PLIKI
 //LOG    DD SYSOUT=A
        
9/30
Era time-sharing (lata 60-70)
Slajd przedstawia narodziny systemów z podziałem czasu oraz ich fundamentalny wpływ na przywrócenie bezpośredniej interaktywności w programowaniu.

Powrót człowieka do bezpośredniej pracy z maszyną

  • Wielodostępność i kwanty czasu: technika time-sharing dzieliła czas jednostki centralnej na milisekundowe szczeliny przydzielane dziesiątkom równolegle zalogowanych użytkowników.
  • Natychmiastowa pętla zwrotna: użytkownik terminala uzyskiwał wynik komendy w ciągu sekund, co zlikwidowało wielogodzinne oczekiwanie na wydruki wsadowe.
  • Ewolucja w stronę powłoki: pionierskie systemy CTSS i Multics zdefiniowały pojęcie dedykowanego procesu powłoki interpretującego komendy w czasie rzeczywistym.
  • Demokratyzacja zasobów: podział czasu umożliwił jednoczesną pracę studentom, naukowcom i specjalistom bez konieczności blokowania całej aparatury obliczeniowej.
Podział czasu (time-sharing): technika pracy systemu operacyjnego polegająca na cyklicznym przydzielaniu krótkich kwantów czasu procesora wielu użytkownikom pracującym jednocześnie na niezależnych terminalach. Stwarza to iluzję wyłącznego dysponowania maszyną przez każdego z nich i zapewnia interaktywną obsługę programów. Koncepcja ta, zainicjowana m.in. w systemach CTSS i Multics, bezpośrednio ukształtowała architekturę współczesnych systemów wielozadaniowych.
Era time-sharing (lata 60-70)
[USER 1] --\
 [USER 2] ---> [ CPU ]
 [USER 3] --/  (Szeroki dostęp)
        
10/30
Unix - fundament nowoczesności
Slajd omawia filozofię projektową systemu Unix i jej wpływ na architekturę współczesnych języków i narzędzi skryptowych.

Filozofia projektowa laboratorium Bell Labs

  • Zasada pojedynczej odpowiedzialności: każdy program narzędziowy powinien wykonywać jedno zadanie, lecz realizować je w sposób optymalny i przewidywalny.
  • Uniwersalny strumień tekstu: dane wejściowe i wyjściowe są reprezentowane jako ustrukturyzowany strumień bajtów tekstu ASCII, co eliminuje binarne bariery integracji.
  • Kompozycja oprogramowania: potęga środowiska wynika z łatwości łączenia prostych narzędzi w złożone potoki przetwarzania bez modyfikacji ich kodu źródłowego.
  • Przenośność i transparentność: implementacja jądra i narzędzi w języku C zapewniła uniezależnienie od architektury procesora i bezprecedensową ekspansję systemu.
Filozofia Uniksa (Unix philosophy): zbiór minimalistycznych zasad projektowania oprogramowania sformułowanych przez Kena Thompsona, Dennisa Ritchiego i Douga McIlroya, kładących nacisk na tworzenie prostych, modularnych narzędzi komunikujących się poprzez standardowe strumienie tekstowe. Podejście to uznaje potoki i skrypty powłoki za podstawowe spoiwo architektury systemowej. Zasady te ukształtowały nowoczesne standardy POSIX, Linux oraz metodyki DevOps.
Unix - fundament nowoczesności
[ Tool A ] --> [ Tool B ] 
       ^              |
       |____( PIPE )__|
        
11/30
Narodziny powłoki (shell)
Slajd przedstawia koncepcję powłoki uniksowej jako autonomicznego programu interpretującego polecenia użytkownika i zarządzającego procesami.

Interfejs tekstowy w roli programu użytkownika

  • Powłoka w przestrzeni użytkownika: w odróżnieniu od wcześniejszych systemów powłoka w Uniksie nie była częścią jądra, lecz zwykłym programem działającym w trybie użytkownika.
  • Przekierowanie wejścia/wyjścia: wprowadzenie operatorów >, < oraz >> umożliwiło elastyczne sterowanie strumieniami danych z poziomu pojedynczego wiersza poleceń.
  • Zapisywalność sekwencji (scriptability): możliwość umieszczenia ciągu komend w zwykłym pliku tekstowym przekształciła interaktywny wiersz poleceń w język programowania.
  • Pionierzy powłoki: ewolucja od prostej powłoki Thompsona (1971 r.), pozbawionej zmiennych i pętli, do zaawansowanych środowisk programistycznych.
Powłoka systemowa (shell): program pośredniczący między użytkownikiem a jądrem systemu operacyjnego, odpowiedzialny za odczytywanie poleceń tekstowych, ich parsowanie, uruchamianie odpowiednich procesów oraz zarządzanie środowiskiem zmiennych. Powłoka działa w przestrzeni użytkownika, co pozwala na jej wymianę na inny interpreter (np. sh, Bash, Zsh). Jest jednocześnie interaktywnym interfejsem wiersza poleceń oraz pełnoprawnym językiem skryptowym.
Narodziny powłoki (shell)
$ cat script.sh
   ls -l
   whoami
   $ sh script.sh
        
12/30
Idea potoków (pipes)
Slajd wyjaśnia mechanizm potoków uniksowych umożliwiający bezpośrednie przekazywanie danych między procesami bez pośrednictwa plików dyskowych.

Łączenie strumieni danych w locie

  • Triada standardowych strumieni: każdy proces uniksowy otrzymuje standardowo deskryptory stdin (0), stdout (1) oraz stderr (2) dla obsługi błędów.
  • Operator potoku (|): konstrukcja zaproponowana przez Douga McIlroya wiążąca wyjście jednego procesu z wejściem kolejnego poprzez bufor w pamięci RAM jądra.
  • Eliminacja plików tymczasowych: przetwarzanie strumieniowe bez konieczności zapisywania gigabajtów danych pośrednich na fizycznych nośnikach pamięci.
  • Modułowość klocków LEGO: możliwość zestawiania wieloetapowych transformacji danych (filtrowanie, sortowanie, agregacja) za pomocą zwięzłej składni potoku.
Potok anonimowy (unnamed pipe): jednokierunkowy kanał komunikacji międzyprocesowej (IPC) zarządzany przez jądro systemu operacyjnego, który łączy standardowe wyjście jednego procesu bezpośrednio ze standardowym wejściem innego procesu. Dane przesyłane są w buforowanej pamięci jądra bez zapisu na dysku, co zapewnia wysoką przepustowość. Składniowo w powłoce potok reprezentowany jest przez znak pionowej kreski (|).
Idea potoków (pipes)
ls | grep "\.txt" | wc -l
   (Bez plików tymczasowych!)
        
13/30
Bourne Shell (1977)
Slajd analizuje powstanie powłoki Bourne'a (sh) jako pierwszego dojrzałego, algorytmicznego języka programowania skryptowego.

Pierwszy w pełni ustrukturyzowany język skryptowy

  • Algorytmiczne struktury sterujące: powłoka Steve'a Bourne'a wprowadziła pętle for/while, konstrukcje warunkowe if-then-else oraz bloki switch/case.
  • Inicjalizacja systemu (init scripts): powłoka sh stała się językiem skryptów startowych demona init, konfigurujących cały stos usług sieciowych i dyskowych.
  • Zmienne środowiskowe i parametry: pełne wsparcie dla zmiennych lokalnych i eksportowanych, tablic parametrów pozycyjnych ($1, $2, $@) oraz kodów powrotu ($?).
  • Standard de facto: składnia Bourne Shell posłużyła jako podstawa formalnego standardu POSIX Shell i zainspirowała nowoczesne powłoki Bash, Ksh i Zsh.
Bourne Shell (sh): standardowa powłoka uniksowa stworzona przez Stephena Bourne'a w Bell Labs, wydana w 1979 r. wraz z siódmą edycją Uniksa (Version 7 Unix). Zastąpiła wcześniejszą powłokę Thompsona, wprowadzając pełną składnię programowania strukturalnego, obsługę sygnałów oraz mechanizm podstawiania komend. Stała się kanonicznym standardem dla skryptów systemowych w całym świecie systemów uniksowych i uniksopodobnych.
Bourne Shell (1977)
for file in *.jpg; do
     mv "$file" "image_${file}"
   done
        
14/30
Skrypty jako klej systemowy (glue)
Slajd charakteryzuje rolę skryptów jako uniwersalnego narzędzia integracji i orkiestracji różnorodnych technologii informatycznych.

Integracja i orkiestracja heterogenicznych komponentów

  • Automatyzacja przetwarzania logów: cykliczna ekstrakcja zdarzeń z plików tekstowych, generowanie raportów i powiadamianie administratorów o anomaliach.
  • Harmonogramowanie zadań: integracja skryptów z demonem cron umożliwiająca bezobsługowe uruchamianie kopii zapasowych i indeksowania o zadanych porach.
  • Zarządzanie kontami i uprawnieniami: automatyzacja masowego zakładania użytkowników, konfiguracji katalogów domowych oraz praw dostępu w systemie.
  • Spajanie baz danych i usług: pobieranie danych z silników SQL, transformacja formatów oraz przesyłanie wyników do zewnętrznych interfejsów sieciowych.
Orkiestracja zadań: zautomatyzowane koordynowanie, zarządzanie i integrowanie powiązanych ze sobą procesów obliczeniowych, usług systemowych i przepływów danych. Skrypty systemowe pełnią funkcję silnika wykonawczego orkiestracji, łącząc heterogeniczne narzędzia w jednolitą linię przetwarzania. Podejście to eliminuje konieczność ręcznej ingerencji operatora w cykliczne procedury eksploatacyjne.
Skrypty jako klej systemowy (glue)
[DB] -> [Script] -> [Report]
      ^        |         ^
      |______( glue )____|
        
15/30
Perl (1987)
Slajd przedstawia powstanie języka Perl jako przełomowego narzędzia zaawansowanego przetwarzania tekstu i administracji systemowej.

Era zaawansowanego przetwarzania tekstu i wyrażeń regularnych

  • Natywne wyrażenia regularne: Larry Wall wbudował silnik regex bezpośrednio w składnię języka, rewolucjonizując parsowanie logów i plików konfiguracyjnych.
  • Ekosystem CPAN: pierwsze ogólnoświatowe, centralne repozytorium gotowych modułów bibliotecznych, zapoczątkowujące nowoczesny model dystrybucji kodu.
  • Paradygmat TMTOWTDI: filozofia "There's More Than One Way To Do It" dająca programiście swobodę wyboru stylu zapisu algorytmu.
  • Uniwersalne spoiwo Internetu: dominacja Perla jako pierwszego języka zaplecza serwerowego we wczesnej epoce interfejsów CGI.
Perl (Practical Extraction and Report Language): interpretowany, wieloparadygmatowy język programowania stworzony przez Larry'ego Walla w 1987 r., zaprojektowany specjalnie do przetwarzania danych tekstowych i automatyzacji zadań administracyjnych. Połączył najlepsze cechy powłoki sh, języka C, edytora sed oraz awk, oferując potężny wbudowany silnik wyrażeń regularnych. Przez ponad dekadę stanowił główne narzędzie administratorów systemów oraz twórców wczesnych aplikacji internetowych.
Perl (1987)
while (<>) {
     s/apple/orange/g;
     print;
   }
   # Legendarne regexy!
        
16/30
Tcl/Tk (1988)
Slajd omawia koncepcję skryptowania wbudowanego oraz tworzenia graficznych interfejsów użytkownika za pomocą pakietu Tcl/Tk.

Skryptowanie wbudowane i szybkie prototypowanie interfejsów graficznych

  • Język jako biblioteka C: John Ousterhout zaprojektował Tcl z myślą o łatwym osadzaniu interpretera wewnątrz aplikacji napisanych w języku C.
  • Biblioteka graficzna Tk: przełomowe rozszerzenie umożliwiające tworzenie kompletnych, okienkowych interfejsów GUI za pomocą kilku linijek skryptu.
  • Paradygmat "wszystko jest łańcuchem": jednolite traktowanie instrukcji, komend i danych jako łańcuchów znakowych o prostej gramatyce.
  • Standard w narzędziach EDA: do dziś podstawowy język automatyzacji projektowania układów scalonych, syntezy FPGA oraz sterowania aparaturą pomiarową.
Tcl/Tk (Tool Command Language / Tool Kit): zestaw obejmujący lekki język skryptowy (Tcl) oraz bibliotekę widżetów graficznych (Tk) stworzony przez Johna Ousterhouta pod koniec lat 80. Został zaprojektowany z myślą o rozszerzaniu aplikacji kompilowanych w C o warstwę interaktywnego sterowania oraz budowaniu przenośnych interfejsów okienkowych. Pozostaje przemysłowym standardem w środowiskach projektowania mikroelektronicznego (EDA).
Tcl/Tk (1988)
button .b -text "Hello" \
     -command {exit}
   pack .b
        
17/30
Python (1991)
Slajd analizuje rozwój języka Python i transformację skryptowania w dojrzały paradygmat tworzenia oprogramowania o wysokiej czytelności.

Skryptowanie zorientowane na czytelność i jakość kodu

  • Wymuszone wcięcia bloków: Guido van Rossum uczynił strukturę wizualną kodu (indentation) elementem składni, gwarantując wyjątkową przejrzystość projektów.
  • Zasada "Batteries Included": bogata biblioteka standardowa dostarczająca gotowe moduły do obsługi protokołów sieciowych, kryptografii, formatów JSON i parsowania XML.
  • Filozofia Zen of Python: zbiór wytycznych architektonicznych (PEP 20) stawiających prostotę, jednoznaczność i elegancję ponad nadmierną zawiłość.
  • Ewolucja w stronę data science: przekształcenie prostego języka skryptowego w globalny fundament uczenia maszynowego, analityki danych oraz automatyzacji chmury.
Python: uniwersalny, interpretowany język programowania wysokiego poziomu o dynamicznym typowaniu, stworzony przez Guido van Rossuma i opublikowany w 1991 r. Charakteryzuje się czytelną, minimalistyczną składnią oraz silnym naciskiem na wieloparadygmatowość (programowanie obiektowe, strukturalne i funkcyjne). Dzięki bogatemu ekosystemowi bibliotek (PyPI) stał się wiodącym językiem w obszarze sztucznej inteligencji, analityki danych oraz praktykach DevOps.
Python (1991)
import this
   # Zen of Python:
   # Beautiful is better 
   # than ugly.
        
18/30
Era WWW - CGI i PHP
Slajd omawia przełom dynamicznych witryn internetowych realizowany przez skrypty wykonywane po stronie serwera WWW.

Skryptowanie po stronie serwera we wczesnej epoce sieci WWW

  • Standard Common Gateway Interface: specyfikacja CGI umożliwiła serwerowi HTTP uruchamianie zewnętrznych procesów skryptowych generujących kod HTML w czasie rzeczywistym.
  • Narodziny PHP (1995 r.): Rasmus Lerdorf stworzył zestaw skryptów C (Personal Home Page Tools) osadzanych bezpośrednio w strukturze kodu HTML.
  • Wyzwanie skalowalności procesów: klasyczne CGI tworzyło nowy proces jądra (fork) dla każdego żądania HTTP, co wymusiło powstanie modułów serwera (np. mod_php, FastCGI).
  • Demokratyzacja tworzenia stron: skrypty serwerowe umożliwiły masowe powstawanie portali społecznościowych, forów dyskusyjnych oraz sklepów internetowych.
Common Gateway Interface (CGI): znormalizowany interfejs komunikacyjny umożliwiający serwerom internetowym (np. Apache, Nginx) przekazywanie żądań HTTP użytkownika do zewnętrznych programów i skryptów oraz odsyłanie wygenerowanej odpowiedzi do przeglądarki. Choć wczesne implementacje CGI cechowały się narzutem wydajnościowym związanym z powoływaniem nowego procesu potomnego (fork) dla każdego żądania HTTP, standard ten zapoczątkował erę dynamicznych aplikacji internetowych.
Era WWW - CGI i PHP
<?php
     echo "Witaj, świecie!";
   ?>
        
19/30
JavaScript (1995)
Slajd charakteryzuje powstanie i rozwój języka JavaScript jako technologii ożywiającej przeglądarkę internetową po stronie klienta.

Skryptowanie po stronie przeglądarki internetowej

  • Geneza w firmie Netscape: Brendan Eich stworzył w 1995 r. język Mocha/LiveScript w zaledwie 10 dni, odpowiadając na potrzebę interaktywności w przeglądarce Navigator.
  • Manipulacja obiektowym modelem DOM: skrypty zyskały możliwość dynamicznego modyfikowania struktury HTML, stylów CSS oraz reagowania na zdarzenia myszy i klawiatury.
  • Architektura asynchroniczna: jednowątkowy model oparty na pętli zdarzeń (event loop) zapewniający płynną obsługę asynchronicznych zapytań sieciowych.
  • Od prostych skryptów do dominacji: ewolucja od animacji kursorów i walidacji formularzy do budowy zaawansowanych aplikacji jednostronicowych (SPA).
JavaScript: dynamiczny, wysokopoziomowy, interpretowany lub kompilowany w locie (JIT) język programowania oparty na prototypach i funkcjach pierwszej klasy, zdefiniowany w standardzie ECMAScript. Stanowi fundament działania aplikacji webowych po stronie przeglądarki (klienta) oraz, za sprawą środowiska Node.js, po stronie serwera. Charakteryzuje się asynchronicznym modelem wejścia-wyjścia sterowanym zdarzeniami.
JavaScript (1995)
alert("Hello World!");
    document.getElementById("hello")
        
20/30
Era nowożytna (lata 2000+)
Slajd przedstawia nowoczesną ekspansję języków interpretowanych wspieraną przez menedżery pakietów i wieloplatformowe frameworki.

Dojrzałe ekosystemy biblioteczne i platformy aplikacyjne

  • Przełom Ruby on Rails: wprowadzenie wzorca Convention over Configuration (CoC) drastycznie przyspieszyło proces tworzenia zaawansowanych aplikacji webowych.
  • Nowoczesne menedżery pakietów: platformy npm, pip, gem i cargo zrewolucjonizowały zarządzanie drzewem zależności i automatyzację budowania oprogramowania.
  • Ekspansja środowiska Node.js: przeniesienie silnika V8 poza przeglądarkę umożliwiło pisanie wysokowydajnych skryptów sieciowych i serwerowych w języku JavaScript.
  • Zunifikowany stos technologiczny: możliwość użycia jednego języka (Full-Stack) do budowy logiki biznesowej, warstwy wizualnej oraz skryptów wdrożeniowych.
Ekosystem pakietów (package registry): scentralizowana lub rozproszona infrastruktura repozytoriów oprogramowania wraz z narzędziami CLI, umożliwiająca publikację, wersjonowanie i instalację bibliotek kodu źródłowego. Ekosystemy takie jak npm (JavaScript) czy PyPI (Python) stanowią kluczową siłę napędową nowoczesnych języków skryptowych. Pozwalają one programistom integrować złożone komponenty za pomocą pojedynczej komendy konsolowej.
Era nowożytna (lata 2000+)
[Package Managers]
   pip, npm, gem, cargo
   Cały świat w zasięgu 
   jednej komendy.
        
21/30
Automatyzacja Microsoft
Slajd charakteryzuje początki automatyzacji w środowisku Microsoft oparte na plikach wsadowych MS-DOS.

Skrypty wsadowe w środowisku MS-DOS i Windows

  • Interpreter COMMAND.COM: tekstowy procesor wiersza poleceń analizujący i wykonujący instrukcje pliku wsadowego (.bat) sekwencyjnie, linia po linii.
  • Kluczowa rola pliku AUTOEXEC.BAT: specjalny skrypt startowy ładowany przy starcie systemu, konfigurujący sterowniki urządzeń i zmienną środowiskową PATH.
  • Ograniczenia mechanizmu BAT: pierwotny brak zaawansowanych struktur pętli, brak arytmetyki zmiennoprzecinkowej oraz prymitywna obsługa błędów za pomocą kodów ERRORLEVEL.
  • Fundament pod skrypty cmd.exe: ewolucja interpretera do wersji 32-bitowej w architekturze Windows NT z rozszerzonym zestawem komend sterujących.
Plik wsadowy (.bat / .cmd): tekstowy plik skryptowy w systemach MS-DOS oraz Microsoft Windows zawierający sekwencję komend powłoki COMMAND.COM lub cmd.exe. Służy do automatyzacji rutynowych zadań administracyjnych, kompilacji oraz konfiguracji środowiska operacyjnego. Stanowi najprostszą formę automatyzacji w świecie technologii firmy Microsoft.
Automatyzacja Microsoft
@echo off
   echo Loading drivers...
   C:\DOS\SMARTDRV.EXE
   PROMPT $P$G
        
22/30
Windows Script Host (WSH)
Slajd omawia platformę Windows Script Host oraz integrację technologii COM i języków VBScript/JScript w administracji systemem Windows.

Obiektowa automatyzacja za pomocą VBScript i architektury COM

  • Niezależność od języka skryptowego: architektura WSH pozwalała na wykonywanie skryptów zapisanych zarówno w VBScript, jak i JScript za pomocą wspólnego silnika hosta.
  • Pełny dostęp do obiektów COM: możliwość tworzenia instancji obiektów systemowych (np. WScript.Shell, FileSystemObject) i sterowania aplikacjami pakietu Office.
  • Zarządzanie infrastrukturą domenową: automatyzacja operacji na usłudze katalogowej Active Directory oraz odpytywanie repozytorium WMI.
  • Luki bezpieczeństwa i zagrożenia: bezwarunkowe uruchamianie plików .vbs przez dwuklik doprowadziło do epidemii robaków sieciowych (np. wirus Love Bug).
Windows Script Host (WSH): środowisko wykonawcze wprowadzone w systemie Windows 98, umożliwiające uruchamianie skryptów systemowych poza przeglądarką internetową w trybie okienkowym (wscript.exe) lub konsolowym (cscript.exe). Wykorzystywało technologię ActiveX i Component Object Model (COM), udostępniając skryptom bezpośrednią kontrolę nad rejestrem, plikami oraz usługami systemowymi. Zostało zastąpione przez potężniejsze środowisko PowerShell.
Windows Script Host (WSH)
Set objFSO = CreateObject(...)
   objFSO.CreateTextFile("log.txt")
        
23/30
PowerShell (2006)
Slajd analizuje architekturę powłoki PowerShell i jej przełomowy paradygmat przesyłania obiektów .NET w potoku zamiast czystego tekstu.

Obiektowy potok danych i standaryzacja administracji systemowej

  • Obiektowy model potoku: polecenia PowerShell nie przesyłają strumieni znaków tekstowych, lecz pełne obiekty .NET z metodami i silnie typowanymi właściwościami.
  • Gramatyka Verb-Noun: spójna, logiczna konwencja nazewnictwa poleceń (poleceń cmdlet), np. Get-Process, Stop-Service, New-Item.
  • Integracja z platformą .NET: bezpośredni dostęp do klas, przestrzeni nazw i bibliotek całego środowiska programistycznego firmy Microsoft.
  • Wieloplatformowość (PowerShell Core): otwarcie kodu źródłowego i rozszerzenie działania środowiska na systemy Linux i macOS.
PowerShell: zaawansowana powłoka wiersza poleceń oraz obiektowy język skryptowy stworzony przez Jeffreya Snovera dla środowiska Microsoft Windows, a od wersji PowerShell Core (2016) dostępny także na platformach Linux i macOS. Charakteryzuje się architekturą potoków przesyłających obiekty środowiska uruchomieniowego .NET zamiast niestrukturyzowanego tekstu. Stanowi podstawowy standard zarządzania infrastrukturą chmurową Azure i serwerami korporacyjnymi.
PowerShell (2006)
Get-Service | 
   Where-Object {$_.Status -eq "Stopped"}
   # Obiektowa magia!
        
24/30
DevOps i Infrastructure as Code (IaC)
Slajd charakteryzuje transformację roli skryptów w kierunku deklaratywnego definiowania infrastruktury chmurowej w kulturze DevOps.

Deklaratywne definiowanie stanu systemów i infrastruktury

  • Przejście na paradygmat deklaratywny: zamiast instrukcji imperatywnych ("jak zainstalować") skrypt definiuje docelowy stan pożądany systemu ("co ma być osiągnięte").
  • Zasada idempotentności: gwarancja, że wielokrotne uruchomienie skryptu konfigurującego doprowadzi do identycznego stanu bez duplikowania zasobów.
  • Narzędzia orkiestracji i konfiguracji: powszechne wdrożenie technologii Ansible (YAML) oraz Terraform (HCL) do opisu sieci, maszyn i klastrów.
  • Wersjonowanie infrastruktury: traktowanie definicji środowisk sprzętowych dokładnie tak samo jak kodu aplikacji w systemach kontroli wersji Git.
Infrastructure as Code (IaC): podejście polegające na zarządzaniu i aprowizacji infrastruktury informatycznej (sieci, maszyn wirtualnych, kontenerów, baz danych) za pomocą deklaratywnych lub imperatywnych plików definicyjnych zamiast ręcznej konfiguracji interfejsów GUI. Pozwala na zautomatyzowane testowanie, audytowalność zmian oraz powtarzalne wdrażanie identycznych środowisk. Jest jednym z filarów kultury DevOps i ciągłej integracji/wdrażania (CI/CD).
DevOps i Infrastructure as Code (IaC)
- name: Install Nginx
     apt:
       name: nginx
       state: present
        
25/30
Nowoczesna wsadowość
Slajd przedstawia renesans koncepcji systemów wsadowych w architekturze chmurowej oraz klastrach superkomputerowych dużej skali.

Przetwarzanie wsadowe w środowiskach chmurowych i klastrach HPC

  • Zarządcy zasobów w superkomputerach: skrypty kolejkujące dla systemów Slurm, PBS i LSF rozdzielające miliony wątków obliczeniowych na tysiące węzłów.
  • Usługi chmurowe Cloud Batch: platformy AWS Batch i Azure Batch dynamicznie powołujące floty maszyn wirtualnych w reakcji na strumień danych do przetworzenia.
  • Konteneryzacja zadań: enkapsulacja skryptu roboczego wraz ze wszystkimi zależnościami w obrazie Docker, co eliminuje konflikty środowiskowe.
  • Ekonomia skali i optymalizacja kosztów: wykorzystanie taniej mocy obliczeniowej maszyn typu Spot/Preemptible do realizacji niekrytycznych czasowo analiz wsadowych.
High Performance Computing (HPC): gałąź informatyki zajmująca się agregacją zasobów obliczeniowych wielu maszyn w celu rozwiązywania problemów naukowych i obliczeniowych wymagających potężnej mocy obliczeniowej. W architekturze HPC skrypty kolejkujące pełnią rolę współczesnego monitora wsadowego, przydzielając procesy do dostępnych węzłów obliczeniowych. Do najpopularniejszych zarządców zadań należą systemy Slurm oraz PBS.
Nowoczesna wsadowość
#SBATCH --job-name=compute
   #SBATCH --nodes=10
   srun my_simulation.exe
        
26/30
Zacieranie granic między językami
Slajd analizuje konwergencję technologii kompilowanych i interpretowanych wynikającą z kompilacji w locie (JIT) oraz nowoczesnych środowisk wykonawczych.

Języki hybrydowe, kompilacja JIT i natywne moduły

  • Wydajność kompilacji w locie (JIT): zaawansowane silniki (np. Google V8, PyPy) analizują kod w czasie rzeczywistym i kompilują gorące ścieżki do kodu maszynowego.
  • Ekspansja środowisk Deno i Bun: nowoczesne środowiska umożliwiające bezpośrednie uruchamianie plików TypeScript bez osobnego kroku manualnej transpilacji.
  • Błyskawiczne pętle kompilacji: kompilatory języków takich jak Go czy Rust osiągają prędkości pozwalające na używanie ich w roli narzędzi skryptowych.
  • Płynne granice architektoniczne: współczesny podział na języki kompilowane i skryptowe staje się cechą konkretnej implementacji narzędzia, a nie samego języka.
Kompilacja w locie (Just-In-Time compilation, JIT): technika wykonywania programów łącząca zalety kompilacji statycznej i interpretacji kodu źródłowego. Maszyna wirtualna tłumaczy fragmenty kodu pośredniego (bytecode) na natywny kod maszynowy procesora bezpośrednio w trakcie jego działania na podstawie profilowania wykonania. Pozwala to językom dynamicznym (JavaScript, Python) osiągać wydajność zbliżoną do języków czysto kompilowanych.
Zacieranie granic między językami
// Deno: skryptowanie 
   // w TypeScript
    await Deno.writeTextFile("plik.txt", "Hello")
        
27/30
Dlaczego skryptujemy?
Slajd podsumowuje techniczne i ekonomiczne korzyści płynące z automatyzacji powtarzalnych procesów w codziennej pracy informatyka.

Motywacje praktyczne i optymalizacja nakładów pracy

  • Szybkość prototypowania rozwiązań: możliwość zweryfikowania koncepcji architektonicznej w kilkanaście minut bez budowania rozbudowanych struktur klasowych.
  • Powtarzalność i eliminacja błędów: deterministyczne wykonywanie procedur technicznych uniezależnia jakość wdrożenia od zmęczenia czy pomyłki operatora.
  • Precyzyjna samodokumentacja: skrypt stanowi jednoznaczny, weryfikowalny zapis procedury administracyjnej nadający się do wersjonowania w systemie Git.
  • Skalowalność operacji: ten sam skrypt może skonfigurować jedną stację roboczą lub zorkiestrować konfigurację tysiąca instancji serwerowych w chmurze.
Reguła automatyzacji (DRY - Don't Repeat Yourself): fundamentalna zasada tworzenia oprogramowania i administracji systemami stanowiąca, że każda powtarzalna czynność wykonywana więcej niż dwukrotnie powinna zostać zautomatyzowana za pomocą skryptu. Zmniejsza to złożoność operacyjną, ogranicza koszty utrzymania środowisk oraz eliminuje błędy ludzkie wynikające z rutyny.
Dlaczego skryptujemy?
Idea -> Script -> Result
   (The shortest path)
        
28/30
Bezpieczeństwo skryptów
Slajd analizuje zagrożenia cyberbezpieczeństwa związane z automatyzacją oraz dobre praktyki bezpiecznego tworzenia skryptów systemowych.

Zagrożenia, podatności i mechanizmy obronne w automatyzacji

  • Zasada minimalnych uprawnień (PoLP): bezwzględne unikanie uruchamiania skryptów z prawami konta root lub administratora, jeśli nie jest to wymagane technicznie.
  • Ataki na łańcuch dostaw (supply chain): ryzyko wstrzyknięcia złośliwego kodu poprzez niezweryfikowane pakiety pobierane z publicznych rejestrów kodu.
  • Bezpieczne zarządzanie poświadczeniami: eliminacja haseł i kluczy API zapisywanych jawnym tekstem w kodzie na rzecz menedżerów sekretów (Vault) i zmiennych środowiskowych.
  • Sanityzacja danych wejściowych: ochrona przed atakami typu Command Injection poprzez rygorystyczną walidację wszystkich argumentów przekazywanych do powłoki.
Zasada minimalnych uprawnień (Principle of Least Privilege, PoLP): kanoniczna reguła bezpieczeństwa teleinformatycznego nakazująca, aby każdy proces, skrypt lub użytkownik posiadał wyłącznie minimalny zestaw uprawnień niezbędny do realizacji przydzielonego zadania. Ogranicza ona potencjalne szkody w przypadku naruszenia integralności skryptu lub wystąpienia błędu wykonawczego. Jest kluczowym wymogiem audytowym w architekturze Zero Trust.
Bezpieczeństwo skryptów
rm -rf / # Nigdy nie 
            # puszczaj 
            # skryptów 
            # bez nadzoru!
        
29/30
Sztuczna inteligencja w świecie skryptów
Slajd przedstawia transformację tworzenia i audytu skryptów wywołaną przez duże modele językowe oraz automatyzację korygowania błędów.

Generowanie kodu, automatyczna remediacja i projektowanie promptów

  • Generowanie kodu z języka naturalnego: duże modele językowe (LLM) potrafią syntetyzować złożone skrypty powłoki i Pythona na podstawie opisu wymagań technicznych.
  • Automatyczna remediacja awarii: autonomiczne skrypty analizujące strumienie logów w poszukiwaniu anomalii i automatycznie aplikujące procedury naprawcze.
  • Nowy wymiar prompt engineeringu: precyzyjny opis problemu technicznego staje się nową formą specyfikowania logiki skryptowej wysokiego poziomu.
  • Konieczność krytycznej weryfikacji: obowiązek formalnego testowania wygenerowanych skryptów w odizolowanych środowiskach (sandbox) przed ich wdrożeniem produkcyjnym.
Automatyczna remediacja (auto-remediation): proces samoczynnego wykrywania, diagnozowania i usuwania incydentów w infrastrukturze IT przez inteligentne skrypty lub agentów bez konieczności interwencji człowieka. Systemy te analizują telemetrię i uruchamiają predefiniowane lub dynamicznie wygenerowane procedury naprawcze. Stanowi to zaawansowany etap rozwoju metodyk AIOps i zapewniania niezawodności systemów (SRE).
Sztuczna inteligencja w świecie skryptów
User: "Napisz skrypt 
   do backupu bazy..."
   AI: [Generating...]
        
30/30
Podsumowanie i perspektywy rozwoju
Slajd syntetyzuje ewolucję języków skryptowych oraz wskazuje kanoniczne źródła wiedzy i perspektywy rozwoju technologicznego.

Ciągłość idei automatyzacji i kanon literatury przedmiotu

  • Stałość nadrzędnego celu: niezależnie od epoki celem automatyzacji pozostaje tworzenie kolejnych warstw abstrakcji chroniących człowieka przed złożonością sprzętu.
  • Fundament nowoczesnego programisty: biegłość w posługiwaniu się powłoką i językami skryptowymi stanowi kluczową kompetencję w ekosystemach Cloud, DevOps i Data Science.
  • Kanon literatury przedmiotu: fundamentalne dzieła klasyczne, w tym "The Art of Unix Programming" Erica S. Raymonda oraz standardy The Open Group.
  • Rola ciągłego kształcenia: dynamiczny rozwój narzędzi wymaga nieustannej weryfikacji dobrych praktyk projektowych i standardów bezpieczeństwa kodu.
Automatyzacja procesów (automation engineering): interdyscyplinarny obszar informatyki koncentrujący się na projektowaniu, implementacji i utrzymaniu powtarzalnych, bezobsługowych procesów wytwórczych i operacyjnych. Łączy znajomość systemów operacyjnych, sieci komputerowych oraz programowania skryptowego w celu maksymalizacji efektywności i niezawodności systemów. Stanowi fundament współczesnych metodyk ciągłego dostarczania oprogramowania.
Podsumowanie i perspektywy rozwoju
+-------------------+
    |   KONIEC          |
    |   DZIĘKUJĘ ZA     |
    |   UWAGĘ!          |
    +-------------------+
        
Podgląd okładki