Monday, April 9th, 2007 09:38 am
Очередная войнушка на тему "твой язык программирования сосет больше, чем мой язык программирования" у [personal profile] avva навела меня на мысль. Я подумал - какой язык программирования мне стоило бы выучить и зачем? Т.е. языков программирования наплодили столько, что пора уже им заиметь своего Линнея и Дарвина, и выпускать определитель видов и открывать факультеты по изучению их генезиса и повадок. Кстати, неужели мне первому в голову пришла эта мысль? Не поверю, где-то это уже должно быть. Но я отклонился от темы.
Итак, я знаю следующие языки (в произвольном порядке): C, C++, Java, Prolog, Perl, PHP, Javascript, Tcl, Visual Basic в различных его изводах, Pascal. "Знаю" здесь надо толковать очень широко - т.е. мои знания, скажем, в Прологе  гораздо хуже, и гораздо ржавее, моих знаний C, но концепции языка я знаю, и если бы понадобилось, думаю, смог бы продуктивно работать на нем после некоторого подновления знаний. Lisp/Scheme я встречал, однако в список внести не могу, поскольку ничего толком на нем не писал, и не уверен, что смог бы без серьезного вложения времени - а это, практически, то же самое, что учить язык заново.
Теперь вопрос - существует ли язык, который мне стоило бы выучить для практических целей? Т.е. если бы я, скажем, не знал Перла, то мне бы стоило выучить его или, скажем, Питон или PHP - потому что, скажем, писать ad-hoc программки для обработки информации в различных форматах на них удобнее, чем на C или Яве. Мне так кажется. А если бы я не знал C, то мне стоило бы его выучить, чтобы писать более эффективные программы или пользоваться тысячами готовых библиотек, у которых есть интерфейс с C.
Т.е. мне интересно, какой язык, который, если я его выучу, позволить мне решать гораздо более эффективно некоторый класс задач - при этом класс достаточно часто встречающийся, чтобы имело смысл заниматься этим заранее (т.е. если какой-то язык позволяет жутко эффективно программировать ядерные реакторы, то это непрактично - буду работать с реакторами, тогда и выучу).
Monday, April 9th, 2007 06:06 pm (UTC)
Я бы пожалуй рекомендовал ML (в виде диалекта O'Caml) - он в общем и практически полезен, хотя не уверен, что очень сильно, но он довольно сильно изменил к лучшему мой стиль программирования, причем касается это практически всех задач.

Причем - именно не Haskell, с которым все носятся, а O'Caml, который и проще и практичнее.
Monday, April 9th, 2007 06:34 pm (UTC)
В принципе я как-нибудь наверное соберусь написать развернутый комментарий. Пока же - вводная информация - язык статически типизированный, по сложности компиляции в нативный код он находится примерно на уровне паскаля (это надо оговорить, потому что первое впечатление совершенно другое - сначала вообще непонятно, как эти красоты можно эффективно реализовать)

Во-первых - как язык для программ, где надо иметь дело с всякими хитрыми структурами данных (синтаксические деревья etc) он хорош неверотяно - одной из моих коммерческих на нем работ был оптимизатор одного Zilog'овского ассемблера - с instruction scheduling, оптимизацией переходов, удалением неиспользуемого кода, и переименованием регистров (алгоритмика там стандартная, но не очень простая). Все это дело вписалось в полторы тысячи строк кода.

Пару раз в период увлечения я на спор переписывал Perl-овские скрипты знакомых админов на ML - в обоих случая они переписались "близко к тексту" и стали немного короче и при этом за счет типового контроля нашлись ошибки в исходных скриптах (хотя, разумеется, есть много перловых идиом, которые так просто не воспроизвести). Но вообще говоря, главная проблема при его практическом использовании - довольно бедные стандартные библиотеки.

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

То есть если коротко - то ML imho стоит изучить (и немного попрограммировать на нем) для расширения кругозора. У меня из всего моего списка языков он по этому параметру занимает первое место с большим отрывом.

PS: Возможно в качестве некоторого обзора забавная статья:
Strong Typing and Perl (http://perl.plover.com/yak/typing/typing.html). Там пол статьи про ML, хотя автор - перловщик и ML знает довольно поверхностно (но при этом пишет по делу)
Monday, April 9th, 2007 06:41 pm (UTC)
А как посоветуете подойти к изучению ML? Есть ли какие-то хорошие книги? Тюториалы?
Monday, April 9th, 2007 11:10 pm (UTC)
www.ocaml-tutorial.org
caml.inria.fr -- домашная страница проекта.
Tuesday, April 10th, 2007 07:56 am (UTC)
Спасибо!
Tuesday, April 10th, 2007 04:38 am (UTC)
Ну если совсем прикладной - то С# выучить навереное стоит. Другое дело, что учить там особенно нечего.
Monday, April 9th, 2007 11:11 pm (UTC)
про camlp4 забыли -- препроцессор работающий на уровне AST.
Tuesday, April 10th, 2007 04:37 am (UTC)
Это любопытная вещь, но она познавательна скорее в смысле демонстрации почти полной практической бесполезности мечты о произвольно расширяемомом синтаксисе :)
Tuesday, April 10th, 2007 10:38 am (UTC)
О!
Monday, April 9th, 2007 07:12 pm (UTC)
C#?
Оно, конечно, понятно что это бледное подобие левой руки Явы, но спрос на него есть, и язык, в отличие от большинства поделок Микрософта, не омерзительный.
Tuesday, April 10th, 2007 07:57 am (UTC)
Есть, хотя и немного. Делегаты, например. Атрибуты (хотя эти и в Яве есть теперь, кажется). Ну и вообще про то, как CLR устроен.
Tuesday, April 10th, 2007 08:40 am (UTC)
Второй, а сейчас уже на подходе третий.
Tuesday, April 10th, 2007 08:43 am (UTC)
тонна и маленькая тележка.

Вот еще например, я последний месяц занимаюсь стыковкой C# с голым C через Interop. Очень интересно.
Monday, April 9th, 2007 07:18 pm (UTC)
Я не знаток Java, но если человек хорошо знает данный язык, разве у него будут проблемы с C#?
Только немного синтакс другой? Да и к тому же, автор спрашивает про практическое применение, а что он сможет сделать с C#, а на Java нет?
Monday, April 9th, 2007 07:19 pm (UTC)
У C# есть определенные различия с Явой, и их полезно знать. Кроме того, смочь сделать на C# может захотеть начальство.
Tuesday, April 10th, 2007 09:59 am (UTC)
Странно, что комментов было так мало.

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

Есть, конечно, более универсальные языки, ну так в них главное - не базовый синтаксис, а то, к чему дается интерфейс, собссно, это не очень-то и связано с языком программирования.
Tuesday, April 10th, 2007 10:54 am (UTC)
А какой класс задач хорош именно для Пролога ?
Tuesday, April 10th, 2007 11:06 am (UTC)
Так называемое логическое программирование. Долго объяснять, тем более, что я это учил лет пятнадцать назад. Но завязано настолько, что курс логического программирования - это просто курс языка Пролог.
Tuesday, April 10th, 2007 12:07 pm (UTC)
"логическое" - В смысле вывода теорем математической логики ? Или что-то еще ?
Tuesday, April 10th, 2007 12:14 pm (UTC)
Нет... Ну как объяснить...
http://en.wikipedia.org/wiki/Logic_programming
Вот классический пример - задачки типа "Американец не пьет виски, русский живет в синем доме, у мексиканца есть брат, бразилец с жителем красного дома - любовники, владелец серой кошки - не сосед мексиканца. Какого цвета дом у американца?"
Tuesday, April 10th, 2007 12:39 pm (UTC)
а LISP для них не лучше подходит ?

Или просто тупо перебрать все варианты на любом языке :-)
Tuesday, April 10th, 2007 12:41 pm (UTC)
как Вы оцениваете эффективность изучения основ компьютерных наук методом обмена репликами в ЖЖ?
Tuesday, April 10th, 2007 12:52 pm (UTC)
я же не про науку вообще спрашиваю, а про узкий конкретный топик.
Tuesday, April 10th, 2007 12:53 pm (UTC)
Лиспом можно, но конструкции тяжелее. А на любом языке перебирать - оно можно, конечно, только десять строк пролога обращаются в тысячу на C. При том, что малейшие изменения условия совершенно убивают уже написанный сишный код. Ну как везде, когда язык не для этого предназначался.
Wednesday, April 11th, 2007 04:26 am (UTC)
У меня сомнения насчет "десять строк в тысячу строк".
Рассмотрим LISP (в прологе я менее компетентен) - там есть списки (с возможностью взять голову/хвост и apply function to all elements), ассоциативные массивы (property кажется там это называется), рекурсия.
В С++ со Standart Template Library все это тоже есть. Правда там все это сделано имея ввиду эффективную реализацию, что чyть затуманивает чисто-абстрактный смысл данных конструкций, но не сильно.
Да и с прологом, подозреваю что C++/JAVA классы с нужной функциональностью можно реализовать менее чем в 1000 строк.
Т.е. я подозреваю что языки типа LISP и пролог сейчас представляют интерес лишь теоретический, но не практический (за исключением разве что очень узких областей).
Wednesday, April 11th, 2007 04:53 am (UTC)
Пятьдесят к пятистам подойдет больше? Deal? :)
Лисповые дела на C реализовать несложно, хотя и сопряжено с головной болью. Прологовские сложнее. хотя дело мастера боится, cам-то пролог на C, в основном и реализован, по-моему. Дело не в списках и не в рекурсии. Логика языка другая. Можно реализовать. Но долго и противно.
Friday, April 13th, 2007 05:09 pm (UTC)
Для грамматического разбора Пролог пожалый неплохо подходит.
Впрочем парсеры компиляторов/интерпретаторов можно писать с помощью yacc (и более продвинутые штуки есть).
Более того, парсер можно довольно легко писать и пpocтo на С рекурсивными функциями, по функции на каждое грамматическое правило.
Tuesday, April 10th, 2007 10:44 am (UTC)
""
Т.е. если бы я, скажем, не знал Перла, то мне бы стоило выучить его или, скажем, Питон или PHP - потому что, скажем, писать ad-hoc программки для обработки информации в различных форматах на них удобнее, чем на C или Яве.
""

Я для цели ad-hoc обработки текстов (текстовых репортов) использую gawk (GNU awk) - дешево и сердито, быстро и достаточно для данной цели.
Не настаиваю чтоб вы его учили, PERL конечно мощнее.
Saturday, April 14th, 2007 11:07 am (UTC)
Я согласен что ниша gawk'а - более простые обработки текста, но и такую задачу вполне может эффективно потянуть (разве что, не в сам EXCEL, а в текстовую таблицу, импортируемую EXCELом).
Читаем HTML, выбираем данные квартир, кладем в ассоциативные массивы индексируя уникальным ключом квартиры(адресом?); затем читаем и переписываем таблицу, по записанному там ключу проверяя в массивах. Вроде все гладко и удобно ложится на возможности gawkа
Tuesday, April 17th, 2007 05:21 am (UTC)
На счёт Assembly не задумывались? Намного эффективней чем С++ или С в особенности для решения задач Real Time.
Ну а если совсем хочется challenge то можно попробовать RTL и так как вы интересуетесь криптоанализом то наверное слышали что алгоритм который подбирает ключи к кодировкам, если пробежит на железке сможет подобрать ключь примерно за 1.5 часаа в сравнении с миллионом лет вроде на самом крутом PC
Tuesday, April 17th, 2007 06:24 am (UTC)
Так в том то и фишка что то же интелегнтный подбор, однако имплементирован на RTL, а не на C или Ассемблере.
Только если на С можно тот же алгоритм гонять для разных ключей то на RTL только на 1, так как это всё в Hardware и не получает никаких инпутов.
Tuesday, April 17th, 2007 05:23 am (UTC)
Да, совсем забыл ... я сейчас тоже пытаюсь освоить PHP с Apache server и MySQL Data Base. Пробую писать свой несложный сайтик. Можно будет как то с вами познакомится и может быть поспрашивать пару вопросов по теме?
Tuesday, April 17th, 2007 06:27 am (UTC)
Спасибо, буду если что обращатся за советом, думаю простые готовые скрипты у вас есть :)
А на этих сайтах я был, видел вопросы и находил ответы по синтаксу PHP, только меня больше интересует мнение опытного человека чем синтакс.
К примеру как лучше решить данную задачу, на PHP, a не как называется та или иная функция
Friday, June 1st, 2007 12:35 am (UTC)
выбор языка зависит от этого процентов так на 100%