Coder Social home page Coder Social logo

jbujak / nl-zpp Goto Github PK

View Code? Open in Web Editor NEW
0.0 0.0 0.0 20.71 MB

Extending type system of NianioLang to improve performance of generated code

Python 0.04% Makefile 0.01% NewLisp 4.24% C 77.48% C++ 0.29% Perl 7.24% Perl 6 10.41% Shell 0.03% Java 0.13% JavaScript 0.11% Vim Script 0.01%

nl-zpp's People

Contributors

day1721 avatar jbujak avatar manio143 avatar michalborkowski96 avatar

Watchers

 avatar  avatar  avatar  avatar

nl-zpp's Issues

Compiler die on incorrect argument type

Kompilator wywala się na poniższym kodzie podczas translacji do nlasma. Type checker powinien wychwycić błędne wywołanie funkcji wcześniej i zgłosić błąd. Żadnego owna nie powinno móc się przekazywać do funkcji, która oczekuje ima.

def main::main() {
	var a : own::arr(ptd::int()) = [];
	main::a(a);
}

def main::a(a : ptd::ptd_im()) {
}

Add anonymous records handling

Anonimowe definicje own::rec powinny być kompilowane do struktur C o nazwach generowanych automatycznie. Dotyczy to też zagnieżdżonych rekordów. Na przykład w poniższym kodzie obie struktury own::rec powinny być nazwane i zdefiniowane, a w definicji zewnętrznej struktury powinna zostać użyta nazwa wewnętrznej, a nie pełna definicja.

var a : own::rec({
    x => own::rec({
        y => ptd::int()
    })
}) = ...;

Verify double passing of ref argument

Trzeba zabronić przekazywania dwóch poddrzew jednej zmiennej typu own jako argumentów funkcji.

Przykład, który nie powinien się skompilować:

def f(ref a, ref b) {}
...
var x : own::rec(...) = {...};
f(ref x->y, ref x->z);

Enforce own initialization during declaration

Type checker nie powinien zaakceptować deklaracji zmiennej typu own bez jej inicjalizacji:

  • var zmienna : own::rec({...}) = {...}; jest ok
  • var zmienna : own::rec({...}); jest nie ok

Properly (with type) reading values from an array

W tym momencie tablica zwraca im i możemy zobaczyć w wygenerowanym main.c w #39 że tablica zwraca im, który dodajemy do INTa, bo w typecheckerze przechodzi.

Chcemy mieć sytuację gdzie

var b = a[0]

produkuje rejestr o typie co wartość a[0] odpowiadający zmiennej b.

Make type checker save type speculations in AST

Trzeba zmienić sygnatury funkcji type_checker::check i type_checker::check_modules, tak żeby przyjmowały argument ref modules i zadbać, żeby typy odgadnięte przez type checker zostały zapisane w drzewie AST.

Warning in gcc

warning: passing argument 1 of ‘c_std_lib0int_to_string’ makes integer from pointer without a cast [-Wint-conversion]

Double module name in struct names

Nazwy typów nie-anonimowych zawierają dwukrotnie nazwę modułu

np. main0main0arr0type0len dla funkcji

def main::arr() {
	return own::arr(ptd::int());
}

Add bencharking framework

Powinniśmy mieć repo z benchmarkami i skryptem, który umożliwia odpalenie wszystkich benchmarków na jakoś danej liście wersji kompilatora.

Jeśli benchark się nie kompiluje lub się wywala na danej wersji, to powinno to być zaznaczone w wynikach, ale skrypt nie powinien się wywalić.

Verify passing owns by ref

Podczas sprawdzania definicji funkcji w type checkerze trzeba weryfikować, że jej wszystkie argumenty typu own są przekazywane jako ref.

Przykład funkcji, która nie powinna się skompilować:

def f(a : own::rec({a=>ptd::int()});

Code style issues

Code style issues introduced by commit 92e2f81

  • indent with spaces
  • incorrect newlines in match statements

Add cleaning after own types

Przy czyszczeniu zmiennych typu own cała zaalokowana na nie pamięć powinna być zwalniana, a na wszystkich imach zawartych w strukturze powinna być wywołana funkcja c_rt_lib0clear.

Remove ptd::sim()

Remove ptd::sim() and replace it with ptd::int() and ptd::string(). Change type deduction to match new types.

Load const should be inlined where possible

Kiedy robimy porównanie czegoś ze stałą, translator najpierw emituje :load_const({dest : reg_t, val : im}), co przekłada się na przypisanie wartości do rejestru. W tym przypadku powinniśmy być w stanie złączyć to z porównaniem:

y = const ? z

zamiast

x = const
y = x ? z

Add own to im conversion

Potrzebujemy sposobu, żeby jawnie konwerować owny do imów.

Dla każdego zdefiniowanego ownowego typu T powinna być wygenerowana funkcja ImmT T0type0to_im(const T* arg). Ma ona brać owna i na podstawie jego oraz jego znanego przy kompilacji typu zwracać odpowiadającego mu ima.

Trzeba też dodać w pliku own.nl funkcję own::to_im(ref arg), która będzie hackiem analogicznym do ptd::ensure_only_static(). W kodzie nl ma ona tylko zwracać podany jej argument, ale podczas kompilacji każde jej wywołanie ma być zamienione na wywołanie funkcji to_im() odpowiadającej typowi przekazanego argumentu.

Bug in type checking

Valid code doesn't compile:

def main::own_t() {
        return own::rec({
                bar => ptd::int()
        });
}
var foo : @main::own_t = {bar => 5};
var iii = foo->bar;

Negative int as record field

Nie działają ujemne inty jako pola rekordu

Działa:

def main::main() {
	var a : own::rec({int => ptd::int()}) = {int => 1};	
}

Nie działa:

def main::main() {
	var a : own::rec({int => ptd::int()}) = {int => -1};	
}

Trzeba to poprawić i dodać testy

Add ref arguments handling

Trzeba przywrócić wykomentowaną funkcję przypisującą argumentom typu ref wartość po zakończeniu funkcji

Add compilation of structure initialization

Inicjalizacja struktury typu own powinna kompilować się do utworzenia lokalnej zmiennej typu struktury (w całości na stosie) i ciągu przypisań wartości na jej poszczególne pola. Nie powinno być możliwości częściowej inicjalizacji.

own::rec member of own::rec with invalid type

Following code:

def main::own_rec() {
        return own::rec({
                ttt => ptd::int()
        });
}

def main::bigger_own() {
        return own::rec({
                fst => @main::own_rec,
                snd => @main::own_rec
        });
}

def main::main() {
        var bigger : @main::bigger_own = {
                fst => {
                        ttt => 1
                },
                snd => {
                        ttt => 2
                }
        };
}

compiles, but bigger->snd has type :tct_empty instead if :tct_own_rec

Add generating proper C structures for record types

Trzeba zmienić definicję funkcji get_func_type_struct w module generator_c, tak żeby zawierała wygenerowana struktura odpowiadała typowi, który ma definiować.

Pola:

  • Zagnieżdżone struktury powinny być trzymane jako wartość a nie wskaźnik
  • Imy (i tymczasowo stringi i boole) powinny być typu ImmT
  • Tablice powinny być reprezentowane przez wskaźnik na typ, który jest w nich trzymany
  • Inty powinny być typu INT

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.