Po pięciu latach prac programistycznych zadebiutowała wersja Lua 5.5, szybkiego i kompaktowego języka skryptowego, który zdobył dużą popularność jako wbudowany język do definiowania konfiguracji oraz do pisania rozszerzeń. Kod interpretera Lua jest napisany w języku C i jest dostępny na licencji MIT.
Lua łączy prostą składnię proceduralną z możliwościami opisywania danych poprzez użycie tablic asocjacyjnych oraz rozszerzalnej semantyki języka. W Lua stosuje się dynamiczne typowanie, a konstrukcje językowe są przekształcane w bajt-kod, który jest wykonywany na wirtualnej maszynie obsługującej rejestry z automatycznym zbieraniem śmieci. Interpreter dostępny jest w formie biblioteki, którą można integrować w projektach napisanych w językach C i C++.
Główne nowości:
- W większości operacji zbierania śmieci zastosowano tryb inkrementalny, w którym cykl zbierania śmieci dzieli się na poszczególne kroki przeplatane z wykonywaniem programu, co pozwala uniknąć długich przerw w działaniu aplikacji z dużą ilością obiektów w pamięci.
- Proponowana jest kompaktowa implementacja tablic, która wymaga o 60% mniej pamięci dla tablic z jednorodnymi danymi (oszczędność ta wynika z faktu, że dane o typie nie są przechowywane dla każdego elementu, lecz dla grupy elementów).
- Dodano możliwość jawnego deklarowania zmiennych globalnych w dowolnych blokach kodu za pomocą słowa kluczowego „global”. Przy zdefiniowaniu w bloku kodu wyrażeń z użyciem słowa kluczowego „global”, wszystkie zmienne muszą być obligatoryjnie deklarowane jawnie. Jeśli deklaracja „global” jest nieobecna, to niejawnie ustawiane jest wyrażenie „global *”, które zachowuje wcześniejsze zachowanie, traktując wszystkie zmienne jako globalne. Wprowadzono również wyrażenie „global<const> *”, dzięki któremu wszystkie niejawnie zdefiniowane zmienne globalne stają się dostępne w trybie tylko do odczytu. X = 1 — Ok, X — zmienna globalna, stare zachowanie domyślne. do global Y — deklaracja zmiennej Y jako globalnej, wszystkie pozostałe zmienne w bloku muszą być deklarowane jawnie Y = 1 — Ok, zmienna Y wcześniej zdefiniowana X = 1 — Błąd, zmienna X nie została zdefiniowana end X = 2 — Ok, poza blokiem global ze starego zachowania.
- Zmienne kontrolne podane w pętlach „for” są teraz dostępne tylko do odczytu i nie mogą być zmieniane w ciele pętli. Na przykład, zmienna i zadeklarowana w pętli „for i = 1, 5 do” nie może być zmieniana w ciele pętli.
- Podczas wyjścia liczb zmiennoprzecinkowych za pomocą funkcji print, teraz wyświetlane są wystarczające liczby cyfr do poprawnej konwersji z łańcucha do pierwotnej postaci.
- Zwiększono dozwoloną liczbę poziomów zagnieżdżenia konstruktorów tabel.
- Dodano funkcję table.create(nseq, nrec) do tworzenia pustej tabeli i zarezerwowania pamięci dla określonej liczby elementów.
- W funkcji utf8.offset zapewniono zwrot nie tylko przesunięcia bajtowego do początku znaku, ale również pozycji końca znaku.
- Dodano wsparcie dla tworzenia zewnętrznych łańcuchów, umieszczanych w pamięci, nad którą nie ma kontroli zbieracz śmieci Lua.
- Dodano funkcję luaL_openselectedlibs do ładowania wybranej biblioteki oraz funkcję luaL_makeseed, która tworzy nasiona do funkcji lua_newstate.
- W lua.c zapewniono dynamiczne ładowanie biblioteki ‘readline’, jeśli jest dostępna (jeśli biblioteka jest w systemie — jest ładowana i funkcje edycji łańcuchów stają się dostępne).
- Wprowadzono optymalizację oszczędzającą pamięć podczas ładowania wstępnie skompilowanego kodu bajtowego — Lua może teraz wielokrotnie wykorzystywać pamięć w niektórych wewnętrznych strukturach bez tworzenia duplikatów podczas ładowania duplikowanego kodu bajtowego.
- Zapewniono ponowne wykorzystanie wszystkich łańcuchów w operacjach „dump” i „undump”.
- W pomocniczych buforach zapewniono ponowne wykorzystanie buforów (bez kopiowania do nowego bufora) podczas tworzenia końcowego łańcucha.
Źródło: opennet.ru
