2011-01-06 15 views
7

Obecnie robię rekruta na uniwersytet o F #. Mam pytanie dotyczące interaktywnej konsoli F # i kompilatora F #.Czy F # Interpreter (fsi.exe) również tworzy pośredni kod języka, tak jak robi to F # Compiler (fsc.exe)?

Kompilator F # generuje kod języka MSLA (Intermediate Language) Microsoft podczas kompilowania zasobu F #. Jest to następnie tłumaczone przez kompilator JIT na kod maszynowy podczas wykonywania napisanego programu.

Co robi konsola tłumaczeń F #? Czy to także linia-na-linii tłumaczy F # Code na MSIL, a następnie JIT to na kod maszynowy? Czy też tłumaczy F # -Code bezpośrednio na kod maszynowy?

Jeśli najpierw konwertuje to do IL, to myślę, że prawdopodobnie będzie interpreter IL, ponieważ kompilator JIT kompiluje tylko kompletne programy. Czy nie?

Co myślisz, jak F # -interpreter obsługuje kod F # i tłumaczy go?

Pozdrowienia, Martin

Odpowiedz

13

F # kompilator emituje IL stosując własną bibliotekę AbsIL. AbsIL to kolejny projekt MSR, który został zaabsorbowany przez F #.

Podczas kompilowania dla trybu interaktywnego, AbsIL uses, przestrzeń nazw System.Reflection.Emit emituje IL w pamięci, w czasie wykonywania, która z kolei jest kompilowana do natywnego kodu przez JIT podczas wykonywania kodu.

+0

Szybki plik źródłowy sugeruje, że AbsIL nie używa System.Reflection.Emit, ale generuje plik binarny bezpośrednio do strumienia BinaryWriter .NET. W niektórych miejscach wydaje się również używać niestandardowego ByterBuffer zdefiniowanego w bajtach.fs. Wierzę, że tak jest, ponieważ pierwotnie AbsIL musiał przejść kompilację z OCaml, ale odszedł od tego, jak kompilator był przywiązany do butów. – Robert

+1

@Robert, spójrz na drugi link mojego posta, zobaczysz, że ma backend SRE, jak określono w nagłówku: "Napisz abstrakcyjne struktury IL w czasie wykonywania za pomocą Reflection.Emit» –

+0

Ponadto, biorąc pod uwagę liczbę problemów, które fsi wywołało i nadal wyzwala w implementacji SRE Mono, mogę powiedzieć z doświadczenia :) –