Есть ли какие-нибудь недавние конвертеры или интерпретаторы Lua в JavaScript где-нибудь? [закрыто]

Речь идет не о символе новой строки, а о спецификаторе формата printf. Вы обнаружили, что, возможно, ошибка в strlen(), и я могу сказать, что вы должны использовать gcc.

. Ваш программный код в порядке. Спецификатор формата printf может быть немного лучше, но это не приведет к ошибке valgrind, которую вы видите. Давайте посмотрим на эту ошибку valgrind:

==18929== Invalid read of size 4
==18929==    at 0x804847E: main (in /tmp/test)
==18929==  Address 0x4204050 is 40 bytes inside a block of size 41 alloc'd
==18929==    at 0x402A17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==18929==    by 0x8048415: main (in /tmp/test)

«Неверное чтение размера 4» - это первое сообщение, которое мы должны понять. Это означает, что процессор выполнил команду, которая загрузила бы 4 последовательных байта из памяти. Следующая строка указывает, что адрес, который был прочитан, был «Адрес 0x4204050 равен 40 байтам внутри блока размера 41 alloc'd».

С помощью этой информации мы можем понять это. Во-первых, если вы замените '\n' на '$' или любой другой символ, будет произведена та же ошибка. Попробуйте.

Во-вторых, мы видим, что ваша строка содержит 40 символов. Добавление символа завершения \0 приводит к тому, что общие байты используются для представления строки до 41.

Поскольку у нас есть сообщение «Адрес 0x4204050 составляет 40 байт внутри блока размером 41 alloc'd», мы теперь все знают о том, что происходит не так.

  1. strdup() выделил правильный объем памяти, 41 байт.
  2. strlen() попытался прочитать 4 байта, начиная с 40-й, который будет распространяться на несуществующий 43-й байт.
  3. valgrind поймал проблему

Это ошибка glib (). Когда-то начинался проект под названием Tiny C Compiler (TCC). По совпадению, glib был полностью изменен так, что нормальные строковые функции, такие как strlen(), больше не существовали. Они были заменены оптимизированными версиями, которые считывают память с использованием различных методов, таких как чтение по четыре байта за раз. gcc был изменен одновременно с тем, чтобы генерировать вызовы для соответствующих реализаций, в зависимости от выравнивания указателя ввода, скомпилированного оборудования и т. д. Проект TCC был оставлен, когда это изменение среды GNU затруднило создание новый компилятор C, убрав возможность использования glib для стандартной библиотеки.

Если вы сообщите об ошибке, поддерживающие glib, вероятно, не исправит ее. Причина в том, что при практическом использовании это, вероятно, никогда не приведет к фактическому сбою. Функция strlen считывает байты 4 за раз, потому что видит, что адреса выровнены по 4 байт. Всегда можно читать 4 байта из 4-байтового выровненного адреса без segfault, учитывая, что чтение 1 байта с этого адреса будет успешным. Поэтому предупреждение от valgrind не выявляет потенциального сбоя, просто несоответствие в предположениях о том, как программировать. Я считаю, что valgrind технически корректен, но я думаю, что нет никаких шансов, что разработчики glib сделают все, чтобы отменить предупреждение.

30
задан Kevlar 7 October 2008 в 19:05
поделиться

3 ответа

Это - текущий вопрос в списке Lua, я предполагаю из-за поверхностного подобия этих двух языков.

, К сожалению, существует много важных различий, которые не так очевидны. Для создания его работать нужен или полноценный компилятор, предназначающийся для JS вместо байт-кода Lua, или переписывающий Lua VM в JavaScript.

я не знаю исходных целей Lua2js; но если бы это был просто ограниченный 'переводчик', затем пишущий, что код Lua намеревался быть переведенным, то отклонил бы большинство (все?) хороших вещей о Lua. Например, я не думаю, что Вы могли использовать функцию в качестве ключа таблицы, с тех пор в JavaScript ключи являются только строками (и числа? я не уверен).

выбор.NET более разумен, он мог быть сделан, изменив существующий компилятор для испускания байт-кода CLR вместо стандартного байт-кода Lua. Даже если CLR разработан и оптимизирован для другого вида языков, это достаточно определенно универсально для выполнения очень хорошо. Основное препятствие было бы доступностью библиотек.

Другая опция, которую я просто нашел, данная статья Roberto Ierusalmschy и Fabio Mascarenhas, где они исследуют перевод байт-код LuaVM в байт-код CLR.

, Как обычно на научных работах, нет никакого признака о дате, когда она была записана, таким образом, я понятия не имею, является ли это новым и революционным или старым и забыто.

8
ответ дан Javier 7 October 2008 в 19:05
поделиться
  • 1
    какая-либо идея о том, как изменить близкий значок также? – sanath_p 25 August 2015 в 22:41

Перевод в JavaScript интересен допускать замену JavaScript на стороне браузера. Мы могли взять немного безопасности типов на браузере также. Предназначение для JavaScript как платформа предназначается для одной из самой распространяющейся платформы, браузеров планеты. GWT делает java2js, но я не уверен, хочу ли я представить GWT только для нескольких страниц в приложении. Я должен думать об этом. Для Вашей функции как ключ в таблице должно быть некоторое волшебство, которое будет сделано. Возможно, просто присвойте уникальное имя каждой функции при компиляции и использовании это для Вашего ключа. Можно также добавить префикс ко всем ключам для проверки типа, и это - хороший запуск.

0
ответ дан lacroix1547 8 October 2008 в 06:05
поделиться
  • 1
    Btw, используйте app:actionLayout вместо android:actionLayout, если Вы хотите звонить getActionView. – algrid 6 March 2019 в 01:13

Одним из способов сделать это может быть использование LuaSub и генерация JavaScript вместо вывода Lua. Это можно сделать, приложив разумные усилия (в настоящее время LuaSub этого не делает).

Места, где JS не может быть изменен в соответствии с требованиями Lua, могут быть обнаружены во время компиляции и вызовут ошибку.

Я собираюсь сделать это много JS + SVG в будущем, и если сторона JS окажется головной болью, возможно, стоит попробовать. Если кто-то еще хочет попробовать, сделайте это. Исходный код LuaSub для вас.

Первоначально LuaSub создавался как расширитель синтаксиса для Lua 5.1, чтобы представить концепции простоты использования (sa приращение, проверка типа) без нарушения совместимости со стандартным Lua или необходимости исправления . В этом он похож на MetaLua (который, кажется, стал более банальным).

0
ответ дан 28 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: