Słyszałem o kilku sytuacjach osób używających powiedzmy, JavaScript lub Python (lub coś takiego) w programie napisanym w C #. Kiedy użycie języka takiego jak JavaScript do zrobienia czegoś w programie C # byłoby lepsze niż po prostu zrobienie tego w C #?
70
Odpowiedzi:
Gdy masz zachowanie, którego nie chcesz rekompilować w celu zmiany. Właśnie dlatego tak wiele gier używa Lua jako języka skryptowego / modującego.
źródło
Technikę tę można zastosować do zaimplementowania podstawowej logiki, którą można łatwo przenosić między różnymi środowiskami językowymi. Na przykład mam symulator kalkulatora, w którym cała logika kalkulatora wewnętrznego jest zaimplementowana w 100% JavaScript. Kod interfejsu użytkownika jest oczywiście różny dla każdej platformy:
Dzięki takiemu rozwiązaniu tworzenie wersji mojego programu dla różnych środowisk operacyjnych, a zwłaszcza aktualizowanie ich, jest znacznie prostsze.
źródło
Bardzo ogólnie istnieją dwie sytuacje, w których zastosowałbyś ten wzór:
Wewnętrznie
Przykładem może być Lua zastosowana w Adobe Lightroom.
Zewnętrznie
IBM z powodzeniem stosował języki skryptowe w systemie operacyjnym VM-CMS na komputerze mainframe . EXEC , EXEC / 2 i później Rexx były używane w całym systemie zarówno wewnętrznie, jak i zewnętrznie. Różne aplikacje (np. XEDIT ) były skryptowalne przy użyciu tych samych języków, a wewnętrzne aplikacje / narzędzia (np. E-mail) zostały napisane w języku skryptowym i wykorzystały ścisłą integrację z systemem operacyjnym i innymi narzędziami. Klienci stworzyli i udostępnili wiele skryptowych narzędzi i aplikacji. DEC dostarczył również DCL . Później Microsoft obsługiwał VBscript jako język skryptowy w większości swoich aplikacji, a ostatnio PowerShell(także pliki wsadowe MS / DOS ). Powłoki Unix mają również skrypty .
Obecnie wydaje się, że trend ujawnia interfejsy API i pozostawia wybór języka skryptowego użytkownikom, którzy mogą korzystać z różnych powiązań lub innych sposobów uzyskiwania dostępu do interfejsu API.
źródło
Przykłady rzeczywiste obejmują:
Większość przeglądarek internetowych, które będą obsługiwać osadzony JavaScript.
Microsoft Office Suite - Excel Word itp. Wszystkie obsługują osadzone skrypty VBA.
Wiele routerów sieciowych zawiera interfejsy API skryptów w różnych językach TCL, Perl, Lua.
Wiele wbudowanych urządzeń jest implementowanych przy użyciu bardzo małego zestawu podstawowych funkcji C, które są sklejane za pomocą języka skryptowego, takiego jak Lua. Masz więc zestaw małych, szybkich funkcji C, które współdziałają ze sprzętem, a także większość logiki sterowania w elastycznym, łatwym do zmiany języku skryptowym.
źródło
Czasami skrypty są osadzone w aplikacji, ponieważ są sposobem na rozszerzenie aplikacji hosta przez innych programistów. Aby uchwycić jak najszerszy zakres umiejętności programowania, host może obsługiwać wiele języków skryptowych. Na przykład w JVM można osadzić całą gamę języków zgodnych z JSR-223 , w tym Python, Ruby, JavaScript itp.
Innym niewymienionym jeszcze powodem jest to, że język osadzony ma jedną lub więcej wyróżniających się funkcji, których języka hosta nie można łatwo powielić. Przykładem może być Parse lub bezproblemowe tworzenie DSL (specyficzny dla domeny język / dialekt), które można znaleźć w języku takim jak Rebol.
źródło
Jest jeden interesujący sposób użycia języka skryptowego w aplikacji, o którym inni jeszcze nie wspominali.
Jeśli Twój język hosta ma bogate, refleksyjne środowisko wykonawcze, często przydatne jest osadzenie prostego języka z REPL w swoich aplikacjach, zaczepienie go w gnieździe i zapewnienie dostępu do całego systemu.
Może być używany do interaktywnego debugowania (i jest naturalnie znacznie potężniejszy niż zwykły debugger), łatania kodu, różnych celów monitorowania, a nawet backdoorów (jeśli nie jesteś dobry).
źródło
Moja szczególna sytuacja, gdy korzystam z interpretowanego języka skryptowego w dużej aplikacji:
Istnieje urządzenie zewnętrzne, które wykonuje kilka funkcji. Pomiary, kontrola, odczyty. Sam jest dość „głupi” i wymaga precyzyjnej kontroli krok po kroku, w tym wielu stanów oczekiwania i doraźnego podejmowania decyzji po stronie mechanizmu kontroli.
Różne funkcje urządzenia są wymagane w różnych punktach głównej aplikacji, w różnych momentach, często na żądanie. Główna aplikacja nie dopuszcza stanów oczekiwania jako takich, wszystko musi być zrobione za pomocą skończonych maszyn stanu.
Teraz, kto napisał maszynę skończonego stanu, wie, że realizacja stanu oczekiwania ma efektywnie co najmniej dwa, często trzy lub cztery wewnętrzne stany maszyny. Wdrożenie dwudziestu stanów oczekiwania dla różnych funkcji (i oczekiwanie na ich reakcje i odpowiednie reagowanie) urządzenia zewnętrznego byłoby bardzo, bardzo frustrującym doświadczeniem.
Zatem zamiast tego istnieją stany: „wykonuj funkcję bez czekania”, „wykonaj funkcję blokującą”, „wykonaj funkcję rozgałęzienia / warunkowego / skoku” w maszynie stanów skończonych, może łącznie sześć stanów. Istnieją skrypty sterujące, które są planowane do wykonania, a następnie wykonywane przez interpretera sterującego urządzeniem zewnętrznym, a ich wyniki są umieszczane tam, gdzie są wymagane.
Podsumowując, aplikacja: w RTOS użycie wewnętrznego interpretowanego języka skryptowego może ogromnie zmniejszyć złożoność wykonywania zadań obficie występujących w stanach oczekiwania (funkcje blokujące).
źródło
Z mojego doświadczenia wynika, że kiedyś opracowaliśmy dużą aplikację, która przepisuje kod źródłowy „starożytnego” języka, aby był zgodny z Unicode. Dokonano tego w języku C #. Skończyło się na tym, że napisałem tylko silnik (który tworzy model danych i zapewnia środki do wykonania kroków niezbędnych do procesu przepisywania) w C # - „kod kleju” do faktycznego wykonywania rzeczy jest wykonywany w IronPython.
Największy punkt dla zintegrowanego IronPython: Załóżmy, że załadowałeś duży model danych (czas ładowania około godziny). Następnie chcesz - ręcznie - zebrać informacje i wyszukać rzeczy. Robienie tego za pomocą skryptu Python z interaktywnej konsoli jest o wiele lepsze niż klikanie w model danych za pomocą debuggera (a ponadto można go odtwarzać).
źródło
Jest kilka powodów.
źródło
Kiedy? Pomiędzy 1948 a 2008 rokiem - początkowo skompilowane języki zajmowały dużo czasu na skompilowanie i połączenie, więc powszechnym było tworzenie języka skryptowego, który umożliwiałby dostosowanie i konfigurację użytkownika. Jeśli spojrzysz na historię AutoLisp, odpowiedź jest początkowo dostarczana z programem AutoCAD z językiem skryptowym, ale zostało to wycofane na korzyść udostępnienia skryptowego interfejsu VBA, a następnie .net.
Dzięki CLR włączenie programu C # lub wywołania programu Lua do istniejącego systemu nie różni się znacząco pod względem kosztów rozwoju, a środowisko uruchomieniowe .net jest dostarczane z narzędziami do generowania i kompilacji w locie.
Nie musisz już mieć języka skryptowego w większym programie, ale zamiast tego narażasz większy program na funkcje skryptowe środowiska wykonawczego.
W środowiskach, które nie oferują generowania i kompilacji kodu w locie i pożądane jest oferowanie języka automatyzacji ogólnego przeznaczenia zamiast języka specyficznego dla domeny, nadal będziesz otrzymywać skrypty Lua lub Python. W przypadku narzędzi oferujących interfejs COM językiem skryptowym będzie C # lub VB.net (MS Office, Sparx Enterprise Architect). Posiadanie języka skryptowego dla programu napisanego w języku, który sam w sobie jest tak prosty, że może być językiem skryptowym, nie jest konieczne.
źródło