пятница, августа 24, 2007

Скриптовые языки — оно вам надо?

Вот Вы, да, Вы. Зачем Вы используете скриптовые языки? У Вас есть большая программа и хочется добавить в нее гибкости, сделать расширяемой, менять что-то отдельно, не трогая основы? А как это сделать — конечно же, добавить скриптовую обвязку: Lua, Python, Tcl, Lisp, да что угодно. Некоторые даже придумывают собственные языки.

Что характерно — скриптовый язык практически никогда не является языком, на котором написана основная программа. Правильно, зачем делать скрипты сложными. Нужен язык попроще, специально заточенный под нашу задачу.

Однако, использование скриптового языка влечет за собой определенные проблемы: надо писать обвязку, скриптовый язык медленнее основного и, зачастую, не такой мощный. Да еще, в придачу, получаем геморрой с отладкой.

Тем не менее, скрипты «со скрипом» прикручиваются. Ведь на них все пишется короче и быстрее, а программа становится расширяемой — игра стоит свеч!

СТОП. А теперь задумаемся. Не потому ли мы используем скриптовые языки, что наш основной язык (например, С++) является слишком сложным и низкоуровневым для простых, «скриптовых» задач?

Не только — скажете Вы:

  • скрипты экономят время на компиляцию;


  • скрипты можно хранить отдельно от основной программы;


  • и, наверное, еще что-то.

Только вот время, сэкономленное на компиляции, с лихвой потратится на отладку. А хранить отдельно от основной программы можно многое. Как минимум OCaml и Haskell умеют загружать отдельные модули в основную программу. Причем модули, скомпилированные в нативный, а не в байт-код.

Более того, практически на любом языке можно сделать динамически загружаемый модуль (.dll или .so), который хранится отдельно от основной программы. А если не использовать в качестве языка С++ с морем template-ов, то время компиляции такого модуля становится несущественным.

Все-таки, я прихожу к выводу, что скрипты используют исключительно из-за сложности и неприспособленности для решения простых задач основного языка (да-да, С++).

Может быть, стоит сменить основной язык разработки? И тогда Вы забудете про множество глупых проблем (ошибки в скриптах и обвязке; тормоза при загрузке и работе), а заодно начнете использовать гораздо более продуктивные инструменты.

Поверьте, OCaml и Haskell — лучшие скриптовые языки, которые я знаю. А уж то, что они хороши и как основной язык, думаю знают все.

Короче. К черту скрипты, пишем все на одном мощном, удобном, кратком и продуктивном языке.

16 комментариев:

dulanov комментирует...

Скриптовые языки можно использовать в роли предметно-ориентированных языков для конечных пользователей (DSL). Например, это удобно для описания бизнес-процессов, написания макросов и пр.

Evolving jerk комментирует...

Скриптовыми языками динамические языки называют те, кто ими никогда и не пользовался. Те, кто пользуется, еще как применяют их в качестве основных и уж точно в качестве glue languages. Поэтому вы, Владимир, похоже просто очередной провокатор флейма, чей блог поначалу показался интересным и без херни.

Пишите и дальше, но уже для других.

Vladimir Shabanov комментирует...

>> to dulanov

Насчет DSL. Дело в том, что тот-же окемл, а уж тем более хаскелл за счет возможности введения любых операторов (а в хаскеле любую ф-ю можно превратить в оператор), а также за счет большей высокоуровневости, позволяют создавать очень сносные EDSL (Embedded DSL -- встроенные в язык).

Эти EDSL, конечено не такие удобные как специальный язык, но трудозатраты на их разработку заметно меньше. И, к тому же, в отличии от отдельного DSL, в EDSL можно использовать весь основной язык. А что самое приятное, так это то, что они также проверяются компилятором, как основной язык.

Насчет макросов -- если это про то, что в MS Office, то есть отличный пример у Adobe -- actions, где можно запоминать и повторять действия пользователя вообще без программирования. Если про макросы a-la lisp, то несмотря на их мощность это инструмент достаточно корявый, т.к. не проверяется компилятором и может приводить к трудно уловимым ошибкам.

Vladimir Shabanov комментирует...

>> to evolving jerk

Скриптовыми языками динамические языки называют те, кто ими никогда и не пользовался.

Заметьте, в конце я также причислил к скриптовым языкам и окемл и хаскелл. Скриптовость -- это не столько свойство языка, сколько способ его использования.

Те, кто пользуется, еще как применяют их в качестве основных...

Дело в том, что я тоже применял.

Неудачно получилось, что в посте сошлись две идеи: то что скрипты используют из-за неудобности основного языка и то, что хаскелл и окемл (по моему мнению) заметно лучше подходят для многих (в том числе скриптовых) задач.

_winnie комментирует...

>Короче. К черту скрипты, пишем все на одном мощном, удобном, кратком и продуктивном языке.
Ы? А как же http://vshabanov-ru.blogspot.com/2006/10/blog-post_3256.html ?

C++ гораздо удобней во многих задачах, например на стыках с Direct3D, где мы ворочаем мегабайтными массивами с текстурами и геометрией.


И ещё. Про питон я могу расказать другому человеку за пару часов. Хаскель - сначала потребует пятилетнего высшего образования в университете, для прививания математического мышления, и ещё месяц на привыкание.

Vladimir Shabanov комментирует...

А как же http://vshabanov-ru.blogspot.com/2006/10/blog-post_3256.html
?


Ну дык, для каждой задачи нужен свой инструмент. Вот и предлагается вместо связки C++/{python|lua|...} использовать один только OCaml или Haskell. Огромная экономия времени.

C++ гораздо удобней во многих задачах, например на стыках с Direct3D, где мы ворочаем мегабайтными массивами с текстурами и геометрией.

Вот только там его и надо применять. В принципе кемл (и даже хаскелл) тоже умеют ворочать массивами, но для эффективности все равно лучше плюсы. Но это должна быть очень маленькая часть кода -- никакой логики, только числодробильня и работа с низкоуровневым API.

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

Необязательно. Недавно нанятый человек хаскелл знал только по тьюториалам. Первые месяца 1.5-2 задавал крайне глупые вопросы, однако сейчас уже врубился и разогнался. Так что 3-6 месяцев достаточно для изучения хаскела с нуля (при условии, что есть к нему интерес, есть работа на нем и есть кто-то, кто может подсказать как что сделать). Конечно не 2 часа, но и не 5 лет. Кстати на изучение плюсов, как раз надо примерно 3-5 лет ;)

А окемл вообще язык по сложности где-то на уровне паскаля. Месяца на изучение достаточно (это без работы на нем и подсказчика).

А если мы говорим о DSL для, положим, игрового проекта, то человеку, думаю, достаточно показать несколько примеров. Недели-двух хватит и на въезд в язык и на въезд в проект. Через месяц-полтора наш новый сотрудник начнет уже писать кусочки игры, так что посмотрим, сколько понадобится )

lrrr комментирует...

Эхехех, зачем жеж так провоцировать.. ;)

Отсутствие статической типизации + duck typing =>
REPL-style & Test-Driven Development => Rapid Prototyping (тут можно было бы по русски, но мне очень нравится как это звучит ;) => все это очень полезно в некоторых областях, ин май хамбл опинион.

Vladimir Shabanov комментирует...

зачем жеж так провоцировать.. ;)

Уж как вышло ;)

Фигово только мысль изложил. Я не столько против динамических языков (несправедливо называемых скриптовыми из-за своей простоты и высокоуровневости), сколько против встраивания в программу на С++ скриптов, т.к., по моему мнению, они встраиваются туда исключительно из-за неудобности самого С++. Почему и предлагаю писать всю программу на одном, более высокоуровневом языке. И, конечно же, рекомендую OCaml или Haskell ;)

Многие подумали, что я тупо обкакал динамические языки :) Да, они мне не нравятся, но point поста в том, что скриптинг в плюсовой программе -- это не клевая фича, а костыль к плюсам.

Отсутствие статической типизации + duck typing =>
REPL-style & Test-Driven Development =>
Rapid Prototyping


Ocaml -- это все то же самое только со статической типизацией )))
Есть duck typing, REPL. TDD вообще слабо зависит от используемого языка, разве что в статически типизированных языках часть тестов делает компилятор )

inv комментирует...

Писал бухгалтерскую программу на ocaml+gtk, понадобился встроенный язык, в качестве которого решил использовать некоторое подобие eval, которое есть в ocaml.
с одной стороны встроенный язык можно было сделать свой, с другой стороны - зачем, если ocaml целиком покрывал его и не имел излишеств.

Vladimir Shabanov комментирует...

Некоторое подобие eval -- это Toploop?

А что там делалось? Какие-нибудь формулы, или что?

inv комментирует...

Ага, верно и то и другоe. давно было, сходу не вспомнил как это делалось :)

кстати в копилку языков которые удобно использовать совместно с другими языками:
http://en.wikipedia.org/wiki/K_programming_language

или
http://en.wikipedia.org/wiki/J_(programming_language)

интересно было бы почитать ваше мнение на эту тему.

Vladimir Shabanov комментирует...

Мнения у меня, к сожалению, особого нет. Как я понимаю K и J удобны там, где нужна работа с массивами, т.е. в области статистики, финансовых расчетов, обработки изображений, звука, некоторых научных расчетов. В принципе, много где.
Все никак не доберусь познакомиться с ними поближе.

allegecityrat комментирует...

Работал я над проектом, где скрипты добавлялись прямо на шарпе, на котором весь проект и был построен.
А еще был проект в той же фирме, где на компилируемых языках были построены только несколько контролчиков, базовая форма без наполнения и собственно запускалка — а ВСЯ бизнес-логика и ВЕСЬ UI делались в виде VB Script и лежали в БАЗЕ ДАННЫХ.

Vladimir Shabanov комментирует...

Вот первый проект (C#) -- это как раз то, о чем я говорил.

Второй (VB) -- в целом то же самое. Как я понял на компилируемых языках была только низкоуровневая библиотека. Т.е. там были скорее не скрипты на VB, а вся программа на VB.

Alex Ott комментирует...

У меня основная программа написана на C++, а для расширения используется DSL а-ля Лисп. Интерпретатор написан за несколько часов, работает уже много лет, позволяет расширять функционал программы без особых проблем. И DSL там используется для описания бизнес-логики (в данном случае - описания процесса определения типов файлов) и это крайне удобно.

И для расширения пользователю не надо учить OCaml/Haskell, и не надо иметь соотвествующие компиляторы

Vladimir Shabanov комментирует...

А можно было бы и основную программу на лиспе написать.

Какие продвинутые пользователи, если могут сами дописать распознавание форматов файлов.