Több mint 25 éve használom a MATLAB-ot. (És azelőtt még a MATRIXx-et is használtam, egy késői, sajnálatra méltatlan próbálkozást egy spinoffra, vagy talán egy ripoffra). Nem ez az első nyelv, amin megtanultam programozni, de ez az, amivel matematikailag nagykorú lettem. A MATLAB ismerete nagyon jót tett a karrieremnek.
Mégis lehetetlen figyelmen kívül hagyni a Python felemelkedését a tudományos számítástechnikában. A MathWorks bizonyára ugyanígy érez: nemcsak hogy hozzáadták a Python közvetlen hívásának lehetőségét a MATLAB-ból, hanem átvették annak néhány nyelvi jellemzőjét is, például a bináris operátorok operandusainak agresszívabb sugárzását.
Elérkezett az a pont, amikor megkérdőjeleztem, hogy továbbra is a MATLAB-ot használom-e mind a kutatásban, mind az oktatásban. Mégis olyan sok minden könnyen megy nekem ott, és olyan sokat fektettem be a hozzá tartozó anyagokba, hogy nehéz volt összeszedni a motivációt, hogy valóban megtanuljak valami újat.
Elérhető a MATLAB-alapú tankönyv, amelynek társszerzője voltam a bevezető számítási matematika számára. A könyv több mint 40 függvényt és 160 számítási példát tartalmaz, és szerintem alaposan megalapozza a MATLAB numerikus tudományos számításokhoz való használatát. Így részben önfejlesztésként, részben pedig a könyv hasznosságának növelése érdekében idén nekiláttam, hogy lefordítsam a kódokat Juliára és Pythonra. Ez a tapasztalat vezetett ahhoz, hogy sajátos nézőpontot alakítottam ki a három nyelvvel kapcsolatban a tudományos számítástechnikával kapcsolatban, amelyet az alábbiakban megpróbálok megragadni.
A költségek és a nyitottság kérdését többnyire félreteszem. A MATLAB a Pythonnal és a Juliával ellentétben nem sör- és beszédmentes. Ez valóban óriási különbség – egyesek számára diszpozitív -, de én a technikai érdemeket szeretném megvizsgálni. Sok éven át a MATLAB számos rendkívül hasznos módon messze felülmúlta az ingyenes termékeket, és ha produktívak akartunk lenni, akkor a költségek nem számítanak. Ez egy külön szempont a nyelv és az ökoszisztéma platonikus vonzerejétől.
Ha félretesszük a költségeket, a nyelvek közötti különbségek nagy részének hasznos kerete az eredetükben rejlik. A MATLAB, a legrégebbi a törekvések közül, a matematikát helyezte előtérbe, különösen a numerikusan orientált matematikát. A Python, amely a nyolcvanas évek végén kezdett el komolyan dolgozni, a számítástechnikát helyezte a középpontba. A Julia, amely 2009-ben indult, arra törekedett, hogy nagyobb egyensúlyt teremtsen ezen oldalak között.
MATLAB
Eredetileg a MATLAB-ban minden érték kétszeres pontosságú lebegőpontos számok tömbje volt. Ennek a választásnak mindkét aspektusa, a tömbök és a lebegőpont, ihletett tervezési döntés volt.
A lebegőpontra vonatkozó IEEE 754-es szabványt 1985-ig el sem fogadták, és a memóriát K-ban mérték, nem G-ben. A lebegőpontos páros számok nem voltak a leghatékonyabb módja a karakterek vagy egész számok ábrázolásának, de a tudósok, mérnökök, és egyre inkább a matematikusok is ezeket akarták használni a legtöbbször. Továbbá a változókat nem kellett deklarálni, és a memóriát nem kellett explicit módon kiosztani. Azzal, hogy a számítógépre bízták ezeket a feladatokat, és az adattípusok kikerültek az útból, felszabadult az agy, hogy az adatokkal operáló algoritmusokon gondolkodjon.
A tömbök azért voltak fontosak, mert a lineáris algebra numerikus algoritmusai a LINPACK és az EISPACK formájában kezdtek teret nyerni. De ezek elérése a tudományos számítástechnika szabványos hordozójával, a FORTRAN 77-gyel többlépcsős folyamat volt, amely magában foglalta a változók deklarálását, a titkos nevű rutinok hívását, a kód lefordítását, majd az adat- és kimeneti fájlok vizsgálatát. Egy mátrixszorzás A*B
-ként való leírása és a válasz azonnali kinyomtatása változást jelentett.
A MATLAB a grafikát is egyszerűvé és sokkal hozzáférhetőbbé tette. Nem voltak bonyolult gépspecifikus könyvtárak alacsony szintű hívásokkal, csak plot(x,y)
és nagyjából azt láttad, amit bárki más is látna a MATLAB-bal. Voltak még további újítások, mint például a beégetett komplex számok, a ritka mátrixok, a platformok közötti grafikus felhasználói felületek készítésére szolgáló eszközök és az ODE-megoldók élvonalbeli csomagja, amelyek a MATLAB-ot a tudományos számítások gondolati sebességű elvégzésének helyévé tették.
Az interaktív számításokhoz – még a hosszadalmas számításokhoz is – ideális kialakítás azonban nem mindig kedvezett a jó és teljesítőképes szoftverek írásának. Az adatok sok függvény közötti mozgatása sok változóval való zsonglőrködést és a bemeneti és kimeneti argumentumok dokumentációjának gyakori megtekintését igényelte. Lemezfájlonként egy függvény egy lapos névtérben üdítően egyszerű volt egy kis projekt esetében, de fejfájást okozott egy nagy projekt esetében. Bizonyos programozási mintákat (vektorizáció, memória előkiosztás) kellett alkalmazni, ha el akartuk kerülni a sebességi szűk keresztmetszeteket. A tudományos számítástechnikát most már sokkal több területen alkalmazták, hatalmas mennyiségű, különböző natív adattípusokkal. stb.
A MathWorks erre úgy reagált, hogy folytatta a MATLAB-on belüli innovációt: inline függvények, egymásba ágyazott függvények, változózárások, számos adattípus, objektumorientált funkciók, egységtesztelési keretrendszerek, és így tovább. Valószínűleg minden egyes újítás egy-egy fontos probléma megoldása volt. De ezeknek a változtatásoknak a 40 évnyi halmozódása azzal a mellékhatással járt, hogy az egyszerűség és a koncepció egységének erodálódását eredményezte. 2009-ben írtam egy könyvet, amely kevesebb mint 100 oldalban elég jól lefedte a MATLAB általam lényegesnek tartott elemeit. Amennyire tudom, ezek mindegyike még mindig elérhető. De ma már sokkal többet kell tudnod ahhoz, hogy profinak mondhasd magad.
Python
A Python története bizonyos értelemben szinte tükörképének tűnik a MATLAB történetének. Mindkettő interaktív parancssorral rendelkezett (ma már széles körben REPL-nek nevezik, a “read-eval-print loop” (olvasás-értékelés-nyomtatás ciklus) kifejezésre), valamint a változók deklarációjától és a fordítástól való mentességgel. A MATLAB azonban numerikus elemzők játszótereként jött létre, míg a Python a hackerek számára készült. Mindkettő aztán revíziók és bővítések révén a másik közönség felé nőtt.
A Python az én szememben még mindig nem rendelkezik matematikai vonzerővel. Vannak csúnyaságai és apró bosszúságai, mint például **
a ^
helyett, @
a mátrixszorzáshoz (újkori újítás!), shape
a mátrix mérete helyett, sororientált tárolás, stb. Ha úgy gondolja, hogy a V.conj().T@D**3@V
egy elegáns módja a $V^*D^3V$ írásának, akkor lehet, hogy orvoshoz kell fordulnia. És ott van a nulla indexelés (szemben az 1-gyel kezdődő indexekkel). Elolvastam az érveket, és nem tartom őket döntőnek. Ez egyértelműen preferencia kérdése – az online szent háborúk tárgya -, mert mindkét konvencióra lehet fárasztó példákat hozni. Amit én döntőnek találok, az az, hogy évtizedes matematikai gyakorlatunk van a vektorok és mátrixok egyről indexelésére, és a legtöbb pszeudokód ezt feltételezi.
Túl az apró bosszúságokon, a Python+NumPy+SciPy ökoszisztémát ügyetlennek és következetlennek találom. A. bizonyíték az a tény, hogy annak ellenére, hogy a nyelv meglehetősen elkötelezett az objektumorientáltság iránt, létezik egy mátrix osztály, és ennek ellenére a használata nem javasolt és deprecated lesz. Lehet, hogy a MATLAB egyszerűen megrontott engem, de én a mátrixokat elég fontos objektumtípusnak tartom ahhoz, hogy megtartsam és népszerűsítsem őket. Nem az az OOP egyik fő értékesítési pontja, hogy a *
különböző dolgokat csinálhat a tömbök és a mátrixok számára? Ebben a tekintetben sok más infelicitás van. (Miért van szükségem egy spsolve nevű parancsra? Nem hívhatom egyszerűen a solve
-t egy ritka mátrixon? És így tovább és így tovább.)
Vannak olyan helyek is, ahol a numerikus ökoszisztéma egy kicsit soványnak tűnik nekem. Például a kvadratúra és az ODE megoldók minimális készletnek tűnnek 2019-ben. AFAICT nincsenek módszerek DAE-khez, DDE-khez, szimplektikus megoldókhoz vagy implicit megoldókhoz, amelyek lehetővé teszik a belső Krylov-iterációkat. Nézd meg az ezekre a függvényekre vonatkozó referenciákat; ezek többnyire 30 vagy több évesek – még mindig jók, de nagyon messze vannak a teljességtől. A Matplotlib csomag egy csodálatos munka, és egy ideig jobbnak tűnt, mint a MATLAB, de 3D-ben még mindig eléggé hiányosnak találom.
Egyes szakértők szerint mély okai vannak annak, hogy a Python kód miért küzd a végrehajtási sebességben a lefordított nyelvekkel. Mulattatnak a “python túl lassú” keresés eredményei. A Python bajnokai sokszor ugyanazokat az érveket/mentegetőzéseket hangoztatják, mint annak idején a MATLAB esetében. Ez nem jelenti azt, hogy tévednek, de többről van szó, mint észlelési problémáról.
Azt hiszem, értem, miért volt a Python olyan izgalmas sok ember számára a tudományos számítástechnikában. Van egy bizonyos MATLAB-szerű szintaxisa és teljesítménye, ami egy REPL-ből elérhető. Nagyszerű eszközök vannak körülötte, és jól játszik más nyelvekkel és a számítástechnika más területeivel. Mindezt ingyenesen és sokkal jobb hosszú távú reprodukálhatósággal kínálta. Nyilvánvaló, hogy sok ember számára jól működik, akik valószínűleg kevés okot látnak a változtatásra.
De azokhoz a dolgokhoz, amiket a tudományos számítástechnikában tudok csinálni, a Pythont sokkal macerásabbnak érzem megtanulni és használni, mint amihez hozzászoktam. Egy darabig nem fogjuk tudni, hogy tovább fog-e söpörni a közösségben, vagy már a csúcsához közeledik. Nincsenek különleges előrejelző képességeim, de én medvés vagyok.
Julia
Juliának megvannak a későn érkező előnyei és hátrányai. Megtapsolom a Julia alkotóit, amiért úgy gondolták, hogy jobbat is tudnának:
Egy nyílt forráskódú nyelvet akarunk, liberális licenccel. A C sebességét akarjuk a Ruby dinamizmusával. Olyan nyelvet akarunk, ami homoikonikus, valódi makrókkal, mint a Lisp, de olyan nyilvánvaló, ismerős matematikai jelölésekkel, mint a Matlab. Valamit akarunk, ami olyan jól használható általános programozásra, mint a Python, olyan egyszerű a statisztikához, mint az R, olyan természetes a karakterlánc-feldolgozáshoz, mint a Perl, olyan erős a lineáris algebrához, mint a Matlab, olyan jó a programok összeragasztásában, mint a shell. Valamit, ami piszok egyszerű megtanulni, de a legkomolyabb hackereket is boldoggá teszi. Azt akarjuk, hogy interaktív legyen, és azt akarjuk, hogy lefordítva legyen.
Nagyrészt úgy gondolom, hogy ez sikerült is nekik. Az 1.0-s verzióhoz vezető út végén úgy tűnt, hogy egy kicsit leértékelték a REPL-t, és volt néhány szinte indokolatlan távolodás a MATLAB-tól. (Pontosan mitől jobb a LinRange
, mint a linspace
?) Ezek azonban apróságok.
Ez az első nyelv, amit használtam, ami túlmutat az ASCII-n. Még mindig indokolatlanul nagy elégedettséggel tölt el az olyan változók használata, mint a ϕ
és az olyan operátorok, mint a ≈
. Ez több mint kozmetika; az, hogy jobban hasonlít az általunk írt matematikai kifejezésekre, igazi plusz, bár ez egy kicsit megnehezíti a tanítást és a dokumentációt.
A Juliában való munka felfedte előttem, hogy a MATLAB választása miatt vettem fel néhány programozási szokást, nem pedig eredendő felsőbbrendűsége miatt. A vektorizáció sok mindenre nem természetes. Szemnyitogató, hogy a Juliában bármelyik függvényt vektorizálhatod, csak egy pontot kell hozzáadni a nevéhez. A mátrix konstruálása egy megértésen keresztül az egymásba ágyazott ciklusokat (vagy meshgrid
trükköket) ehhez képest hibás ostornak tünteti fel, és a mátrix teljes elkerülése egy egyszerű összegzés generátorán keresztül olyan érzés, mintha valamit a semmiért kapnánk. (Tisztában vagyok vele, hogy a Pythonban is vannak hasonló nyelvi jellemzők.)
A többszörös diszpozíció nagy jellemzője néhány dolgot sokkal egyszerűbbé és egyértelműbbé tesz, mint az objektumorientáció. Tegyük fel például, hogy egy hagyományos objektumorientált nyelvben vannak Wall és Ball osztályaid. Melyik osztálynak kell észlelnie egy Ball és egy Wall ütközését? Vagy szükség van egy Room osztályra, hogy bírót játsszon? Az ilyen jellegű kérdések az őrületbe tudnak kergetni. A többszörös diszpozícióval az adatokat objektumtípusokba csomagoljuk, de az adatokkal operáló metódusok nincsenek osztályhoz kötve. Tehát
function detect_collision(B::Ball,W::Wall)
ismeri a típusokat, de tőlük függetlenül van definiálva. Elég sok programozás kellett ahhoz, hogy felismerjem, mennyire érdekes és potenciálisan fontos a többszörös feladás fogalma a nyelv kiterjesztése szempontjából.
A numerikus ökoszisztéma gyorsan fejlődik. Az első számú példám a DifferentialEquations.jl, amit a csodálatos Chris Rackauckas írt. Ha ez a szoftver nem nyeri el hamarosan a Wilkinson-díjat, akkor a rendszer elromlott. Csak menjen fel az oldalra, és készüljön fel a megtérésre.
Még nem láttam a nagy sebességnövekedést a MATLAB-hoz képest, amit a Julia ígér. Részben ez a relatív tapasztalatlanságomnak és az általam végzett feladatok típusának köszönhető, de részben azért is, mert a MathWorks hihetetlen munkát végzett a kód automatikus optimalizálásában. Ez amúgy sem olyan aspektusa a kódolásnak, amire a legtöbbször koncentrálok.
A Julia nyelven való programozással eltartott egy ideig, amíg jól éreztem magam (talán csak öregszem és kikristályosodtam). Többet kell gondolkodnom az adattípusokon, mint szeretném, és mindig ott van az az alattomos gyanú, hogy valaminek a helyes módját kihagytam. De mindennapi használatra mostanában nagyjából ugyanolyan valószínűséggel fordulok a Juliához, mint a MATLAB-hoz.
A lényeg
A MATLAB a vállalati megoldás, különösen mérnöki feladatokra. Valószínűleg még mindig a legkönnyebben megtanulható az alapvető numerikus feladatokhoz. Az aprólékos dokumentáció és az évtizedek óta hozzájáruló tanulási eszközök mindenképpen számítanak.
A MATLAB a tudományos számítástechnika világának BMW szedánja. Drága, és ez még azelőtt van, hogy a kiegészítőkről (eszköztárakról) beszélnénk. Kőkemény, zökkenőmentes teljesítményért és szolgáltatásért fizetsz. Emellett aránytalanul sok gyűlöletet is vonz.
A Python egy Ford pickup. Mindenütt jelen van és sokan szeretik (az USA-ban). Mindent tud, amit csak akarsz, és olyan dolgokra építették, amire más járművek nem képesek. Van rá esély, hogy néha-néha kölcsön akarsz majd kérni egyet. De nem nyújt nagyszerű tiszta vezetési élményt.
Julia egy Tesla. Azzal a merész céllal épült, hogy megváltoztassa a jövőt, és lehet, hogy meg is változtatja. Az is lehet, hogy csak egy lábjegyzet lesz. De addig is stílusosan jut el oda, ahová tart, és méghozzá erőteljesen.