SoLang — pisanie programów jeszcze nigdy nie było takie proste

Aktualizacja 2019-04-02:

Chociaż ten wpis powstał pierwszego kwietnia, opisuje prawdziwy projekt. Może jednak zawierać elementy humorystyczne w postaci wyolbrzymień.

Programowanie od zawsze było zarezerwowane dla 'tych wybranych'. To jednak już przeszłość, na rynek bowiem wkracza nowy gracz:

Czym jest SoLang?

SoLang to język programowania oparty o platformę Stack Overflow. Opiera się on na założeniu, że każdy kod aktualnie pisany przez programistów składa się z niewielkich fragmentów które łatwo wyszukać w internecie. Dlaczego by z tego nie skorzystać już na poziomie samego języka?

Jak to działa?

Za bazę do stworzenia SoLang posłużyła składnia Kotlin DSL. Dzięki temu kod jest prosty do napisania nawet bez posiadania specyficznych umiejętności. Pozwólcie, że zaprezentuję przykład.

Jednym z popularnych zadań mających sprawdzić umiejętności programisty jest program FizzBuzz. Program ma za zadanie wypisać liczby od 1 do 100, ale wszystkie liczby podzielne przez 3 zamienić na "Fizz", wszystkie podzielne przez 5 na "Buzz", a podzielne przez 15 na "FizzBuzz". Zadanie to sprawia wiele problemów, a przykładowe jego rozwiązanie w języku `python`(Który jest uważany za jeden z najprostszych) wygląda tak:

i=0;exec"print i%3/2*'Fizz'+i%5/4*'Buzz'or-~i;i+=1;"*100

Wszystko jasne i klarowne, prawda? Niestety, jeśli zostawimy ten blok kodu na kilka tygodni, po tym czasie nie będzie już dla nas klarowne za co odpowiadał.

Jeśli chcemy ten sam kod napisać w języku SoLang, po prostu wyszukujemy co chcemy zrobić na platformie Stack Overflow. Gdy znajdziemy już odpowiedni fragment po prostu klikamy przycisk 'share' - da nam on informację o numerze odpowiedzi(Twórca języka obiecuje, że niedługo będziemy mogli wstawić fragment do swojego kodu jednym kliknięciem, za pomocą wtyczki do przeglądarki).

Teraz wystarczy tylko opisać kompilatorowi co chcemy zrobić. Chcemy stworzyć kod. W kodzie chcemy zawrzeć zawartość bloku siódmego(odpowiedź zawierała 7 bloków kodu z czego nas interesuje ostatni) z odpowiedzi numer 40427469 na platformie Stack Overflow. Całość chcemy skompilować za pomocą Pythona 2 i zapisać w pliku `script.py`:

fun main() = createCode {
    +StackOverflowSnippet(answerNumber = 40427469, codeBlockNumber = 7)
}.buildWith("python2", "script.py")

Jeśli zapomnimy za co dany fragment kodu był odpowiedzialny, wystarczy że udamy się do odpowiedzi numer 40427469 i sprawdzimy na jakie pytanie odpowiada. W przyszłości będziemy to mogli zrobić już z poziomu edytora po najechaniu myszką na daną linijkę. Niesamowite, prawda? Ale to nie wszystko. Język pozwala modyfikować pobrane fragmenty kodu według zadanego wzoru. Pozwala także łączyć je i przycinać, a nawet pobierać gotowe skrypty budowania. Zanim jednak to pokażę, opiszę jak skonfigurować nowy projekt w języku SoLang.

Jak wypróbować nowy język?

Jedną z opcji jest oczywiście sklonowanie repozytorium na githubie: https://github.com/krzysztofsroga/solang 

Jeśli zamiast tego chcemy użyć języka we własnym projekcie, otwieramy edytor IntelliJ IDEA i postępujemy zgodnie z instrukcją zawartą na stronie pomocy.

Czyli po kolei - klikamy File -> New -> Project. W wyskakującym okienku po lewej stronie zostawiamy domyślną opcję Gradle, a na środku wybieramy Kotlin (Java) i klikamy Next. Wybieramy nazwę aplikacji (ArtifactId) oraz własną (GroupId). Klikamy Next. W kolejnych okienkach możemy zatwierdzić domyślne ustawienia.

W już gotowym projekcie szukamy pliku build.gradle i wrzucamy do niego odpowiednie zależności:

repositories {
    maven{ url <span class="hljs-string">"<span id="https://jitpack.io">https://jitpack.io</span>"</span> }
    maven{ url <span class="hljs-string">"<span id="https://kotlin.bintray.com/kotlinx">https://kotlin.bintray.com/kotlinx</span>"</span> }
}

dependencies {
    implementation 'com.github.krzysztofsroga.solang:0.1.3-alpha'
}

Oczywiście nie usuwamy przy tym już istniejących linijek maven i implementation, a dodajemy tylko te brakujące. Dzięki tak skonstruowanym zależnościom, edytor sam postara się o pobranie odpowiedniej biblioteki.

Jak stworzyć bardziej skomplikowany kod?

Język oczywiście nie kończy swojego działania na bezmyślnym pobieraniu kodu z internetu. Fragmenty możemy łączyć, edytować, przycinać, jest nawet eksperymentalna opcja ich parametryzacji.

Jeśli chcemy przyciąć fragment kodu FizzBuzz tak aby pomijał całkowicie liczby niepodzielne przez 3 i 5, a ponadto liczył do 50 zamiast 100 wystarczy użyć dwóch funkcji - change oraz takeLines.

fun main() = createCode {
    +StackOverflowSnippet(answerNumber = 40427469, codeBlockNumber = 7) toLine 7 change ("101" to "51")
}.buildWith("python2", "script.py")

Świetne, prawda? Oczywiście taki kod ma także swoje minusy. Język domyślnie pobiera najnowszą wersję odpowiedzi i bierze kod w niej zawarty. Niestety, kod może ulec zmianie właściwie w każdym momencie i z tego względu nie jest to najbezpieczniejsze rozwiązanie. Z tego względu język domyślnie działa w trybie SAFE - użytkownik jest pytany czy na pewno chce uruchomić dany fragment po jego obejrzeniu. Jeśli chcemy uruchomić kod bez pytania, na początku funkcji main musimy zmienić konfigurację:

SoLangConfiguration.soLangMode = SoLangConfiguration.SoLangMode.UNSAFE

Jest też opcja dzięki której kod zostanie tylko zaprezentowany użytkownikowi, bez kompilacji:

SoLangConfiguration.soLangMode = SoLangConfiguration.SoLangMode.PRINT

Inną opcją zabezpieczenia się przed niepowołanymi edycjami kodu jest odwołanie się do konkretnej rewizji odpowiedzi. W ten sposób możemy być pewni, że nasz kod zawsze będzie zachowywał się tak samo. Robimy to w następujący sposób:

+SimpleSnippet("Pierwsza wersja: ")
+StackOverflowSnippet(answerNumber = 4362605, codeBlockNumber = 2, revisionNumber = 1)
+SimpleSnippet("Druga wersja: ")
+StackOverflowSnippet(answerNumber = 4362605, codeBlockNumber = 2, revisionNumber = 2)

Korzystanie z samego języka co prawda na początku może się wydawać dziwne, ale z czasem powinno być o wiele wydajniejsze niż używanie 'starych' metod programistycznych. Myślę, że w ciągu kilku lat wszyscy powoli przesiądziemy się jeśli nie na to konkretne, to na inne, pokrewne rozwiązania.

Co dalej?

Projekt jest dopiero we wczesnej fazie rozwoju i myślę, że w niedługim czasie jego funkcjonalność może się znacznie zwiększyć. W planach jest miedzy innymi rozszerzenie do najpopularniejszych przeglądarek umożliwiające dodanie kodu do naszego projektu jednym kliknięciem. Będzie można także odwoływać się do kodu napisanego... W samym SoLangu. Umożliwi to tworzenie rekurencyjego kodu. Inną ważną zmianą bedą także pluginy do najpopularniejszych edytorów, między innymi pozwalające szybko podejrzeć na jakie pytanie dany fragment odpowiada i jak będzie wyglądał w naszym kodzie. Oczywiście nie można zapomnieć o możliwości pobierania kodu z innych stron StackExchange oraz z Githuba(w ostatnim wypadku zapewne będzie to połączone z dodaniem notki o licencji).

Z ciekawostek, jakich nie znajdziecie poza blogiem dobrychprogramów, to autor wyżej wymienionego języka zaczynając pracę nad nim nie wiedział o istnieniu projektu StackSort, który szczerze mówiąc działa na podobnej zasadzie.

A Wy? Jak zapatrujecie się na nowy język i wszystkie możliwości z nim związane?