C# jako język skryptowy? Meet ScriptCS

20

O tym, że Microsoft chciałby “uskrypcić” C#, pierwszy raz usłyszałem w 2009 roku na MVP Summit. Efektem takich zapowiedzi jest projekt Roslyn – czyli Compiler As A Service. Idea bardzo interesująca i zacna, jej implementacja – z tego co czytałem – również.

Glenn Block (m.in.) wziął Roslyn, wziął NuGeta, wziął C#, wziął fajny pomysł i zainicjował projekt ScriptCS.

Idea jest prosta (wyjaśniona w większych szczegółach na blogu Glenna: “scriptcs – Living on the edge in C# without a project on the wings of Roslyn and Nuget“):

  • piszemy C#
  • piszemy tyle C# ile nam potrzeba, tzn. tworzymy klasy tylko wtedy jeśli chcemy mieć klasy – jeśli nie to nie
  • do zależności wykorzystujemy NuGet
  • bez żadnych csproj/sln uruchamiamy swoje skrypty – i działają

Prosto, szybko i przyjemnie.

Po niekolei (tzn w odwrotnej kolejności) zaprezentuję na najbanalniejszym przykładzie o co chodzi:

W celu zobaczenia czegoś takiego na konsoli po wywołaniu “scriptcs first_script.csx”:

image

trzeba stworzyć plik “first_script.csx” i wypełnić go kodem C#. Zwróćcie uwagę, że potrzebna jest tylko jedna linjka, bez żadnych klas i przestrzeni nazw:

 System.Console.WriteLine("hello from ScriptCS!"); 

Oprócz tego, obok tego pliku, tworzymy katalog “packages”. Wymóg istnienia tego katalogu nawet jeśli nie jest potrzebny to chyba jakiś bug, ale nevermind.

Oczywiście wykonanie powyższej komendy zakłada, że plik “scriptcs.exe” jest dodany do PATH. Musimy tą zmienną środowiskową zmodyfikować dopisując do niej katalog /bin/debug powstający w wyniku kompilacji projektu ScriptCS.

Kompiluje się bardzo prosto: wystarczy wywołać “msbuild ScriptCS.sln” w głównym katalogu repozytorium. A repozytorium trzeba najpierw zaciągnąć z githuba:

git clone https://github.com/scriptcs/scriptcs.git

Na samym początku jednak warto jeszcze zainstalować nuget cmdline bootstrapper.

… i to wszystko odwrotnie trzeba zrobić. Miłej zabawy!

Ale to jeszcze nie koniec.

Bo na przykład warto wiedzieć, że już powstał plugin do Sublime Text pozwalający wykorzystać ScriptCS do uruchamiania kodu C# z poziomu tego niesamowitego edytora – wystarczy ctrl+B:

clip_image001

Trzeba też zdawać sobie sprawę że ten powyższy kod to tylko popierdułka i żadne mecyje. Polecam spojrzeć na ciekawsze przykłady zastosowania: https://github.com/scriptcs/scriptcs-samples. Znajdziecie tam m.in. przykład SignalR, WPF albo coś co mózg rozwala: uruchomienie NancyFx z poziomu ScriptCS!

Nasuwa się pytanie: dlaczego wcześniej nikt czegoś takiego nie napisał?

Wiem, że można pisać kod C# inline w Powershell i go wykonywać, jak pisał na przykład Wiktor Zychla, ale wnioskuję z posta przytoczonego, że PS wymaga kompletnych struktur C#, razem klasą chociażby – overhead, którego pozbywamy się w ScriptCS.

Ale jak przy Powershell jesteśmy… Dzięki temu projektowi Doug Finke (Powershell MVP) puścił na Twitterze link (https://gist.github.com/dfinke/5148895#file-psroslyn-ps1) do czegoś co pozwala na taki kod w Powershell, obadajcie, wypas!:

PS C:\> Invoke-Csx @"
using System.Linq;
Enumerable.Range(1, 10).Select(x => x * x);
"@ | Where {$_ % 2 -eq 0} | ForEach {$_*2}

Tak więc zapraszam do eksperymentów! Projekt powoli chyba zaczyna osiągać taką rzeszę zwolenników że niedługo będzie można założyć iż nie umrze raczej śmiercią naturalną. Polecam śledzenie jego konta na Twitterze aby być na bieżąco: https://twitter.com/scriptcsnet.

Share.

About Author

Programista, trener, prelegent, pasjonat, blogger. Autor podcasta programistycznego: DevTalk.pl. Jeden z liderów Białostockiej Grupy .NET i współorganizator konferencji Programistok. Od 2008 Microsoft MVP w kategorii .NET. Więcej informacji znajdziesz na stronie O autorze. Napisz do mnie ze strony Kontakt. Dodatkowo: Twitter, Facebook, YouTube.

20 Comments

  1. Antek,
    Nie ma, ale ten projekt ma może 2 tygodnie:). Więc podejrzewam że się czegoś podobnego dorobi.
    Póki co dzięki pluginowi do sublime można mieć namiastkę REPLa.

  2. Pingback: dotnetomaniak.pl

  3. Paweł,
    Roslyn to biblioteka, a nie exe do którego podajesz skrypt, który wykryje nugety referencje. ScriptCS ma poziom skomplikowania dość niski, wystarczy spojrzeć na kod na GitHubie. To bardziej implementacja koncepcji stojącej za Roslyn. Dlatego też napisałem że dziwne czemu wcześniej nikt tego nie napisał:).

  4. A nie co ja plotę, jest przecież rcsi.exe. W takim razie chodzi głównie o rozszerzenie tego mechanizmu o dodatkowe opcje, jak nuget właśnie.

  5. Paweł,
    No tak, ale nuget w tym kontekście to właśnie poniekąd “big deal”:). Glenn Block sam napisał: “Roslyn + Nuget = scriptcs”.
    Wiem że teraz trwają prace np nad debuggowaniem takich skryptów. Nie wiem jak to wygląda w gołym Roslyn, nie bawiłem się tym.

  6. na razie jedyny plus tego ze to mozna z konsoli odpalic. tak to nie odkryli ameryki – repl byl dostepny w MONO, zas do takich pomniejszych spraw i kodu to LinqPad sie idealnie nadaje – wiec ten przyklad z console write line w LinqPad zapisuje w jednej linijce bez using – sam domyslnie dodaje ten using.

    Pewnie jakby sie uprzec to i za pomoca command line mozna linqPad odpalic (ale tutaj zgaduje nie sprawdzalem)

    Tak czy siak, fajnie wykorzystany Roslyn – w ogole musze do niego znow powrocic, bo jak pisalem ten C# to Knockout JS to jeszcze z Roslyn nie moglem skorzystac :(

  7. Zgadzam się z przedmówcą, Gutkiem. W Mono od dawna jest możliwość tworzenia i uruchamiania skryptów w CS. Dodatkowo jest interaktywna konsola – http://www.mono-project.com/CsharpRepl . Używanie skryptów CS w Mono jest powszechnie znane – korzysta z tego np. Unity3D w silnikach do gier. MS wprowadzając Roslyn nic nowego nie odkrywa, dziwi mnie jedynie , iż robią to tak późno. Zaś można liczyć na to, iż po wprowadzeniu Roslyna do platformy .NET jako standardu, spowoduje wysyp przykładów jego użycia.

  8. Panowie,

    ale nie mylmy Roslyn’a z scriptcs czy rcsi. Roslyn to trochę więcej a te dwie rzeczy to tylko pokazanie co za pomocą Roslyn’a można (ale też nie wyczerpanie jego możliwości). Tak tylko kwestią uzupełnienia…bo takie odniosłem wrażenie (może mylne) :)

    Paweł

  9. Waldimen on

    Ja tam wolę LinqPad-a, jak chce coś sprawdzić szybko to wpisuje i uruchamiam, naprawdę super narzędzie polecam, kupiłem nawet licencję na wersję Pro jest warta swojej ceny.

  10. Roslyn to dużo więcej niż CodeDom: http://stackoverflow.com/questions/7852926/microsoft-roslyn-vs-codedom

    A ScriptCS to więcej niż LinqPad. Dzięki temu można pisać reużywalne skrypty i je wykonywac na różnych maszynach. C#-em zastąpić Powershella. LinqPad to po prostu proces “odpal -> napisz -> uruchom -> skasuj -> zapomnij” podczas gdy ScriptCS oferuje wszystko to czego potrzeba od środowiska skryptowego. Polecam zresztą posłuchać jednego z ostatnich odcinków DotNetRocks gdzie Glenn opowiada i o powstaniu projektu i o dalszej wizji, bardzo interesujące: http://www.dotnetrocks.com/default.aspx?showNum=853 .

  11. Waldimen on

    Ale dlaczego zastępować Powershella ? Czegoś mu brakuje ? Powershell nadaje się to skryptów o wiele bardziej niż czysty C#.
    Słuchałem odcinka .NetRocks na razie nie widzę do tego konkretnego zastosowania ale zobaczymy jak to się rozwinie.

  12. Waldimen,
    Na pewno w chwili obecnej nie nadaje się do produkcyjnego zastosowania – w końcu projekt powstał 2 tygodnie temu. Ale jestem bardzo ciekaw jakie możliwości to przed nami otworzy. Ja bardzo lubię C# i o ile powershell z miesiąca na miesiąc doceniam coraz bardziej, to C# jest wygodniejszy.

  13. somekind on

    Tytuł to jakaś gra słowna, której nie rozumiem, czy zwykła literówka?

Newsletter: devstyle weekly!
Dołącz do 1000 programistów!
  Zero spamu. Tylko ciekawe treści.
Dzięki za zaufanie!
Do przeczytania w najbliższy piątek!
Niech DEV będzie z Tobą!