Näyttelijämalli on rinnakkaislaskennan matemaattinen malli , joka on rakennettu näyttelijän käsitteen ympärille ( esim . näyttelijä "näyttelijä; näyttelijä"), jota pidetään rinnakkaissuorituksen universaalina primitiivinä. Tässä mallissa näyttelijä on vuorovaikutuksessa vaihtamalla viestejä muiden toimijoiden kanssa, ja jokainen voi vastauksena vastaanottamiinsa viesteihin tehdä paikallisia päätöksiä, luoda uusia toimijoita, lähettää omia viestejään ja päättää, kuinka vastata seuraaviin viesteihin.
Luotu teoreettiseksi pohjaksi useille rinnakkaisten järjestelmien käytännön toteutuksille .
Mallin tärkeimmät ajatukset ja perusta luotiin vuonna 1973 Hewitt, Bishop ja Steigerin julkaisussa [1] . Ohjelmointikielet Lisp , Simula ja Smalltalkin varhaiset versiot sekä parametrisen suojauksen ja pakettivaihdon menetelmät vaikuttivat mallin muodostusprosessiin . Mallin luomisen päämotivaatio oli tehtävä rakentaa hajautettuja laskentajärjestelmiä, jotka perustuivat satoihin ja tuhansiin itsenäisiin tietokoneisiin, jotka on varustettu omalla paikallisella muistilla ja tietoliikenneliitännöillä [2] . Moniprosessorijärjestelmien ja moniydinarkkitehtuurien myötä kiinnostus toimijamallia kohtaan kasvoi myös hajautettujen järjestelmien ulkopuolella.
Vuonna 1975 kehitettiin toiminnallinen semantiikka toimijamallille [3] [4] . Vuonna 1977 kehitettiin toimijamallien aksiomaattisten lakien järjestelmä [5] . Vuonna 1981 mallin denotaatiosemantiikka (siirtymien semantiikka) [2] [6] luotiin , kehitettiin ja yleistettiin vuonna 1985 [7] ; näiden töiden tuloksena toimijamallien teoria tunnustetaan kehitetyksi ja kehitetyksi.
1990-luvulla luotiin formalismeja, jotka eivät täysin vastaa toimijamallia (eivät formalisoi taattua viestin toimitusta), mutta ovat käytännön kiinnostavia, erityisesti useat erilaiset toimijaalgebrat [8] [9] ja lineaariseen logiikkaan perustuva tulkinta. [10] .
Analogisesti olio-ohjelmoinnin filosofian kanssa , jossa jokaista primitiiviä pidetään objektina, toimijamalli erottaa "toimijan" käsitteen universaalina kokonaisuutena. Toimija on laskennallinen kokonaisuus, joka vastauksena vastaanotettuun viestiin voi samanaikaisesti:
Ei oleta, että edellä mainituilla toimilla on tiettyä järjestystä ja ne voidaan suorittaa kaikki rinnakkain.
Lähettäjän erottaminen lähetetyistä viesteistä oli toimijamallin perustavanlaatuinen saavutus: se tarjoaa asynkronisen viestinnän ja rakenteiden hallinnan viestien välityksen muodossa [11] .
Viestien vastaanottajat tunnistetaan osoitteesta, jota joskus kutsutaan "postiosoitteeksi". Näin ollen näyttelijä voi olla vuorovaikutuksessa vain niiden toimijoiden kanssa, joiden osoitteet hänellä on, voi poimia osoitteita vastaanotetuista viesteistä tai tietää ne etukäteen, jos näyttelijä on ne itse luonut.
Mallille on tunnusomaista laskelmien luontainen rinnakkaisuus toimijoiden sisällä ja välillä, dynaaminen toimijoiden luominen, toimijaosoitteiden sisällyttäminen viesteihin ja vuorovaikutus vain suoran asynkronisen viestinnän kautta ilman rajoituksia viestien saapumisjärjestykseen.
Toimijamallia voidaan käyttää mallintamisen, ymmärtämisen ja päättelyn perustana useissa samanaikaisissa järjestelmissä , esimerkiksi:
Ehkä ensimmäiset rinnakkaiset ohjelmat olivat keskeytyskäsittelijöitä . Käytön aikana tietokoneen on pääsääntöisesti reagoitava ulkoisiin tapahtumiin, jotka voivat tapahtua aiemmin tuntemattomalla hetkellä (asynkronisesti käynnissä olevan ohjelman suhteen) - esimerkiksi vastaanottaakseen tietoa ulkopuolelta (merkit näppäimistöltä , paketit verkosta ja niin edelleen). Tällaisten tapahtumien tehokkain käsittely toteutetaan ns. keskeytysten avulla. Tapahtuman sattuessa nykyisen ohjelman suoritus "keskeytyy" ja käynnistetään keskeytyskäsittelijä , joka suorittaa tapahtumaan reagoimiseksi tarvittavat toimenpiteet (esim. vastaanottaa saapuvan tiedon ja tallentaa sen puskuriin, josta se voidaan lukea myöhemmin), jonka jälkeen pääohjelma jatkaa työtä siitä mihin se jäi .
1960-luvun alussa keskeytyksiä alettiin käyttää simuloimaan useiden ohjelmien samanaikaista suorittamista yhdellä prosessorilla [13] . Rinnakkaisuus jaetun muistin kanssa on johtanut samanaikaisuuden hallinnan ongelmaan. Aluksi tämä tehtävä suunniteltiin yhdeksi erillisen tietokoneen mutexeista . Edsger Dijkstra kehitti semaforeja , ja myöhemmin, vuosina 1971-1973, Charles Hoare ja Per Hansen kehittivät monitoreja [14] [15] [16] mutex-ongelman ratkaisemiseksi . Mikään näistä ratkaisuista ei kuitenkaan luonut ohjelmointikielillä konstruktioita, jotka kapseloisivat pääsyn jaettuihin resursseihin. Hewitt ja Atkinson suorittivat myöhemmin kapseloinnin käyttämällä serialisointikonstrukteja ([Hewitt, Atkinson 1977, 1979] ja [Atkinson 1980]).
Ensimmäiset laskentamallit (esim. Turing -kone , postikone , lambda-laskenta jne.) perustuivat matematiikkaan ja käyttivät globaalin tilan käsitettä "laskentavaiheen" määrittämiseen (myöhemmin nämä käsitteet yleistettiin McCarthyn ja Dijkstra [17] [18 ] ). Jokainen laskentavaihe eteni yhdestä globaalista laskentatilasta toiseen. Globaalin tilan lähestymistapaa on jatkettu automaatioteoriassa äärellisille automaateille ja pinokoneille, mukaan lukien niiden ei- deterministiset versiot. Tällaisilla ei-deterministisilla automaateilla on rajoitetun epädeterminismin ominaisuus. Toisin sanoen, jos kone seisoo aina ennen kuin se menee alkutilaan, silloin sen tilojen lukumäärällä on raja.
Dijkstra kehitti ei-determinististä globaalin valtion lähestymistapaa edelleen. Dijkstran malli on herättänyt kiistaa rajoittamattomasta epädeterminismistä, rinnakkaisen laskennan ominaisuudesta, jossa pyynnön käsittelyn viive voi tulla rajattomaksi jaetuista resursseista käytävän arbitraasikilpailun seurauksena, ja samalla taata, että pyyntö lopulta tulee huollettu. Hewitt väitti, että toimijamallin pitäisi tarjota takeita palvelun tuottamisesta. Vaikka Dijkstran mallissa ei voi olla rajattomasti aikaa peräkkäisten toimintojen suorittamisen välillä tietokoneella, rinnakkain käynnissä oleva ohjelma, joka aloitti toimintansa tiukasti määritellyssä tilassa, voidaan keskeyttää vain rajoitetussa määrässä tiloja [18 ] . Siksi Dijkstran malli ei voi taata palvelun toimittamista. Dijkstra väitti, että oli mahdotonta toteuttaa rajatonta epädeterminismia.
Hewitt väitti toisin: ei ole rajoitettu aikaa, joka kuluu laskenta-osion työhön, jota kutsutaan välimieheksi konfliktien ratkaisemiseksi. Välimiehet ratkaisevat tällaiset tilanteet. Tietokoneen kello toimii asynkronisesti ulkoisten tulojen kanssa: näppäimistötulo, levykäyttö, verkkotulo ja niin edelleen. Joten tietokoneelle lähetetyn viestin vastaanottamiseen voi kulua rajattomasti aikaa, ja siinä ajassa tietokone voi käydä läpi rajattoman määrän tiloja.
Rajoittamaton epädeterminismi on tyypillinen piirre toimijamallille, joka käyttää Klingerin matemaattista mallia, joka perustuu alueteoriaan [ [2] . Toimijamallissa ei ole globaalia tilaa.
Toimijamallin viestit eivät välttämättä ole puskuroituja. Tämä on sen jyrkkä ero aiemmista lähestymistavoista samanaikaiseen laskentamalliin. Puskuroinnin puute aiheutti paljon väärinkäsityksiä näyttelijämallin kehittämisessä ja on edelleen kiistanalainen aihe tähän päivään asti. Jotkut tutkijat väittävät, että viestit puskuroidaan "ilmaan" tai "ympäristöön". Myös toimijamallin viestit lähetetään yksinkertaisesti (esimerkiksi IP -paketit ). Synkronista kättelyä vastaanottajan kanssa ei vaadita.
Toimijamallin luonnollinen evoluutio oli kyky välittää osoitteita viesteissä. Pakettikytkentäisten verkkojen vaikutuksesta Hewitt ehdotti uuden rinnakkaisen laskentamallin kehittämistä, jossa linkissä ei olisi lainkaan pakollisia kenttiä, jotka kaikki voisivat olla tyhjiä. Tietenkin, jos viestin lähettäjä haluaa vastaanottajalle pääsyn osoitteisiin, joita hänellä ei vielä ole, osoite on lähetettävä viestissä.
Laskennan aikana voi olla tarpeen lähettää viesti vastaanottajalle, jolta on tarkoitus saada vastaus myöhemmin. Tapa tehdä tämä on lähettää toisen toimijan osoitteen sisältävä viesti, jota kutsutaan ansioluetteloksi (joskus kutsutaan myös jatkoksi tai puhelupinoksi ). Vastaanottaja voi sitten luoda vastausviestin, joka lähetetään jatkamisen yhteydessä .
Toimijoiden luominen ja osallistujaosoitteiden sisällyttäminen viesteihin tarkoittaa, että toimijamallilla on potentiaalisesti muuttuva topologia niiden suhteissa toisiinsa, samankaltaisesti kuin Simula-kielen objekteilla, joilla on myös muuttuva topologia suhteessa toisiinsa.
Toisin kuin aikaisemmassa peräkkäisten prosessien yhdistämisessä, toimijamalli suunniteltiin pohjimmiltaan samanaikaiseksi malliksi. Kuten toimijamallien teoriassa on kirjoitettu, siinä oleva sekvenssi on erikoistapaus, joka syntyy samanaikaisista laskelmista.
Hewitt vastusti vaatimusten sisällyttämistä näyttelijämallille, että viestien tulee saapua siinä järjestyksessä kuin ne lähetettiin. Jos halutaan tilata saapuvia viestejä, tämä voidaan mallintaa toimijajonolla, joka tarjoaa tämän toiminnon. Tällaiset toimijajonot järjestäisivät saapuvat viestit niin, että ne vastaanotetaan FIFO -järjestyksessä . Yleisesti ottaen, jos näyttelijä X lähettää viestin M1 näyttelijälle Y , ja sitten sama näyttelijä X lähettää toisen viestin M2 Y : lle , ei ole vaatimusta, että M1 saapuu Y :lle ennen M2 :ta .
Tässä suhteessa toimijamalli peilaa pakettikytkentäjärjestelmää, mikä ei takaa pakettien vastaanottamista siinä järjestyksessä kuin ne on lähetetty. Viestien toimitusmääräystakuiden puuttuminen mahdollistaa pakettikytkentäjärjestelmän puskuroida paketteja, käyttää useita polkuja pakettien lähettämiseen, lähettää vaurioituneita paketteja uudelleen ja käyttää muita optimointitekniikoita.
Näyttelijät voivat esimerkiksi käyttää viestinkäsittelyputkia. Tämä tarkoittaa, että sanoman M1 käsittelyprosessissa toimija voi vaihdella käyttäytymistä, jota käytetään seuraavan viestin käsittelyyn. Tämä tarkoittaa erityisesti, että se voi aloittaa yhden viestin M2 käsittelyn ennen kuin käsittely M1 on valmis . Se, että toimijalle on myönnetty oikeus käyttää sanomankäsittelyputkea, ei tarkoita, että sen on käytettävä kyseistä liukuhihnaa. Se, lähetetäänkö viesti putkeen vai ei, on teknisen kompromissin asia. Mistä ulkopuolinen tarkkailija voi tietää, että näyttelijän viestien käsittely on mennyt putkeen? Ei ole epäselvyyttä siitä, kuinka toimija käyttää liukuhihnatoimintoa tässä suhteessa. Vain jos tietyssä toteutuksessa liukuhihna-optimoinnin toteutus tehdään väärin, voi tapahtua jotain muuta kuin odotettua toimintaa.
Toinen tärkeä toimijamallin ominaisuus on paikallisuus: viestiä käsitellessään toimija voi lähettää viestejä vain viestistä vastaanottamiinsa osoitteisiin, osoitteisiin, jotka hänellä oli jo ennen viestin vastaanottamista sekä osoitteisiin, jotka hän on luonut käsitellessään viestiä. viesti.
Paikallisuus tarkoittaa myös sitä, että useita osoitemuutoksia ei voi tapahtua samanaikaisesti. Tässä suhteessa toimijamalli eroaa joistakin muista samanaikaisuusmalleista, kuten Petri-verkoista , joissa toteutuksia voidaan samanaikaisesti poistaa useista paikoista ja sijoittaa eri osoitteisiin.
Ajatus näyttelijäjärjestelmien kokoamisesta suurempiin kokonaisuuksiin on tärkeä osa modulaarisuutta, joka kehitettiin Gool Ag :n tohtorintutkinnossa .
Toimijamallin tärkein innovaatio oli käyttäytymiskäsitteen käyttöönotto, joka määritellään matemaattiseksi funktioksi, joka ilmaisee toimijan toimia hänen käsiteltäessä viestejä, mukaan lukien uuden käyttäytymisen määrittely seuraavan saapuvan viestin käsittelyä varten. Käyttäytyminen tarjoaa rinnakkaisuuden matemaattisen mallin toiminnan.
Käyttäytyminen myös vapauttaa toimijamallin toteutusyksityiskohdista, kuten esimerkiksi Smalltalk-72:ssa säietulkkimerkki tekee. On kuitenkin tärkeää ymmärtää, että toimijamallin kuvaamien järjestelmien tehokas toteutus vaatii pitkälle kehitettyä optimointia.
Muita samanaikaisuusjärjestelmiä (kuten prosessilaskentaa ) voidaan mallintaa toimijamallissa käyttämällä kaksivaiheista toimitusprotokollaa [19] .
Toimijamallissa on suljetuille järjestelmille laskennallinen esityslause siinä mielessä, että ne eivät vastaanota viestejä ulkopuolelta. Matemaattisessa merkinnässä suljettu järjestelmä, jota merkitään S , rakennetaan parhaaksi approksimaatioksi alkukäyttäytymiselle, nimeltään ⊥ S , käyttämällä S:lle rakennettua approksimoivaa progression S käyttäytymisfunktiota seuraavasti (Hewittin 2008 julkaisun mukaan):
Merkitse S ≡ ⊔ i∈ω progressio S i (⊥ S )Siten S voidaan matemaattisesti luonnehtia sen kaikkien mahdollisten käyttäytymistensä suhteen (mukaan lukien rajoittamattoman epädeterminismin huomioon ottaminen). Vaikka Denote S ei ole S:n toteutus , sitä voidaan käyttää todistamaan Church-Turingin teesin [20] seuraava yleistys : jos suljetun toimijajärjestelmän toimijaprimitiivi on tehokas, niin sen mahdolliset tuotokset ovat rekursiivisesti numeroituvia. Todistus seuraa suoraan laskennallisen esitystavan lauseesta.
Näyttelijämallin kehityksellä on mielenkiintoinen yhteys matemaattiseen logiikkaan. Yksi keskeisistä motiiveista sen kehittämiseen oli tarve hallita Planner - ohjelmointikielen kehittämisen aikana esiin tulleita näkökohtia . Kun näyttelijämalli alun perin muotoiltiin, tuli tärkeäksi määrittää mallin voima suhteessa Robert Kowalskin väitöskirjaan, jonka mukaan "laskelmat voidaan ryhmitellä päätelmien avulla". Kowalskin väitöskirja osoittautui vääräksi näyttelijämallin samanaikaisissa laskelmissa. Tämä tulos on edelleen kiistanalainen ja ristiriidassa joidenkin aikaisempien näkemysten kanssa, koska Kowalskin väitöskirja pätee peräkkäisten laskelmien ja jopa jonkinlaisten rinnakkaisten laskelmien, esimerkiksi lambda-laskujen, osalta.
Siitä huolimatta logiikkaohjelmointia on yritetty laajentaa rinnakkaislaskentaan. Kuitenkin Hewitt ja Aga väittävät vuoden 1999 artikkelissa, että tuloksena oleva järjestelmä ei ole deduktiivinen seuraavassa mielessä: rinnakkaisten logiikkaohjelmointijärjestelmien laskentavaiheet eivät seuraa deduktiivisesti aiempia vaiheita.
Migraatio näyttelijämallissa on näyttelijän kykyä vaihtaa sijaintiaan. Esimerkiksi Aki Yonezawa mallinsi väitöskirjassaan postipalvelua, johon asiakastoimijat voivat astua sisään, vaihtaa paikkaa juosten ja poistua. Näyttelijä, joka voisi siirtyä, mallinnettiin näyttelijäksi, jolla on tietty sijainti, joka muuttuu näyttelijän siirtyessä. Tämän simulaation luotettavuus on kuitenkin kiistanalainen ja on tutkimuksen kohteena.
Näyttelijät voidaan turvata jollakin seuraavista tavoista:
Hienovarainen kohta näyttelijämallissa on kyky syntetisoida näyttelijän osoite. Joissakin tapauksissa turvajärjestelmä voi estää osoitteiden synteesin. Koska näyttelijän osoite on vain pieni merkkijono, se on luonnollisesti mahdollista syntetisoida, vaikka jos bittijono on tarpeeksi pitkä, on näyttelijän osoitteen löytäminen melko vaikeaa tai jopa mahdotonta. SOAP käyttää päätepisteosoitteena URL -osoitetta , jossa toimija sijaitsee . Koska URL -osoite on merkkijono, se on luonnollisesti mahdollista syntetisoida, vaikka salausta käytettäessä merkkijonon poimiminen on lähes mahdotonta.
Toimijan osoitesynteesi mallinnetaan yleensä kartoituksella. Ajatuksena on käyttää näyttelijäjärjestelmää kartoittamaan toimijoiden todelliset osoitteet. Esimerkiksi tietokoneen muistirakenne voidaan mallintaa toimijoiden järjestelmäksi, joka antaa kartoituksen. SOAP - osoitteiden tapauksessa tämä on DNS - mallinnus ja URL - kartoitus .
Robin Milnerin ensimmäinen julkaistu samanaikaisuutta käsittelevä työ [21] oli huomattava siitä, että se ei perustunut peräkkäiseen prosessien koostumukseen, mikä erosi toimijamallista, koska se perustui kiinteään määrään prosesseja, kiinteään määrään linkkejä rivitopologiassa, jota käytettiin synkronoi linkin. Anthony Hoaren [22] julkaisema alkuperäinen Cooperating Serial Processes (CSP) -malli eroaa toimijamallista, koska se perustuu kiinteään topologiaan linkitettyjen peräkkäisten prosessien rinnakkaiseen koostumukseen ja kommunikoimaan käyttämällä synkronista prosessiin perustuvaa viestinvälitystä. nimet. CSP:n myöhemmät versiot ovat siirtyneet pois prosessinimiin perustuvasta viestinnästä ja omaksuneet anonyymin viestinnän periaatteen. Tätä lähestymistapaa käytetään myös Milnerin työssä kommunikaatiojärjestelmien laskennasta ja pi-laskusta .
Molemmilla näillä Milnerin ja Hoaren varhaisilla malleilla on rajoitettu epädeterminismi. Vuorovaikutteisten järjestelmien nykyaikaiset teoreettiset mallit [23] tarjoavat suoraan rajattoman epädeterminismin.
Neljäkymmentä vuotta Mooren lain julkaisemisen jälkeen sirun suorituskyvyn jatkuva kasvu johtuu paikallisen ja maailmanlaajuisen massiivisen rinnakkaisuuden menetelmistä. Paikallista rinnakkaisuutta käytetään uusissa siruissa 64-bittisille moniytimisille mikroprosessoreille, monisirumoduuleissa ja korkean suorituskyvyn tietoliikennejärjestelmissä. Globaali samanaikaisuus on tällä hetkellä käytössä uusissa langallisen ja langattoman laajakaistan pakettikytkentälaitteistoissa. Tallennuskapasiteetti kasvaa eksponentiaalisesti sekä paikallisen että globaalin rinnakkaisuuden vuoksi.
Malli on tarkoitettu ratkaisemaan seuraavat tietokonejärjestelmien rakentamisen ongelmat:
Monia toimijamalleissa esitellyistä ideoista käytetään nyt samoista syistä myös moniagenttijärjestelmissä [ 24] . Keskeinen ero on, että järjestelmän agentti (useimmissa määritelmissä) asettaa toimijoille lisärajoituksia, jotka tyypillisesti edellyttävät sitoutumista ja tavoitteita.
Toimijamallia käytetään myös pilvilaskenta -asiakkaissa [25] .
Varhaiset ohjelmointikielet näyttelijätuella sisältävät Act 1, 2 ja 3 [26] [27] , Acttalk [28] , Ani [29] , Cantor [30] , Rosette [31]
Uudemmat näyttelijämallipohjaiset kielet: Actor-Based Concurrent Language (ABCL), ActorScript, AmbientTalk [32] , Axum [33] . Yleiskäyttöisiä ohjelmointikieliä, jotka käyttävät näyttelijän käsitettä, ovat E , Elixir [34] , Erlang , Io , SALSA [35] , Scala [36] [37] .
Näyttelijöitä sisältäviä kirjastoja ja taulukkorakenteita on kehitetty tarjoamaan näyttelijämäinen ohjelmointityyli kielillä, joissa ei ole sisäänrakennettuja näyttelijöitä.
Kirjastot ja taulukkorakenteet näyttelijöiden kanssa | |||
---|---|---|---|
Nimi | Viimeinen julkaisupäivä | Lisenssi | Ohjelmointikielet |
ActiveJava | 2008 | ? | Java |
Näyttelijä | 31.5.2013 | MIT | Java |
Näyttelijä-CPP | 10.3.2012 [38] | GPL 2.0 | C++ |
Näyttelijäkehys | 13.11.2013 | Apache 2.0 | .NETTO |
NäyttelijäKit | 13.9.2011 [39] | BSD | Tavoite-C |
Akka | 23.4.2015 | Apache 2.0 | Java ja Scala |
Akka.NET | 18.1.2016 | Apache 2.0 | .NETTO |
C++ Actor Framework (CAF) | 25.11.2015 [40] | Boost Software License 1.0 ja BSD 3-Clause | C++11 |
Selluloidi | 19.1.2016 [41] | MIT | rubiini |
Pilvi Haskell | 17.6.2015 [42] | BSD | Haskell |
PilviI | 24.12.2015 [43] | BSD | C/C++, Elixir/Erlang/LFE, Java, Javascript, Perl, PHP, Python, Ruby |
Toimiva Java | 15.2.2016 [44] | BSD | Java |
GPars | 9.5.2014 [45] | Apache 2.0 | Groovy |
jetlang | 30.5.2013 [46] | UusiBSD | Java |
Korus | 2010-02-04 | GPL 3 | Java |
[ 47 ] | 13.10.2011 [48] | MIT | Java |
LabVIEW Actor Framework | 1.3.2012 [49] | ? | LabVIEW |
libprocess | 19.6.2013 | Apache 2.0 | C++ |
NAct | 28.2.2012 | LGPL 3.0 | .NETTO |
OOSMOS | 17.2.2016 [50] | GPL 2.0 ja kaupallinen | C, C++ |
Rata | 16.2.2016 [51] | UusiBSD | Java |
Orleans | 4.6.2019 [52] | MIT | .NETTO |
Panini | 22.5.2014 | MPL 1.1 | Oma ohjelmointikieli |
Peerneettinen | 29.6.2007 | LGPL 3.0 | Java |
PostSharp | 24.9.2014 | Kaupallinen / Freemium | .NETTO |
Pulsar | 24.11.2016 [53] | UusiBSD | Python |
Pulsar | 18.2.2016 [54] | LGPL / Eclipse | Clojure |
Pykka | 28.5.2022 [55] | Apache 2.0 | Python |
React.Net | ? | MIT | .NETTO |
Retlang | 18.5.2011 [56] | UusiBSD | .NETTO |
roottori | 23.5.2022 | MIT | C++17 |
S4 | 31.7.2012 [57] | Apache 2.0 | Java |
SOobjektiaattori | 2016-02-11 | UusiBSD | C++11 |
Termiittijärjestelmä | 21.5.2009 | LGPL | Kaavio |
Theron | 18.1.2014 [58] | M.I.T. [59] | C++ |
näyttelijä | 11.9.2019 [60] | GoDaddyn julkinen julkaisu [61] | Python |
QP | 29.9.2015 [62] | GPL 2.0 ja kaupallinen | C ja C++ |
Kvasaari | 18.1.2016 [63] | LGPL / Eclipse | Java |