5

Jeśli istnieją jacyś projektanci języków (lub ludzie po prostu znają), jestem ciekawy metodologii tworzenia standardowych bibliotek dla języków interpretowanych. W szczególności, co wydaje się być najlepszym podejściem? Definiowanie standardowych funkcji/metod w języku interpretowanym lub wykonywanie przetwarzania tych wywołań w skompilowanym języku, w którym napisany jest interpreter?Języki tłumaczenia - wykorzystanie skompilowanego języka za tłumaczem

To, co skłoniło mnie do myślenia o tym, to pytanie na temat funkcji stripslashes() w Pythonie. Moją pierwszą myślą było "dlaczego nie zdefiniować własnego i po prostu nazwać go, kiedy jest to potrzebne", ale podniosło to pytanie: czy preferuje się, aby taka funkcja pozwalała interpretowanemu językowi obsługiwać się na górze, czy byłoby lepiej, aby napisać rozszerzenie i wykorzystać skompilowany język za tłumaczem?

+3

Zamiast "wykorzystać" skompilowany język, dlaczego nie "używać" go lub "wykorzystywać" go? Nie zwiększajmy liczby słów kluczowych w języku angielskim, chyba że musimy :) – MarkJ

Odpowiedz

6

Linia między językami "zinterpretowanymi" i "skompilowanymi" jest obecnie bardzo niewyraźna. Na przykład pierwszą rzeczą, jaką robi Python, gdy widzi kod źródłowy, jest skompilowanie go do reprezentacji kodu bajtowego, w zasadzie tego samego, co Java robi podczas kompilowania plików klas. To właśnie zawierają pliki * .pyc. Następnie środowisko wykonawcze Pythona wykonuje kod bajtowy bez odwoływania się do oryginalnego źródła. Tradycyjnie, język czysto interpretowany odnosiłby się do kodu źródłowego w sposób ciągły podczas wykonywania programu.

Budując język, dobrym podejściem jest zbudowanie solidnego fundamentu, na którym można realizować funkcje wyższego poziomu. Jeśli masz solidny i szybki system obsługi ciągów znaków, projektant języka może (i powinien) zaimplementować coś w stylu stripslashes() poza podstawowym środowiskiem wykonawczym. Odbywa się to przez co najmniej kilka powodów:

  • Projektant język może pokazać, że język jest na tyle elastyczne, aby obsłużyć tego rodzaju zadania.
  • Projektant języka faktycznie pisze prawdziwy kod w języku, który ma testy i dlatego pokazuje, że fundament jest solidny.
  • Inne osoby mogą łatwiej czytać, pożyczać, a nawet zmieniać funkcje wyższego poziomu bez konieczności budowania, a nawet rozumienia rdzenia językowego.

Tylko dlatego, że język taki jak Python kompiluje się do kodu bajtowego i wykonuje, co nie znaczy, że jest wolny. Nie ma powodu, dla którego ktoś nie mógłby napisać kompilatora Just-In-Time (JIT) dla Pythona, zgodnie z tym, co już robią Java i .NET, aby jeszcze bardziej zwiększyć wydajność. W rzeczywistości IronPython kompiluje Pythona bezpośrednio do bajtowego kodu .NET, który następnie jest uruchamiany przy użyciu systemu .NET, w tym JIT.

Aby odpowiedzieć bezpośrednio na twoje pytanie, jedyny czas, w którym projektant języka mógłby zaimplementować funkcję w języku za środowiskiem wykonawczym (np. C w przypadku Pythona), to maksymalizacja wydajności tej funkcji. Właśnie dlatego moduły takie jak parser wyrażeń regularnych są napisane raczej w języku C niż natywnym języku Python. Z drugiej strony, moduł taki jak getopt.py jest zaimplementowany w czystym Pythonie, ponieważ wszystko można tam zrobić i nie ma żadnej korzyści z używania odpowiedniej biblioteki C.

3

Istnieje również rosnąca tendencja do reimplementacji języków, które są tradycyjnie uważane za "interpretowane" na platformach takich jak JVM lub CLR - a następnie umożliwiają łatwy dostęp do "natywnego" kodu dla interoperacyjności. Tak więc z Jython i JRuby możesz łatwo uzyskać dostęp do kodu Java, a od IronPython i IronRuby możesz łatwo uzyskać dostęp do kodu .NET.

W takich przypadkach umiejętność "wykorzystania języka skompilowanego za tłumaczem" może być opisana jako główny czynnik motywujący dla nowej implementacji.

1

Dopóki używasz przenośnego API dla skompilowanego kodu bazowego niczym ANSI C standard library lub STL w C++, a następnie korzystając z tych funkcji będzie trzymać cię od wymyślania koła i może zapewnić mniejsze, szybsze tłumacza. Lua przyjmuje to podejście i jest zdecydowanie mały i szybki w porównaniu do wielu innych.

2

Zobacz dział "Papiery" pod numerem www.lua.org.

Szczególnie The Implementation of Lua 5.0

Lua definiuje wszystkie standardowe funkcje bazowymi (ANSI C) kodu. Uważam, że jest to głównie ze względu na wydajność. Ostatnio, funkcje "string. * Otrzymały alternatywną implementację w czystym Lua, co może okazać się kluczowe dla podprojektów, w których Lua jest uruchamiana w środowisku wykonawczym .NET lub Java (gdzie kod C nie może być użyty).

Powiązane problemy