Wyzwanie tworzenie kompilatora

1

Język C to mały język. Napisz kompilator do języka C w dowolnym języku mieszczący się w 500 liniach kodu.
https://vgel.me/posts/c500/
https://github.com/Mati365/ts-c-compiler

0
What to drop

Finally, I had to decide what not to support, since it just wasn't feasible to get all of C into 500 lines. (sorry!) I decided I wanted a really decent sampling of features that tested what the general implementation approach was capable of—for example, if I had skipped pointers, I could have just gotten away with the WASM parameter stack and shed a lot of complexity, but that would have felt like cheating.

I ended up implementing the following features:

  • arithmetic operations and binary operators, with proper precedence
  • int, short, and char types
  • string constants (with escapes)
  • pointers (of however many levels), including correct pointer arithmetic (incrementing an int* adds 4)
  • arrays (only single-level, not int[][])
  • functions
  • typedefs (and the lexer hack!)

Notably, it doesn't support:

  • structs :-( would be possible with more code, the fundamentals were there, I just couldn't squeeze it in
  • enums / unions
  • preprocessor directives (this would probably be 500 lines by itself...)
  • floating point. would also be possible, the wasm_type stuff is in, again just couldn't squeeze it in
  • 8 byte types (long/long long or double)
  • some other small things like pre/post cremements, in-place initialization, etc., which just didn't quite fit
  • any sort of standard library or i/o that isn't returning an integer from main()
  • casting expressions
0

Wyzwania Kompilatorowe. Uwielbiam, odkąd na studiach profesor z C powiedziała że kiedyś każdy dobry programista chciał napisać swój kompilator C. Co prawda nigdy się za to porządnie nie zabrałem, ale kilka dziwnych rozwiązań śledziłem. Moim ulubieńcem jest na pewno 8cc który stał się podstawą do ELVM czyli kompilatora C generującego bardzo prosty kod assemblera który potem można łatwo zassemblować do języków ezoterycznych jak BrainFuck czy WhiteSpace. Ktoś nawet napisał backend dla rachunku Lambda. Czyli mamy sytuację odwrotną niż w kompilatorze Haskella. W kompilatorze Haskella, kompilujemy czysty funkcyjny język do imperatywnego świata, a tu kompilujemy imperatywny język C do czystego funkcyjnego świata XD

2
cccpp napisał(a):

Język C to mały język

C to nie jest mały język. 500 linii to jest nierealne.

1
Azarien napisał(a):
cccpp napisał(a):

Język C to mały język

C to nie jest mały język. 500 linii to jest nierealne.

Bardzo nieregularny. A w praktyce dwa języki (preprocesor i C)
Coś tam w gramatyce jest nieregularnego, co powodowało że nie chwytały nie-patchowane generatory

w 500 lini to sobie można mały podzbiór Pascala / innego eleganckiego pod względem projektu języka / strukturalnego Basica

0
Azarien napisał(a):

C to nie jest mały język. 500 linii to jest nierealne.

Nie napisał w wymaganiach że trzeba używać znaku nowej linii.

0
loza_prowizoryczna napisał(a):
Azarien napisał(a):

C to nie jest mały język. 500 linii to jest nierealne.

Nie napisał w wymaganiach że trzeba używać znaku nowej linii.

Konsultowałeś z Johnym co nie chce być good ?

Same #define i #include, a musza być w oddzielnej, wystarczą

0
ZrobieDobrze napisał(a):

Same #define i #include, a musza być w oddzielnej, wystarczą

cccpp napisał(a):

Napisz kompilator do języka C w dowolnym języku

Na uj mi #define i #include.

0
loza_prowizoryczna napisał(a):
ZrobieDobrze napisał(a):

Same #define i #include, a musza być w oddzielnej, wystarczą

cccpp napisał(a):

Napisz kompilator do języka C w dowolnym języku

Na uj mi #define i #include.

Żeby moc dzielić kod na pliki. No chyba ze użyjemy zewnetrznego preprocesora

0
KamilAdam napisał(a):

Żeby moc dzielić kod na pliki. No chyba ze użyjemy zewnetrznego preprocesora

To już podpada pod overengineering IMHO.

0
loza_prowizoryczna napisał(a):
KamilAdam napisał(a):

Żeby moc dzielić kod na pliki. No chyba ze użyjemy zewnetrznego preprocesora

To już podpada pod overengineering IMHO.

W sensie dzielenie kodu na pliki? Zauważ jednak że kompilator ma być w 500 liniach, ale możesz chcieć kompilować rzeczy większe niż 500 linii, a wtedy IMHO dobrze podzielić kod

0
KamilAdam napisał(a):

W sensie dzielenie kodu na pliki? Zauważ jednak że kompilator ma być w 500 liniach, ale możesz chcieć kompilować rzeczy większe niż 500 linii, a wtedy IMHO dobrze podzielić kod

W sumie kolejne ciekawe podejście podsunąłeś - stworzyć wysoce ekspresywny język w którym napiszesz ten kompilator w C a do którego kompilatora napiszemy np. w Haskellu. Myślisz że przejdzie wymagania?

0
loza_prowizoryczna napisał(a):
KamilAdam napisał(a):

W sensie dzielenie kodu na pliki? Zauważ jednak że kompilator ma być w 500 liniach, ale możesz chcieć kompilować rzeczy większe niż 500 linii, a wtedy IMHO dobrze podzielić kod

W sumie kolejne ciekawe podejście podsunąłeś - stworzyć wysoce ekspresywny język w którym napiszesz ten kompilator w C a do którego kompilatora napiszemy np. w Haskellu. Myślisz że przejdzie wymagania?

Nie trzeba się tak męczyć z tworzeniem własnego języka. Weź https://github.com/mlochbaum/BQN . To najbardziej upakowany język o jakim słyszałem

BTW innym rozwiązaniem jest użycie bibliotek. Jakby był dostępny kompilator C jako biblioteka napisałbyś wszystko w jednej linii XD

0
KamilAdam napisał(a):

BTW innym rozwiązaniem jest użycie bibliotek. Jakby był dostępny kompilator C jako biblioteka napisałbyś wszystko w jednej linii XD

To nie przejdzie wymagań - trzeba napisać kompilator a nie po prostu go użyć.

To najbardziej upakowany język o jakim słyszałem

Nie przebije DNA. Tam program tworzy się sam w wyniku interakcji wsobnej. Z drugiej strony - a jeśli by wytrenować model tak by wypluł taki kompilator i ten model miał poniżej 500 parametrów? Teoretycznie dobieranie wartości w treningu jest kreatywne więc może się załapanie pod napisanie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1