Kompilator SScript

1

jeśli okno główne aplikacji (czyli to z menu i toolbarem) ustawię jako niezmaksymalizowane i zapiszę schemat, to po restarcie programu formularz ten jest maksymalizowany z automatu

Ok, zaraz się fixnie ;)

Zamiast wyświetlać ten błąd (...) sugeruję wyświetlić okienko z potwierdzeniem czy na pewno chce się nadpisać istniejący schemat;

O tym nie pomyślałem na początku, dodane do TODO i zmieni się w wolnym czasie :)


Btw, wiesz, że możesz przełączyć edytor na język polski? :D
2

http://sscript.4programmers.net/download/23-07-2013.zip

Voilà - w ten oto sposób prezentuję przed Wami kolejne pełne wydanie pełne równie "fajnych" zmian, jak i poprzednio (hm, w gruncie rzeczy mógłbym wymyślać jakieś fajne nazwy głównych branchy, jak np.ma Android :D).

Kompilator 2.2.3:

  • SSA zostało zaimplementowane! :) (chociaż w imo słaby sposób - części związane z SSA mam na mojej liście rzeczy do refatoryzacji; bez zapasu tabletek na ból głowy nie polecam oglądać zawartości ssa_stage1.pas oraz ssa_stage2.pas...)
  • naprawione zostały wzajemne zależności, teraz już działają poprawnie (tzn.bezproblemowo może istnieć bezpośrednia wzajemna zależność pomiędzy dwoma plikami (oraz np.procedurami wewnątrz nich) i nie jest to żaden błąd, a wręcz przeciwnie: kompilator wtedy działa jak najbardziej poprawnie i kompiluje wszystko bezproblemowo ;) Kilkanaście godzin myślenia nad rozwiązaniem się jednak opłaciło ;>)
  • delikatnie zmieniona została składnia typów enumerycznych: type<enum> foo = [enum1, enum2, enum3]; wygląda imo lepiej, niżeli type<enum> foo = {enum1, enum2, enum3};
  • doszło parę istotnych zmian w optymalizacjach (tzn.pomijając te, które zostały usprawnione przez SSA): zaimplementowałem optymalizator pojedynczych wyrażeń (aktywowany --tree-simplify z linii poleceń i/lub w trybie -O1). Optymalizacja ta stara się maksymalnie uprościć każde pojedyncze wyrażenie, np.:
  • x = x + 50; zostaje zamienione do x += 50;*,
  • x = 10*x + 50*x; zostaje zamienione do x *= 60;*,
  • x = x; jest zamieniane na puste wyrażenie,
  • plus parę innych; jeżeli ktoś chce poznać wszystkie, może sobie przejrzeć: https://github.com/Piterolex/SScript-Compiler/blob/2.2.3-stable/compiler/optimization/tree_simplification.pas#L87 (spokojnie, są tam ogólne komentarze ;P)
    W ramach ciekawostki dodam, że w/w optymalizator np.w GCC to plik simplify-rtx.c posiadający ~6.2 tysięcy linii (https://github.com/mirrors/gcc/blob/master/gcc/simplify-rtx.c - nie polecam otwierać na Operze :P), mój posiada "zaledwie" 360, ale cóż: zawsze to coś! ;>

Wirtualna maszyna 0.3.3:

  • zaimplementowano garbage-collector - yay! Póki co jest to prosta wersja zwykłego mark-and-sweep, lecz potem planuję dodać dodatkowo zliczanie referencji (jako drugą metodę; bodajże podobnie ma JVM). Dla testu można spróbować uruchomić np.taki kod:
function<int> main()
{
 while (true)
  new int[100000];
}

(+- te kilka zer przy tym new) i patrzeć na wykres użycia pamięci np.w menedżerze zadań Windows: domyślnie GC uruchamia się po osiągnięciu limitu 256 MB pamięci, lecz można to zmienić za pomocą przełącznika -gc (lub z poziomu ustawień wirtualnej maszyny w edytorze).

Zmian edytora raczej podawać nie muszę, widać w postach powyżej ;)


Moja aktualna lista TODO prezentuje się tak:

  • na pewno na pierwszy ogień idzie załatanie tych wszystkich memleaków... zaczynam powoli żałować, że nie zaimplementowałem tego w jakimś języku z wbudowanym GC, bo teraz muszę sam dbać o zwalnianie pamięci, więc póki co cały kompilator to jeden wielki memleak. Phi, fixnie się w wolnym czasie ;]
  • potem poprawa wydajności; ten release powinien być nieco wydajniejszy od poprzednich, lecz mimo wszystko mój kompilator jest wolny jak cholera :P
  • optymalizacje dla tablic
  • konstrukcja var<int[]> tab = {1, 2, 3, 4, 5}; (o której było już w którymś z tematów, który założyłem)
  • usprawnić generator kodu (póki co wypluwa sporą liczbę zbędnych opcodów, które optymalizator bajtkodu nie zawsze wyłapuje)
  • optymalizacje międzyfunkcyjne; np.:
function<int> callme()
{
 return 10;
}

function<int> main()
{
 var<int> x = 5*callme(); // wartość wywołania "callme();" jest z góry znana, zatem można by od razu podłożyć i policzyć tę wartość
}

Mam jeszcze listę takich "może kiedyś":

  • SSA dla bajtkodu
  • operator ? (na takiej samej zasadzie, jak w C++: wyrażenie?prawda:fałsz)
    Cóż, sporo pozycji na tej liście nie ma :]

Ach, oraz oczywiście parę screenshotów:
function<void> callme(int param)
{
}

function<int> main()
{
 for (var<int> i=0; i<10; i++)
  callme(i); 

 return 0;
}

W formie grafu to:
img0.png
Forma SSA może wydawać się nieco dziwna, lecz wygląda to tak:
zmienna.(pre-ssa)$(post-ssa)
pre-ssa to SSA-ID, które są używane przez zmienną
post-ssa to SSA-ID, które są zwracane przez zmienną (dla operatora przypisania zawsze pre-ssa=post-ssa, różnica jest w przypadku całej reszty)
Musiałem wprowadzić dwa oznaczenia z racji na operatory ++, += i pochodne, ponieważ np.: wyrażenia i++; nie można by przedstawić w formie i$(0), bo jest to zarówno przypisanie, jak i wykorzystanie wartości zmiennej i. Ot, lubię takie niemainstreamowe rozwiązania ;)

function<int> callme()
{
 return 0;
}

function<int> main()
{
 var<int> x = 0;

 if (callme())
  x = 10; else
  x = 20;

 if (x%2)
  x++;

 return x;
}

img1.png


Uff, powoli całość zaczyna chyba nawet przypominać jakiś "normalny" kompilator :D Mimo wszystko muszę sobie zrobić jakąś przerwę od kodzenia tego: są wakacje, a ja przesiaduję przed komputerem** rozmyślając, jak by usprawnić ten kompilator c:
`*` oraz ofc.obliczane w momencie kompilacji, gdy "x" jest znane i odpowiednia optymalizacja włączona (w tym przypadku `--constant-propagation` oraz `--constant-folding` (lub po prostu `-O2`)). `**` oczywiście wychodzę również na dwór/rower etc., tak żeby nie było :D
Well, to tyle na teraz - jak wam się podoba/co myślicie? ;)
0

Fajne to xD, przydała by się jeszcze obsługa plików i dll/so coby można było zapisywać wyniki do plików i korzystać z zasobów systemowych...

Ciekawe było by coś takiego jak typ liczbowy, w którym sam definiujesz jego rozmiar np var<num[32]> x = 0; gdzie
num to typ, i w nawiasach jego rozmiar, a używasz go jak int'a

1

@hzmzp: wszystko po kolei - jak zaimplementuję klasy (lub przynajmniej struktury :P), to dodam obsługę plików - tak, coby to było ładnie opakowane w jakąś klasę w stylu File.
Aktualnie dokańczam kompilator JIT (yeah!) i dodaję parę pomniejszych rzeczy do VM-ki oraz kompilatora, i chociaż projekt nieco przystopował, to nadal wytrwale nad nim pracuję.
Alzo, w ramach rozluźnienia pisze także jeden pomniejszy projekt, o którym mam nadzieję, że pewnego dnia wspomnę i również dam do oceny (podpowiem, że jest to 2D-owa gra) ;)

1

Halo, coś się tutaj dzieje? Jak idą prace? :-)

1

Tia, ostatnio trochę cicho, ponieważ jestem leniwy i zacząłem grać w Fallouta ("jeszcze tylko wrócę do Megatony i otwieram Lazarusa... no dobra, skoro już tutaj stoi karawana, to może także zakupię amunicję... o, a tam dawno nie byłem...") :P
Oprócz tego aktualnie trzeci raz przepisuję kompilator JIT w VM-ce, bo za każdym razem całkowicie zmieniałem ideę całości i mnie zaczęło to powoli doprowadzać do białej gorączki, ale mam nadzieję, że teraz się już uda bez większych problemów.
Ale spokojnie - prace nad całością nie zatrzymały się całkowicie, wystarczy spojrzeć na listę zmian: http://sscript.4programmers.net/wiki/Changelog
Ogólnie to nowa wersja kompilatora jest właściwie niemalże gotowa, w VM-ce mam do dokończenia ten kompilator JIT, a nad edytorem ostatnio się długo nie rozwodziłem, ale niewiele pozostało.

0

W jaki sposób tworzysz bibliotekę standardową?

1

Co masz konkretnie na myśli?
Pomysły na funkcje biorę zaglądając do dokumentacji C++, Pascala i innych języków (+dodaję, co mi samo wpadnie na myśl) - rzecz w tym, że przez to w bibliotece standardowej panuje dosyć spory chaos i będę musiał pewnego dnia to wszystko ładnie spisać do jakiegoś dokumentu w stylu standardu języka (coś jak C++ ISO lub jakkolwiek tam "formalniej" to się nazywa).
Ogólnie to całą bibliotekę standardową planuję przepisać w SScript 3* (gdy już będą struktury, klasy (...), czyli na stan obecny... +∞ sekund minut dni lat od teraz), tak aby summa summarum trzymało się toto jednej konwencji nazewnictwa i całej tej reszty.
Dążę do tego, aby SS3 wyglądał jakoś tak:

@("stdio.ss")
using std;

function<int> main()
{
 var<int> i = input.readInt("Wpisz jakąś liczbę: ");
 output.writeLine("%i+%i*%i=%i', i, i, i, i+i*i);

 return 0;
}

Ot, trochę C++-owato.
Jeszcze nie myślałem nad żadnymi konkretnymi nazwami metod, oczywiście, wszystko jest "na czas pisania tego postu"; a nuż nawet zmienię całą gramatykę języka, jak mi się tak pewnego dnia spodoba :P

* tak dla czystej formalności: od pierwszego postu w tym wątku mowa o SScript 2 (SS1 to projekt sięgający 2009 roku, o ile dobrze pamiętam, i nawet nie mam do niego już kodu źródłowego**)
** no dobra, mam... ale na starym, zepsutym już dysku twardym z laptopa. Zresztą, to i tak jedynie słabo napisany interpreter i w ogóle moje pierwsze podejście do tworzenia własnego języka programowania (co więcej - miał inną składnię, chociaż miejscami podobną (klamerki, @ do importowania oraz oparty na słowach kluczowych; główną różnicą jest to, że miał jawne dynamiczne typowanie)), czyli nic ciekawego.

0

W kodzie (vmtypes.pas) widziałem typy jak referencja, wskaźnik.

  • Czy w samym Sscripcie mogę ich użyć?
  • Jeśli tak, czy istnieje "uniwersalny wskaźnik"?
0

Pewnie masz na myśli plik: https://github.com/Piterolex/SScript-VM/blob/b27f51bcb1645da2e6922d1b1d1798a76901ad5d/ssvm/vmtypes.pas
Są to typy zarezerwowane do wewnętrznego użytku przez maszynę wirtualną - stricte: uczytelnienia kodu.
Wygodniej i czytelniej pisze się przykładowo Xyz := PVMFloat(addr)^; niż Xyz := PExtended(addr)^;, to samo odnośnie VMReference (chociaż jeszcze nie wszędzie to jest pozmieniane - zbliża się spory update kodu VM-ki, w którym zmieniam całkowicie VMString, aby pozbyć się memleaków (o ironio) i ułatwić sobie dalszą zabawę z kompilatorem JIT, a przy tym porządkuje sporo w kodzie - m.in. to).
bool, char, int, float oraz string są wbudowane pod takimi nazwami w sam język (np.var<int> foo = 1024;), lecz referencja ((P)VMReference) istnieje jedynie na poziomie bajtkodu (rejestry trzymające referencje (adresy): er1, er2, er3 oraz er4) - w kodzie wysokopoziomowym referencje na stan obecny to jedynie tablice pod postacią, jaką są zaimplementowane.

Ad 1: w sumie "na siłę" (ponad tablice) możesz najwyżej wysokopoziomowo rzutować 64-bit -> 32-bit i na odwrót:

var<int[]> tmp;
var<int> src_64, dst_32;
/* ... */
tmp = cast<int[]>(src_64); // oczywiście zadziała jedynie, gdy VM-ka jest kompilowana na 32-bitowy system
dst_32 = cast<int>(tmp); // boom! z 64-bitów zrobiliśmy 32!

Czyli jakoś da się je używać poza ich pierwotnym zastosowaniem, chociaż VM-ce niekoniecznie się to musi spodobać (GC, który w tym przypadku jednak nie powinien zostać aktywowany, może się pewnego razu przyczepić) :P

Ad 2: jedynie na poziomie bajtkodu, jak opisane wyżej. Ew.typ any, który przyjmuje wszystko:

var<any> foo = 10;
foo = "hello";
foo = 10.5;
foo = null;

To taki feature, który został zaprojektowany w zupełnie innym celu, a którego takie użycie to narażanie samego siebie na undefined behaviour... ale poniekąd odpowiada to na pytanie.

1

Ujawniając swoje intencje: Chcę zrobić port jakiejś biblioteki graficznej do twojego języka;
Męczącym mnie problemem jest wskazywanie na niezarządzaną przez gc pamięć.
Struktur nie mogę uniknąć, lecz tutaj z pomocą przychodzi arytmetyka wskaźników.

Pozostaje mi próba zaimplementowania ich na własną rękę ;) (Szanse nikłe, lecz są!)

0

Em, GC nie będzie tykał żadnych danych (obiektów), które nie zostały zaalokowane bezpośrednio przez VM-kę (czyli jedynie przez operator new na stan obecny), jeżeli o to Ci chodzi.

0

A dlaczego gdy wpiszę do GOOGLE hasło SScript to nie pokazuje żadnych wyników na ten temat?

0

Google cie nie lubi.

991b3a6cbb.png

A tak bardziej na powaznie. Duzo popularniejsze jest haslo script, wiec google automatycznie wyszukuje dla script i trzeba kliknac pod spodem zamiast tego wyszukaj sscript.

1

Tak dla czystej formalności: wszystkie te inne wyniki SScript (poza 4p i githubem) nie są moje :P
(przed stworzeniem tego języka nie sprawdzałem w Google tego hasła ;p)

0

U mnie google nie wyszukuje sscript:
http://postimg.org/image/xxnx2zex5/

0

Ehm:

n0name_l napisał(a):

Duzo popularniejsze jest haslo script, wiec google automatycznie wyszukuje dla script i trzeba kliknac pod spodem zamiast tego wyszukaj sscript.

0

Niezależnie od tego czy wpiszę sscript czy script to google mi nic nie pokazuje dopiero jak wpiszę np. sscript 4programmers.net do dostaje oczekiwany wynik.

1

To wpisz SScript w cudzysłowie, Google po prostu nie zna tej nazwy i próbuje na siłę dopasować coś podobnego.

0

Trzeba kliknąć to niebieskie sscript przy Zamiast tego wyszukaj, Ty najwyraźniej tego nie robisz.

0
AlfaLeporis napisał(a):

To wpisz SScript w cudzysłowie, Google po po prostu nie zna tej nazwy i próbuje na siłę dopasować coś podobnego.

To zadziałało.

0

Co ciekawe jakiś ktoś jeszcze rozwija projekt języka o tej samej nazwie:
a) http://perso.nnx.com/pludov/homepage/sscript/status.html,
b) http://perso.nnx.com/pludov/homepage/sscript/presentation.html

0

goscktos123:
Najwyraźniej masz problemy z czytaniem ze zrozumieniem. Wpisz "sscript" bez cudzysłowów i kliknij wyszukaj, a następnie kliknij "zamiast tego wyszukaj sscript".

0

http://perso.nnx.com/pludov/homepage/index-sscript.html

29/05/2006 New Available version

Raczej już nie jest rozwijany :P
A w sumie szkoda, zawsze ciekawie jest popatrzeć na inne rozwiązania ;)

3

[OT]: 11 postow o tym jak wyszukac haslo w google. Boje sie o przyszlosc tego narodu.

0

Fajny ten Schutz Staffel cript ;)

5

No, po prawie roku - nowiutka wersja prosto spod moich palców ;)

Lista zmian jak zwykle dostępna tutaj:
http://sscript.4programmers.net/wiki/Changelog

Tym razem jednak jestem zmuszony wrzucić paczuszkę z plikami na osobny hosting (problemy z połączeniem się do serwera, a nie mam aktualnie czasu dłużej nad tym przysiąść, więc idę po linii najmniejszego oporu :P):
http://speedy.sh/Qz4qp/15-06-2014.zip

Parę screenshotów:
screenshot0.png

screenshot1.png
(tak to wygląda rzecz jasna tylko po włączeniu wyświetlania logu (-v -vv), normalnie tyle nie wyświetla)

screenshot2.png

screenshot3.png

screenshot4.png

Jestem otwarty na sugestie oraz raporty o bugach ;)

0

@Patryk27 - gratuluję nowej wersji :]

Mam tylko małą sugestię, dotyczącą kolejnych nowych wersji IDE - jak dobrze pamiętam, kiedyś sugerowałem Ci kolorowanie składni w pozycjach w okienku CodeInsight; Przydałoby się, aby to okienko posiadało kolory ustawione w ustawieniach (Delphi7 tego nie wspiera, Lazarus połowicznie);

Na myśli mam takie samo tło listy pozycji w CodeInsight, jak tło edytora kodu, taki sam kolor dla słów kluczowych, znaków specjalnych, identyfikatorów itd.; Tego ciągle mi brakuje w środowiskach - pełnej zgodności ustawionego schematu kolorów.

1

@furious programming:
Oh, racja - musiałem zapomnieć dodać do listy. Machnięte do pliku TODO.

1 użytkowników online, w tym zalogowanych: 0, gości: 1