Använda C++ som ett skriptspråk
En varning: För att förstå något av det här inlägget så behöver man ha en del förståelse för hur c++ fungerar. Man behöver också ha tålamod med min för tillfället bristande pedagogik.
Har du också hört att det inte går att använda C++ som ett dynamiskt skriptspråk? Att man måste starta om sitt program för att kunna använda koden som man just skrivit? Tänk om det inte var så. Tänk om du kunde skriva din högpresterande C++-kod i en textruta och få den att köra direkt och interagera med ditt program direkt. Eller tänk om du skulle vilja ha en server igång som dynamiskt laddar in enstaka moduler allt eftersom de skrivit uppdateringarna till dem. Eller tänk om du har en spelmotor där du justerar parametrar och inte vill starta om din redigerare för att testköra.
Det här konceptet kallas av vissa för realtime C++ (ej att förknippas med realtidsprogrammering som är något helt annat). Det är ett koncept som har många användningsområden, men som inte helt spritt bland de flesta utvecklare. Det kallas också i vissa sammanhang också för Hot reloading
Hur går det till?
När man som programmerare vill använda kod som någon annan skrivit så har man ett antal alternativ. Har man tillgång till källkoden så kan man såklart lägga in den i sitt program, har man tillgång till ett statiskt bibliotek så kan man inkludera den när man bygger.
Men om man inte vill att biblioteket ska inkluderas i sin helhet i programmet så kan man välja att länka till det istället. Man kan då, ladda in det när programmet startas.
Man kan göra det här om man exempelvis inte vill kompilera biblioteket själv, men man kan också göra det för att det är bibliotek många program använder. Genom att flera program delar gemensamma bibliotek minskar man hur mycket hårddiskutrymme som behövs för att lagra bibliotket och hur mycket RAM som behövs när det laddas.
De har biblioteken kallas för delade bibliotek och sparas i linux med filändelsen .so
och i nischade operativsystem som ingen borde använda som windows med filändelserna .dll
och tillhörande .lib
som används vid kompilering.
Vi kan ta biblioteket OpenGL som exempel. (OpenGL är egentligen inte ett bibliotek utan ett en beskrivning för hur man ska skriva ett grafikbibliotek, men vi låtsas att det är ett bibliotek för enkelhets skull.)
I linux finns det (åtminstone) en fil som kallas för libGL.so
som innehåller logiken för att rendera grafik i ens program. När man ska använda libGL
så kan man antingen länka vid kompilering (vilket inte är rekommenderat längre, av olika anledningar) eller ladda in biblioteket när ens program startat.
Om man inte använder sig av några häftiga bibliotek som glew
eller glad
så kan man använda sig av funktioner som operativsystemet tillhandahåller. I Linux finns det en funktion som heter dlopen
för att läsa in ett delat bibliotek, och sen dlsym
för att få ut pekare till de funktioner som man vill använda. I andra operativsystem finns motsvarande funktionalitet. Man kan om man är en grottmänniska till exempel använda dlsym för att läsa in glVertex3f
och andra OpenGL-funktioner som man vill använda i biblioteken.
Men vad är nytt med detta?
Det vanliga är att man som ovan laddar in de delade bibliotek som man vill använda vid programmets uppstart. Men om man istället väljer att kompilera om biblioteket och ladda in det dynamiskt så kan man åstadkomma ovanliga saker som att ladda om delar av sitt program när det ändras.
Och det var där som jag fick användning för det. När jag utvecklade delar av min spelmotor så ville jag inte behöva starta om hela spelet för att ses små ändringar som jag gjort och där passade det här mönstret in bra.
Varför är det inte vanligare?
Den naturliga frågan är ju varför inte alla håller på med realtime C++ om det är så enkelt och användbart. Jag tror att den enkla anledningen är för att det oftast går bra ganska bra utan. Om vi tar spelmotorn Unreal Engine som ändå er en ganska stor best och tar flera sekunder att starta om efter att man ändrat något i källkoden så är det fortfarande inte ett tillräckligt stort problem för att de flesta ska bry sig om det.
Ska man vara krass så försöker de flesta utvecklare (och övriga människor också) oftast att bara få saker gjort oavsett om det går snabbt eller långsamt.
En annan anledning är nog helt enkelt att ganska många inte vet om att det går att ladda bibliotek dynamiskt. De flesta lägger till länkningar till bibliotek i sina bygg-filer och är sen mer eller mindre ovetande om att operativsystemet laddar och länkar in biblioteken när programmet startar sen. (Jag hörde till den här kategorin.)
Mer konkreta exempel.
Hade jag haft mer tid mellan matning och nattning av bebis och andra sysslor hade jag konkretiserat exemplen mer. Vill du veta mer så får du gärna dechiffrera ett testbibliotek som jag gjorde för sex år sen som ligger uppe på GitHub
Jag såg också en video som inspirerade mig till projektet då. Den finns på Youtube, men jag har för närvarande inte lyckats hitta den. Jag kommer lägga upp den om jag stöter på den igen.
Tyvärr är min egen spelmotor inte öppen källkod, så jag kan inte länka direkt till hur jag använder rtc++ där, men jag kanske gör enskilda blogg-artiklar om delar av den. Annars berättar jag gärna mer Verklig Reality så att säga om vi möts.
Andra inlägg från bloggen
2024
Använda cpp som ett skriptspråk (2024-12-03)
Mekaniskt tangentbord Lasersköld L1 del 1 (2024-11-14)
Alphasmart neo 2 font editor (2024-10-11)
Bloggen är äntligen fyttad (2024-09-24)
2022
Figurer i skuggan (2022-06-04)
2018
prestandatest pa morgonen c (2018-11-21)
2017
Framsteg och frustration (2017-08-31)
2015
fix audacity startup bug on ubuntu 1510 (2015-11-24)
git subtree (2015-06-21)
add native code to android studio (2015-06-21)
2014
Ingenting (2014-11-08)
Äldre inlägg...