De Perlo al Pitono

Ĉi tiu afiŝo temas pri mia laboro pri la Tekstaro de Esperanto. Ĝi tamen rilatas ankaŭ al PMEG, ĉar la Tekstaron mi ne nur prizorgas, sed ankaŭ mem uzadas. Ĝi fakte estas unu el miaj plej gravaj helpiloj, kiam mi laboras pri PMEG. La afiŝo ankaŭ temas pri Pitono, sed ne pri la serpentospeco (atentu la majusklon en “Pitono”). Ĝi temas pri la programado lingvo Pitono.

La unua programado lingvo, kiun mi lernis, estas Perlo. Mi eklernis Perlon iam en la 1990-aj jaroj, proksimume tiam, kiam mi ekverkis PMEG-on. Perlo estas elstare kapabla lingvo, precipe kiam temas pri traktado de tekstoj: ŝanĝado de teksto, priserĉado de teksto kaj similaj taskoj. Perlo ankaŭ havas, ekde la jaro 2000, tre bonan subtenon de Unikodo. Tial, kiam mi kreis la serĉilon de la Tekstaro en 2002, mi elektis uzi Perlon por la plej gravaj funkcioj de la Tekstaro. La tekstoj en la Tekstaro estas plejparte en Esperanto, sed aperas ankaŭ ie kaj tie vortoj kaj signoj el plej diversaj lingvoj (eĉ en la Ĉina), kaj por tiaj tekstoj oni ne povas uzi ion alian ol Unikodo. Por la bazaj HTML-aj paĝoj, kiujn la uzantoj vidas en la Tekstaro, mi tamen uzas la lingvon PHP, kiu estas iom pli simpla kaj facila, kiam temas pri retpaĝoj. PHP havas tamen tre malbonan subtenon de Unikodo, kion mi forte bedaŭras.

En 2002, kiam mi eklaboris pri la Tekstaro, la lingvo Pitono (“Python”) estis forta rivalo de Perlo, sed ĝi tiam apenaŭ subtenis Unikodon, almenaŭ ne tiom, ke ĝi povus esti uzebla por miaj celoj. Mi jam tiam interesiĝis pri tiu lingvo, sed ĝi tute ne estis matura por tiaj taskoj, kiujn mi bezonis fari per ĝi. En 2008 oni lanĉis tute novan version de Pitono, sub la nomo Pitono 3. Tiu nova versio ekuzis Unikodon kiel sian ĉefan signokodon, kio estis tre bona novaĵo. Mi jam tiam pripensis eklerni Pitonon 3, sed mi rapide konstatatis, ke Pitono 3 estis tro freŝa. Multaj aldonaj moduloj, kiuj estas nemalhaveblaj, kiam oni efektive volas fari ion per la lingvo, ankoraŭ ne estis adaptitaj al Pitono 3, kaj plej multaj programistoj ankoraŭ longe restis ĉe la malnova speco de Pitono. Mi do devis forlasi mian lernadon de Pitono, kaj mi plu uzadis Perlon por la Tekstaro kaj por multaj aliaj tekstoprilaboraj taskoj dum jaroj.

Sed la mondo evoluis. Perlo iom post iom, fakte sufiĉe rapide, perdis sian popularecon. En 2000 oni komencis labori pri tute nova versio de Perlo, nomata Perlo 6, sed tiu laboro ankoraŭ daŭras, kaj Perlo 6 ankoraŭ en 2020 (sub la nova nomo “Raku”) ne estas matura por vera ekuzo. Ĝi eĉ al mi ŝajnas esti plene fiaskinta projekto. La antaŭa versio, Perlo 5, estas plu tute uzebla, sed apenaŭ iu ajn elektas uzi tiun lingvon en novaj projektoj. Krome Perlo 5 ŝajnas hodiaŭ eksdata kaj malmoderna en multaj manieroj. Ĝia maniero uzi objekte orientitan kodon estas tre stranga kaj maloportuna. Ĝia maniero uzi referencojn ĉe variabloj estas vera malhelpaĵo. Mi ankoraŭ hodiaŭ post preskaŭ 30 jaroj da perlumado ĉiufoje stumblas, kiam mi devas fari ion per referencoj, kaj devas rekontroli en manlibro aŭ per Guglo, kiel fari tion, kaj ofte bezonas reverki la saman kodpecon plurfoje, antaŭ ol ĝi funkcias.

Dume Pitono forte populariĝis. Ĝi hodiaŭ ne plu estas ia kurioza rivaleto de Perlo, sed unu el la plej gravaj programadaj lingvoj en la mondo. Krome ĝi estas ege pli racie kaj bonorde strukturita ol Perlo. Lastatempe mi komencis senti, ke estas tempo reprovi lerni Pitonon, precipe ĉar mi iom ektimis, ke Perlo vere mortos, kaj ne plu estos evoluigata. Do, antaŭ kelkaj semajnoj mi decidis ekagi. Mi havigis al mi lernolibron pri Pitono, kaj komencis eksperimenti. Montriĝis, ke la lernolibron mi apenaŭ bezonas. La rimedoj en la Interreto estas pli utilaj. Krome mi lernas plej bone per konkreta uzado, kaj jam post kelkaj tagoj mi komencis provi reverki la ĉefan serĉoprogramon de la Tekstaro per Pitono.

Tiu eksperimento montriĝis ekstreme utila. Mi devis trairi la Perlo-kodon de la malnova serĉoprogramo, kiun mi verkis antaŭ multaj jaroj, por povi rekrei la samajn funkciojn per Pitono. Mi devis pripensi ĉe ĉiu linio, kion la sufiĉe kompleksa kodo efektive faras. Tiam mi trovis plurajn lokojn, kiuj ne estas optimume koditaj, kaj eĉ plurajn spurojn de kodo, kiu faris nenion ajn, aŭ eĉ malhelpis ion. Mi korektis tiujn fuŝojn, kaj kompreneble faris la samon pli ĝuste en la nova Pitona versio. Post kelkaj tagoj la nova programo estis sufiĉe kompleta por ke mi povu ĝin efektive testi farante priserĉojn de la tekstoj de la Tekstaro, kontrolante ĉu la Pitona versio redonas la samajn serĉorezultojn kiel la Perla versio. Kompreneble estis diferencoj, kaj mi devis eltrovi, kio misiras. Tiam mi trovis ne nur erarojn aŭ mankojn en la nova Pitona kodo, sed ankaŭ erarojn kaj mankojn en la Perla versio, kaj aldone eĉ tre subtilajn mankojn kaj fuŝojn en la Tekstaraj tekstoj. Temas pri malglataĵoj, kiujn mi eble neniam trovus, se mi ne farus la Pitonan eksperimenton. Jam duonvoje tra la eksperimento mi povis konstati, ke eĉ se en la fino mi forlasos la Pitonan version de la programo, la eksperimento tamen estas tute inda kaj utilega.

Mi dume ankaŭ ekhavis kelkajn ideojn pri efektivaj plibonigoj kaj kompletigoj. Interalie mi ĵus aldonis pli racian traktadon de eraroj en serĉesprimoj. La serĉado en la Tekstaro okazas per t.n. “regulesprimoj”, kiuj estas kompleksa sistemo de ĵokeraj kodaĵoj kaj aliaj helpiloj por esprimi kompleksan serĉadon de teksto. Eblas tamen krei serĉesprimojn, kiuj nenion povas trovi, ĉar ili estas erare strukturitaj. Antaŭe la serĉilo simple kolapsis senklarige, kiam oni donis al ĝi ion tian. Nun (ekde hodiaŭ!) ĝi bonorde raportas la problemon al la uzanto, kiu povas korekti sian serĉesprimon kaj reprovi.

Ĉiuokaze ŝajnas al mi, ke la eksperimento plene sukcesis. Certe mi devos ankoraŭ multon testi, kaj mi esperas, ke la uzantoj de la Tekstaro helpos min raportante eventualajn problemojn. Sed hodiaŭ mi kuraĝis lanĉi la Pitonan serĉoprogramon kiel laŭvole elekteblan alternativon apud la malnova serĉoprogramo. Kiam mi testis ĝin en mia propra komputilo, ĝi plej ofte estis iomete pli rapida ol la Perla versio, sed ja nur marĝene. Plej grave por mi estas, ke la programa kodo estas pli bone strukturita kaj pli facile komprenebla, kio ebligas al mi evoluigi ĝin pli facile. Temas do pri sekurigado de la estonteco de la Tekstaro.

Pri unu marĝena detalo montriĝis, ke Pitono kondutas en maniero neoptimuma por la Tekstaro. Tio longe mistifikis min, kaj mi eĉ pensis, ke estas grava difekto en Pitono mem. Temas pri serĉado de ne-Esperantaj literoj, kio feliĉe estas ne tre esenca afero por la Tekstaro. Kiam mi uzis la specialan serĉosimbolon “\NE” (por “ne-Esperanta litero”), kaj elektis uzi serĉadon sen atento al la diferenco inter minuskloj kaj majuskloj, la nova serĉoprogramo elsputis tute sensencajn rezultojn. Ĝi subite konsideris la literojn “i” kaj “s” kiel ne-Esperantajn, kvankam la kodo, kiun mi donis al la serĉilo, klare diris ion tute alian! Mi longe rompis al mi la kapon provante kompreni, kio misiras. Mi provis diversajn manierojn traduki la kodon “\NE” al efektiva regulesprimo, sed ĉiufoje la afero fiaskis mizere, kiam mi ne elektis “Atenti usklecon”. Post multe de guglado kaj cerbumado mi finfine eltrovis, kio okazas. Temas pri la fama “turka problemo”. Jes, turka! Oni nomas ĝin tiel, ĉar temas precipe pri la litero “ı” – t.e. “i” sen punkto. La turka uzas du specojn de “i”, unu kun punkto, kies majuskla formo estas “İ” (same kun punkto), kaj alian sen punkto, “ı”, kies majuskla formo estas “I” (sen punkto, kompreneble). Tre racie. Fakte la “i”-oj de aliaj lingvoj estas tute mallogikaj: la minuskla formo havas punkton, dum la majuskla formo ne havas punkton. Sed kiel tio rilatas al priserĉado de la Tekstaro? Montriĝis, ke en serĉado sen atento de uskleco, ĉiuj tiuj kvar “i”-oj egaliĝas. Ne estas tiam diferenco inter “ı” kaj “I”, nek inter “i” kaj “İ”, nek inter “ı” kaj “i”, nek inter “I” kaj “İ”. Kaj sekve, kiam la serĉilo en serĉado de ne-Esperantaj literoj vidas la literon “i”, ĝi vidas en ĝi ankaŭ la literon “ı“, kiu estas unu el la literoj serĉataj per la kodo “\NE”. Simile okazas pri la litero “s”, kiu en sen-uskleca serĉado egalas al la litero “ſ”, kiu estas arĥaika formo de “s” kun propra kodnumero en Unikodo. “ſ” ja estas speco de “s”, precipe en sen-uskleca serĉado, kaj tial ankaŭ ĉiuj “s”-oj aperas en serĉorezultoj, kiam oni uzas “\NE”. Ial Perlo vidas tion tute alie, kaj donas serĉorezultojn, kiuj konvenas por la Tekstaro, ankaŭ sen elekto de “Atenti usklecon”. Mi unue opiniis, ke Pitono agas erare, sed post cerbumado mi devis koncedi, ke ne estas eraro, sed simple alia logiko, kredeble tute oportuna en multaj okazoj. Kaj la aliro de Perlo kredeble estas en multaj okazoj simile nedezirata.

Kion do fari? Ne ekzistas maniero igi Pitonon uzi la logikon de Perlo pri tiaj aferoj. Finfine mi elektis devigi uzon de “Atenti usklecon” ĉiufoje, kiam “\NE” aperas en serĉesprimo. Ĉiuokaze tiu kodaĵo estas akcesoraĵo malgrava en la Tekstara serĉilo. Kredeble malmultaj uzas ĝin, kaj kiam ili iafoje ja uzas ĝin, ili devas simple serĉi kun atento de uskleco. (Mi scias, ke oni apenaŭ uzas ĝin, ĉar dum longa tempo ĝi tute ne funkciis pro programeraro, kaj tiam neniu rimarkis la problemon, aŭ almenaŭ neniu raportis ĝin al mi.)

Tamen, se oni rekte enskribas la turkan literon “ı” (aŭ “İ”), kaj elektas sen-usklecan serĉon, oni ja ricevas nekonvenan rezulton kun trafoj de “i” kaj “I” uzante la novan Pitonan serĉilon. Mi dume allasas tion, ĉar kredeble apenaŭ iu ajn faras tiajn serĉojn. Pri la arĥaika litero “ſ” mi tute ne faras al mi zorgojn. Ĝi ĉiuokaze ne aperas en la tekstoj de la Tekstaro, dum “ı” ja ĉeestas, eĉ 70 fojojn (aŭ 65.529 fojojn, se kredi Pitonon).

Se ne aperos gravaj nesolveblaj problemoj, mi intencas pluiri iom post iom anstataŭigante la aliajn Perlajn partojn de la Tekstara sistemo, esperante, ke Pitono efektive povas fari ĉion, kion mi jam faras per Perlo. Poste mi esperas anstataŭigi ankaŭ PHP-on per Pitono. Tio devas esti sufiĉe facila afero.

Ĉu do ĉio estas perfekta pri Pitono? Ne, tute ne. Ĉiu programada lingvo havas kaj bonajn, kaj malbonajn flankojn. Multajn ĝenas la uzo de spacosignoj en Pitono, sed tio ne estas problemo por mi. Mi ĉiam trovis tion bonega eco de Pitono. La kodo estas pli klara kaj pli facile legebla sen amasoj da kurbaj krampoj kaj punktokomoj ĉie. Sed estas problemoj pri la dokumentado de Pitono. Pro la ekzisto de du specoj de Pitono, Pitono 2 kaj Pitono 3, kiuj estas tre similaj, sed ne interkongruaj, oni facile konfuziĝas, kiam oni serĉas klarigojn pri io. Mi volas uzi nur la novan version 3, sed ĉiufoje, kiam mi serĉas klarigojn, mi devas pene forkribri ĉion, kio temas pri Pitono 2. Ofte oni miksas klarigojn pri ambaŭ specoj en la sama teksto. Kaj eĉ estas ĉiam granda risko, ke oni senintence uzas Pitonon 2 anstataŭ 3. En Linukso (Ubuntu) versio 2 ankoraŭ estas la defaŭlta, kaj oni devas aparte atenti por uzi version 3. Tiel estas, kvankam ekde la 1-a de Januaro 2020 Pitono 2 estas oficiale finita projekto. Oni ne plu evoluigos ĝin. Espereble iom post iom tiu problemo malpliiĝos. Krome iuj moduloj estas tre malbone dokumentitaj. Mi ekz. uzas la modulon “libxml2” por trakti XML-on. Ĝi apenaŭ havas uzeblan dokumentaron. Ĝenerale oni rekomendas alian modulon, “lxml”, por tiaj taskoj. Ĝi kredeble estas bona, sed al ĝi mankas unu grava eblo, kiu estas absolute esenca por la tekstaro. Montriĝis, ke nur “libxml2” bone taŭgas. Sed mi devis multon mem diveni por povi uzi ĝin. Ankaŭ uzo de WSGI (ne petu min klarigi, kio tio estas; mi nur diru, ke estas io simila al CGI) estas tre ĥaose (kaj iafoje malĝuste) klarigita. Mi devis multe eksperimenti por funkciigi tion. Nu, ankaŭ pri Perlo iafoje okazis simile.

Se vi sukcesis legi ĝis ĉi tie, vi kredeble mem estas programisto. Espereble vi trovis ion interesan en mia rakonto. Al ĉiuj aliaj mi povas nur gratuli pro via pacienco. 🙂

Unu penso pri “De Perlo al Pitono

Respondi