LINUX.ORG.RU

Самый лучший язык для скриптов: Tcl?

 , , , ,


7

5

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

А какие языки вы используете для задач средней сложности — тех что не требуют эпохальных тяжеловесных программ, но и не решаются тривиально пайпом из трёх-пяти команд в баше? Средняя сложность — это что-то порядка от 3-5 до 3-5 тысяч строк кода (смотря какой язык). Такие где разбиение программы на отдельные модули, хранимые в разных файлах ещё не требуется.

Длинно. Почему я выбрал Tcl.

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

Но у bash есть проблемы. Основная из которых — многие выражения (в частности пайпы) выполняются в субшелле, а из субшелла почти невозможно передать информацию в материнский иначе через stdout. Ещё одной проблемой является постоянная сериализация-десериализация объектов. Это уже не настолько важно, но всё-таки хотелось бы от этого по возможности избавиться.

То же самое касается других стандартных языков UNIX: dc, bc, sed, m4, awk, ... На последнем, впрочем, наверное, можно писать и нормальные программы, но синтаксис у него не очень красивый и возможностей не так уж много. Это хорошие языки, очень хорошие в своей области, но имеют ограниченную область применения.

Я уже знаю C и несколько других императивных языков, но если нужно что-то быстро посчитать или сделать, эти языки малопригодны — в том же C даже сравнить строки просто так нельзя, нужна специальная функция, кроме того нужно вручную рулить памятью. Pascal крайне беден в экспрессивном плане, а begin / end — это уродливо, так что лучше уж C. Basic уже мёртвый, да к тому же ещё более убог чем паскаль. C++ крайне сложен для изучения, а профита по сравнению с C почти никакого.

Таким образом, стало ясно, что мне нужно изучить какой-то другой язык. Так как язык требуется для того, чтоб быстро решить какую-то задачу, а не писать оптимизированное решение на века, стало ясно, что нужен один из динамических языков общего назначения: Perl, Python, PHP, Ruby, Tcl, Lua или какой-то другой.

Я выбрал Tcl.

1. PHP не подходит сразу, на нём только веб-странички хорошо писать, а всё остальное лучше в Perl (да и про страницы можно поспорить, если нужно чёткое разделение контента, стилей и логики).

1. На Perl, Python и Ruby множество сложных синтаксических конструкций, которые без поллитра не разберёшь, например (python):

_='_=%r;print _%%_';print _%_

2. Lua: простой язык, код на нём быстрый, изучить тоже можно довольно быстро. Но однако на каждый чих нужна либа. Даже работы с юникодом изкоробки нет (в смысле строку можно прочитать и вывести, но нельзя посчитать кол-во символ или заменить подстроку и тд).

3. Tcl: крайне простой синтаксис: 12 правил и man-ы по всем используемым командам достаточно для для понимания любого кода. При этом богатая стандартная библиотека, хорошая интеграция с Tk и кроссплатформенность.

То есть на Tcl можно решить любую задачу почти так же просто как на баше (да в крайнем случае даже пайпы есть), но при этом синтаксис гораздо более предсказуем.

Плюс на Tcl можно писать графические приложения так же легко как и консольные, например вот такой код в 10 строк — это уже целая работающая игра! Правда автор явно экономил строки, и читаемость кода из-за этого несколько страдает. Кроме того, Tcl поддерживает (особенно с 8.6) функциональное программирование и длинные числа изкоробки. Так что переход с bc, который только их и использует будет проще. Ещё мне очень нравится, что ключевых слов в этом языке нет. Вообще. Те же for / if и другие — это просто такие команды, которые берут условие и фрагмент и его исполняют. Можно запросто объявить процедуру for, которая будет использовать другой синтаксис итератора и далее использовать её, если так удобней. Язык динамически типизированный, как и другие скриптовые, но проблем из за этого не возникает. Если переменная используется внутри expr, то она интерпретируется как число. Если в команде string ... на месте строки — строка и тд. Никаких сомнительных x=«10»+10 Работа с переменными похожа на такую в bash, что тоже плюс: при присваивании переменной знак $ не ставится, а при извлечении из неё значения ставится:

set i 10 # i:=10
puts $i ;# будет выведено 10
incr i ;# i теперь 11
puts [expr [set i]+3] ;# set можно использовать вместо $i или ${i}\
так как при отсутствии третьего аргумента он просто возвращает значение.\
Ещё это один из немногих способов двойной подстановки.

4. Что-то другое. А что собственно? Пока только идёт в голову что-то лиспоподобное (например: clisp (scheme (или racket guile))), APL-подобное: J, K (есть свободная Kona), APL и тд или конкатенативное (dc-подобное): forth, factor...

Из 2, 3, 4 выбрал всё-таки Tcl, потому что синтаксис у него хоть и не стандартный для императивных языков, но похож на привычный шелловский и он есть в GNU/Linux изкоробки или в репозитории, так что не придётся заморачиваться ручной сборкой.

Уже начал изучать, почти всё нравится, кроме необходимости писать всё время expr и set, всё-таки такие частые операции можно было бы и сделать частью синтаксиса, хоть и немного в ущерб единообразию.

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

Учить его действительно легко, так как базовый синтаксис простой, а команды можно изучать по мере надобности, к тому же man к командам Tcl снабжен сносками на команды с похожим назначением, так что поняв, что команда — это не то, что надо, можно посмотреть все остальные и найти наиболее подходящую.

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

★★★★★

На Perl, Python и Ruby множество сложных синтаксических конструкций

Они же не обязательны к использованию. В чём проблема?

anonymous ()

Тикля концептуально прикольная, но Ruby для указанной задачи подходит лучше.

ТС, раз тебе нравятся языки без синтаксиса, глянь вот это: http://iolanguage.org/

anonymous ()

Долгое время я писал на bash. Это неплохой язык, к тому же он достаточно выразительный

Убейся.

Lua: простой язык, код на нём быстрый, изучить тоже можно довольно быстро. Но однако на каждый чих нужна либа.

Осиль Lua rocks

annulen ★★★★★ ()

более привычную инфиксную нотацию для арифметики и читаемый код.

Щас тут начнётся лиспосрач, и совершенно справедливо. Херню не пиши, ничего не мешает в лиспе писать «привычную инфиксную нотацию». А синтаксис... это типа ты сказал, что фигурные скобки лучше круглых читаются что ли?

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

спасибо за обзор, теперь тоже возьмусь за тикль.

В таком случае несколько советов: Если есть возможность, бери 8.6, в искоробочном 8.5 некоторых вкусных фич не хватает. Впрочем, некритично. Прочитай https://www.tcl.tk/about/language.html И man Tcl (да, так и пишется, в твоём дистре может быть man tcl. Он же доступен в онлайне по ссылке из поста)

И то и другое — короткие документы, которые можно прочитать целиком довольно быстро. Это по-моему большой плюс по сравнению с другими языками, где сразу предлагается прочитать огромную книгу. На этапе «дочитал до середины и решил дочитать потом» обучение обычно и заканчивается... хотя может это только у меня так. Ещё есть Tutorial, но он уже не обязателен. Не знаю, зачем ещё какие-то книги, если в манах всё есть.

Xenius ★★★★★ ()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от annulen

Осиль Lua rocks

Хм... ты используешь Lua как основной скриптовый язык для задач средней сложности?

Убейся.

А комментарии по существу будут?

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

Ага, все сначала кричат, что нам нужен уникод и дырявые массивы, а потом оказывается, что нужен не уникод, а регэкспы, которых кроме как в перле нативненько все равно нет, а дырявые массивы нужны раз в два года. А когда дело доходит до тормозов, прозрачного jit'а с бесплатным ffi почему-то под рукой не оказывается и приходится херачить ядро на сях. Enjoy your python.

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

Я так и не понял, чем тебя не устроил python.

Объясни, как работает этот код на питоне:

_='_=%r;print _%%_';print _%_

Ты его можешь понять без запуска интерпретатора?

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

Питон его не устроил тем, что в перле нечитабельные конструкции, очевидно же :}

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

Я использую. Проблемс? ;)

Нет, почему же, я может и Lua буду изучать. А можешь примеры кода показать для математики или работы со строками/файлами?

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

Оператор % перегружен для строк и выполняет функцию подстановки аля принтф. В переменную _ загружается форматная строка, потом сама к себе применяется. Код скорее всего с олимпиады по самовыводящимся программам. Читай ман по строкам, никакой магии.

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

Ты его можешь понять без запуска интерпретатора?

Я могу, да. А ты, если ты будешь судить о языках по намеренно обфусцированному коду, закончишь тем, что будешь писать на C# формочки.

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

регэкспы, которых кроме как в перле нативненько все равно нет

[facepalm.tar.xz] Что значит «нативненько»?

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

Хм... ты используешь Lua как основной скриптовый язык для задач средней сложности?

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

А комментарии по существу будут?

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

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

Чем же?

Более компактный код. Возможность писать псевдо-функциональный код с использованием блоков. Возможность нормально порождать процессы, а не через жопу, как в тикле. Более мощная стандартная библиотека. Куча готовых gem-ов на все случаи жизни.

Я пробовал вернуться на тикль, но последней каплей «да ну его нахер» стало отсутствие удобного синтаксиса в стиле пайпов bash-а.

В итоге, для мелких скриптов удобнее bash, а для крупных — рубя.

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

Недавно писал вундервафлю, в которой плотность регэкспов на страницу зашкаливала. Если сравнивать $line =~ /.../; $1 и myRe1 = re.compile('...'); caps = myRe1.match(line); caps[1], особенно завернутое в if'ы/while'ы и с проверками на дурака, кода получается много больше и не наглядно. Сначала писал на перле, потом решили прыгнуть на луа, т.к. уже на нем была логика, а пробрасывать дорого. Завернул регэкспы в нужном виде и получилось примерно то же самое (все равно перл рулил из-за expr==statement, но терпимо). Такая вот история успеха.

arturpub ★★ ()

Самый лучший язык для скриптов: Tcl?

Да.

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

Ага, все сначала кричат, что нам нужен уникод и дырявые массивы, а потом оказывается, что нужен не уникод, а регэкспы, которых кроме как в перле нативненько все равно нет, а дырявые массивы нужны раз в два года. А когда дело доходит до тормозов, прозрачного jit'а с бесплатным ffi почему-то под рукой не оказывается и приходится херачить ядро на сях. Enjoy your python.

Ты сам-то понял, какую херню написал?

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

алгоритмические задачи любой сложности можно спокойно реализовывать на Lua

Лорчую, для «бизнес-логики» лучше еще ничего не встречал, а встречал я немало.

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

В принципе могу. Но зачем?! Ты же не будешь сам такой код писать, да и читать вряд ли где найдёшь, если среди примеров обфускации и прочих извращений не будешь искать.

anonymous ()

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

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

Если сравнивать $line =~ /.../; $1 и myRe1 = re.compile('...'); caps = myRe1.match(line); caps[1], особенно завернутое в if'ы/while'ы и с проверками на дурака, кода получается много больше и не наглядно.

В руби /text/ =~ "Some text here" уже перестало работать?

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

Это вовсе не херня. Мы возможно разными вещами занимаемся, когда тебе надо просто кирпичики сложить типа из sql на gui, скриптовые рулят, не спорю. Но если сами компоненты вроде системы хранения или отображения пишешь сам под задачу, начинаются проблемы с производительностью. Я люблю перл, но не раз втыкался в скорость, и ничего не помогает, ну показывает мне nytprof депровые места, а толку-то? Там все так, как и должно быть.

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

Приведенный код в хотлупах компилируется в пару опкодов. Покажи нам не говно.

Мне пох, во что он там у тебя компилируется. Подход в использованием 100500 неймспейсов — полное говно.

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

Такое я тебе и сам могу показать, на луа я как раз пробовал писать немного:

#!/usr/bin/env lua
-- Attempt to do sieve in Lua

local p = {}
local n = arg[1]

for i = 2, n do p[i] = 0 end
for i = 2, n do
    if p[i]==0 then
        print (i)
        for j = i^2, n, i do p[j]=1 end
    end
end

Хм... а чем io.write лучше print?

Xenius ★★★★★ ()

А какие языки вы используете для задач средней сложности

perl, lua

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

Язык без встроенных строковых функций никак нельзя считать полноценным скриптовям языком.

Ты не осилил. Они там есть.

к тому же адски тормозящее из-за бесконечных форков и отсутсвия каких-либо оптимизаций.

Опять таки, не осилил оптимизацию. У меня bash не тормозит на разумных объёмах данных.

Нетривиальный код на баше превращается в адское месиво, практически не пригодное к поддержке

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

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

Возможность нормально порождать процессы, а не через жопу, как в тикле.

Нормально — это как? В Tcl вроде вполне нормально, хотя я пока эту часть подробно не рассматривал, не нужно

стало отсутствие удобного синтаксиса в стиле пайпов bash-а.

Есть же.

Более компактный код

С J всё равно не сравнить

Возможность писать псевдо-функциональный код с использованием блоков.

Элементы функциональщины есть и в Tcl, особенно 8.6, ты видимо его не застал.

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

Ты не осилил. Они там есть.

В таком виде, что лучше бы их не было

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

Да ничем, ты же файлы просил, как-то ближе к ним и пришлось. Тебе какой код-то нужен? Есть свертка финансовых итогов в древовидном разрезе по атрибутам объектов-аналитик, на работе валяется, но там никакой суперматематики нет, только сложная редукция таблицы в дерево. Фишка не в рокет-сайнс, а в простоте и прозрачности ускорения сложной логики. Если складываешь кубики, то питоны, тикли и перлы в помощь — однопроходные скрипты все равно никогда не компилируются.

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

для project euler tcl рядом с mathematica/maple/apl(j) и рядом не валялся. Ты б сразу уточнял, что эта предметная область.

qnikst ★★★★★ ()

Для скриптов - Tcl, как самый простой при наличии всей необходимой функциональности.

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

Код у лиспов более читаемый, чем у Tcl. Авторитетно заявляю, т.к. регулярно и давно имею дело и с Tcl, и с CL. Разве что инфиксный синтаксис для арифметики можно отметить.

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

Я такое не пишу, и таки да, если под математикой ты это имеешь ввиду, бери готовый «фреймворк» по решению этой хренотени.

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

для project euler tcl рядом с mathematica/maple/apl(j) и рядом не валялся. Ты б сразу уточнял, что эта предметная область.

Может bc тогда уж? Он простой, довольно мощный и длинная арифметика изкоробки.

Xenius ★★★★★ ()

Плюсую, сам большую часть своих поделок пишу на тикле

buddhist ★★★★★ ()

Для маленьких простых скриптов - bash, для больших и сложных - python. Всё остальное - извращение.

it-nativa ()
Ответ на: комментарий от qnikst

разве bc умеет что-то больше инженерного калькулятора??

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

Xenius ★★★★★ ()

неистово плюсую

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