Oma kääntäjä, kuinka alkuun?

Anonyymi

Haaveena tehdä oma ohjelmointikieli ja sille kääntäjä. Jostain pitäisi päästä alkuun.

Alkuun riittää pelkät mustan ruudun ominaisuudet. Eli vaikkapa ohjelmointikielen rivi

tulosta("Moro\n");

tulostaisi terminaalissa teksin "Moro" ja rivinvaihdon "\n".

Käyttöjärjestelmän tarjoamaa palveluahan tuossa joudutaan kutsumaan, mutta mitä ja kuinka?

39 kommenttia

Vastaukset

  • Aivan alkuun kannattaa kääntää katse ikkunaan päin ja huomata että kevät on jo pitkällä. Seuraavaksi kohennat suortuvat ojennukseen ja lähdet reippaalle kävelylenkille. Kun kohtaat ihmisen niin

    echo "Moro!"

    ja yllättäen joku kohtaamistasi ihmisistä saattaa jopa olla lyömättä.

  • Entä jos laittaa Googleen "my own programming language"?

    • En käytä googlea, mutta vilkaisen mitä ehdottamasi haku antaa muilla hakupalveluilla. Tarkoitus olisi tehdä siis suomenkielinen ohjelmointikieli.


  • Ensiksi tarvitaan ns. lexical analysis, seuraavaksi rakennetaan tämän pohjalta abstract syntax tree ja sitten voikin aloittaa toteuttamaan logiikkaa siihen oman kielen kääntäjään tai tulkkiin.

  • Mitä järkeä?

    • Ei niin yhtikäs mitään.



    • Itseasiassa siinä on paljonkin järkeä.

      Tuo kielen kääntäminen on hyvin pitkälle tutkittu ja tunnettu asia, että jos pitää kertoa jokin asia tietokoneelle niin asian voi ilmaista kielellä millä se käy mahdollisimman helposti.

      Siinä sitten helposti voi säästää paljonkin koodin määrässä ja sillä tavalla myös vähentää virheitä.

      Itse pyrin ohjelmoinaan niin että en niinkään kirjoita koodia vaan mietin miten saan asian ilmaistua mahdollisimman yksinkertaisesti ja sitten tulkitsen sitä jollain koodilla.

      Yleensä kuitenkin tarvittavat kielet eri asioihin on keksitty jo mutta voi sitä tulla käyttöä jos jotain työkalua väsää.

      Tietysti jos jotain suomen kieltä haluaa tulkata niin onhan siinä se käyttötarkoitus jos vaikka haluaa vääntää tekstiseikkalua missä kirjoitetaan suomenkielellä mitä halutaan tehdä. Nämä olivat aiemmin hyvinkin suosittuja. Tässä yksi esimerkki: https://archive.org/details/msdos_Gateway_1992


    • M-Kar kirjoitti:

      Itseasiassa siinä on paljonkin järkeä.

      Tuo kielen kääntäminen on hyvin pitkälle tutkittu ja tunnettu asia, että jos pitää kertoa jokin asia tietokoneelle niin asian voi ilmaista kielellä millä se käy mahdollisimman helposti.

      Siinä sitten helposti voi säästää paljonkin koodin määrässä ja sillä tavalla myös vähentää virheitä.

      Itse pyrin ohjelmoinaan niin että en niinkään kirjoita koodia vaan mietin miten saan asian ilmaistua mahdollisimman yksinkertaisesti ja sitten tulkitsen sitä jollain koodilla.

      Yleensä kuitenkin tarvittavat kielet eri asioihin on keksitty jo mutta voi sitä tulla käyttöä jos jotain työkalua väsää.

      Tietysti jos jotain suomen kieltä haluaa tulkata niin onhan siinä se käyttötarkoitus jos vaikka haluaa vääntää tekstiseikkalua missä kirjoitetaan suomenkielellä mitä halutaan tehdä. Nämä olivat aiemmin hyvinkin suosittuja. Tässä yksi esimerkki: https://archive.org/details/msdos_Gateway_1992

      "Itse pyrin ohjelmoinaan"

      Et sinä mitään osaa ohjelmoida, kuhan nyt ensin oppisit kirjoittamaan "ohjelmointi" sanan.


    • Anonyymi kirjoitti:

      "Itse pyrin ohjelmoinaan"

      Et sinä mitään osaa ohjelmoida, kuhan nyt ensin oppisit kirjoittamaan "ohjelmointi" sanan.

      Tietysti osaan.

      Sinä taas et, kun et kyennyt edes neuvomaan aloittajaa mistä lähdetään liikkeelle kääntäjän tekemisessä. Alkaa siitä kielen kuvauksesta että voi lexerillä käydä jäsentämään sitä koodia.

      Miksi et tiedä näitä perusasioita?


    • M-Kar kirjoitti:

      Tietysti osaan.

      Sinä taas et, kun et kyennyt edes neuvomaan aloittajaa mistä lähdetään liikkeelle kääntäjän tekemisessä. Alkaa siitä kielen kuvauksesta että voi lexerillä käydä jäsentämään sitä koodia.

      Miksi et tiedä näitä perusasioita?

      Todista, että osaat, kirjoita ""Itse pyrin ohjelmoimaan"", siitä se alkaa.


    • Anonyymi kirjoitti:

      Todista, että osaat, kirjoita ""Itse pyrin ohjelmoimaan"", siitä se alkaa.

      Osoitin jo asiantuntemukseni opastamalla aloittajaa. Sinulta se puuttuu.


    • Anonyymi kirjoitti:

      Ei niin yhtikäs mitään.

      Jos aloittaja haluaa koodata ohjelman kielellä jota ei ole vielä olemassa? Esim. jos koodi varastetaan, se on täysin hyödytöntä tai tosi iso homma kääntää toiselle kielle.


    • M-Kar kirjoitti:

      Itseasiassa siinä on paljonkin järkeä.

      Tuo kielen kääntäminen on hyvin pitkälle tutkittu ja tunnettu asia, että jos pitää kertoa jokin asia tietokoneelle niin asian voi ilmaista kielellä millä se käy mahdollisimman helposti.

      Siinä sitten helposti voi säästää paljonkin koodin määrässä ja sillä tavalla myös vähentää virheitä.

      Itse pyrin ohjelmoinaan niin että en niinkään kirjoita koodia vaan mietin miten saan asian ilmaistua mahdollisimman yksinkertaisesti ja sitten tulkitsen sitä jollain koodilla.

      Yleensä kuitenkin tarvittavat kielet eri asioihin on keksitty jo mutta voi sitä tulla käyttöä jos jotain työkalua väsää.

      Tietysti jos jotain suomen kieltä haluaa tulkata niin onhan siinä se käyttötarkoitus jos vaikka haluaa vääntää tekstiseikkalua missä kirjoitetaan suomenkielellä mitä halutaan tehdä. Nämä olivat aiemmin hyvinkin suosittuja. Tässä yksi esimerkki: https://archive.org/details/msdos_Gateway_1992

      Näin on. "Omia" ohjelmointikieliä tehdään ja käytetään paljonkin, kun sovellus sitä edellyttää. Sen sijaan uuden yleiskäyttöisen ohjelmointikielen kehittämisessä tuskin on järkeä, ellei opiskelutarkoituksessa.

      Jos siis jostain pitäisi päästä alkuun, kannattaa miettiä mihin omaa ohjelmointikieltä tarvitsee ja tuoko oma ohjelmointikieli selvää etua verrattuna johonkin olemassaolevaan, valmiiseen kieleen. Ellei tuo, kannattaa panostaa jonkin valmiin kielen opiskeluun.

      Seuraavaksi tulee tehtäväksi suunnitella ohjelmointikielen syntaksi; onko se rivi- vai lausekoodia, tekstiä vai jotakin muuta ja mm. millaisia rakenteita ja käskyjä kieli tukee. Vaihtoehtoja on loputtomasti ja niitä todellakin kannattaa punnita sillä ajatuksella, mihin omaa ohjelmointikieltä tarvitsee.

      Vasta tämän jälkeen alkaa toteutuksen suunnittelu ja varsinainen tekeminen.

      Oman ohjelmointikielen kehittäminen ei välttämättä ole vaikeaa, mutta työlästä se on, jos haluaa lopputuloksella oikeasti olevan jotakin käyttöä.


    • Anonyymi kirjoitti:

      Näin on. "Omia" ohjelmointikieliä tehdään ja käytetään paljonkin, kun sovellus sitä edellyttää. Sen sijaan uuden yleiskäyttöisen ohjelmointikielen kehittämisessä tuskin on järkeä, ellei opiskelutarkoituksessa.

      Jos siis jostain pitäisi päästä alkuun, kannattaa miettiä mihin omaa ohjelmointikieltä tarvitsee ja tuoko oma ohjelmointikieli selvää etua verrattuna johonkin olemassaolevaan, valmiiseen kieleen. Ellei tuo, kannattaa panostaa jonkin valmiin kielen opiskeluun.

      Seuraavaksi tulee tehtäväksi suunnitella ohjelmointikielen syntaksi; onko se rivi- vai lausekoodia, tekstiä vai jotakin muuta ja mm. millaisia rakenteita ja käskyjä kieli tukee. Vaihtoehtoja on loputtomasti ja niitä todellakin kannattaa punnita sillä ajatuksella, mihin omaa ohjelmointikieltä tarvitsee.

      Vasta tämän jälkeen alkaa toteutuksen suunnittelu ja varsinainen tekeminen.

      Oman ohjelmointikielen kehittäminen ei välttämättä ole vaikeaa, mutta työlästä se on, jos haluaa lopputuloksella oikeasti olevan jotakin käyttöä.

      Yleiskäyttöisessä kielessä voisi olla mieltä jos keksii tehdä jotain perustavalla tavalla paremmin kuin mitä nyt on olemassa.

      Ei tule kyllä mieleen mitään, mutta kaikennäköistä kielen parsimiseen liittyvää työkalua tai domain specific languagea keksii helposti.


    • Anonyymi kirjoitti:

      Näin on. "Omia" ohjelmointikieliä tehdään ja käytetään paljonkin, kun sovellus sitä edellyttää. Sen sijaan uuden yleiskäyttöisen ohjelmointikielen kehittämisessä tuskin on järkeä, ellei opiskelutarkoituksessa.

      Jos siis jostain pitäisi päästä alkuun, kannattaa miettiä mihin omaa ohjelmointikieltä tarvitsee ja tuoko oma ohjelmointikieli selvää etua verrattuna johonkin olemassaolevaan, valmiiseen kieleen. Ellei tuo, kannattaa panostaa jonkin valmiin kielen opiskeluun.

      Seuraavaksi tulee tehtäväksi suunnitella ohjelmointikielen syntaksi; onko se rivi- vai lausekoodia, tekstiä vai jotakin muuta ja mm. millaisia rakenteita ja käskyjä kieli tukee. Vaihtoehtoja on loputtomasti ja niitä todellakin kannattaa punnita sillä ajatuksella, mihin omaa ohjelmointikieltä tarvitsee.

      Vasta tämän jälkeen alkaa toteutuksen suunnittelu ja varsinainen tekeminen.

      Oman ohjelmointikielen kehittäminen ei välttämättä ole vaikeaa, mutta työlästä se on, jos haluaa lopputuloksella oikeasti olevan jotakin käyttöä.

      "uuden yleiskäyttöisen ohjelmointikielen kehittämisessä tuskin on järkeä, ellei opiskelutarkoituksessa"

      Kas kummaa! Esittämäsi väite on raskaasti ristiriidassa sen kanssa, miksi kehitettiin uusi yleiskäyttöinen ohjelmointikieli, ja annettiin sille nimeksi "rust".

      Rust on kieli, jossa tavoitteet ovat olleet muuten samat kuin Delphin kehittämisessä, paitsi että rustin kehittäjät halusivat kielestä syntaxiltaan C-kieltä muistuttavan.

      Eli rust on kieli, joka on muuten kuin Delphi, paitsi että syntaksi ei sitten olekaan Delphin kaltainen, vaan nimenomaan C-kielen kaltainen.

      Joku siis piti tärkeänä kehittää kielen joka on periaatteiltaan kuten Deklphi, mutta syntaksiltaam kuten C-kieli !

      Voi toki kysyä, MIKSI !

      Järkevämpää olisi ollut käyttää Delphiä tai, kuten kielen toinen nimi on, Objectpascalia.

      Ainakin C -kielessä on yksi (ilmeisesti tahallaan tehty) heikkous:

      k = 200;
      if (a = 5) { k = 7};

      Tämä hölmö koodinpätkä jättää muuttujan k arvoksi 7 (eikä 200).

      Ammattitason c -ohjelmoija tetenkin väittää, että kyseessä on tyypillinen aloittelijan tekemä virhe, ja että hän ei itse koskaan tekisi tuollaista virhettä.

      MUTTA:

      Heti, kun tämä ammattilainen erehtyy tekemään jonkin seuraavista, samalla kasvaa todennäköisyys siihen, että hän itse tekee saman virheen:

      1) koodaa erittäin väsyneenä

      2) koodaa hyvin nälkäisenä

      3) koodaa samalla, kun puhuu jonkun kanssa (olipa tuo joku puhelimessa tai samassa huoneessa)

      4) koodaa samalla, kun katsoo TV:tä

      No, ehkä tuo ylläoleva esimerkkirakenne ei ole sallittu rustissa, vaikka C -kielessä se onkin sallittua !

      Silti herää kysymys: miksi Firefox piti uudelleenkoodata rustilla, sen sijaan että se olisi uudelleenkoodattu Objectpascalilla.

      Ilmeisesti C -koodaajat kuvittelevat Objectpascalista useita paikkansapitämättömiä asioita, joista 1 on se, että he luulevat, että Delphi -koodaaja aina käsin kirjoittaisi begin end tuon C:stä tutun { } sijasta.

      Omassa Delphi IDEssäni riittää, kun painaa b ja sitten Ctrl-J .... Delphi itse muuttaa sen b:n muotoon begin end, ja väliin vielä pari rivinvaihtoa.


    • Anonyymi kirjoitti:

      "uuden yleiskäyttöisen ohjelmointikielen kehittämisessä tuskin on järkeä, ellei opiskelutarkoituksessa"

      Kas kummaa! Esittämäsi väite on raskaasti ristiriidassa sen kanssa, miksi kehitettiin uusi yleiskäyttöinen ohjelmointikieli, ja annettiin sille nimeksi "rust".

      Rust on kieli, jossa tavoitteet ovat olleet muuten samat kuin Delphin kehittämisessä, paitsi että rustin kehittäjät halusivat kielestä syntaxiltaan C-kieltä muistuttavan.

      Eli rust on kieli, joka on muuten kuin Delphi, paitsi että syntaksi ei sitten olekaan Delphin kaltainen, vaan nimenomaan C-kielen kaltainen.

      Joku siis piti tärkeänä kehittää kielen joka on periaatteiltaan kuten Deklphi, mutta syntaksiltaam kuten C-kieli !

      Voi toki kysyä, MIKSI !

      Järkevämpää olisi ollut käyttää Delphiä tai, kuten kielen toinen nimi on, Objectpascalia.

      Ainakin C -kielessä on yksi (ilmeisesti tahallaan tehty) heikkous:

      k = 200;
      if (a = 5) { k = 7};

      Tämä hölmö koodinpätkä jättää muuttujan k arvoksi 7 (eikä 200).

      Ammattitason c -ohjelmoija tetenkin väittää, että kyseessä on tyypillinen aloittelijan tekemä virhe, ja että hän ei itse koskaan tekisi tuollaista virhettä.

      MUTTA:

      Heti, kun tämä ammattilainen erehtyy tekemään jonkin seuraavista, samalla kasvaa todennäköisyys siihen, että hän itse tekee saman virheen:

      1) koodaa erittäin väsyneenä

      2) koodaa hyvin nälkäisenä

      3) koodaa samalla, kun puhuu jonkun kanssa (olipa tuo joku puhelimessa tai samassa huoneessa)

      4) koodaa samalla, kun katsoo TV:tä

      No, ehkä tuo ylläoleva esimerkkirakenne ei ole sallittu rustissa, vaikka C -kielessä se onkin sallittua !

      Silti herää kysymys: miksi Firefox piti uudelleenkoodata rustilla, sen sijaan että se olisi uudelleenkoodattu Objectpascalilla.

      Ilmeisesti C -koodaajat kuvittelevat Objectpascalista useita paikkansapitämättömiä asioita, joista 1 on se, että he luulevat, että Delphi -koodaaja aina käsin kirjoittaisi begin end tuon C:stä tutun { } sijasta.

      Omassa Delphi IDEssäni riittää, kun painaa b ja sitten Ctrl-J .... Delphi itse muuttaa sen b:n muotoon begin end, ja väliin vielä pari rivinvaihtoa.

      "Rust on kieli, jossa tavoitteet ovat olleet muuten samat kuin Delphin kehittämisessä, paitsi että rustin kehittäjät halusivat kielestä syntaxiltaan C-kieltä muistuttavan."

      Höpöhöpö. Rustissa on tavoiteltu sitä, että ohjelmoija voi kontrolloida tarkasti muistia, voi tehdä metaohjelmointia ja jakaa niitä dataskeemoja muistissa kätevästi että voi ajaa rinnakkain.

      Object Pascal on käytännössä Pascalia mihin ympätty tuki olio-ohjelmoinnille ja nimiavaruuksille.

      "Eli rust on kieli, joka on muuten kuin Delphi, paitsi että syntaksi ei sitten olekaan Delphin kaltainen, vaan nimenomaan C-kielen kaltainen."

      Rust ei ole Delphin kaltainen.

      "Ammattitason c -ohjelmoija tetenkin väittää, että kyseessä on tyypillinen aloittelijan tekemä virhe, ja että hän ei itse koskaan tekisi tuollaista virhettä."

      Tuollaisissa IDE näyttää punakynää ja ei saa lisättyä koodia masteriin kun CI herjaa.

      "Silti herää kysymys: miksi Firefox piti uudelleenkoodata rustilla, sen sijaan että se olisi uudelleenkoodattu Objectpascalilla."

      Vaikka siksi että Rust on parempi kieli.

      Onhan näissä nyt ihan tajuton ero:

      https://www.freepascal.org/docs-html/current/prog/progse5.html
      https://doc.rust-lang.org/1.30.0/book/first-edition/macros.html

      Tällainen ei myöskään onnistu Free Pascalilla: https://doc.rust-lang.org/1.1.0/book/closures.html

      "Ilmeisesti C -koodaajat kuvittelevat Objectpascalista useita paikkansapitämättömiä asioita, joista 1 on se, että he luulevat, että Delphi -koodaaja aina käsin kirjoittaisi begin end tuon C:stä tutun { } sijasta."

      Sillä ei ole juuri vitunkaan väliä mitä kirjoittaa koska 75% ohjelmoijan ajasta menee koodin lukemiseen. Siksi halutaan kieliä millä voidaan lisätä sitä varsinaisen ohjelman koodin ilmaisukykyä.

      "Omassa Delphi IDEssäni riittää, kun painaa b ja sitten Ctrl-J .... Delphi itse muuttaa sen b:n muotoon begin end, ja väliin vielä pari rivinvaihtoa. "

      Eli tulee enemmän rivejä. Hyi. Paskaa koodia.

      Tosiasia on että Object Pascalilla ei saa kirjoitettua asioita niin selkeästi kuin nykyaikaisilla työkaluilla. Rustistakin löytyvällä Closures toiminnolla saadaan muutamalla rivillä tehtyä se mikä vie Object Pascalissa helposti ruudullisen koodia.


    • Anonyymi kirjoitti:

      "uuden yleiskäyttöisen ohjelmointikielen kehittämisessä tuskin on järkeä, ellei opiskelutarkoituksessa"

      Kas kummaa! Esittämäsi väite on raskaasti ristiriidassa sen kanssa, miksi kehitettiin uusi yleiskäyttöinen ohjelmointikieli, ja annettiin sille nimeksi "rust".

      Rust on kieli, jossa tavoitteet ovat olleet muuten samat kuin Delphin kehittämisessä, paitsi että rustin kehittäjät halusivat kielestä syntaxiltaan C-kieltä muistuttavan.

      Eli rust on kieli, joka on muuten kuin Delphi, paitsi että syntaksi ei sitten olekaan Delphin kaltainen, vaan nimenomaan C-kielen kaltainen.

      Joku siis piti tärkeänä kehittää kielen joka on periaatteiltaan kuten Deklphi, mutta syntaksiltaam kuten C-kieli !

      Voi toki kysyä, MIKSI !

      Järkevämpää olisi ollut käyttää Delphiä tai, kuten kielen toinen nimi on, Objectpascalia.

      Ainakin C -kielessä on yksi (ilmeisesti tahallaan tehty) heikkous:

      k = 200;
      if (a = 5) { k = 7};

      Tämä hölmö koodinpätkä jättää muuttujan k arvoksi 7 (eikä 200).

      Ammattitason c -ohjelmoija tetenkin väittää, että kyseessä on tyypillinen aloittelijan tekemä virhe, ja että hän ei itse koskaan tekisi tuollaista virhettä.

      MUTTA:

      Heti, kun tämä ammattilainen erehtyy tekemään jonkin seuraavista, samalla kasvaa todennäköisyys siihen, että hän itse tekee saman virheen:

      1) koodaa erittäin väsyneenä

      2) koodaa hyvin nälkäisenä

      3) koodaa samalla, kun puhuu jonkun kanssa (olipa tuo joku puhelimessa tai samassa huoneessa)

      4) koodaa samalla, kun katsoo TV:tä

      No, ehkä tuo ylläoleva esimerkkirakenne ei ole sallittu rustissa, vaikka C -kielessä se onkin sallittua !

      Silti herää kysymys: miksi Firefox piti uudelleenkoodata rustilla, sen sijaan että se olisi uudelleenkoodattu Objectpascalilla.

      Ilmeisesti C -koodaajat kuvittelevat Objectpascalista useita paikkansapitämättömiä asioita, joista 1 on se, että he luulevat, että Delphi -koodaaja aina käsin kirjoittaisi begin end tuon C:stä tutun { } sijasta.

      Omassa Delphi IDEssäni riittää, kun painaa b ja sitten Ctrl-J .... Delphi itse muuttaa sen b:n muotoon begin end, ja väliin vielä pari rivinvaihtoa.

      Yksi ilmeinen juttu myös se, että silloin 10v sitten ei FreePascalissa ollut kääntöä LLVM:lle.

      Nyt se on testivaiheessa jo. Ei vielä valmis.


    • Käytät viitteenä Free Pascalin vakaan version haaraa
      joka on julkaistu 2015 (sitä aikaisemmin nämä ominaisuudet olivat jo muissa versioissa).
      Onko tullut mieleen että asia voi olla tehty jollain lailla
      paremmin muissa (tuoreimmissa) versioissa tai Delphissä.


    • Anonyymi kirjoitti:

      Käytät viitteenä Free Pascalin vakaan version haaraa
      joka on julkaistu 2015 (sitä aikaisemmin nämä ominaisuudet olivat jo muissa versioissa).
      Onko tullut mieleen että asia voi olla tehty jollain lailla
      paremmin muissa (tuoreimmissa) versioissa tai Delphissä.

      Rust ilmestyi vuonna 2010.

      Ei Mozillaa kiinnostanut odottaa milloin ehkä tulee johonkin Free Pascaliin ominaisuudet mitä tarvitsivat.


  • katso YACC

  • Jos tarkoitus on ainoastaan tehdä suomenkielinen ohjelmointikieli, niin silloin kannattaisi tehdä vain "wrapper" jollekkin olemassa olevalle kielelle. Eli tulkata syntaksi. Ei tarvitse keksiä pyörää uudelleen.

    • juuri tuolla wrappaustekniikalla Osmo A. Wiio kehitti eCi -kielen.

      Koko eCi -kieli on toteutettu C -kielen preprosessointia hyväksikäyttäen siten, että näin on suomennettu C -kielen avainsanoja.

      esim. näin:

      #define volatile arka

      Asiasta on julkaistu juttu Tietokone -lehdessä 1980 -luvulla.


    • Anonyymi kirjoitti:

      juuri tuolla wrappaustekniikalla Osmo A. Wiio kehitti eCi -kielen.

      Koko eCi -kieli on toteutettu C -kielen preprosessointia hyväksikäyttäen siten, että näin on suomennettu C -kielen avainsanoja.

      esim. näin:

      #define volatile arka

      Asiasta on julkaistu juttu Tietokone -lehdessä 1980 -luvulla.

      M-Kar taas satuilee noista Closureista.

      ObjectPascal ei tosiaan käytä tuota termiä, mutta vastaava toiminto:

      type
      TStringEvent = function(Sender:TObject; Param:String) of Object;

      Esimerkki löytyy Delphin omasta HELPistä esim. TNotifyEvent (muuten sama kui9n tässä, mutta iolman tuota String -parametria).

      Rustin Closuret eivät tarjoa mitään sellaista, etteikö vastaavaa voisi toteuttaa Delphillä.

      Rustin suurin ero "C++" -kieleen verrattuna on juurikin taulukon indeksitarkistukset, jotka ovat olleet läytettävissä jo Delphi 1.0:sta alkaen.

      Kunpa joku keksisi keinon muuntaa koko Firefoxin lähdekoodi kaikkine osineen ObjectPascaliksi.

      Tekisin siihen muutamia muutoksia, ja seuraus olisi paras selain, mitä on koskaan nähty.

      Nyky -Firefoxin ikävimpiä puolia kun on muistisyöppöys.

      Delphissä, jos missä on ylivoimaisen hyvä muistinhallinta.

      Jos sitä osaa käyttää oikein, nopeushyöty nyky -firefoxiin on huomattava!

      Siinä, missä nyky -firefox hyytyy pahasti, jos on kymmeniä välilehtiä yhtäaikaa auki, oikein Delphillä tehtynä nopeus pysyisi huippunopeana vaikka olisi 10000 välilehteä auki, ryhmiteltyinä käyttäjän haluamalla tavalla eri ikkunoihin.

      Aloittajalle:
      Laitapa hakukoneeseen:

      Jack Crenshaw Let's Build a Compiler


  • Jos joku tämän viestiketjun lukija tai kommentoija on Pelit-lehden tilaaja, ja tai omaa muuten vain pääsyn keskustelualueelle pelit.fi -keskustelualueelle, siellä on käyty tästä keskustelua.

    Vastasin siellä, ja vastaan nyt että kielitutkimus on laaja akateeminen tutkimuskenttä, ja täytyy muistaa, että kaikki kielet on ihmisen kehittämiä, myös tietokonekielet.

    Opettele ensin jonkin valmiin kielen kääntäjän toiminnan teoria, ja seuraavaksi yritä opetella tajuamaan kyseisen kääntäjän toiminta käänteisenä. Seuraava vaihe on, että kun sen tajuat, ohjelmoi decompiler, eli uudelleenkääntäjä, joka kääntää käännetystä koneen ymmärtämästä kielestä koodin takaisin ihmisen ymmärrettävään koodikieleen. Ota aluksi vaikka haltuun Javan kääntäjä.

    Javan uudelleenkääntäjiäkin on nykyään jo hyviäkin ja sellaisiakin, jotka kääntävät käännettyä java-koodia verkossa pilvessä takaisin ihmisen ymmärrettävään muotoon.

    Sitten maailma on täynnä ohjelmointikieliä, valitse jokin tietty paradigma, ja tutki, mitä kyseisen suuntauksen kieliä ja minkälaisia on jo kehittty.

    Käytännössä jos ajatellaan, että olet tietojenkäsittely-opiskelijana yliopistossa, oma ohjelmointikieli on tasoltaan tohtorin väitöstutkimus-opinnäytteen työn arvoinen suoritus.

    Mikä ikäsi on ja peruskoulutuksesi?

    • "Käytännössä jos ajatellaan, että olet tietojenkäsittely-opiskelijana yliopistossa, oma ohjelmointikieli on tasoltaan tohtorin väitöstutkimus-opinnäytteen työn arvoinen suoritus."

      Se ei silti vaadi paljoa. Yksinkertaisen, turing täydellisen tulkin saa sadalla rivillä koodia.


  • Jos haluat itse kääntää konekieleksi asti, niin teeppä ensin seuraava:

    Tee tuo sama ohjelma "hello world", vaikka C:llä, ja käännä se ilman mitään optimointeja, jne.

    Sitten avaat sen jollakin dissassemberilla, tms. joka näyttää sen konekielenä ja siitä se lähtee. Näet miten käyttöjärjestelmän tarjoamia rajapintoja voi käyttää ja järjestelmäkutsuja voi tehdä, jne.

    Perusasioista se kannattaa aloittaa, kun perusasiat ymmärtää hyvin, kaikki muu helpottuu hyvin äkkiä.

    Kääntäjiä tosin nykyään tehdään hyvin paljon myös sillä periaatteella, että niissä on "front end", ja "back end" erikseen. Uudelle kielelle, ei välttämättä tarvitse tehdä kokonaan omaa kääntäjää, vaan tehdään vain se etu osa, joka kääntää uuden kielen joksikin välikieleksi ja kääntäjän loppuosa voi olla monelle eri kielelle sama.

    Tällaisia projekteja on esim. LLVM:

    https://fi.wikipedia.org/wiki/LLVM

    • Jos haluaa vain tehdä suomenkielisen ohjelmointikielen, yksi helppo tapa olisi toki tehdä vain suomi -> C tms. kääntäjä. ;)

      Eli käännät joksikin olemassa olevaksi kieleksi, joka sitten käännetään sen kielen omalla kääntäjällä konekieleksi.


    • Tottakai näin, että kääntää vaikka C:lle,ja antaa C-kääntäjän viimeistellä käännös. Vähintäänkin kääntää vaikka webasmille, LLVM:n välikielelle tai muulle vastaavalle.

      Se on kohtuuttoman suuri työ alkaa optimoimaan konekieltä kaikille maailman prossuille.


  • Ennen kuin alkaa kehittämään mitään uutta, pitäisi miettiä "miksi asiakkaat tarvitsevat tämän tuotteen", "miksi tämä asia tarvitaan", "jos minulla olisi yritys, miksi minä olisin valmis maksamaan tästä tuotteesta" "jos olisin asiakas, miksi olisin valmis maksamaan tästä".

    On täysin toisarvoista, oletko hakemassa taloudellista hyötyä vai et. Ellei siihen löydy vastausta, miksi jokin tuote tarvitaan ja miksi siitä ollaan valmiita maksamaan (merkki siitä että sen hyöty on riittävän merkittävä), ideasi ei todennäköisesti ole hyödyllinen tai merkittävä, vaan pelkästään erilainen kuin aiemmat ja pelkkä erilaisuus ei ole etu.

    • Ei ole etu, minkä kannalta? Kuka sanoi, että sen pitäisi olla etu tai tällä pitäisi olla etua mihinkään muuhun verrattuna?

      Jos koodaat esimerkiksi "hello world" ohjelman uudella kielellä ensimmäistä kertaa, harjoitus mielessä, eihän siinä ole tarkoitus, että siitä ohjelamsta olisi mitään etua muihin vastaaviin ohjelmiin verrattuna, vaan siinä on tarkoitus oppia ja alussa yksi tapa oppia on kopioida.

      Eli toiminnan tarkoitus tällöin on oppiminen.

      Toiminnan tarkoitus voi olla myös harrastus, jolloin myöskään kyseista tarpeellisuus / erilaisuus analyysillä ei välttämättä ole väliä.

      Mutta ei kopiointi välttämättä ole ollenkaan huono bisnes staregiakaan, päinvastoin, hyvän toimivan idean kopiointi on lähes aina varmempi tie, kuin täysin uuden testaamattoman idean kehitys ja valmiiksi tuotteeksi tai palveluksi tekeminen. Yleensä selvästi suuremmat riskit ovat uudessa ja kokeilemattomassa ideassa, mutta samoin uudessa ideassa ovat usein myös suuremmat tuottomahdollisuudet, sikäli mikäli on sopivaan aikaan markkinoilla. Toki markkinoilla voi olla myös liian aikaisin. Eihän youtube ollut ensimmäinen videosivusto, facebook ei ollut ensimmäinen sosiaalinen media, jne.

      Kekseliäät ihmiset näyttävät olevan lähes poikkeuksetta hyvin uteliaita. Eli he ovat opiskelleet jo olemassa olevia asioita ko. alalta ja muiltakin aloilta yleensä hyvin laajasti.


    • Anonyymi kirjoitti:

      Ei ole etu, minkä kannalta? Kuka sanoi, että sen pitäisi olla etu tai tällä pitäisi olla etua mihinkään muuhun verrattuna?

      Jos koodaat esimerkiksi "hello world" ohjelman uudella kielellä ensimmäistä kertaa, harjoitus mielessä, eihän siinä ole tarkoitus, että siitä ohjelamsta olisi mitään etua muihin vastaaviin ohjelmiin verrattuna, vaan siinä on tarkoitus oppia ja alussa yksi tapa oppia on kopioida.

      Eli toiminnan tarkoitus tällöin on oppiminen.

      Toiminnan tarkoitus voi olla myös harrastus, jolloin myöskään kyseista tarpeellisuus / erilaisuus analyysillä ei välttämättä ole väliä.

      Mutta ei kopiointi välttämättä ole ollenkaan huono bisnes staregiakaan, päinvastoin, hyvän toimivan idean kopiointi on lähes aina varmempi tie, kuin täysin uuden testaamattoman idean kehitys ja valmiiksi tuotteeksi tai palveluksi tekeminen. Yleensä selvästi suuremmat riskit ovat uudessa ja kokeilemattomassa ideassa, mutta samoin uudessa ideassa ovat usein myös suuremmat tuottomahdollisuudet, sikäli mikäli on sopivaan aikaan markkinoilla. Toki markkinoilla voi olla myös liian aikaisin. Eihän youtube ollut ensimmäinen videosivusto, facebook ei ollut ensimmäinen sosiaalinen media, jne.

      Kekseliäät ihmiset näyttävät olevan lähes poikkeuksetta hyvin uteliaita. Eli he ovat opiskelleet jo olemassa olevia asioita ko. alalta ja muiltakin aloilta yleensä hyvin laajasti.

      Ei sitä omaa ohjelmointikieltä kuitenkaan tehdä hello worldin käännöstä tutkimalla. Ensiksi on lexeri ja siitä rakennetaan abstract syntax tree.

      Sitten kun kieli on parsittu näin, voi alkaa kirjoittaa siihen sitä logiikkaa.


    • M-Kar kirjoitti:

      Ei sitä omaa ohjelmointikieltä kuitenkaan tehdä hello worldin käännöstä tutkimalla. Ensiksi on lexeri ja siitä rakennetaan abstract syntax tree.

      Sitten kun kieli on parsittu näin, voi alkaa kirjoittaa siihen sitä logiikkaa.

      Mitä ihmettä sie taas sössötät?

      Sinun kannataisi alkaa kirjoittaa vaikka blogia, josset tykkää keskustella.


    • M-Kar kirjoitti:

      Ei sitä omaa ohjelmointikieltä kuitenkaan tehdä hello worldin käännöstä tutkimalla. Ensiksi on lexeri ja siitä rakennetaan abstract syntax tree.

      Sitten kun kieli on parsittu näin, voi alkaa kirjoittaa siihen sitä logiikkaa.

      Vaikka vastasitkin väärään viestiin, voin silti vastata sinulle.

      Ohjelmointikieliä, kuten monia muitakin asioita voi tehdä ja opetella tekemään hyvin monella eri tavalla.

      Mitään ei tietenkään tehdä pelkästään tutkimalla, mutta olemassa olevan koodin lukeminen ja ymmärtäminen on yksi tapa oppia.

      Takaisinmallinnus eli reverse engineering on myös yksi tapa oppia.

      Tiesitkö, että kokonaisia teollisuuden aloja on eri maissa aloitettu hyvin paljon takaisinmallinnusta käyttäen?

      Takaisinmallinnus ei ole kovin tehokas tapa oppia, verrattuna lukemiseen, ja valmiin materiaalin hyödyntämiseen. Tässä mielessä toki kannattaa opiskella tekstin parsintaa, lexical analyysia, jne.

      Ymmärsin, että aloittajaa nimenomaan kiinnosti, miten järjestelmäkutsut, jne. toimivat ja näihin kysymyksiin tekstin parsinta yksin ei anna vastauksia.

      Jos nämä aiheet kiinnostaa, kannattaa tutusta käyttöjärjestelmien toimintaan, hyviä hakusanoja on vaikka system call, järjestelmäkutsu, jne.

      https://fi.wikipedia.org/wiki/Järjestelmäkutsu#Toteutukset


    • Anonyymi kirjoitti:

      Vaikka vastasitkin väärään viestiin, voin silti vastata sinulle.

      Ohjelmointikieliä, kuten monia muitakin asioita voi tehdä ja opetella tekemään hyvin monella eri tavalla.

      Mitään ei tietenkään tehdä pelkästään tutkimalla, mutta olemassa olevan koodin lukeminen ja ymmärtäminen on yksi tapa oppia.

      Takaisinmallinnus eli reverse engineering on myös yksi tapa oppia.

      Tiesitkö, että kokonaisia teollisuuden aloja on eri maissa aloitettu hyvin paljon takaisinmallinnusta käyttäen?

      Takaisinmallinnus ei ole kovin tehokas tapa oppia, verrattuna lukemiseen, ja valmiin materiaalin hyödyntämiseen. Tässä mielessä toki kannattaa opiskella tekstin parsintaa, lexical analyysia, jne.

      Ymmärsin, että aloittajaa nimenomaan kiinnosti, miten järjestelmäkutsut, jne. toimivat ja näihin kysymyksiin tekstin parsinta yksin ei anna vastauksia.

      Jos nämä aiheet kiinnostaa, kannattaa tutusta käyttöjärjestelmien toimintaan, hyviä hakusanoja on vaikka system call, järjestelmäkutsu, jne.

      https://fi.wikipedia.org/wiki/Järjestelmäkutsu#Toteutukset

      Toki järjestelmäkutsuja voi opiskella mutta siinä tehdään eri asiaa sitten kuin ohjelmointikieltä. Ohjelmointikieltä toteutettaessa näitä ei edes tarvitse vaan voi tehdä jonkun sillan, että saa upotettua pätkän vaikka C-koodia sekaan millä tekee järjestelmäkutsun kun rakentaa kielellä jotain I/O pulikkaa.


  • Ohjelmointikielien tekeminen on liiankin helppoa kun niitä on niin monta.

    Saisi olla luvanvaraista moinen touhu.

    • Uudemmilla kielillä saa tehtyä asioita yleensä paremmin ja sitten tosiaankin on domain specific languaget, että kieli ratkoo jotain tiettyä asiaa. Joissakin kielissä on myös jänniä erikoisominaisuuksia joista on hyötyä joissakin tarkoituksista.

      Lisäksi joistakin kielistä voi tulla pitkäksikin aikaa standardeja johonkin asiaan tai toimialalle ja kun on sama käytössä jotain kymmentä vuotta niin tehdään vaikka uudempi kieli korjaamaan ongelmia mikä kääntää tälle standardikielelle ennen lopullista käännöstä.

      Vanhemmat kielet häviää sitä tahtia kun ohjelmia kirjoitetaan uusiksi uudemmilla kielillä.


  • Linux ja sen Bash tulkki antaa alkuun ihan hyvä pohjan luoda omia komentoja. Tee vaikka;

    up (komento päivittämään järjestelmän)
    TopMSN (hakemaan uusin viesti S23 sivulta)
    asenna (ohjelman asentaja)
    poista (ohjelman poistaja)
    siivoa (järjestelmän kunnossapitoa)
    ohje (hakemaan opastusta jollakin hakusanalla)

    ja niin edelleen, kyllä siinä suurin into katoaa, vaikka homma menisikin kivuttomasti.

  • Suomen kieli sijapäätteineen voisi tosiaankin olla ihan hauska idea ohjelmointikielen pohjaksi, koska käytännössä nykyiset ohjelmointikielet perustuvat englantiin.

    for value in values -> print value
    arvolle arvoissa -> tulosta arvo

Ketjusta on poistettu 0 sääntöjenvastaista viestiä.