Ihan kiva, että tämä kysymys metaohjelmoinnista nousi esille. Kiitos osallistuneille. Kaivelin tietoa mm. C#:n "expression tree" ominaisuudesta, joka tuntuu melko lailla samalta, mitä minä olen kömpelöllä tavalla "tikuista" implemetoinut äskettäin harrasteprojektissani, toteuttaessani ajonaikaista PEG-kielioppikuvaus->datarakenneohjattu parseri toteutusta. Tuo datarakenne on melko lailla == "expression tree".
Mutta joskus myöhemmin tarvitsen samassa projektissa toteutusta, jossa esim jotakin algoritmia kuvaava semanttinen verkko (joka on em. parserilla jäsennelty ja rakennettu lojban-kielisestä kuvauksesta) on edelleen muutettava suorituskelpoiseksi koodiksi, mielellään kaikki ajonaikaisesti, ilman että esim generoitu lähdekoodia on välillä käännettävä ulkoisella työkalulla.
Haluaisin pysyä C :ssa. Siksi olen jo yhtenä mahdollisuutena harkinnut XLISP-tulkin porttamista sisäiseksi osaksi sovellustani. Sovellus kääntäisi semattisen verkon lohkon XLISP-koodiksi ja käynnistäisi aina tarvittessa XLISP-tulkin.
Mutta tehtävään voi olla tyylikkämpiä ratkaisuja, joista en ole yhtään tietoinen. En kuitenkaan aio vaihtaa C :sta esim pythoniin tai C#:ssaan (siis minun asemassani monoon). Mutta XLISP:ille olen valmis harkitsemaan parempia vaihtoehtoja.
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 8
Vanhimmat
C :n sisältä käsin. http://docs.python.org/extending/embedding.html
Kiitos, tuota täytyy kokeilla!
Tossa aiemmin mitä tosta ihmeteltiin, ei kai liittynyt suurelta osalta siihen, ettei koodia voisi muokata tai siinä olisi joku mahdottomuus. Enemmän minä ja muutama muukin ihmettelivät sitä miksi toisen ohjelman kannattaa luoda koodia. Miksi ei kannattaisi suorittaa sitä toiminnallisuutta suoraan koodia luovalla logiikalla? Mihin sitä luotua koodia tarvitaan siinä välissä? Ok, jos suoritettava koodi vaikka siirretään jonnekin, niin sellaisessahan sitä tarvitaan koska luojaa ei ole siinä ympäristössä. Mutta missä tätä kannattaisi yleensä käyttää?
Itsekään en oikein ymmärrä itse itseään muokkaavan koodin hyötyä. Saman asian kuitenkin aina voi tehdä tekemällä tulkin samalle koodille kuin millä ohjelma on tehty. Tämä taas tuntuu hieman norsupyssymäiseltä idealta ja mieluummin sitten tekisi vaan jonkin skriptauskielen tai jopa vaan konfiguraatiotiedoston joka toteuttaa tasan sen mitä tarvitaan. Ja kun sitä konfiguraatiotiedostoakaan ei varmaan tarvitse levylle kirjoittaa, niin mieluummin vaan tallettaa sen sijaan tilasäännöt muuttujiin - ja tässähän sitä oltiinkin taas perinteisessä ohjelmoinnissa. Sen sijaan voin kyllä kuvitella kuinka vaikeaa on analysoida koodia, joka muuttaa itse itseään. Saakohan tällaisesta koodista edes selvää kukaan muu kuin sen kirjoittaja?
Onhan noissa Microsoftin kääntäjissäkin "välikielet" (Microsoft Intermediate Language). Eivät vaan näy koodaajille: http://fi.wikipedia.org/wiki/Välikieli
"Itsekään en oikein ymmärrä itse itseään muokkaavan koodin hyötyä." Minäkin epäilen, että itseään muuttava koodi voi olla vakava stabiilisuushaaste, mutta myös yksinkertaistaa joitakin toteutuksia. Kuitenkaan en minä sellaista aio yrittää. C -koodi ei muutu. Semanttisen verkon sisältö muuttuu, mutta se ei olekaan suoritettavaa koodia, vaan dataa. Mutta osa tästä datasta edustaa proseduraalista tietämystä, joka on mielekästä konvertoida suoritettavaksi koodiksi esim tietämyksen todenperäisyyden testaamiseksi. Kyseessä on eräänlainen chatbot projekti, tarkoituksena kerätä semanttista tietoa interaktiivisesti lojban-kielisen keskustelun avulla. Botti edustaa, jos ei ihan oikeaa tekoälyä, niin semanttista teknologiaa. Mutta ainakin toistaiseksi se on puhdas harrasteprojekti.
minulla on generinen skripti joka generoi antille build.xml:n jota voi sitten käyttää useamman kerran jos asetukset eivät muutu. tässä on kyse siitä että ant xml:n pitää olla staattinen mutta vaatimukset vaativat jotain muuta.isommat projektit helpompia hallita.
Eikös metaohjelmoinnilla yleensä tarkoiteta generics/template-tyyppisiä ominaisuuksia, jotka löytyvät kielistä kuten Ada, C ja Java? C#:ssakin tuo ominaisuus on, mutta muistaakseni se on jotenkin pahasti sössitty. Generics-ominaisuus ei kyllä ole koodin generointia tai muuttamista lennossa nähnytkään. Enemmän se on sukua makrojen käytölle. Mutta erittäin kätevä ominaisuus kyllä.