Виндовый Тикль равно как виндовый питон, равно как и виндовый перл всегда можно найти не http://activestate.com/
Протупил :) TCL у меня уже есть, вместе с MinGW вытянул как-то.
Но синтаксис там не совсем человеческий...
"set a 1" вместо "а=1", квадратные скобки в непонятных местах и т.д.
Wolverrum, Jay-C
A TCL сохраняет/загружает откомпиленый байткод? Lua может, как и питон. И без гемора, как в AngelScript.
RPGman
proc open {} {
music.open
play_intro
}
и т.п. ну да он все через set... ну норма вроде ниче...
Сохраняет/загружает..
Ужос: строгая типизация в скриптовом языке. Нафига, спрашивается, надо?
Lua бесспорно лучше.
L00bis
Строгая типизация может иметь смысл для увеличения производительности виртуальной машины. (я AS не смотрел, поэтому говорю чисто абстрактно)
nbkolchin
Чушь. Оверхед, накладываемый виртуальной машиной, всегда несравненно больше.
luajit.luaforge.net - Lua теперь ЕЩЕ БЫСТРЕЕ!
L00bis
>luajit.luaforge.net
Jit-компилер - это уже контрольный выстрел в голову AS :)
Блин, прозевал выход такой уматовой штуки...
Нет, ну как так можно писать? 2Мб(!) AS против 180кб Lua+32кб jit-compiler?
Я, как геймдизайнер, ответственно заявляю что ЛУА - убер скриптовой язык.
RPGman
>"set a 1" вместо "а=1", квадратные скобки в непонятных местах и т.д.
Скобки как раз, как надо. Дело в том, что в TCL любое "левое" выражение воспринимается как строка, и чтобы придать ему смысл, оно заключается в квадратные скобки:
proc foo {a b} { return [expr { $a+$b }] } #здесь надо писать квадратные скобки puts [foo 1 2] #а здесь нет foo 1 2
Достаточно яркий пример :)
А то, что всё через set - не беда.
Вообще, язык не плохой, одни namespace'ы чего только стоят. А info, а переопределение любой функции (или переименование) в рантайме...эххх... Одна только проблема - если кто-то криворукий будет писать код на TCL, ты его ещё хрен поймешь.... Я не так давно под WoWEmu скриптов достаточно много написал, и чужие использовал - с этой проблемой сталкивался. Мне Python в этом отношении больше нравится.
Расширяемость у TCL тоже на высоте - написано множество модулей, которые легко биндится через сам интерпретатор. Также есть компиляторы в байт-код, например, платный от ActiveState. Скорость возрастает во много раз, хотя про info и придётся забыть.
С биндингами в качестве скрипт-языка всё не так уж и плохо, если составить список, что легче биндить (по возрастанию сложности), то получится так:
1. Lua
2. TCL
3. Python
(биндить питон - это вообще тихинький такой ужос;) )
EDIT: Основы TCL можно познать тут: http://tclstudy.narod.ru Но это не особо нужно, достаточно прочесть более-менее грамотно написанный исходник и всё становится понятно (я использовал оба подхода, но второй - в большей степени;) )
xpinguin
>а переопределение любой функции (или переименование) в рантайме...эххх...
В луа функция - переменная типа "функция"
Переопределяется по определению :)
>Одна только проблема - если кто-то криворукий
>будет писать код на TCL, ты его ещё хрен поймешь....
Минус для юзабельности геймдизайнером.
>Также есть компиляторы в байт-код, например, платный от ActiveState.
Всё сторонее? В луа байткод выгружается простым дампом "функциональной" переменной. Весь луашный компилер можно выразить на самом луа:
f=io.open("lua_script.out", "wb")
f:write(string.dump(loadfile("lua_script.in")))
io.close(f)
Загружается байткод той же функцией, что и текстовый скрипт - она просто проверяет, загрузить его как есть (если это бинари) или откомпилить, если текст.
>(биндить питон - это вообще тихинький такой ужос;) )
Это я прочувствовал :) Когда стоял выбор, в сторону какого языка смотреть (Lua vs Python, хотелось Питона, как "более мощного"), все благородные начинания обломались о биндинг. С пол-пинка примеры не пошли, со второго тоже :) А вот луа пошел на ура. И синтаксис осваивается самым далеким человеком за полчаса по примерам. Доки по языку и апи оформлены не хуже ANSI/ISO.
RPGman
>>Одна только проблема - если кто-то криворукий
>>будет писать код на TCL, ты его ещё хрен поймешь....
>Минус для юзабельности геймдизайнером.
Бесспорно. Правда на луа можно не лучше наворотить... Питон тут, как я уже сказал - идеал.
>>Также есть компиляторы в байт-код, например, платный от ActiveState.
>Всё сторонее?
Не совсем. Т.е. конечно придётся кинуть разделяемую библиотеку с интерпретатором байт-кода (кстати, она - бесплатная; платный только компилятор) интерпретатору TCL, но для скрипта всё прозрачно: код загужается в текущий контекст просто командой source:
# обычный тектовый скрипт source "script.tcl" #скомпилированный скрипт source "script.tbc"
Вообще, Lua гораздо быстрее Tcl.
L00bis
Молодой человек, вы когда-нибудь сами писали виртуальные машины? Ликбез для
безграмотных:
Допустим у нас есть следущий код (язык абстрактный):
func f() { var a, b; a = f1(); b = f2(); return a + b; } func f_typed():int { var a:int; var b:int; a = f1(); b = f2(); return a + b; }
Нас интересует только представление "a + b" в виртуальной машине.
Представление кода в ВМ (в простейшем случае) будет таким
// untyped version PUSH a PUSH b ADD // typed version PUSHI a PUSHI b ADDI
Ежу понятно, что в первом варианте мы сначала должны привести "a" и "b" к типу
numeric. Во втором, ADDI --- две ассемблерные команды. Разница в
производительности --- минимум 10 раз.
Оверхед накладываемый грамотно реализованной ВМ --- минимален. В качестве
руководства для начинающих, рекомендую почитать литературу о реализации языка
Форт (Forth).
Отдельной темой является выведение типов переменных при компиляции кода (см.
Ocaml). Но это достаточно сложно реализуемо и я не встречал ни одного
скриптового языка, в котором используются эти алгоритмы.
All:
Народ, не надо использовать TCL. Он мертв и его использование в новых
программах --- разновидность некрофилии.
P.S. Embedded Language нужно подбирать исходя из конкретной задачи.
Безусловными лидерами являются Lua и Python. Первый хорош производительностью и
небольшим размером, второй --- мощным набором библиотек.
P.P.S. Сам я в своих проектах использую Squirrel.
nbkolchin
Что-то подсказывает, что приведение "a" и "b" к нумерик не будет тормознее в 10 раз :)
И L00bis прав, говоря что строгая типизация для скриптования проекта ни к чему. Посмотрите сами на пример строгого скрипта для инициализации меню.
Lua и Python приятнее в разы.
Глянул на домашник Squirrel. Его прямо сравнивают с Python/Lua :)
Сразу вопрос (пока squirrel тянется и не рассмотрен детально) - в чем отличия от Луа? Преимущества, плюсы/минусы?
Насчет TCL согласен.
RPGman
> Что-то подсказывает, что приведение "a" и "b" к нумерик не будет тормознее в 10 раз :)
Будет. Введение жесткой типизации позволяет простым способом поднять производительность.
> строгая типизация для скриптования проекта ни к чему.
В большинстве случаев --- не нужна нафиг. Есть ситуации, когда она полезна --- например GLSH от Unigine.
Про Squirrel: плюс --- Си-образный язык, API очень похожее на Lua, честный int. Минус --- меньшая чем у Lua производительность (по моим тестам, в среднем в два раза). По моему, я уже описывал Squirrel где-то на форуме.
http://wiki.squirrel-lang.org/default.aspx/SquirrelWiki/LuaCompar… Squirrel.html
RPGman
там есть статейка, в которой сравнивается squirrel и lua. Точно не помню, что-то вроде более сишного синтаксиса, классы, массивы (вроде как должны быть быстрее таблиц, но как-то сомнительно) и т.п.. По скорости вполе сопоставим с lua
Тема в архиве.