Terugblik naar Gambas3 in 2019

Nu er hier en daar wat stiltes vallen, is het een goed moment om de tekst eens te bekijken die de programmeur van Gambas, Benoît Minisini scrhreef naar aanleiding van het verschijnen van een nieuwe Gambas versie…

Gambas 2019 overzicht

De programmeertaal Gambas heeft vorig jaar achter de schermen een grote verandering ondergaan. De compiler van de programmeeromgeving is volledig herschreven.

In januari 2019 schreef Benoit Minisini een artikel voor de Franse linuxfr.org website. Het artikel sijpelde door omdat er naar verwezen wordt op de documentatiewebsite van gambas op gambas.sourceforge.net. Het kan beschouwd worden als een vervolg voor een stukje dat hij schreef in 2012 naar aanleiding van het verschijnen van Gambas 3.3, en dat ook op die site te vinden is. Ps: Sinds eind 2019 is Gambas aan versie 3.14.x., de zogenaamde versie “Pi”.

Gambas 3.12

Gambas is een programmeertaal die object oriented werkt en gebaseerd is op een basic-achtige interpreteerder. En het is ook een volledige IDE of programmeeromgeving met ondermeer een compiler, een interpreteerder, een verzameling van modules die complementair gebruikt kunnen worden, en een geïntegreerde programmeeromgeving. Het geheel wordt verspreid onder de GNU GPL v2 licentie.

Een nieuwe compiler

De grootste verandering bij de stap naar versie 3.12 is het afscheid van de oude compiler, die gebaseerd was op LLVM.
De API van LLVM voor het maken van code is een aantal jaar geleden veranderd van versie LLVM 3.5 naar LLVM 3.6. Hoewel het cijfer een kleine versiesprong aangeeft, blijkt LLVM 3.6 niet compatibel met de vorige versie, wat mogelijk de programmeur van Gambas ooit frustreerde, een probleem waar hij nu definitief van verlost wil zijn.

De nieuwe compiler is van het type “in vliegende vlucht” of in het Engels “on the fly” of ook wel “Just In Time”, met de bekende JIT afkorting.

De compiler vertaalt de bytcode van Gambas (in C) tijdens het uitvoeren, en gebruikt vervolgens de compiler van het systeem (meestal gcc of clang) om verder te vertalen naar de uiteindelijke machinetaal. Vladimir Makarov van de programmeertaal Ruby moet ongeveer dezelfde ideeën gehad hebben, en die zijn toegepast in versie 2.6.0 van de programmeertaal Ruby. (www.ruby-lang.org/en/news/2018/12/25/ruby-2-6-0-released/).

Deze methode heeft een nadeel: ze is trager dan de vroegere compiler. Maar ze heeft het grote voordeel niet afhankelijk te zijn van de API van de soms minder betrouwbare aanwezige C compilers. In tegenstelling tot de vroegere compiler neemt de programmeertaal nu de zaak helemaal in eigen handen. Meer nog, er kunnen nu bepaalde testen uitgeschakeld worden om aan snelheid te winnen. Maar daarbij stijgt dan het risico op het crashen van het programma, bijvoorbeeld door een onmogelijke deling door nul.

Door het gebruik van de nieuwe compiler doken er kleine probleempjes op na het verschijnen van 3.12, maar die werden de daaropvolgende weken snel gerepareerd in versies 2.12.1 en 3.12.2.

Webapplicatie met grafische interface

Een andere grote ontwikkeling van Gambas 3 is de mogelijkheid om web-applicaties te maken vanuit de programmeeromgeving, alsof je een klassiek desktop programma maakt.

Nieuwe component en gebruik van de programmeeromgeving

Die nieuwe mogelijkheid is gebaseerd op een nieuwe component “gb.web.form”, die kan omgaan met javascript notering, JSON formaten en URL methodes. Met “gb.web.form” krijg je een extra form, de WebForm. Dit type van Forms dient om de grafische schermen te definiëren die in je webapplicatie gebruikt gaan worden. Ze kunnen overeen komen met klassieke html pagina’s of dialoogvensters. De component biedt dan verschillende grafische controle-elementen om te gebruiken op je Form.

(hier een voorbeeld van zo’n form: op linuxfr.org)

Werking

Het principe van een webapplicatie verschilt grondig van een typische “Modale” toepassing. De webapplicatie wordt gecompileerd tot een cgi script dat daarna draait op de server, en niet op de desktop van de gebruiker.
De browser van de gebruiker dient als interface, een soort grafische terminal. Html wordt de beschrijvig van de interface.
Er wordt zo weinig mogelijk javascript gebruikt. De handelingen van de gebruiker worden onder de vorm van http/xml requests naar het programma op de server gestuurd. Die antwoordt met de nodige javascript code om de pagina te verversen. De toestand van de grafische interface van de gebruiker wordt bewaard in de sessie van de browser. Dat is natuurlijk veel trager dan webapps die voornamelijk in de browser draaien, en het biedt minder mogelijkheden, maar het werkt toch vrij goed.

(een voorbeeld van zo’n form op linuxfr.org)

Voor gambas ontwikkelaars heeft dat bovendien het voordeel dat ze kunnen werken voor een platform dat verschilt van hun eigen Linux computer, denk aan collega unix-achtige Mac, waar spijtig genoeg geen gambas op draait.

Welkom, Git

Er zijn ook wijzigingen in de ontwikkeling, het programmeren van gambas zelf. De programmeurs van gambas zijn overgeschakeld van het subversion systeem van Sourceforge op het Git broncodebeheer systeem. De referentieversie van de ontwikkelaars vind je nu op gitlab.com.
De hoofdontwikkelaar gebruikte een jaar en een half git om het te proberen, en hij vindt het krachtiger, sneller, gemakkelijker, en betrouwbaarder. Er is letterlijk niets tegen in te brengen.

Ook de mailinglist is overgebracht van SourceForge naar een prive-server die door een gambas gebruiker beheerd wordt.
Het systeem om foutmelding te beheren, de bug-list, wordt al langer beheerd met een eigen programma dat in gambas geschreven is, en draait op de server van de werkgever van de hoofdprogrammeur.
Nu zit enkel de hoofdwebsite nog op SourceForge, maar ook daar zal verandering in komen.

Nieuwe systemen

Er zijn naast GNU/Linux op x86 steeds meer andere systemen waarop gambas compileren al lukt :
FreeBSD
NetBSD
GNU/kFreeBSD
Cygwin

(maar dat betekent niet dat de hele IDE daarop draait zoals op Linux)

En de hardware breidt uit naar ARM, ARM64, PowerPC64.

Er werden ook aanpassingen gedaan voor Hurd.

Software platform

Gambas heeft ook een eigen platform om programma’s te publiceren die in gambas zijn geprogrammeerd. Je kan er gambas programma’s op publiceren en van afhalen. Dat kan van in de programmeeromgeving; je kan er de lijst van programma’s zien, filteren op categorie, en de programma’s installeren en de-installeren in je werkomgeving. En natuurlijk kan je je eigen project er aan toevoegen. Ook de voorbeeldprogramma’s die vroeger bij de IDE zaten, zitten nu in dat online systeem. De ontwikkelaar noemt het de “Logithèque Gambas”.

Programmeeromgeving

De IDE of geïntegreerde programmeeromgeving, het programma waarin je werkt om gambas programma’s te schrijven, is ook verbeterd, meer bepaald de beeldbewerkingsmodule. Die liet toe zeer eenvoudige pixelbewerkingen te doen, maar is nu volledig herschreven en kan nu veel meer:
Er is nu
– mogelijkheid voor meervoudige selectie.
– booleaanse operaties op verschillende selecties, dank zij een nieuwe component, gb.clipper (waarover later meer).
– rotatie en uitrekken en verdubbelen van selecties.
– selecteren via een toverstaf
– kleurbalans, helderheid, doorzichtigheid.
– kleurenpallet, kleurverzadiging, een kleur omzetten naar transparant
Kortom, het is een kleine gimp geworden.

Intrede van gitlab

De ingebruikname van Git heeft ook gevolgen voor de grafische interface, die vroeger enkel mogelijkheden had voor Subversion. De interface is dus aangepast om ook Git te kunnen gebruiken, tot en met de git branches. Maar niets gaat boven het gebruiken van de commandolijn voor het gebruik van git, want het programma heeft zoveel mogelijkheden die je niet allemaal kan uitwerken in de grafische interface.
Er is een Git menu bijgekomen met onder het menu Publier, Synchroniser, Annuler tous les changements, Tout ajouter au référentiel, en Branche, wat de andere takken toont. Je kan het je als programmeur niet beter wensen! Bij het gebruik van de commando’s via het menu krijg je een venster met de output van git, zoals je die normaal zou zien op de commandolijn.

Apart bestand openen

De programmeeromgeving kan nu gebruikt worden om een apart bestand te wijzigen, zonder dat je er een project voor moet openen. Je kan dus snel een beeldbestandje openen, of een SQLite database aanpassen. (ps Ik zie niet direct veel verschil met vroeger, want in Gambas 3.9.2 kon dat ook al)
Bij het starten van Gambas3 kan je kiezen voor Open Bestand, en dan krijg je bv alleen het tekenprogramma als je een pixel bestand hebt gekozen. Het lijkt op de File, Open file (Bestand, Open bestand…) die je kan doen als je in een project staat, maar dan komt dat bestand in de lijst bij de bestanden van je project te staan onder “File”, en je krijgt hem er niet zo snel weer weg (tip: delete verwijdert effectief het oorspronkelijke bestand!)

Modellen

Het venster om een project te openen is herzien: het baseert zich nu op een lijst van modelprojecten. Die lijst is naar hartelust uitbreidbaar. Het volstaat een nieuw project te maken in de verborgen map ~/.local/share/gambas3/template/ en dat zal mee opgenomen worden als nieuw modelproject. Standaard lijkt die leeg te zijn.

Gambas Lettertype

Er is nu een eigen lettertype voor Gambas beschikbaar. Als je wil kan je het installeren vanuit Gereedschap, voorkeuren, Letterypen (Tools/Preferences/Fonts). Met een knop wordt dan dat lettertype geinstalleerd in je persoonlijke map. Het bestaat uit Gambas9 en Gambas10, en van beiden een vet (bold) versie. Het zijn dus bitmap lettertypes met 9 en 10 punt groote. Het lettertype bevat heel wat unicode tekens, en hoewel niet helemaal volledig, toch bruikbaarder dan heel wat andere bestaande bitmap lettertypes.
Het standaard lettertype voordien hangt af van bv je distributie; bij Ubuntu zal dat bv “Ubuntu,11” zijn, in KDE “NotoSans,10”, enz (of ik zou ze daarnaartoe veranderd kunnen hebben).

Diverse verbeteringen

Een greep:
– mogelijkheid om een breakpoint te de-activeren
– gebruik van bestanden met het patch formaat
– de maker van de packages beheert nu de applicatie los van de grafische toolkit.
– automatisch aanvullen van de naam van bestanden
– de gewijzigde bestanden zijn automatisch bewaard bij het crashen van de programmeeromgeving
– het venster van het openen van een project is herzien
– de online hulp is te downloaden vanuit het opties menu voor offline gebruik
– de compressie van javascript bestanden en CSS is verbeterd
– PNG bestanden kunnen automatisch versleuteld worden indien het hulpprogramma pngquant aanwezig is. (ps: pngquant kan gemakkelijk bij-geïnstalleerd worden met apt get of via online zoek bij de paketten van je distributie, zoals software.opensuse.org; pngquant is a command-line utility and a library for lossy compression of PNG images)
– het beheer van donkere thema’s is aanzienlijk verbeterd
– het beheer van de sessies is onder handen genomen
– de interface van de debugger is herzien
– er is een venster voor het ingeven van speciale tekens
enz.

Toegang tot databanken

Het systeem voor de toegang tot databanken is verbeterd:
– de verbindingen gedefineerd in de instellingen van de programmeeromgeving zijn bereikbaar bij het uitvoeren van het programma, en de wachtwoorden die bewaard zijn in de portefeuille van de desktop kunnen automatisch gebruikt worden.
– de collation van de databankvelden wordt nu beheerd en worden in aanmerking genomen volgens het type van de onderliggende databank
– een klasse SQLrequest is toegevoegd, die toelaat om een SQL-request te maken die automatisch rekening houdt met de verschillen in syntax tussen de database systemen.
– de eigenschap Connection.LastInsertId laat toe om de laatste waarde van een toegevoegd record te krijgen bij een automatisch voortnummerend veld.
– de component gb.db.mysql laat toe sneller met mysql databanken te werken dankzij een interne cache van de meta-data.
– de component gb.db.sqlite3 laat toe met SQLite 3 databanken te werken en is volledig herschreven in C; ze is nu betrouwbaarder, sneller, gebruikt minder geheugen.
– de component gb.db.odbc kan nu een string verbindingsgegevens met ODBC ontvangen als hostname van de datanbank
– de component gb.db.form die grafische controle-elementen voorziet voor gebruik met databanken heeft een aantal verbeteringen gekregen.

Anderzijds biedt de databankbeheerder van de ontwikkelomgeving nu de mogelijkheid om de struktuur van een databank te bewaren bij het project. Deze struktuur kan nadien gebruikt worden bij het uitvoeren van het programma om automatisch de databank te maken (bij eerste gebruik) via de methode Connections.create().

De tekstverwerker component

De tekstverwerker met kleurcodering voor het programmeren is volledig herschreven in Gambas. Hij is geïmplementeerd in de nieuwe component gb.form.editor. Die tekstverwerker biedt alle mogelijkheden van de oude tekstverwerker, en brengt de volgende nieuwigheden:
– schuifbalken met vooruitzicht op de tekst (een beeld toont waar in de hele tekst je bent).
– automatische aanvulling van de aanhalingstekens; als je ze opent wordt er onmiddellijk een sluit-aanhalingsteken gezet. Ook voor het automatisch sluiten van haakjes en strings.
– meer kleuraanduiding voor de syntax
– automatische lijnoverschrijding (line break)
– smooth scroll
– duidelijk maken van de huidige controlestruktuur
– oplichten van de huidige zoekgeschiedenis

En aangezien de tekstverwerker geschreven is in Gambas, kan je hem gebruiken in GTK+ applicaties.

Terminal emulator component

De nieuwe component gb.form.terminal implementeert een terminal emulator controle, compatibel met de VT-100, volledig geschreven in Gambas. Hij laat toe aan de programmeeromgeving om de uitvoer van een programma dat draait, weer te geven in een echte terminal. (ps: ik denk dat deze uitvoer vroeger al onderaan het scherm voorbijrolde in een soort commandolijnbox)

Toegang tot kaarten

gb.map is een nieuwe component die toelaat om kaarten te gebruiken in een vierkantjespatroon, van OpenStreetMap, Google, Microsoft Earth en anderen.

De component biedt een klasse Map die een kaart voorstelt; met de mogelijkheid er een aantal vektoren bovenop te leggen. Hij biedt ook een controle MapView die zorgt voor de weergave van de kaart en die muisbesturing toelaat. De omvormingen tussen de verschillende projectiesystemen en de coördinaten worden beheerd door het hulpprogramma cs2cs van het project Proj.(ps: https://proj.org/apps/cs2cs.html)

Voorbeeld:

Public Sub Form_Open()
MapView1.Map.AddTile("OpenStreetMap", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", Null).Copyright ="© OpenStreetMap contributors"
'
' Centrer sur Paris
MapView1.Map.Center = MapPoint(48.866667, 2.333333)
MapView1.Map.Zoom = 5
'
End

Componenten Grafische interfaces
Grafische toolkits

Gambas gebtuikt altijd de grafische toolkits van Qt en GTK+, en biedt een identieke API voor de componenten van de twee toolkits, wat toelaat om een grafische toepassing te maken die op eender welke van de twee toolkits kan draaien. Een nieuwe component Qt5 (gb.qt5) gebruikt de bibliotheken van Qt5, terwijl een nieuwe component gb.gtk3 de bibliotheken van GTK+3 aanspreekt. Er zijn dus ondertussen vier grafische componenten die allemaal dezelfde grafische interface gebruiken in de programmeeromgeving.

Andere grote wijzigingen zijn:

  • – de standaard API voor tekenen is nu de klasse Paint, die implementeert een model gelijkaardig aan dat van Cairo; de functies om tekst op een lijn te zetten en schaduwen te maken zijn toegevoegd, alsook enkele nuttige tekenhulpmiddelen.
  • – vensters met alfa-componenten worden nu ondersteund
  • – de oude tegen-API GTK+ 2 is achtergelaten, en Cairo wordt overal gebruikt bij de GTK component.
  • – desktop sessies worden nu ondertsteund, de eigenschap Application.Restart laat toe om het commando te bepalen dat wordt uitgevoerd door de sessiebeheerder om de toepassing terug op het bureaublad te zetten bij het starten van het bureaublad.
  • – de ondersteuning van meer schermen is verbeterd (de dialoogvensters moeten verschijnen en centreren op het scherm van hun ouder-venster).

Frustratie no2

Iedere nieuwe subversie van GTK+ 3 bevat de onprettige verrassing om een deel van de softwarebibliotheek niet meer te zien werken. Het ging zover dat sommigen me hebben aangeraden om ze maar helemaal uit Gambas weg te laten.
Ik denk dat GTK+ 3 de slechtste softwarebibliotheek is die ik ooit heb moeten gebruiken, door de afwezigheid van terugwaartse uitwisselbaarheid.
Wat ik hoop: dat GTK+ 3 in werkelijkheid een doorlopende beta versie is van GTK+ 4, en dat in de toekomst alles in orde komt.

Herschrijven van de controle-objecten in Gambas

Heel wat interne controle-objecten zijn herschreven in Gambas, en werken dus op dezelfde manier in Qt of in GTK+. Ze zijn uitgevoerd in een nieuwe component gb.gui.base, die dient als basis voor alle code die in Gambas geschreven is en die gemeentschappelijk is voor alle grafische toolkits

Dankzij dat herschrijven en die doorgedreven gemeenschappelijke basis, is het mogelijk geworden om de volgende functies uit te voeren: afgedekte vensters vertonen nu schaduw binnenin, en ondersteunen nu een vloeiende afdekking.

Toevoeging van vele nieuwe controle-elementen:

  • – ColorPallette: een keuze uit kleuren van een kleurenpallet.
  • – DirBox: een tekstveld gekoppeld aan een mappenkeuze (nota: met een delete knopje voor het tekstveld).
  • – DocumentView: een controle-element die toelaat elk type document te tonen
  • – FileProperties: een controle-element dat de eigenschappen en de grootte van een document laat zien; de grootte wordt berekend in de achtergrond.
  • – FontBox: een tekstveld gekoppeld aan een lettertype kiezer.
  • – ImageView: laat toe een beeld te tonen met verschillende zoom-waarden.
  • – ListEditor: laat toe een lijst van elementen te wijzigen en opnieuw te sorteren.
  • – MessageView: een berichtenvenster dat automatisch verschijnt en verdwijnt.
  • – SliderBox: het samenbrengen van een Slider en een SpinBox, gelijkaardig aan wat bestaat in Gimp.
  • – Spinner: het tonen van een wacht-animatie in een vorm die ronddraait
  • – Spring: een map die uit een Panel spring, waarvan de eigenschap Expand True moet zijn.
  • – SwitchButton: een aan/uit knop

Beheer van de iconenbalk op de desktop

Het beheer van de iconenbalk is herzien. Het maakt gebruik van het DBus protokol van freedesktop.org als dat gevonden wordt. Daarbij maakt het automatisch gebruik van gb.dbus.trayicon. Anders, en zolang het ondersteund is door de desktop, blijft het X11 protocol gebruikt worden.

Frustratie 3

De ontwikkelaars van KDE, Gnome, en Unity zijn erin geslaagd om een gemeenschappelijk protocol DBus te gebruiken voor een iconenbalk. En die dan ieder op zich in een onderling niet uitwisselbare manier uit te voeren.

Daardoor werkt de iconenbalk via DBus enkel met KDE. Voor de anderen werken er sommige dingen wel, andere niet.

Eigen iconen

De component gb.form.stock biedt twee sets van iconen aan voor Gambas; één in monochrome of zwart-wit, de andere in kleur. Ze bestaan uit beeldjes van 32 op 32 beeldpunten, die automatisch worden uitgerokken naargelang de noden. Deze set iconen laat toe een toepassing te schrijven die niet afhangt van de iconen die al dan niet op het desktopsysteem aanwezig zijn.

Multimedia componenten

De component gb.media is momenteel gebaseerd op GStreamer 1.0. Zijn stabiliteit is grotendeels verbeterd, zelfs als alles nog niet perfect is, door -ondermeer- de breekbaarheid van de GStreamer API.

De volgende functionaliteit is toegevoegd:

  • – capsfilter is toegevoegd met filters voor Multimedia formaten.
  • – opvang van signalen die worden uitgestuurd door de GStreamer pijplijn.
  • – al lopend videobeelen opnenmen
  • – opvang van het laatste beeld van een pijplijn
  • – de mogelijkheid om twee stromen van multimedia samen te voegen in een ketting zonder knipwerk.
    Bovendien is er een nieuwe component gb.media.form die voorziet in een eenvoudige multimedia lezer in de vorm van een grafisch controle-element.

Scannergebruik

gb.scanner is een nieuwe component die als een omhullende werkt voor het programma scanimage van het SANE project.

Het nemen van een beeld gaat als volgt:

dim hImg as Image
hImg = Scanners["hpaio:/net/HP_LaserJet_MPF?ip=192.168.1.25"].Scan()

Alle opties van scanimage zijn bereikbaar via de eigenschap Option van ieder Scanner object. De mogelijkheid om meer pagina’s te scannen is voorzien via de asynchrone mode.

Netwerk component

En verder veel foutcorrecties aan de netwerkcomponent gb.net, zoals:
– de component gb.net.smtp, die het protocol SMTP beheert, is volledig herschreven in gambas. Hij is veel betrouwbaarder, en laat authenticatie als PLAIN en CRAM-MD5 toe, alsook SSL en TLS;
– de component gb.web.curl regelt nu het ftps:// protocol. Hij beschikt over een klasse HttpForm om gemakkelijk http pagina’s te kunnen verzenden, en een klasse DownloadManager om verschillende vormen van asynchrone downloads te beheren.
– gb.web.feed is een nieuwe component om de RSS stromen te beheren.
– gb.httpd is een nieuwe component die een eenvoudige HTTP webserver levert, en die wordt gebruikt door de ontwikkelomgeving om webapplicaties te debuggen die ontworpen zijn met de componenten gb.web of gb.web.form.

Multi-precisie berekeningen

De nieuwe component gb.gmp brengt Gambas de mogelijkheid om gehele getallen en rationele getallen te behandelen met een willekeurige precisie. Dit is gebaseerd op de bibliotheek van GNU: GNU multi-precision library. Het aantal getallen na de komma is enkel beperkt door de capaciteit van het systeem waar de berekening op draait.

https://gmplib.org

(Een voorbeeld is opgenomen in het origineel document)

Hulpcomponenten:

Twee componenten werden toegevoegd:
1. De eerste, gb.util, hergroepeert de methodes en praktische extenties van de interpreter.
– lezen van CSV bestanden.
– omzetten van datums van het Unix formaat of RFC822;
– berekening van de datum van Pasen.
– functies voor de creatie, verplaatsing en verwijdering van intelligente mappen.
– afstand tussen twee tekenreeksen volgens Damerau-Levenshtein
– tekst uit een stuk html halen
– uitfilteren van dicritische tekens
– omzetten van phonetisch (voor de Franse taal)

De tweede, gb.util.web, hergroepeert de methoden die nodig zijn voor het programmeren voor het web:
– omcoderen naar javascript
– de stroom van JSON coderen en decoderen
– URL verwerking

Andere nieuwe componenten

– gb.args is ee nieuwe component die dient voor het analyseren van de argumenten die meegegeven worden op de commandolijn vanaf hun beschrijving.
– gb.clipper is ee nieuwe component die gebaseerd is op de Clipper bibliotheek.
– gb.data implementeert nu de heap en PATRICIA boomstrukturen en een interface voor grafiekmanipulatie.
– gb.memcached is een nieuwe component die een memcached client implementeert (key-value db cache).
– gb.openal is een nieuwe component gebaseerd op de audio 3D bibliotheek OpenAL (OpenAL Soft waarschijnlijk, 3D geluid voor games en andere toepassingen)
– gb.openssl is een nieuwe component die een interface biedt voor versleutelingsfuncties van de libcrypto bibliotheek van het OpenSSL project
– gb.inotify is een nieuwe component die toelaat de mappen van het systeem in het oog te houden; het is gebaseerd op de inotify interface van Linux.
– gb.markdown is een nieuwe component die een lichtere vorm aanbiedt van de Markdown syntax.
– gb.report is vervangen door een nieuwe component gb.report2, die ook een verbetering is.
– gb.sdl2 en gb.sdl2.audio voorzien nu de SDL2 bibliotheek.
– gb.term is een nieuwe component die toelaat unix terminals te gebruiken, dichtbij wat het besturingssysteem aanbiedt.

Verbeteringen aan de taal

Nieuwe schrijfwijze (syntax)

– If … Then … Else … kan nu op 1 lijn gezet worden.
Match is een nieuwe operator die een vergelijking mogelijk maakt met een model (pattern matching), waarvoor het de bibliotheek gb.pcre gebruikt
– .[xxx] en !xxx zijn twee nieuwe afkortingen voor bewerkingen op arrays, te gebruiken binnen een struktuur van With … End With.
– het symbool … kan gebruikt worden om alle optionele argumenten van één functie naar een andere functie door te geven.
– numerieke constanten mogen in de octale notatie geschreven worden als &Oxxx (dus beginnend met de hoofdleter O);
– lokale variabelen mogen nu eender waar in de loop van een functie gedeclareerd worden, maar hun bereik blijft altijd beperkt tot die functie.
– het is nu mogelijk om variabelen van een lusstructuur te declareren bij het begin van de lus bij For en For Each, bv: For i As Integer = 1 To 100;
– het is nu mogelijk om onbeperkte toegang te hebben tot strings met arraybewerkingen.
– de compiler genereert een waarschuwing voor iedere lokale of globale variabele die niet geïnitialiseerd werd.

Nieuwe functies

– IsMissing() laat toe om de afwezigheid te checken van optionele argumenten
– Rand() geeft een pseudo willekeurig geheel getal
– System.Log() laat toe om in het systeemjournaal te schrijven (het is een interface van de syslog API van libc)
– Url() en FromUrl() laten toe om URL’s om te zetten.
– Move … Kill … laat toe om een bestand te verplaatsen en daarbij de atomaire bestemming te onderdrukken, onmisbaar bij het werken met processen die tegelijkertijd in hetzelfde bestand mogen schrijven.
– Assert laat toe om assertions (veronderstellingen) in de code te steken die het programma stoppen in geval van crash, ze worden niet gecompileerd tot het moment dat je een uitvoerbaar bestand genereert.

Correctie van de tijd-functies

De organisatie van de functies voor datum en tijd vertoont nu meer samenhang. Er is nu een duidelijke verdeling tussen functies die de lokale datum/tijd interpreteren en die met de universele UTC werken. Meer bepaald zijn nu de functies CStr() en CDate() nu uitwisselbaar, zoals het had moeten zijn van in het begin; het heeft wel de kost dat dit niet achterwaarts compatibel is.

Optimalisaties

– de functie Split() is sneller geworden
– de toegang tot arrays en collecties zijn sneller geworden, de benchmark voor “sort” is 25% verbetered.
– het grootste deel van de methodens Find() en Exist() voor arrays zijn sneller.
– de instructies Input en Line Input zijn sneller
– de omzettingen naar het type Boolean, en van of naar het type Variant zijn sneller.
– de ongelijkheidsoperatoren zijn sneller
– de functies Dir() en RDir() zijn nu 20 tot 40 procent sneller dankzij het gebruik van fstatat(), en door minder aanroepen naar stat() dan de intelligente gok van het aantal vaste linken naar de huidige directory facultatief maken.
– zoeken binnen een string is nu gemiddeld ongeveer vier keer zo snel.
– lussen met een variabele van het type integer zijn nu 5 procent sneller

Snelheidstesten

Hieronder de resultaten van een reeks van zes “benchmarks” die bestaan uit zes programma’s, geschreven in Gambas, Perl, en Python, waarvan de bron hier beschikbaar is (https://gitlab.com/gambas/gambas/tree/master/benchmark).

De gebruikte versies van de verschillende talen zijn:

Python 2.7.1.5rc1;
Perl 5.26.1;
Gambas 3.11.90 (ontwikkelversie van 2 november 2018)

Ze zijn uitgevoerd op een systeem met Ubuntu 18.04 met de Linux kernel 4.15.0-38-generic.
De tijden voor het uitvoeren van het programma zijn in seconden weergegeven.

… (op linuxfr.org staat een tabel met de resultaten)

───────── ───────── ───────── ──────────── ────────────────────────
Python Perl Gambas Gambas + JIT Gambas + JIT
(exécution uniquement)
─────────── ───────── ───────── ───────── ──────────── ────────────────────────
sort 3,93 6,36 4,76 0,84 0,25
polynom 9,94 13,40 8,04 0,84 0,75
primes 6,29 7,65 2,99 0,77 0,61
nbody 4,54 4,55 4,03 0,68 0,29
mandelbrot 5,34 4,24 3,06 0,22 0,10
string 8,94 1,81 1,41 1,49 1,40
─────────── ───────── ───────── ───────── ──────────── ────────────────────────

In vergelijking met de vorige testen kan men vaststellen dat er veel moeite gedaan is om de recente versies van er en Python te optimaliseren. Desondanks blijft Gambas aan kop staan in alle testen, behalve voor sort, waar Gambas na Python komt.
Men kan vaststellen dat de voordelen van een compilatie “in vliegende vlucht” ligt in de optimalisatie van de berekeningen, en dat die geen enkel merkbaar verschil oplevert in de behandeling van lettertekens (strings).

Conclusie

Er is de laatste 6 jaar veel werk uitgevoerd geweest, maar er blijft ook nog veel werk te doen:

  • – zelfs als Wayland nog altijd niet klaar is (integenstelling tot wat voorspeld was), zou er toch over gedacht moeten worden om het eventueel te overwege;
  • – aangezien Gambas ook werkt op ARM zou het goed zijn om te komen tot een werkende gambas op Android; er heeeft niets bewogen op dat gebied sinds vorig overzicht;
  • – de component gb.web.form verdient doorgedreven aandacht als de beste methode om web applicaties te maken in Gambas.
  • – het zou zonder twijfel interessant zijn om een andere taal dan BASIC te implementeren in de compiler.

Behalve enkele irritaties, die in de praktijk te maken hadden met vele verloren uren, te wijten aan (de fouten van anderen) bepaalde op te lossen problemen :-), kijken we met voldoening naar de evolutie van de taal. De mensen die ze gebruiken schijnen zelden teleurgesteld te zijn. Laat ons dus hopen, dat het jullie ook bevalt als jullie het uitproberen.

(En dan wenst hij nog een goed jaar aan alle gebruikers en ontwikkelaars van vrije software)

 ps: Dit is mijn eigen vertaling. Origineel in het Frans verscheen ondermeer op https://linuxfr.org/users/gambas

This entry was posted in Gambas3. Bookmark the permalink.