🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #247156

Re: ile czasu trzeba aby sie nauczyc c++?

#247156
From: godek.maciek
Date: Fri, 21 Apr 2017 18:00
50 lines
3882 bytes
W dniu piątek, 21 kwietnia 2017 18:01:23 UTC+2 użytkownik (fir) napisał:

> jak ja ostatnio pisalem prosty kompilator "wyrazen z jednym rowna sie i z czterema operatorami (+-*/) plus nawiasy" to to wcale nie do konca przypominalo 'petle z ifami lub ze switchem')

też ostatnio rozwijam kompilator na potrzeby pracy magisterskiej,
ale kompilacja to jednak coś innego, niż parsowanie. w ogólnym
przypadku celem parsowania jest zbudowanie drzewa rozbioru składni,
choć oczywiście jeżeli format instrukcji jest prosty, często może
wcale nie być nawet takiej potrzeby (co ma znaczenie, jak ktoś
pracuje w językach takich jak C czy Pascal, gdzie obsługa drzew
jest raczej uciążliwa). Jeżeli masz już drzewo rozbioru składni,
to stworzenie interpretera dla języka jest raczej łatwym zadaniem.

Dla amatorów Lispa parsowanie jest zasadniczo umiarkowanie ciekawym
zagadnieniem, natomiast kompilacja -- jak najbardziej. Najbardziej
podstawowa technika kompilacji to konwersja do postaci, w której
funkcje przekazują kontynutacje ("Continuation-Passing Style").

Na przykład, wyrażenie (+ (* x y) (/ z w))
w postaci przekazującej kontynuacje miałoby postać

(pass* x y
  (lambda (xy)
    (pass/ z w
       (lambda (zw)
         (pass+ xy zw return)))))

gdzie pass+, pass/ i pass* to CPS-owe odpowiedniki działań arytmetycznych,
a "return" to "nadrzędna kontynuacja" (np. koniec programu, albo
powrót do wywołującej funkcji). Słowo kluczowe "lambda" ma takie samo
znaczenie, jak w języku Scheme czy w lambda-rachunku, i podobne
jak "function" w JavaScripcie.

Program w takiej postaci można już dość łatwo przekształcić
do pseudo-asemblera:

xy := x * y
zw := z / w
result := xy + zw
return

albo czegoś w tym rodzaju. Dalszy etap nosi w literaturze nazwę
"register allocation" (i używa się do tego np. metod kolorowania
grafów), a chodzi w nim o to, żeby tym zmiennym przechowującym
wyniki pośrednie przypisać konkretne rejestry procesora (żeby zmniejszyć
liczbę dostępów do pamięci)

lista źródeł, na których się opieram, jest dostępna tutaj:

https://www.quora.com/How-do-people-develop-lisps/answer/Panicz-Godek
Technical Details
Message-ID: <6eb4f9c1-4016-43fc-8003-1484e904aa9b@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin3!goblin.stu.neva.ru!news.misty.com!border2.nntp.dca1.giganews.com!nntp.giganews.com!c45no4676744qtb.1!news-out.google.com!t13ni1970qtc.1!nntp.google.com!c45no4676739qtb.1!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <451e90e7$0$17965$f69f905@mamut2.aster.pl> <b1e91861-9e4f-4b2e-be9f-b9a47ca8d719@googlegroups.com> <58e14e55$0$5152$65785112@news.neostrada.pl> <50630553-5585-4c79-b204-10decc20648f@googlegroups.com> <93ccf1ff-6c50-4308-ba33-d7e593ffaeb0@googlegroups.com> <almarsoft.2018019733568017445@news.v.pl> <16c707cc-51c1-49fe-8d99-28670469a954@googlegroups.com> <780c3784-e9ed-44e6-b983-ba04d778a9c4@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 10.31.60.203 with SMTP id j194mr5635703vka.18.1492797645769;        Fri, 21 Apr 2017 11:00:45 -0700 (PDT)
X-Received: by 10.157.82.15 with SMTP id e15mr78483oth.6.1492797645720; Fri, 21 Apr 2017 11:00:45 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin3!goblin.stu.neva.ru!news.misty.com!border2.nntp.dca1.giganews.com!nntp.giganews.com!c45no4676744qtb.1!news-out.google.com!t13ni1970qtc.1!nntp.google.com!c45no4676739qtb.1!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Fri, 21 Apr 2017 11:00:45 -0700 (PDT)
In-Reply-To: <780c3784-e9ed-44e6-b983-ba04d778a9c4@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=46.186.72.252; posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r
NNTP-Posting-Host: 46.186.72.252
References: <451e90e7$0$17965$f69f905@mamut2.aster.pl> <b1e91861-9e4f-4b2e-be9f-b9a47ca8d719@googlegroups.com> <58e14e55$0$5152$65785112@news.neostrada.pl> <50630553-5585-4c79-b204-10decc20648f@googlegroups.com> <93ccf1ff-6c50-4308-ba33-d7e593ffaeb0@googlegroups.com> <almarsoft.2018019733568017445@news.v.pl> <16c707cc-51c1-49fe-8d99-28670469a954@googlegroups.com> <780c3784-e9ed-44e6-b983-ba04d778a9c4@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <6eb4f9c1-4016-43fc-8003-1484e904aa9b@googlegroups.com>
Subject: Re: ile czasu trzeba aby sie nauczyc c++?
From: godek.maciek@gmail.com
Injection-Date: Fri, 21 Apr 2017 18:00:45 +0000
Lines: 63
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit