2013-11-27 34 views
12

Czy ktoś może wskazać mi dobrą definicję terminu "obniżanie" w kontekście kompilatorów?Poszukiwana: dobra definicja terminu "obniżenie" w kontekście kompilatorów

Z tego co mogę powiedzieć, jest to tłumaczenie operacji na wyższym poziomie na równoważną kombinację operacji niższego poziomu, ale nie jestem do końca pewien, i nie mogę znaleźć po kilku minutach wyszukiwanie w Google. (Istnieje kilka zastosowań "obniżania", np. W GCC lub LLVM, ale bez odniesienia do definicji.)

+0

Czy nie nazywa się to "zmniejszaniem"? A może tak to się nazywa w definicjach gramatycznych, nie pamiętam. – slugster

+0

Dość niejasne. Tak właśnie działa cały kompilator. Nazwałbym konkretne przykłady "zmniejszeniem siły", np. '* 2' =>' << 1'. – EJP

Odpowiedz

13

Dr Dobbs właśnie opublikował an article by Walter Bright (od dlang FAME), gdzie wspomina terminu:

Obniżenie

Jeden semantyczny technika jest oczywiste z perspektywy czasu (ale wziął Andrei Alexandrescu zwrócić uwagę ja) nazywa się "obniżaniem". Polega ona na wewnętrznym przepisywaniu bardziej złożonych konstruktów semantycznych w kategoriach prostszych. Na przykład pętle while i pętle foreach można przepisać pod względem pętli for. Następnie reszta kodu ma jedynie do czynienia z pętlami for. Okazało się, że odkryłem kilka utajonych błędów w sposobie, w jaki pętle zostały zaimplementowane w D, a więc było to miłe zwycięstwo. Używa się go również do przepisywania instrukcji scope guard w terminach try-finally itd. Każdy przypadek, w którym można to znaleźć w przetwarzaniu semantycznym, będzie wygrany dla implementacji.

Jeśli okaże się, że istnieją pewne specjalne reguły w języku, które uniemożliwiają takie "obniżanie" przepisywania, dobrym pomysłem może być powrót i ponowne przejrzenie języka.

Za każdym razem, gdy można znaleźć wspólne podejście do obsługi konstruktów semantycznych, jest to okazja do zmniejszenia wysiłku związanego z wdrożeniem i błędów.

4

Nie mogę znaleźć dobrego linku z definicją, ale myślę, że mogę dać dobry przykład. W LLVM, LLVM IR obsługuje kilka wielkości liczb całkowitych. Większość kompilatorów C/C++, w tym clang, obsługuje długi i 64-bitowy typ danych. Wiele 32-bitowych procesorów, takich jak mipsy (32-bitowe), nie ma instrukcji, które mogą zrobić, na przykład, dodać lub porównać 64-bitowe. LLVM "obniży" te operacje 64-bitowe do operacji, zwykle 32-bitowych, które może wykonać procesor.

W przypadku int64_t porównać na przykład LLVM obniży ją do

compare the upper 32 bits with a signed comparison 
if they are equal, compare the lower 32 bits with an unsigned comparison 

Niektóre opuszczania można uzyskać bardzo fantazyjne. Na przykład na procesorze, który nie obsługuje instrukcji mnożenia, proste mnożniki mogą zmienić się w przesunięcia i dodać, podczas gdy bardziej skomplikowane mogą przekształcić się w wywołanie biblioteki supprt w czasie wykonywania.