Bevezetés
Sziasztok! Remélem, mindenki jól van.
Gyorsan telik az év, és elérkeztünk a Mindshifting May hónaphoz, ami valószínűleg az a hónap, amit a legjobban várok, főleg azért, mert benne van a Prolog is!
Remélem, tetszett az Analytical April. Hihetetlenül sokan részt vettetek benne, és szerintem ez volt az eddigi egyik legsikeresebb hónap. Áprilisban Simon Peyton Jonesszal is beszélgettem, egy elkésett Functional February-interjú keretében. Ez tényleg jó volt, és mindenképp ajánlom, hogy nézd vissza, ha másért nem, hát ezért a gyönyörű mondatért: „Amikor majd lekopik az imperatív programozás mészköve, alóla előbukkan a funkcionális programozás gránitja”.
Na de térjünk rá a Mindshifting May hónapra! Ahogy szoktuk, Erik és én most is gyors áttekintést adunk arról, hogy miről szólnak ezek a hónapok, és milyen nyelveket fogunk felfedezni.
Szóval ebben a hónapban nem kevesebb, mint hat nyelv vár ránk: a Ballerina, a Pharo, a Prolog, a Red, a Tcl (ejtsd: „tickle”) és az Unison. Ezek a nyelvek mind meglehetősen különböznek a „mainstream” nyelvektől, ezért azt javasoljuk, hogy próbálj ki közülük többet is, hogy érezd, miben mások. A Prologot mindenképp ajánlom, mert ez az egyik nyelv, amiben életemben a legjobban szerettem programozni. Erik is nagyon izgatott az Unison miatt, úgyhogy azt is érdemes kipróbálni.
A jelvények
Ahhoz, hogy megkapd a Mindshifting May jelvényt, májusban öt tetszőleges feladatot kell teljesítened az egyik ilyen nyelvben.
Van emellett az egész éves 12in23 jelvény is. Ahhoz, hogy megkapd, ötöt kell megoldanod a kiemelt feladataink közül abban a nyelvben. Ha ezt május után nézed, ezt a részt az év bármelyik pontján megcsinálhatod, szóval nem maradtál le semmiről. Nehéz volt kiválasztani ezeket a feladatokat, mert a nyelvek mind nagyon különbözőek, ezért inkább általánosabb feladatokat választottunk, amelyeket jó megoldani, és érdekes felfedezni rajtuk a különböző megközelítéseket.
- Betűszó: egy kifejezés átalakítása betűszóvá
- Izogram: annak ellenőrzése, hogy egy kifejezés tartalmaz-e ismétlődő betűket
- Római számok: egy tízes számrendszerbeli szám átírása római számokra
- Esőcseppek: egy szám átalakítása esőcsepphangokká
- Űrkorszak: annak kiszámítása, hány éves lenne valaki a Naprendszerünk bolygóin
Ezek a feladatok és a korábbi hónapok feladatai mind megtalálhatók a #12in23 oldalon.
Áttekintések
Vágjunk bele, és ismerjük meg a nyelveket egy-egy áttekintésen keresztül.
Prolog:
- Másfajta gondolkodásmód. A programot relációk halmazaként definiáljuk. Ezután „lekérdezheted” a relációk adatbázisát, hogy egyesítéssel (mintázatillesztéssel) válaszokat találj. Ideális szabályalapú rendszerekhez
- Kevés szintaxis, mindössze egy adattípus (termek) és egy nyelvi szerkezeti elem (klózok). A klózok teljes egészében termekből épülnek fel, és tényeket vagy szabályokat definiálhatnak.
- Nagyon deklaratív. Kevesebbet kell aggódnod azon, hogyan számolódnak ki a dolgok, és többet azon, minek kell kiszámolódnia. Ez sok esetben kevesebb kódot jelent
- Úgy tervezték, hogy jól működjön nagy keresési terek lekérdezésében. Különböző keresési stratégiák (mélységi, szélességi), támogatja az automatikus nyesést
Unison
- Az Unison-kódban nincsenek verzióütközések! Egy Unison-függvény ismeri a függőségei hash-értékeit, így meg tudja találni a szükséges kód megfelelő verzióját.
- Az Unison támogatja az élő kódban való böngészést a helyi fejlesztői felületen és a hosztolt tárakban, így mindig átkattinthatsz, hogy megnézd azon könyvtárak forráskódját, amelyektől függsz.
- Az Abilities segítségével tisztán funkcionális módon kezelhetők az „effektek” (pl. IO)
Pharo
- Nagyon kevés szintaxis, a teljes szintaxis elfér egy képeslapon (mindössze 6 fenntartott szó!). Az üzenetszintaxis a természetes nyelveket utánozza: alany, ige és kiegészítők (between: 1 and: 2 +). A szemantika is egyszerű (pl. halálosan egyszerű precedenciaszabályok). Így könnyebb megtanulni és olvasni
- A termelékenység remek, amint az ember túljut a kezdeti tanulási görbén. Ennek több oka van, köztük az egyszerű szemantika és a kevés szintaxis, de a Pharo később említett kiemelkedő funkciói is
- A legtöbb platformon fut (Windows, macOS, Linux + ARM-támogatás), egy gyors virtuális gépen (OpenSmalltalk)
- Nem csupán egy Smalltalk-implementáció, és továbbra is aktívan fejlesztik (a legutóbbi Smalltalk-verzió a Smalltalk 80, 1980-ból)
- Barátságos közösség
Tcl (ejtsd: „tickle”)
- Nagyon kevés szintaxis, mindössze 12 szabály, és elfér egy papírlapon. A szemantika is viszonylag egyszerű. A programok így könnyen olvashatók és megtanulhatók
- Egyszerű párhuzamosság korutinokkal, amivel az aszinkron kód szinkron kódként írható meg
- Beépített eseményciklus hálózati programozáshoz és aszinkron fájl-I/O-hoz
- Érett, de még mindig fejlődik
Ballerina
- Első osztályú támogatás a JSON, XML és táblázatos adatok típusbiztos, deklaratív feldolgozásához, nyelvbe integrált lekérdezésekkel
- Rugalmas típusok, ahol a strukturális típusosság (duck typing) az elterjedt. A zárt típusokkal altípusokat képezhetsz, míg a nyílt típusok elegánsan kezelik a túl sok küldött adatot. Beépített adatkötés és validáció HTTP-erőforrásokban való használatkor
- Beépített támogatás gyakori integrációs mintákhoz és csatlakozókhoz, beleértve az elosztott tranzakciókat, a kompenzációt és a circuit breakereket
- Minden Ballerina-program automatikusan megfigyelhető bármely Open Telemetry-eszközzel, ami teljes kontrollt és rálátást ad a kód viselkedésére és teljesítményére.
- Remek párhuzamosság strandekkel, amelyek könnyűsúlyú szálak. A nem blokkoló I/O-hívások egyszerűek. A fordító segíthet ellenőrizni a workerek közötti küldő és fogadó hívásokat, elkerülve a holtpontokat. A változtathatatlanság is nagyszerű a hálózatkezeléshez
- Explicit hibakezelés uniótípusokkal és a
checkszintaktikai cukorral, ami ezt segíti
Red
- Könnyűsúlyú. A teljes toolchain körülbelül 1,5 MB-os letöltés, egyetlen futtatható fájl.
- Hordozható. Könnyű keresztfordítás. Kis binárisokat állít elő függőségek nélkül. Alacsony memóriaigény.
- A Red a saját meta-nyelve és saját adatformátuma (a LISP-ekhez hasonlóan). A programok átalakíthatják és olvashatják a kódot.
- Reaktív: az objektumok összekapcsolhatók, hogy csökkentsék a program méretét és bonyolultságát (gondolj az Exceltáblákra)
Hol használják ezeket a nyelveket?
Prolog:
- Mesterséges intelligencia (az IBM Watsonja)
- (Természetes) nyelvi feldolgozás
- Elosztott adatbázis tudásbázisokhoz (TerminusDB)
- Még a Java virtuális gép típusszabályainak meghatározására is használták
Unison
- Elosztott rendszerek írására használják
- Általános webszolgáltatások
- Kötegelt számítási feladatok
Pharo
- Interaktív eszközökhöz használják
- Nagyon különböző területeken használják: online kereskedési platform és befektetéskezelő, felhőalapú eszköz
- Felhasználói felület és interakció prototípuskészítése a hadiiparban
- Webalapú alkalmazás rendezvényszervezéshez
- Formálható fejlesztői környezet eszköze API-k, adatok és rendszerek felfedezéséhez
Tcl
- Ragasztókódként vagy beágyazva használják
- A CISCO routerek grafikus felületeiben használják
- Különféle gyártási rendszerekben
- A NASA is sok alkalommal használta
- További nagyvállalatok közé tartozik a Pixar, a Boeing, az Intel, az NBC és még sokan mások.
- A Tk ablakkezelő eszközkészletet más „script” nyelvek is átvették, mint a perl/python/ruby.
- Az Expect, egy eszköz interaktív CLI-alkalmazások automatizálására
Ballerina
- Felhőnatív alkalmazásokhoz használják
- A MOSIP használja, amely egy alapvető identitásplatform, amely segít a kormányoknak és más szervezeteknek költséghatékony módon bevezetni a digitális és alapvető identitásrendszereket.
Mi teszi érdekessé ezeket a nyelveket programozói szempontból?
Prolog:
- Logikai programozási nyelv (az elsők egyike), amely a maga paradigmája (mint az OO és a funkcionális programozás)
- Dinamikusan típusos
Unison
- Tisztán funkcionális nyelv
- Statikusan típusos
Pharo
- Objektumorientált nyelv, de a Smalltalk értelmében. Különbözik a „hagyományos” objektumorientált nyelvektől: nincsenek konstruktorok, típusdeklarációk, interfészek és primitív típusok.
- Dinamikusan típusos
Tcl
- Többparadigmás: támogatja az objektumorientált, imperatív és funkcionális stílust
- Dinamikusan típusos
Ballerina
- Többparadigmás: objektumorientált, funkcionális és deklaratív
- Statikusan típusos
Red
- Többparadigmás: imperatív, funkcionális, objektumorientált, szimbolikus, reaktív
- Statikusan típusos
Mik a kiemelkedő funkcióik?
Prolog:
- Rugalmas. Sok beépített predikátum több irányban is működik. Lehetővé teszi, hogy ugyanazzal a szintaxissal kérdezz le és hozz létre adatokat. Néhány probléma, ami más nyelvekben nehéz, itt triviális
- A DCG olyan, mint egy beépített parser-kombinátor, amely kiváló sorozatok elemzésére, generálására, kiegészítésére és ellenőrzésére
- A CLP hatékony módja annak, hogy egy programot megszorításokkal definiálj
Unison
- A kód nem szöveg, hanem (változtathatatlan) adat. A kód egy adatbázisban tárolódik, és az Unison Codebase Manageren keresztül érhető el és frissíthető. A szövegfájlok csak egy módja annak, hogy kódot juttass az adatbázisba. A változtathatatlan adat azt is jelenti, hogy a teszteredmények gyorsítótárazhatók, és a típusellenőrzést is csak egyszer kell elvégezni
- A definíciókra hash alapján hivatkozunk, nem név szerint. Ezt nevezik „content-addressed” kódnak. Egy definíció szintaxisfája határozza meg a hash-ét. Nincsenek verziózási ütközések, az átnevezések triviálisak.
- Az Unison dokumentációja első osztályú entitás a nyelvben, és mindig szinkronban van azokkal a függvényekkel, amelyeket leír. Élő példákat ágyazhatsz bele, és biztosíthatod, hogy a példakód leforduljon.
- Ideális felhőalapú számításokhoz: nem kell buildelni, a függvények menet közben terjeszthetők, és kevesebb időt vesz igénybe kódolók és dekódolók írása az Unison-szolgáltatások közötti kommunikációhoz.
Pharo
- Egyszerű végrehajtási modell: minden objektum, és a végrehajtás kizárólag üzeneteken keresztül történik (amelyek szintén objektumok). Még a vezérlés is üzenetekkel valósul meg. Bár a modell egyszerű, nagyon erős. Meglehetősen különbözik más objektumorientált nyelvektől.
- A kódod egy Pharo image-ben él, nem szövegfájlokban. Egy Pharo image tartalmazza az alkalmazásod teljes állapotát, és egy Pharo virtuális gépen futtatható. Amikor mented a munkádat, a Pharo a környezet teljes állapotát image-fájlként menti el. Ez a fájl tartalmazza az összes objektumot, azok kapcsolatait és a végrehajtási kontextust. Az image-fájlok megoszthatók másokkal, és betölthetők különböző gépekre vagy platformokra. Így a fejlesztők könnyen együttműködhetnek egy projekten, vagy terjeszthetnek Pharóban készült alkalmazásokat
- Élő és magával ragadó, futásidőben azonnali visszajelzést ad a Pharo-specifikus IDE-n keresztül. Futtasd és változtasd a programodat menet közben, akár futás közben is! Erőteljes hibakereső, amely támogatja a metódusok újraindítását és a hibák menet közbeni javítását
Tcl
- Egyszerű típusrendszer: minden string. A „minden string” volt az, ahogy a Tcl-t régen megvalósították. Most a motorháztető alatt egy robusztus típusrendszer működik, ahol a Tcl-entitás (legyen az string, tizedes tört, lista, szótár) rendelkezik típus-specifikus reprezentációval és string-reprezentációval is. Ez nagymértékben javítja a Tcl-kód teljesítményét, mert már nem kell oda-vissza konvertálnia a stringekből.
- „Minden parancsként fut”. Nincsenek beépített parancsok. A Tcl egy „szabványos könyvtárral” érkezik, amely parancsokat tartalmaz, beleértve az if és while stb. Nagyon egyszerű új vezérlési parancsokat hozzáadni: például egy until ciklust. A Tcl-parancsok felülírása is könnyű.
- Mivel kompakt, egyszerű a szemantikája, és C-könyvtárként van megvalósítva, könnyen beágyazható
Ballerina
- Felhőnatív. Beépített konverziók JSON-ból felhasználó által definiált típusokba. Szuper könnyű szintaxis (mikro)szolgáltatások létrehozásához. Beépített párhuzamos végrehajtás a szolgáltatásokhoz. HTTP (1 és 2), graphql és gRPC támogatás alapból
- Automatikusan generál artefaktumokat, hogy a kódodat különböző felhőkbe élesítsd. Ezek az artefaktumok lehetnek Dockerfile-ok, Docker image-ek, Kubernetes YAML-fájlok vagy szerver nélküli függvények.
- Beépített kódvizualizáció szekvenciadiagramokként. Remek a kódfolyam vizualizálására. Még a HTTP-hívásokat is meg tudja jeleníteni
Red
- Kiváló domain-specifikus nyelvek/„dialektusok” építésére és elemzésére (Rebol-terminológia). Számos beépített dialektus:
- Red/System: C-szintű rendszerprogramozási nyelv, natív kódra fordítva
- Parse: egy erőteljes PEG-elemző
- VID: egyszerű dialektus grafikus felületek elrendezésének létrehozásához
- Draw: vektoros 2D rajzolási dialektus
- Rich-text: rich-text leírási dialektus
- Egyszerű grafikus felületek. Teljesen platformfüggetlen és natív. Támogatja a kétirányú adatkötést, az élő frissítést, az eseményeket, és hozzáférést biztosít az operációs rendszer funkcióihoz
Melyiket (melyeket) érdemes kipróbálni májusban?
Mindegyik önmagában is érdekes nyelv, szóval bármelyik mellett lehet érvelni.
- Ha érdekel a felhőalapú számítás, a Ballerina és az Unison remek választás. A Tcl-nek is nagyszerű párhuzamossági funkciói vannak
- Ha ismered az objektumorientált programozást, de szeretnél egy másfajta megközelítést látni, próbáld ki a Pharót
- Ha szeretnéd megtapasztalni, milyen olyan nyelvben programozni, amelyet nem szövegfájlok támasztanak alá, próbáld ki a Pharót és annak egyedi, erőteljes IDE-jét, vagy az Unisont az Unison Codebase Managerrel.
- Ha szereted a minimalizmust, a Tcl, a Prolog, a Pharo és a Red mind meglehetősen kevés szintaxissal és viszonylag egyszerű szemantikával rendelkezik
- Ha szeretnéd látni a paradigmák érdekes keverékét, a Ballerina, a Tcl és a Red is többféle paradigmát támogat
- Ha szeretnél kipróbálni néhány szokatlanabb paradigmát, válaszd a Prologot a logikai programozáshoz, a Redet a reaktív programozáshoz és a Ballerinát a deklaratív programozáshoz
- Ha szereted a funkcionális programozást, nézd meg az Unisont, és különösen az Abilities funkciót.
- Ha érdekel a meta-programozás, a Tcl, a Prolog, a Pharo és a Red mind kiváló támogatást nyújt
Persze, ha van időd, azt javaslom, próbálj ki közülük néhányat! Mindegyik meglehetősen egyedi. Oldd meg ugyanazt a feladatot néhány kiemelt nyelvben, és nézd meg, mennyire más a megvalósítás.