nbkolchin
>> строгая типизация для скриптования проекта ни к чему.
>В большинстве случаев --- не нужна нафиг. Есть ситуации, когда она полезна --- например GLSH от Unigine.
там динамическая типизация :). Глотает даже такие отжиги : int a = "asdf"; :D
nbkolchin
>> Что-то подсказывает, что приведение "a" и "b" к нумерик не будет тормознее в 10 раз :)
>Будет. Введение жесткой типизации позволяет простым способом поднять производительность.
Я сам ВМ не писал, но разве ВМ с динамическими типами не юзают для переменных нечто вроде Variant типа? Тогда приведение всего-лишь означает выборку из поля с соответствующим типом. "Разов" тут никак не наберется.
keltar
>По скорости вполе сопоставим с lua
В виду последних новостей (для меня) о jit-компиляции Lua - уже нет :)
keltar
> там динамическая типизация
Опаньки. Я не знал, исходил из синтаксиса языка. А была бы полезна. :)
У них ВМ точно безтиповая?
RPGman
Все зависит от конкретной реализации. В Lua используется union. (я честно пытался вспомнить реализации языков где Variant --- struct, но не смог :) ).
Про приведение типов: смотри, в безтиповом языке у нас для сложения нужно выполнить два сравнения + возможные вызовы функции преобразования типа. Это против двух ассемблерных команд в реализации с явными типами.
nbkolchin
> + возможные вызовы функции преобразования типа.
Вот именно, "возможные". Т.е. потенциально 10-кратная разница в скорости возможна, но в реале разница незначительна. Не думаю, что проверку типа перед приведением делают на пи-коде ВМ. Скорее это хардкоднуто.
Глянул скрипты на Squirrel. Это как раз то, чем AngelScript привлекает некоторых, и чем AngelScript никогда не станет :)
Биндинг весьма и весьма похож на Lua'шный.
Вечерком покопаюсь детальнее...
Однозначно можно рекомендовать Lua-фобам в качестве единственной альтернативы. Целесообразность применения AS теперь вообще под баааальшим вопросом.
nbkolchin
Уважаемый, я не писал своей VM, но достаточно начитан всяких холиваров на comp.lang.*, поэтому предлагаю закончить нафиг спор. Желающие сами почитают comp.lang.* и другие источники и решат, кто прав.
L00bis
>предлагаю закончить нафиг спор
+1
Я, в принципе, хотел услышать аргументы почитателей AngelScript. Просто часто на вопрос новичка "какой скрипт-язык взять" они громче всех кричат "AngelScript - круто, AngelScript - для программеров, Lua - пацкаль ацтойный". Иногда мне пофиг, иногда раздражает - ну не туда зарулят человека, а ему потом расхлёбывать.
Добавлю:
L00bis
Спасибо за luaJit
nbkolchin
Спасибо за Squirrel.
To all nubs:
Прежде, чем слушать всякие "советы", просто попробуйте Lua и Squirrel.
nbkolchin
>Народ, не надо использовать TCL. Он мертв и его использование в новых
>программах --- разновидность некрофилии.
Почему? Проект развивается. Сейчас готовится ветка 8.5. Почему он мёртв-то?
RPGman
Это спасибо Open Source Community, а не мне.
-=]AG[=-
>Я, как геймдизайнер, ответственно заявляю что ЛУА - убер скриптовой язык.
Ты с чем кроме ЛУА работал? чем он лучше?
Вот, решил провести пару тестов трёх интерпретаторов (Lua, Python, TCL)
Что использовалось:
Python 2.3.5
Psyco 1.5
Lua 5.1
LuaJIT 1.1.0
TCL 8.4.6
ActiveState TclDevKit 3.2
Первый тест - числа Фибоначчи. Вот код из вычисления:
Python:
import psyco psyco.full() def fib_recur(n): if (n == 0): return 0 elif (n == 1): return 1 res = fib_recur(n-1) + fib_recur(n-2) return res print fib_recur(40)
(psyco естественно отключается для тестов без psyco ;))
Lua:
function fib(n) if (n == 0) then return 0 elseif (n == 1) then return 1 end return fib(n-1) + fib(n-2) end print(fib(40))
TCL:
proc fib { n } { if { $n == 0 } { return 0 } elseif { $n == 1 } { return 1 } set res [ expr { [fib [expr {$n-1}]] + [fib [expr {$n-2}]] } ] return $res } puts [fib 40]
Все тесты запускались по три раза.
Результаты этих тестов:
Lua: >3 мин
LuaJIT: 44.72 - 45.15 сек
Python: >3 мин
Python Psyco: 16.93 - 16.94 сек
TCL: >3 мин
TCL compiled: >3 мин
Тут следует отметить, что компилирование TCL в этих двух тестах призводительность не повысило, но даже понизило.
Также проводил тесты для N=30. Тут всех порвал Lua - 1 секунда, далее Python - 5 секунд и в аутсайдерах TCL - 7 секунд.
Следующий тест - цикл с большим количеством итераций и произволными арифметическими вычислениями внутри.
Вот код:
Python:
import psyco psyco.full() def calc(n): for i in xrange(n): res = i*5 + 12/(i+1) - i*(i+2) return res print calc(300000)
Lua:
function calc(n) for i = 1,n do res = i*5 + 12/(i+1) - i*(i+2) end return res end print(calc(300000))
TCL:
proc calc { n } { for { set i 0 } { $i < $n } {incr i } { set res [expr { $i*5 + 12/($i+1) - $i*($i+2) }] } return $res } puts [calc 300000]
Тут всё оказалось весьма странно:
Lua: 0.2 - 0.21 сек
LuaJIT: 0.51 сек
Python: 17.5 сек
Python Psyco: 23.24 - 23.40 сек
TCL: 0.64 - 0.65 сек
TCL compiled: 0.7 сек
TCL отыгрался.... Python провалился. Lua всех рвёт...
Может эти тесты несовершенны и надо придумать что-то по-лучше, но определённые представления они дать могут.
xpinguin
Круто Lua всех рвет, но вот Python 2.4 уже есть как думаешь он чуть бстрей будет не пробовал?
Python 2.4 по скорости такой же тормознутый как Python 2.3.5. Тут особо ни на что не расчитывай...
DaRT
>Python 2.4 по скорости такой же тормознутый как Python 2.3.5. Тут особо ни на что не расчитывай...
Ты думаешь он мне нужен?? я вот начал Lua использовать и мне ничего не надо для скриптов кроме его :))) Я просто спросил чтобы быть полностьтю уверенным что Lua самый быстрый скриптовый язык.
xpinguin
Ну чтож тесты убедительны, а как с их внедрением в движок/программу?
xpinguin
>TCL отыгрался.... Python провалился. Lua всех рвёт...
:) сравнил с собственной, самописной скрипт системой (Cи подобный типизированый скрипт) :
Первый тест: в 1.4 раза быстрее чем LUA (не Jit)
Второй тест: в 1.14 раза быстрее чем LUA(не Jit), (ну тут понятно, в Lua цикл обрабатывается как одна команда VM)
Тема в архиве.