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 снабжен сносками на команды с похожим назначением, так что поняв, что команда — это не то, что надо, можно посмотреть все остальные и найти наиболее подходящую.

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

★★★★★

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

А почему ты не говоришь про открытые продукты, готовые к промышленному использованию?

Потому, что они готовы только с доточкой.

Ок. Тогда otrs itsm. Это на перле.

Далее. Слушаю.

Этого мало. Нужны ещё и программисты.

Так языку далеко не один год. Программисты есть. Просто на декстопе clojure нафиг никому не всрался.

компилятор есть. Софта нету. И не будет.

Может потому, что на линупсе нет ниодной вменяемой открытой финансовой программы?

Интересные у тебя в голове факты.

Да нет, факты в голове не бывают. Они могут только в реальности присутствовать.

Бгг.

Это хорошо, что ты умеешь смеяться над собой.

Причём оба.

Обострение началось? Ну да, осень уже пришла...

silver-bullet-bfg ★★
()
Ответ на: комментарий от silver-bullet-bfg

Потому, что они готовы только с доточкой.

Это спорное утверждение требует обоснования. С которыми, к слову, у тебя не густо.

Далее. Слушаю.

Перетопчешься. Либо сначала скажи зачем тебе это надо.

Так языку далеко не один год.

Этого мало.

Программисты есть.

Студенты, осилившие хелловорлд после статьи на хабре не считаются.

Просто на декстопе clojure нафиг никому не всрался.

На моём десктопе всем пофиг на чём написана программа, хоть на окамле, лишь бы работала.

Может потому, что на линупсе нет ниодной вменяемой открытой финансовой программы?

Полтора пенсионера, которые помнят кобол не в курсе про линукс.

факты в голове не бывают.

Ну, надо же как-то назвать чего ты там себе выдумываешь.

Обострение началось?

Ага. На лоре, вот, некро[манты|филы] завелись.

harm
()
Ответ на: комментарий от silver-bullet-bfg

А руби какой брал (не ради троллинга, а для справки)?

1.9.3p448

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

В копилку:

$ time for i in `seq 1 1000`; do sbcl --no-sysinit --no-userinit  --quit  1>/dev/null; done;

real    0m7.526s
user    0m1.036s
sys     0m3.516s

$ time for i in `seq 1 1000`; do guile  -q -c ''; done 

real    0m28.680s
user    0m17.929s
sys     0m6.808s

harm
()
Ответ на: Ах ты тостячок от silver-bullet-bfg

Тогда привожу код на тикле, который ты мне объяснишь по операторно

Так ты это оказывается с лурки взял?

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