LINUX.ORG.RU

Вышла Lua 5.2

 ,


0

0

Завершена работа над новой версией популярного встраиваемого языка програмирования Lua. Выпущены руководство (reference manual) с описанием новой версии языка (5.2), набор тестов для реализаций Lua версии 5.2 и образцовый (референсный) интерпретатор версии 5.2.0.

Вот основные изменения в новой версии языка:

  • Можно вызывать yield из защищенного вызова (pcall) и метаметодов.
  • Новый метод работы с окружениями и глобальными переменными. В частности, функции getfenv/setfenv больше не работают.
  • Появилось стандартное API для битовых операций.
  • Изменение в C API: появились т.н. «облегченные нативные функции» («light C functions»), представляющие собой простые указатели на функции. В отличие от полноценных замыканий, они не имеют окружения, что позволяет экономить системные ресурсы.
  • В языке появился оператор goto.
  • Изменение в сборке мусора: таблицы со слабыми ссылками на ключи и с сильными ссылками на значения теперь будут работать как таблицы эфемеронов.
  • Теперь у таблиц могут быть финализаторы.
  • Помимо уже существующего инкрементного сборщика мусора, интерпретатор теперь имеет экстренный сборщик мусора, который освобождает память, если не удается выделить новую. Кроме того, появился экспериментальный сборщик мусора с учетом поколений (generational GC), но он по умолчанию отключен.

Полный список изменений можно прочитать в файле README, находящемся в дистрибутиве Lua.

Нововведения в языке привели к несовместимости Lua 5.2 и 5.1. Возникшие проблемы совместимости задокументированы в руководстве. Впрочем, теоретически существует возможность написать программу так, чтобы она исполнялась и на Lua 5.1, и на 5.2. Lua не стремится сохранять обратную совместимость: например, версия 5.1 не была совместима с 5.0. Разработчики отмечают, что совершенно необязательно переводить существующие приложения со скриптингом на Lua на новую версию языка.

С момента выпуска Lua 5.1 прошло около четырех лет. Первая альфа-версия 5.2 вышла примерно год назад. Образцовый интерпретатор распространяется по лицензии MIT.

>>> Сайт Lua

★★★★★

Проверено: maxcom ()
Последнее исправление: proud_anon (всего исправлений: 4)

Ответ на: комментарий от anonymous

и большая часть в юзерспейсе

Так большая часть или все?

Так что упс.

Пока не вижу «упс». Если в ядре венды хоть в одном месте используется исключение, то Катлера нужно «бить по яйцам и увольнять».

tailgunner ★★★★★
()
Ответ на: комментарий от LamerOk

А что, греп на raise найдет __finally? Правда?

Нет, греп на finally найдет и __finally. Но можешь прикидываться шлангом и дальше - я давно понял, что ты органически неспособен признать ошибку.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Какая именно «венда»?

Ядро.

Хорошо, какая часть «ядра»? kernel32.dll - это тоже, знаешь ли, «ядро». Но это немножко не то ядро, которое ntdll.dll

LamerOk ★★★★★
()
Ответ на: комментарий от tailgunner

я давно понял, что ты органически неспособен признать ошибку.

И это говорит человек, который предлагал вместо SEH'а искать в исходникакх вендового ядра плюсатые исключения...

LamerOk ★★★★★
()

Если добавили goto, значит это кому-нибудь нужно.

zenden
()

goto скорее всего нужен для генерации автоматических привязок к С/С++ - т.е. в коде, куда не ступает нога человека (в ситуациях, описанных не раз выше).
PS. для почившего в бозе Станкера Луа была выбрана(vs Python) по причине 2-3 кратного преимущества в производительности на том движке/задачах - но скритовиков найти была неслабая задача потом;)

azazello ★★★★
()
Ответ на: комментарий от Turbid

Веб—гуёвина для openwrt luci написана на lua

у них там на луе весь конфигуратор написан.

AVL2 ★★★★★
()
Ответ на: комментарий от azazello

но скритовиков найти была неслабая задача потом;)

луа очень прост и настолько гибок, что писать на нем может любой технически грамотный человек.

AVL2 ★★★★★
()
Ответ на: комментарий от AVL2

Есть и плюсы и минусы. Вообще язык очень неплохой.

Какие минусы по сранению с пистоном кроме меньшей библиотеки?

Turbid ★★★★★
()

Разработчики отмечают, что совершенно необязательно переводить существующие приложения со скриптингом на Lua на новую версию языка.

Это отчасти правда. Сам луа весит настолько мало, что его можно смело считать часть проекта.

Но еще есть биндинги. И они тоже зависают на конкретных версиях. И кому нужен голый луа, без luasocket, lanes,unicode итп?

Я уже давно собрал луа 5.2, но не использую именно потому, что тот же luasocket с ним не собирается. Ладно они переименовали пару функций, о чем, кстати, нигде не сказано. Так ить они же и глубже поломали...

AVL2 ★★★★★
()
Ответ на: комментарий от baverman

Знаю, но я же пришел на этот ресурс учиться у великих гуру в сфере IT(особо в сфере тонкого троллинга). Не всё потеряно, главное что есть у кого учиться;)

lucentcode ★★★★★
()
Ответ на: комментарий от Turbid

Какие минусы по сранению с пистоном кроме меньшей библиотеки?

По сравнению с пистоном одни плюсы. В том числе и с библиотеками.

Другое дело, что это язык небольших приложений и дополнений в больших приложениях. Но 90% пестон-поделок именно такие и есть.

AVL2 ★★★★★
()
Ответ на: комментарий от tailgunner

Странно, в WinAPI чётко прослеживается наследие обычного C. Хотя, зная MS не удивлюсь, если их компилятор C умел много недокументированных возможностей, не покрытых стандартом языка C. С Java они именно так и делали, Basic превратили в монстра и т.п.

lucentcode ★★★★★
()
Ответ на: комментарий от anonymous

Учитывая, что в Lua ЕМНИП нет исключений, goto там весьма полезен.

там есть pcall. Лично я согласен с предыдущими ораторами, что goto полезен только для автоматических генераторов биндингов и подобного роботоориентированного программизма.

AVL2 ★★★★★
()
Ответ на: комментарий от baverman

Lua всё больше скатывается в питон.

Для этого следовало не goto вводить, а автоматический usleep (5000) через строчку.

AVL2 ★★★★★
()
Ответ на: комментарий от anonymous

Ага, именно, что при правильном использовании. Только программы с его использованием сложны для понимания, и модификации. Они очень похожи на ассемблерный листинг с кучей jmp,jne,ja и прочих инструкций, переходящих на метку. Только в ассемблере безусловный, и условные переходы очень органично вписываются в общую структуру ЯП. Для высокоуровневых ЯП проще использовать декомпозицию и множество легковесных функций. Хотя для коротких скриптов goto может быть очень мощным инструментом, здорово уменьшающим размер программы. Неоднозначный это оператор, иногда от него польза, а часто немало вреда.

lucentcode ★★★★★
()
Ответ на: комментарий от KRoN73

17 лет назад, когда был нищим студентом, писал на десятке языков, от Си/Си++ и трёх-четырёх ассемблеров до Форта или Перла :)

Понятно. Значит ни одного из них нормально не знаешь ;)

anonymous
()
Ответ на: комментарий от anonymous

В асме раньше goto был? Там же jmp обычно рулит:) Хотя это наверно самый старый их всех goto операторов. Прообраз goto из эпохи динозавров. И правильно, нет нужды в goto. Есть куча способов без него писать программы. И гораздо более совершенных. Даже в простых процедурных языках.

lucentcode ★★★★★
()
Ответ на: комментарий от anonymous

А вложенный цикл в отдельную процедуру не судьба засунуть? И в случае чего использовать return? Или специальный флаг и православный оператор break? Это элементарно, и правильно с точки зрения написания красивого кода. Особенно хорош вариант с отдельной процедурой и return, он предполагает сильную декомпозицию программы и многократное использование процедуры в разных местах программы. Прямой аналог действия goto, только кошерный:)

lucentcode ★★★★★
()
Ответ на: комментарий от KRoN73

Lua имеет явно указанный женский род.

В португальском языке - да.

Без классификатора «язык» в русском языке Lua будет женского рода.

В русском языке нет слова Lua.

Ты на каком языке общаешься?

Вот-вот. Не забывай об этом ;)

anonymous
()
Ответ на: комментарий от lucentcode
static int sh_sir_crc_init(struct sh_sir_self *self)
{
	struct device *dev = &self->ndev->dev;
	int ret = -EIO;
	u16 val;

        /* skipped */
	val = sh_sir_crc_cnt(self);
	if (4 != val) {
		dev_err(dev, "CRC count error %x\n", val);
		goto crc_init_out;
	}
        /* skipped */

crc_init_out:

	sh_sir_crc_reset(self);
	return ret;
}

если нечто подобное сложно для твоего понимания, рекомендую убиться об стенку.

anonymous
()

В языке появился оператор goto.

goto hell
kermzyxer
()
Ответ на: комментарий от anonymous

Ну и самое мощное средство - исключения из мира С++. С ними вы точно можете выйти красиво из вложенного цикла:) Генерируете исключение, ловите их и в зависимости от исключения делаете что надо.

lucentcode ★★★★★
()
Ответ на: комментарий от anonymous

А что если это C++, и в этом skipped находятся объявления переменных-объектов. Они инициализируются?

stack_protector
()
Ответ на: комментарий от lucentcode

Ну и самое мощное средство - исключения из мира С++.

Это шутка? Не смешно.

AVL2 ★★★★★
()
Ответ на: комментарий от anonymous

Ну батенька, код то простой. И понятный. Но в исходнике на пару тысяч строк пара сотен goto выносит моск. И это - медицинский факт:)

lucentcode ★★★★★
()
Ответ на: комментарий от lucentcode

это ты описываешь историю того, как ты остался без мозга? Если у тебя одна функция на 2k строк, ты долбодятел. А goto между функциями в C запрещён.

anonymous
()
Ответ на: комментарий от AVL2

Но еще есть биндинги. И они тоже зависают на конкретных версиях. И кому нужен голый луа, без luasocket, lanes,unicode итп?

А их разработчики давно уже закончили скрипеть зубами, ругаться в рассылку на Иерусалимски, и пошли либо адаптировать их под 5.2, либо под clear subset 5.1 и 5.2, либо... думают над этим. Адаптируются постепенно.

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Что, нельзя уже и постебаться? И любой программист(или не программист, а злобный юзер(как я)), обязан знать не один способ выйти из вложенного цикла, и любой другой ситуации. Есть много способов сделать одно и то-же. Надо уметь их применять. Сам использовал goto, но со времён интереса к ассемблеру x86 знаю, что любую задачу можно решить кучей методов. А вы говорите о goto, как о священной корове. Как тут не начать стёб?

lucentcode ★★★★★
()
Ответ на: комментарий от proud_anon

Впрочем, о нужности новой версии еще долго не утихнут споры. Не хуже, чем на ЛОРе.

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от lucentcode

А вложенный цикл в отдельную процедуру не судьба засунуть? И в случае чего использовать return?

Это в православном языке с анонимными функциями предлагается генерить процедуры по любому чиху?

Или специальный флаг и православный оператор break?

это уже лучше. Но не всегда.

Особенно хорош вариант с отдельной процедурой и return, он предполагает сильную декомпозицию программы и многократное использование процедуры в разных местах программы.

не совсем так. Этот вариант предполагает море тупой и бесполезной работы по определению одноразовых функций, уменьшение скорости выполнения программы и абсолютно никакого профита.

AVL2 ★★★★★
()
Ответ на: комментарий от proud_anon

А их разработчики давно уже закончили скрипеть зубами, ругаться в рассылку на Иерусалимски, и пошли либо адаптировать их под 5.2, либо под clear subset 5.1 и 5.2, либо... думают над этим. Адаптируются постепенно.

Посмотрим.

Пока что я решил несмотря на приятные новшества не переходить на новую версию.

ЗЫ

Не уверен, что большая часть разрабов не поступила таким же образом...

AVL2 ★★★★★
()
Ответ на: комментарий от anonymous

А зачем так?

static int sh_sir_crc_init(struct sh_sir_self *self)
{
	struct device *dev = &self->ndev->dev;
	int ret = -EIO;
	u16 val;

        /* skipped */
	val = sh_sir_crc_cnt(self);
	if (4 != val)
		dev_err(dev, "CRC count error %x\n", val);
	else {
	        /* skipped */
	}

	sh_sir_crc_reset(self);
	return ret;
}

Так, по-моему, лучше будет. Хотя в ветке else может оказаться ещё куча вложенных if-ов, тогда да, без goto не обойтись.

anonymous
()
Ответ на: комментарий от anonymous

Шеф, я вообще не программист. Прости убогого... Не спец я в С( мне он не очень нравится в принципе). Плюсы как-то ближе к сердцу. Но JavaScript и PHP мне нужны гораздо больше. А в них goto не в почёте;) goto между функциями не запрёщен в ассемблере, там и функции то весьма условно можно назвать функциями... Метки, и команды call для перехода и ret для возврата. Добро пожаловать в стан фанатов низкоуровневых ЯП. Там что угодно можно вытворять, Вирт увидев такое, получил бы инфаркт.

Из всех языков что я видел:

  • Python самый простой на первых порах(на самом деле он очень коварен). goto не используется.
  • C слишком примитивен(иногда это плюс, но чаще минус). Юзают goto программисты, но это не в плюс самому языку.
  • D - попытка исправить C(неудачная). Есть goto.
  • Vala - приятный язык, но недоделанный немного. Без goto вроде.
  • Плюсы - круты, но немного перегружены. Можно жить без goto, но иногда он выручает. Сам грешным делом использовал.
  • Smalltolk и Scheme нравятся, но они не годятся к разработке в реальном мире, академические ЯП.
  • Objective-C - вроде ничего для низкоуровневого ЯП, но нет нормального свободного рантайма и библиотек к нему, ну и уровень ЯП для WEB/Desktop должен быть немного выше.
  • C# - хорош язык, но от MS... Тоже с goto. Зачем он там?
  • Java - надо её упростить, или перевести всю платформу на использование Scala. Без goto, и при этом на нём можно реализовать что угодно:)


lucentcode ★★★★★
()
Ответ на: комментарий от proud_anon

goto рулит и педалит при правильном использовании. Учитывая, что в Lua ЕМНИП нет исключений, goto там весьма полезен.

Есть в некотором виде при помощи error() и pcall() / xpcall().

Это вообще-то ни в каком виде не исключения. error() - это просто аварийное завершение программы с выводом сообщения, а pcall() и xpcall() - «безопасные» вызовы функций, для которых error() не приводит к завершению программы, а завершает только текущую функцию и возвращает переданное сообщение.

anonymous
()
Ответ на: комментарий от lucentcode

Но JavaScript и PHP мне нужны гораздо больше. А в них goto не в почёте;)

Джава- и пэхапэ-быдлокодерам goto не положен. Как солдатам стройбата - оружие ;)

anonymous
()
Ответ на: комментарий от anonymous

Кстати, тут не ошибочка?

static int sh_sir_crc_init(struct sh_sir_self *self)
{
	struct device *dev = &self->ndev->dev;
            ...
}

По-моему, нужно

struct device *dev = self->ndev->dev;
или
struct device *dev = &self->ndev.dev;
:)

anonymous
()
Ответ на: комментарий от yoghurt

В си - да, гоуту. Либо return(!).

Лишний return в середине функции тоже считается злом™, просто чуть меньшим, чем goto. Разве что в функции будет единственная эффективная точка возврата внутри вложенного цикла, да и то как-то сомнительно.

const86 ★★★★★
()
Ответ на: комментарий от anonymous

Это вообще-то ни в каком виде не исключения. error() - это просто аварийное завершение программы с выводом сообщения, а pcall() и xpcall() - «безопасные» вызовы функций, для которых error() не приводит к завершению программы, а завершает только текущую функцию и возвращает переданное сообщение.

Итак, есть возможность аварийно завершить работу функции и передать сообщение, возможность назначить обработчик для ошибок и даже возможность просмотреть стек вызовов после возникновения ошибки. Этого достаточно, чтобы организовать неструктурную обработку исключений, разве нет?

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от LinuxUser

Не пиши ничего. Программирование - это явно не твоё!

Deleted
()
Ответ на: комментарий от anonymous

Правильное использование Goto бывает только в Си и в ассемблере. В скриптовых языках оно не бывает.

Deleted
()
Ответ на: комментарий от lucentcode

D - попытка исправить C

мы уже выяснили что у тебя нет мозга. D - попытка заменить C++, и весьма удачная.

Objective-C - вроде ничего для низкоуровневого ЯП, но нет нормального свободного рантайма и библиотек к нему, ну и уровень ЯП для WEB/Desktop должен быть немного выше.

скажи это ябблу, у которого весь досктопный и мобильный софт на нём, дубина.

Шеф, я вообще не программист. Прости убогий...

fixed for the greater good.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.