Gå til innhold

Vi vil lage vårt eget programmeringsspråk


Gjest Slettet+56132

Anbefalte innlegg

Gjest Slettet+56132

Hei,

 

jeg og Hrisebro satt og pratet om programmeringsspråk, og plutselig fikk begge lyst å lage vårt eget kodespråk. Men, det er diverse spørsmål vi gjerne vil ha svar på:

  • Hvor lang tid tar det?
  • Hva trenger vi?
  • Hva slags kunnskaper må man ha?

Takk for alle innspill, kommentarer og hjelpere. Om noen er interesserte er det bare å si ifra. :)

Lenke til kommentar
Videoannonse
Annonse

Er mange svar på det spørsmålet, jeg vil si at dere hvertfall bør kunne C, å programmere et programmeringsspråk i et annet høynivåspråk høres for meg feil ut. (og vanskelig å få topp hastighet da).

 

Grunnleggende OOP/Datamaskinforståelse er og et minimum.

Lenke til kommentar

C er ikke nødvendig; Lisp-kompilere er skrevet i Lisp, Basic-kompilere i Basic, Pascal i Pascal, Java i Java .. o.s.v. .. men det hender man kombinerer litt - spesielt i sammenheng med "bootstrapping"; man bruker litt C og resten i "språk X"

 

Man kan bruke en allerede eksisterende kompiler til å oversette til lavnivå asm/binaries. Bruker man f.eks. GCC som backend kan man gjøre som her http://paste.lisp.org/display/25915 .. Fordeler er at ting blir portable "gratis" og man sparer en masse jobb. ECL bruker GCC på dette viset.

 

..eller man kan bruke et backend som f.eks. en Lisp (Lisp er et programmerbart programmeringsspråk)-kompiler til å ta seg av kode -> ASM. Jeg lager nye språk-elementer (og dermed nye språk/dialekter) i Lisp hver dag. Lisp-kompileren tar seg av kompileringen (ja, native) av de nye featurene jeg legger til. Kommer jeg på at jeg savner `while'? .. da legger jeg til `while' (4-5 linjer med kode) og jeg har et "nytt språk":

 

(defmacro while (pred &body body)
 (let ((result (gensym)))
   `(let ((,result nil))
      (do () ((not ,pred) ,result)
        (setf ,result (progn ,@body))))))

 

1000kr. til første person som greier å legge til `while' v.h.a. C (nå finnes det allerede et keyword `while' i C; så kall den `myWhile') uten å måtte lage en ny ekstern parser/kompiler/m.m.

 

..man får vurdere hva man er ute etter..

 

    * Hvor lang tid tar det?

 

Så lang tid du ønsker å bruke; man blir aldri "ferdig".

 

    * Hva trenger vi?

 

Hm, vel, "yacc" og "lex" @ google - eller man kan bruke Lisp siden Common Lisp har innebygget støtte for å lage "domain-specific languages", eller t.o.m. generelle språk som nevnt kort over.

 

    * Hva slags kunnskaper må man ha?

 

Søk på:

 

* "stack"

* "regular grammar"

* "context-free grammar"

* "state machine"

* .. uhm .. og se "See Also"-linkene på wikipedia

 

..på google og wikipedia, men vurder å investere i en bok. "Introduction to the Theory of Computation" er god (sitter med den her).

Endret av lnostdal
Lenke til kommentar

Jeg har laget et programmeringsspråk, som heter IKEELU som består av å skrive kode med alle bokstavene i alfabetet, samt ?!., som gjør ymse ting.

 

Det som er litt køddent er å skrive linker til exe fil :p

Så den eneste versjonen jeg har nå som fungerer, er en parser laget i C#

 

Hvor lang tid det tar å lage, avhenger fullstendig av hvor komplisert språket er.

Det er også ganske mye knot med intel instruksjoner (som du fort vil se ikke akkurat er så enkelt som det burde vært)

Lenke til kommentar
jeg og Hrisebro satt og pratet om programmeringsspråk, og plutselig fikk begge lyst å lage vårt eget kodespråk.

Å lage programmeringsspråk er gøy :) Vanligvis har man kanskje en plan/ide om hva slags språk man vil lage, har dere det? Funksjonelt? Deklarativt? Imperativt/OO? Er dere av den minimalistiske skolen? Eller er det everything-but-the-kitchen-sink i selve språket? Det er masse å tenke gjennom før man hopper ut i selve programmeringen. Har dere et problem dere vil løse? Skal dere bare lage et språk på papiret? Eller vil man ha interpreter og/eller kompilator (for en gitt plattform? ny plattform?)?


  •  
  • Hvor lang tid tar det?
     
  • Hva trenger vi?
     
  • Hva slags kunnskaper må man ha?
     

Tid... Man blir aldri ferdig. Språk utvikler seg hele tiden. Akkurat som talespråket vårt utvikler seg vil et programmeringsspråk nødvendigvis utvikle seg etterhvert som man bruker det. (Eller man bruker Lisp...)

 

Man trenger plenty med pågangsmot. Selv er jeg også av den skolen som synes man trenger en hel del kunnskaper om emnet. Så slipper jeg å finne opp helt grunnleggende prinsipper på nytt.

 

Men hvis vi tenker oss at man skal lage en interpreter eller kompilator.. Har man klart å få på plass en grammatikk så er selvsagt neste steg å få parset denne til et passende syntaks-tre. Allerede må man kunne noe om hvordan uttrykke grammatikker og hvordan parsere fungerer. Så sitter vi her med et syntaks-tre, litt avhengig av språket vil man kanskje gjør en del semantisk sjekking, type-sjekking osv. Dermed lønner det seg å kunne en hel del om dette, men dette blir veldig avhengig av typen språk man lager. Type-teori er stort felt! Og så, avhengig av hva man lager, kan man evaluere treet man har framfor seg eller å generere kode. Altså bør man hvertfall ha en del kunnskaper generelt om run-time-systemer og spesifikke kunnskaper om den aktuelle plattformen.

 

Jeg kunne sikkert ha fortsatt, det er masse man må kunne, etter min mening. Men man kan også hoppe ut i det, da kanskje ikke med like heldige resultater, men med (minst) like mye morro :)

 

Jeg vil uansett anbefale noen bøker, "Compiler Construction, Principles and Practice" av Kenneth Louden og "Principles of Compiler Design" (Drage-boka) er noe man bør ha bladd gjennom :) Dessuten er kurset på Ifi, UiO som kalles Kompilatorteknikk (INF5110) veldig gøy, hvis man er av den typen :)

 

Lykke til :)

Lenke til kommentar
[*]Hvor lang tid tar det?

7050708[/snapback]

Tja, jeg har holdt på godt over et år (og er ikke i nærheten av et brukbart produkt enda), men jeg er veldig pirkete og vil ha ting til å gå fort. Den første kommersielle fortran-kompilatoren tok 18 årsverk å lage. Men du kan sikkert lage din egen interpreter på en helg hvis du kan programmering fra før.

 

[*]Hva trenger vi?
Et programmeringsspråk du kan godt (det kan være hva som helst). Hvis du skal lage en interpreter er det alt du trenger, hvis du skal lage en kompilator er det enkelst hvis du får litt hjelp av fasm ( www.flatassembler.net ).

 

[*]Hva slags kunnskaper må man ha?

Du må kunne programmere, og du må vite akkurat hvordan de enkelte delene språket ditt vil virke. Sånn cirka holder ikke. Når du vet akkurat hva delene i språket skal virke blir det mye enklere videre.

 

Hvis du ikke er interresert i teori om emnet anbefaler jeg dessuten at du holder deg unna teori om emnet (unntatt: lær BNF Backus-Naur Form). (Altså: ikke bry deg med å lese en bok.) Dessuten bør du holde deg unna yacc, flex, bison, gold og lignende. Disse vil gi deg mye hodebry, og du vil lære å bruke disse, men disse har sine begrensninger, og når du møter begrensningene og vil videre er du like langt som da du startet.

 

Dette anbefales som en start: http://compilers.iecc.com/crenshaw/

Lenke til kommentar
Hva mener du med at YACC, Flex og disse type generatore vil gi deg hodebry?

Selv bruker jeg det ikke. Foretrekker heller å skrive alt selv.

7077782[/snapback]

Først og fremst må du borti C. Det er enklere, mer lærerikt og først og fremst morsommere å skrive det selv. Da forstår du mer hva som foregår (forhåpentligvis).

 

Har du noen BNF av programmeringsspråket ditt?

Den jeg har er relativt enkel, den har bare en type "statement", et ferdig språk wile gjerne ha både if og while i tillegg til variabel = uttrykk, som jeg har her:

 

letter      ::=   A..Z | a..z | $ | _
digit       ::=   0..9
mulop       ::=   * | / | % | << | >> | ! | | | &
addop       ::=   + | -
relop       ::=   = | <> | < | > | <= | >=
notop       ::=   NOT
boolop      ::=   AND | OR | XOR
number      ::=   <digit> [<number>]
identifier  ::=   <letter> [<identifier> | <digit> [<identifier>]]
newline     ::=   CR$ | LF$ | CRLF$ 
whitespace  ::=   (TAB$ | SPACE$) [<whitespace>]
blankspace  ::=   (<whitespace> | <newline>) [<blankspace>]

term        ::=   <number> | <identifier>[()] | (<expression>)
negfactor   ::=   [- | ~] <term>
mulfactor   ::=   <negfactor> [<mulop> <mulfactor1>
addfactor   ::=   <mulfactor> [<addop> <addfactor>]
relfactor   ::=   <addfactor> [<relop> <relfactor>]
notfactor   ::=   [<notop>] <relfactor>
boolfactor  ::=   <notfactor> [<boolop> <boolfactor>]
expression  ::=   <boolfactor>

assignment  ::=   <identifier> = <expression>  
statement   ::=   <assignment>

program     ::=   {<statement>}

Den ser ganske heavy ut, men den rommer tross alt nesten en full gramatikk for BASIC (unntatt funskjoner og løkker).

 

Det enkleste er å først lage en funksjon for hver regel. Funksjonen Program() vil for eksempel kalle opp funskjonen Statement() i en løkke til du har nådd slutten på fila. Statement() kaller opp Assignment() osv.

Lenke til kommentar
Er mange svar på det spørsmålet, jeg vil si at dere hvertfall bør kunne C, å programmere et programmeringsspråk i et annet høynivåspråk høres for meg feil ut. (og vanskelig å få topp hastighet da).

 

Du trenger slett ikke skrive i C. Mange kompilatorer/interpretere er for eksempel skrevet i Haskell og forskjellige varianter av ML. Pugs, den eneste implementasjonen av Perl 6 som er noenlunde komplett er skrevet i Haskell.

 

Grunnleggende OOP/Datamaskinforståelse er og et minimum.

7050784[/snapback]

 

OOP er absolutt ikke nødvendig, se ovenfor. Datamaskinforståelse er jeg selvfølgelig enig i, det er jo selvsagt.

 

Var på vei med å skrive en kompilator engang, men når jeg kom til parsing fant jeg ut at det ville vært enklest å skrive en interpreter

 

Parsing kommer du ikke utenom uansett.

 

Om du har tenkt å lage et programmeringsspråk er forøvrig Lambda the Ultimate ikke til å komme utenom. Men tenk over hva hensikten virkelig er. Hvis det er for å lære trenger du jo ikke egentlig noen annen grunn, men har du intensjoner om at andre folk skal bruke programmeringsspråket må du spørre deg selv hvilket problem det egentlig er du løser som ikke er løst like bra før.

Lenke til kommentar
  • 3 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...