[#16]
Re: Dlaczego programy w Amosie zajmują tak dużo?
@rafgc,
post #15
Kompilatory Basica rzadko są specjalnie zoptymalizowane - w końcu Basic to język interpretowany, a możliwość jego kompilacji jest tylko opcją.
A zwróć też uwagę na fakt, że instrukcje Basica są dosyć wysokopoziomowe: przykładowo, aby kompilator Basica przeprowadził skuteczną optymalizację komendy w rodzaju I=I+B należałoby wykonać dokładną analizę kodu (automatyczną) czego można się spodziewać w I, oraz B: liczby stało, czy zmiennoprzecinkowej i o jakiej precyzji. Basic (w odróżnieniu od m.in. C) nie definiuje tak dokładnie typów zmiennych, więc linkowana procedura musi obejmować wszystkie możliwości (z których w programie wynikowym zostanie wykorzystana tylko część) - musi być duża i mniej wydajna (bo gdzieś trzeba sprawdzić typ i wykonać skok do właściwej podprocedury obsługującej go).
Przykładem względnie wysokopoziomowej instrukcji w C jest printf: zawarte w niej możliwości formatowania i przyjmowania najrozmaitszych typów argumentów czynią ją naprawdę sporą (warto sprawdzić jak wpływa na wynikowy kod jej dolinkowanie). Po przeciwnej stronie jest inkrementacja ++ - w wielu przypadkach kompilowana do jednej instrukcji CPU.
A Basic (czyli także AMOS) ma wyłącznie instrukcje dosyć uniwersalne (co z jednej strony jest ich zaletą), ale właściwie nie nadające się do optymalizacji w fazie linkowania. Nawet jeśli instrukcje nieużywane nie są linkowane (to akurat da się zrobić dosyć prosto), to i tak procedury tych dolinkowanych MUSZĄ być duże. Więc plik wynikowy będzie duży.
PS. Można to prosto sprawdzić doświadczalnie: napisać cokolwiek np.
10 print "qwerty"
20 rem pusty komentarz
30 rem if 10 then print "uiop"
40 goto 10
następnie skompilować to. Zanotować rozmiar i usunąć rem z linii 30, ponownie skompilować. Jeśli długość kodu wynikowego będzie się różnić bardzo nieznacznie, to będzie znaczyć, że w obu przypadkach zostały dolinkowane nieużywane instrukcje.
Ostatnia aktualizacja: 17.01.2013 22:31:51 przez wali7