Bevezetés
Sziasztok! Remélem, mindenki jól van.
Eseménydús augusztuson vagyunk túl az Exercism-nél. Összevontuk a Premium és az Insiders csomagot, automatikus visszajelzést építettünk közvetlenül a szerkesztőbe, elindítottuk a kurzustrófeákat, és rengeteg apró fejlesztést is bevezettünk az oldalon! Ha még nem nézted meg a kurzusaidat, hogy megtudd, milyen trófeákat szereztél, mindenképp tedd meg. Mindenkinek küldtünk e-mailt, aki egy vagy több trófeát szerzett, szóval azt is tartsd szemmel. Augusztusban azzal is jól szórakoztunk a #12in23 keretében, hogy olyan nyelveket fedeztünk fel, amelyeket az emberek általában alkalmazások készítésére használnak.
Ez a hónap a Slimline September, amelyben olyan nyelvekkel foglalkozunk, amelyek szintaxisa általában nagyon tömör és szűkszavú. Konkrétan ezekkel a nyelvekkel: 8th (a Forth leszármazottja), AWK, Bash, jq, Perl és Raku (amelyet korábban Perl 6 néven ismertek).
A jelvények
Ahhoz, hogy megkapd a Slimline September jelvényt, szeptemberben öt feladatot kell megoldanod valamelyik ilyen nyelvből.
Ott van még az egész évre szóló 12in23 jelvény is. Ennek megszerzéséhez a nyelv öt kiemelt feladatát kell megoldanod.
- Gigasecond: dátumok kezelése
- Atbash Cipher: stringek kezelése
- Darts: számok és elágazások kezelése
- Luhn: stringek, elágazások és számok kezelése
- Series: stringek és sorozatok kezelése
Ezek a feladatok és a korábbi hónapok feladatai mind megtalálhatók a #12in23 oldalán.
Áttekintés
Vágjunk bele, és nézzük meg a nyelveket egyenként, rövid áttekintéssel.
8th
- Ron Aaron fejlesztette ki.
- A név szójáték a Forth nyelvre, amely egyben a fő inspirációja is. Sokban különbözik azonban a Forth-tól:
- Erősen típusos
- Platformfüggetlen
- Fokozott biztonság (nincs közvetlen memóriahozzáférés és nincs beépített assembler)
- Ingyenes és kereskedelmi verzióban is elérhető, utóbbi több funkciót kínál.
- Zárt forráskódú, de a forráskód megtekinthető, ha valaki vállalati licencet vásárol
AWK
- Az AWK-t a Bell Labsban alkotta meg Alfred Aho, Peter Weinberger és Brian Kernighan az 1970-es években. A név a szerzők vezetéknevéből alkotott mozaikszó.
- Domain-specifikus nyelv, amelyet szövegfeldolgozásra terveztek, de más célokra is használható
- Az AWK Unix-szűrő, akárcsak a sed és a grep, és arra szánták, hogy pipeline-ban használják
- A Single UNIX Specification és a Linux Standard Base specifikáció is megköveteli, hogy minden implementáció tartalmazza, ezért megtalálható a legtöbb *nix gépen
- Az AWK nyelv különböző implementációi:
- awk (vagy oawk, az eredeti AWK esetében): az eredeti implementáció
- GNU AWK (gawk), 1988-ban jelent meg, és jelentősen átdolgozta, illetve bővítette a nyelvet
- BWK AWK (más néven nawk), a 90-es évek végén jelent meg
- mawk: gyors, bájtkódot értelmező implementáció
- Sok *nix rendszeren az
awkparancs szimbolikus link, amely vagy agawk-ra, vagy anawk-ra mutat
Bash
- A Bash egy Unix shell, amelyet Brian Fox fejlesztett ki, és 1989-ben jelent meg.
- A Bourne shell ingyenes helyettesítőjeként tervezték, és mára a legtöbb Linux-disztribúció alapértelmezett bejelentkezési shellje lett. A Bourne shell parancsszintaxisának szuperhalmaza, ami megkönnyíti az átállást
- Számos módon bővíti a Bourne shellt: kapcsos zárójeles kiterjesztés, parancssori kiegészítés, jelkezelés és egyebek
jq
- Stephen Dolan fejlesztette ki, és 2012-ben jelent meg
- Célja, hogy egyszerűvé tegye a JSON-dokumentumok lekérdezését, átalakítását és manipulálását („a sed a JSON-hoz”)
- A
jqeszközt (amely magát a nyelvet valósítja meg) eredetileg Haskellben implementálták, később C-re portolták. Készültek Go- és Rust-alapú portok is
Perl
- A Perlt Larry Wall fejlesztette ki az 1980-as évek végén, és először 1987-ben jelent meg.
- Általános célú szkriptnyelvnek tervezték, hogy megkönnyítse a jelentések feldolgozását
- Nagyon nagy hatású, különösen a reguláris kifejezések támogatása terén (erre később még visszatérünk)
Raku
- Larry Wall (a Perl megalkotója) tervezte, és 2015-ben jelent meg
- Eredetileg Perl 6 néven ismerték, és az volt a célja, hogy rendbe tegye a nyelvet, valamint eltávolítson néhány funkciót, amelyet kevéssé hasznosnak vagy zavarónak tartottak (szórakoztató idézet: „A Perl 6-ban úgy döntöttünk, jobb magát a nyelvet kijavítani, mint a felhasználót.”, Larry Wall). A Perl 6 végül nem lett forráskompatibilis a Perl 5-tel, ezért átnevezték Rakura
- Tervezési filozófiájának középpontjában az áll, hogy a programozás élvezetes és produktív legyen, miközben széles eszköztárat kínál sokféle programozási kihívás megoldásához (általános célú)
- Mivel a Raku egy specifikáció, több implementációja is lehet (és van is). Jelenleg az egyetlen aktívan fejlesztett implementáció a Rakudo, de vannak régebbi implementációk is, például a Pugs (Haskellben írva), a v6-KindaPerl6 és a Niecza (amely a CLR-t célozza)
Hol használják ezeket a nyelveket?
8th
- Sajnos nem találtunk rá példát, hol használják
AWK
- Adatkinyerésre és jelentéskészítésre használják, valamint általában szkriptelésre
Bash
- Elsősorban rendszergazdai feladatokra használják, de parancssori segédprogramok vagy más eszközök köré írt burkolók készítésére is. Mi rengeteget használtuk arra, hogy tömegesen dolgozzunk az Exercism repóival
jq
- JSON-dokumentumok lekérdezésére, átalakítására és manipulálására használják, gyakran shell-szkriptek formájában.
Perl
- Adatmanipulációra, fájlok feldolgozására, webfejlesztésre és rendszergazdai feladatokra használják. A web kezdeti időszakában lett népszerű, nagyban a stringek kezelésére való képességei és kiterjedt modulökológiája miatt.
Raku
- Szövegfeldolgozásra, rendszergazdai feladatokra és még sok minden másra használják
Mi teszi ezeket a nyelveket érdekessé programozási szempontból?
A legtöbb nyelv dinamikusan típusos és értelmezett, ami jól illik a szkriptjellegükhöz. Ez alól azonban vannak kivételek, főleg a támogatott paradigmák terén.
8th
- Erősen típusos
- Többparadigmás: procedurális, de ami érdekesebb, veremalapú (veremalapú végrehajtási modell), reflektív (képes megvizsgálni és módosítani a saját szerkezetét és viselkedését) és konkatenatív (minden kifejezés függvény, és a függvények egymás mellé írása függvénykompozíciót jelöl)
- Natív kódra fordítják, de REPL-ben is értelmezhető
AWK
- Dinamikusan típusos, és gyakran értelmezett (a használt implementációtól függ)
- Fő paradigmája az adatvezérelt megközelítés, ahol a programot olyan utasításokként írod le, amelyek megadják a felismerendő adatokat és a szükséges feldolgozást, ahelyett hogy kifejezetten meghatároznád a végrehajtandó lépések sorrendjét. Az AWK támogatja a procedurális programozást is
Bash
- Dinamikus és értelmezett nyelv
- Támogatja az imperatív és a procedurális programozást
jq
- Dinamikus és értelmezett nyelv
- Tisztán funkcionális nyelv (minden érték megváltoztathatatlan), a „pipeline-ok” hangsúlyozásával. Nagyon unixos hangulata van
Perl
- Dinamikusan típusos és értelmezett
- Többparadigmás: támogatja a funkcionális, az objektumorientált és az imperatív programozást
Raku
- Dinamikusan típusos, de támogatja a fokozatos típusozást, ahol szükség szerint statikus típusokat adhatsz hozzá (a Perl dinamikus)
- Többparadigmás nyelv: imperatív, procedurális, objektumorientált és funkcionális
Mi teszi őket nagyszerű nyelvekké?
8th
- A nagyon kevés szintaxis megkönnyíti a nyelv megtanulását és megértését. JSON-t használ az adatok leírására (például objektumok és tömbök). Más tárolókat is támogat, például vermeket, sorokat és kupacokat.
- Nincsenek fenntartott kulcsszavak. A szubrutinokat „word”-nak nevezik, és könnyen lehet újakat definiálni. Futásidőben minden word újradefiniálható, akár beépített, akár felhasználói.
- Platformfüggetlen. Bármely támogatott platformra könnyedén generálhatsz futtatható állományt.
- Biztonságos. Beépített biztonsági funkciók előzik meg a hibák széles körét (nincs közvetlen memóriahozzáférés, a futtatókörnyezet nem linkel dinamikus könyvtárakhoz).
AWK
- Egyszerű szintaxis, az AWK-kód szerkezete nagyon következetes, ami megkönnyíti az AWK-kód megtanulását és olvasását. Adatszerkezetei is egyszerűek és rugalmasak.
- Nagyon kifejező: nagyon kevés kóddal sokat lehet elérni. Tökéletes egysorosokhoz.
- A legtöbb *nix gépen telepítve van, így sok helyen használhatod az AWK-tudásodat (a /bin/sh mellett ez az egyetlen szkriptnyelv a szabványos Unixban).
- Kiválóan működik pipeline-okban és shell-szkriptekben, ahol az AWK más eszközök kimenetét dolgozza fel, vagy épp fordítva.
Bash
- A legtöbb platformon használható. Szinte minden *nix gépen telepítve van, a macOS-t is beleértve. A Windows Subsystem for Linux (WSL) révén a bash mára Windows-rendszereken is elérhető.
- Használható RE(P)L-ként, ahol egyes parancsokat futtatsz, vagy fájlokból olvasol be és hajtasz végre kódot (ezek a shell-szkriptek). Ha használtál már Linux-terminált, valószínűleg írtál is bash-kódot, mert a terminál általában egy bash RE(P)L.
- A bash és a shell-szkriptek széles körben elterjedtek a rendszergazdai feladatokban, a devopsban és a számítógépek kezelésében.
- Rendkívül sokoldalú és rugalmas
- Hatékony stringkezelési képességek, köztük a nagyon egyszerű string-interpoláció
jq
- Egyszerű, rövid szintaxis a JSON-nal való munkához, ami megkönnyíti a megtanulását
- Egyéni függvénydefiníciókat tesz lehetővé bonyolultabb műveletekhez.
- Támogatja a farokrekurzió-optimalizálást, ami nagyszerű a rekurzív adatfeldolgozáshoz
- A jq eszközt egyetlen binárisként terjesztik, amely mindössze mintegy 30 KB méretű
- A
yqeszköz ajqköré épül, és ugyanazzal a szintaxissal teszi lehetővé XML-, TOML- és YAML-fájlok manipulálását (a háttérben ezeket az adattípusokat JSON-ná alakítja) - Mind a C-, mind a Go-implementáció beágyazható más alkalmazásokba
Perl
- A legtöbb platformon fut. Kiváló platformfüggetlen szkriptek írásához
- A rugalmasság a Perl tervezési filozófiájának alappillére. Híres mottója: „Több mint egy módja van rá” (TMTOWTDI). Az éppen adott feladattól függően különböző megközelítéseket lehet használni.
- Erős közösség és nagy hatású projektek öröksége. Rengeteg szkriptet, eszközt és alkalmazást fejlesztettek Perlben. Egykor így emlegették: „a ragasztószalag, ami összetartja az internetet”
- Gazdag modul- és könyvtárökológia, amely a Comprehensive Perl Archive Network (CPAN) révén érhető el
Raku
- Nagy, összetett és hatékony, ugyanakkor úgy tervezték, hogy ne kelljen egyszerre az egészet megtanulnod. Könnyű vele elkezdeni, és a hatékonyabb funkciókba később is belemerülhetsz
- Hatékony és bővíthető típusrendszer, amely magában foglalja a fokozatos típusozást. Ez azt jelenti, hogy megadhatod, milyen szintű típusellenőrzést szeretnél, így egyensúlyt teremthetsz a dinamikus és a statikus típusozás között
- Támogatja a többszörös diszpécserelést, amivel öröklés nélkül is használhatsz polimorfizmust
- A Unicode első osztályú állampolgár a Rakuban. Natív támogatást nyújt a különböző karakterkódolások kezeléséhez
- Fejlett konkurencia- és párhuzamossági funkciókat kínál. Beépített támogatást nyújt az aszinkron programozáshoz, a reaktív programozáshoz és a párhuzamos végrehajtáshoz
Mik a kiemelkedő jellemzőik?
8th
- Másfajta gondolkodásmódot igényel. Paradigmáinak egyedi keveréke nagyon eltér más nyelvekétől, és arra ösztönöz, hogy új módokat találj a dolgok megközelítésére.
- A veremalapú és fordított lengyel jelölésű (RPN) szintaxis nagyon egyszerű gondolati modellt ad a program végrehajtásáról. Az értékek a veremre kerülnek, és a legtöbb word a veremre gyakorolt hatásuk alapján van definiálva.
AWK
- Az adatvezérelt paradigma nagyon hatékony. Másfajta gondolkodást igényel: a programokat feltétel/művelet párok halmazaként definiálod, a szöveg rekordokra bomlik (jellemzően egy sor egy rekord), és minden rekord mezőkre tagolódik (például CSV-mezők, vagy egy szó egy mezőnek felel meg). Ha egyszer megszokod, értékelni fogod ennek a megközelítésnek az eleganciáját és kifejezőerejét, és mindenhol fel fogod ismerni a hasznát.
- Tökéletes a szöveggel való munkához. Akár szöveget dolgozol fel, alakítasz át vagy jelentést készítesz, az AWK mindig segít. Olyan feladatoknál, mint például az egyes felhasználók shelljének kiírása a rendszeren, vagy egy CSV-oszlop összegzése, el fogsz ámulni, milyen kevés kód kell hozzá.
Bash
- Tökéletes az automatizáláshoz. A shell-szkriptek kiválóan alkalmasak az ismétlődő feladatok automatizálására.
- A bash-szkriptek pipeline-okat használnak, és könnyedén összefűzhetsz velük más programokat. Gyerekjáték olyan szkriptet írni, amely az egyik parancs kimenetét egy másik parancsnak adja tovább, vagy elérni, hogy a szkript meghiúsuljon, mihelyt bármelyik végrehajtott parancs hibára fut.
- Hatékony. Az, hogy milyen könnyen használhatók vele más eszközök, hihetetlenül hatékony eszközzé teszi a basht.
jq
- Kiváló JSON-adatok egyszerű és letisztult kinyerésére/manipulálására (amiből manapság rengeteg van). Mára a JSON-adatok átalakításának de facto eszközévé vált. JSON-adatokat akár létre is hozhatsz a jq-val.
- Támogatja az adatfolyam-feldolgozást, ami azt jelenti, hogy „végtelen” adatokkal is dolgozhatsz memóriaproblémák nélkül
- A pipeline-ok hangsúlyozása könnyen elsajátítható mindenkinek, aki ismeri a streameket, például a Unix-eszközöket. Emellett viszonylag könnyen átláthatóvá teszi a jq-kódot.
Perl
- Híres tömörségéről és kifejezőerejéről. Nagyon kevés kóddal sokat lehet elérni
- Különösen jól illik a szöveggel való munkához, nagy részben a hatékony reguláris kifejezés-támogatásának köszönhetően. Kiváltképp a Perl 5 vezetett be sok új funkciót (például visszahivatkozások, nevesített csoportok és lusta kvantorok). Philip Hazel alkotta meg a PCRE-t (Perl Compatible Regular Expressions), egy C-könyvtárat, amely Perl 5-kompatibilis reguláris kifejezésmotort valósít meg. Még azok a nyelvek is, amelyek nem a PCRE-re épülnek, gyakran PCRE-kompatibilisre tervezik a reguláris kifejezés-támogatásukat (és így a Perl 5 szintaxisát használják)
Raku
- Támogatja az automatikus szálkezelésű junctionöket, amelyek nagyban megkönnyítik a párhuzamos programozást
- Támogatja a lusta kiértékelést, amivel végtelen listákkal és sorozatokkal dolgozhatsz anélkül, hogy memóriaproblémákba ütköznél. Ez különösen hasznos nagy adathalmazok esetén, vagy olyan algoritmusoknál, amelyek végtelen adatfolyamokkal dolgoznak
- Kiváló szövegfeldolgozáshoz: egyszerűbb, olvashatóbb és hatékonyabb reguláris kifejezés-szintaxist kínál
- Beépített támogatás egyéni domain-specifikus nyelvek (DSL-ek) definiálásához grammatikák segítségével. Így parsereket készíthetsz adott adatformátumokhoz vagy nyelvekhez, ami megkönnyíti az összetett szöveges adatok kezelését
Melyiket próbáld ki?
- Ha elsősorban Unix-rendszert használsz, vagy devopsszal foglalkozol, a Bash felbecsülhetetlen értékű nyelv, amit érdemes megtanulni. Az AWK, a Perl vagy a Raku megtanulása is igazán hasznos lehet, ráadásul az első kettő sok rendszeren eleve telepítve van.
- Ha JSON-nal (vagy XML-, YAML- és TOML-fájlokkal) dolgozol, a jq kézenfekvő választás.
- Ha szövegfeldolgozással szeretnél foglalkozni, az AWK, a Perl és a Raku a kézenfekvő választás.
- Ha valami kicsit másfélét próbálnál ki, az 8th remek választás.