LINUX.ORG.RU

tcl vs perl Какой язык идеально подходит для парсинга?

 , ,


2

2

Вот, думаю взяться за изучение языка, специально для продвинутого парсинга. С одной стороны, вроде бы тикль идеологически подходит: все есть строка. С другой — чаще всего perl хвалят, под такую задачу. Плюс, в перле, я слышал, лучшие регекпы и самая продвинутая интеграция их в язык. Два языка сразу учить не хочется. При прочих равных я бы предпочел тикль. Может кто-нибуль посоветует, из опыта?



Последнее исправление: terminator-101 (всего исправлений: 1)

Парсинг чего? Если у тебя парсинг ассоциируется только с регепсами, то в перле и тикле они одинаковы: глоб и pcre. Лучшие парсеры написаны на сях.

gh0stwizard ★★★★★
()

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

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

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

Что еще можно парсить?

Почти все, что существует :3 И бинарные файлы тоже.

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

Тексты можно парсить через токены, например MIB-файлы, HTTP-заголовки и т.п. Т.е. тексты со строгой формализацией. Стандартные средства перла не очень подходят для этой задачи (постороннего кода выйдет больше, чем в решении на сях). В тикле ситуация такая же как в перле, только ещё больше лишних слов (т.е. длинные функции, на то он и тикль).

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

gh0stwizard ★★★★★
()

Привет, anonimous. Тикль говно, Перл тоже. Для парсинга лучше всего подходят ML-подобные языки, но ты слишком тур, чтобы их освоить.

tailgunner ★★★★★
()

А может вообще awk? Он простой и специально для этого.

А из этих двух Tcl изучить быстрее, так что если не подойдет, ты меньше времени потеряешь.

Xenius ★★★★★
()

Знаешь как PERL расшифровывается ? Он как раз под твою задачу и придуман.

Так что, используй перл. Идиотов не слушай.

ovax ★★★
()

Сам счастлив с Haskell+Parsec. Пацаны говорят, что Парсек не тру, потому что на комбинаторах и рантаймовый (в отличие от Хаппи с его квазиквотированием), но именно этим он мне и нравится. Пока упёрся в единственное ограничение - если делать разбор выражений встроенным buildExpressionParser, лексеру нельзя сообщить собственные свои разделители токенов.

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

Для парсинга лучше всего подходят ML-подобные языки

Говорят, что OMeta очень крутая, ибо сделана специально для массового запила DSL в COLA (VPRI), которую крышует сам Кэй.

yoghurt ★★★★★
()

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

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

Говорят, что OMeta очень крутая

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

tailgunner ★★★★★
()

Два языка сразу учить не хочется

А ты попробуй, и сравни как они подходят для твоих задач

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

А может вообще awk? Он простой и специально для этого.

+1

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

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

Не лучше. В них goto нет, а без goto говно твой парсер.

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

python-parsley - pattern-matching language based on OMeta and Python

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

Адские огнеметчики в треде, все в пожарную машину.

Ты, вероятно, идиот?

Допустим, надо реализовать автомат (LALR, например). С goto эффективная реализация тривиальна. На ML ты обделаешься жидко это писать.

Или, например, надо генерить код из PEG - опять же, выход из вложенных проверок по goto намного эффективнее, чем лестницы из if-ов. А в PEG они могут быть очень длинными, до сотни вложений для более-менее реалистичного языка.

anonymous
()

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

ну опять-же смотря что за тексты, зачем и как быстро парсить.

MKuznetsov ★★★★★
()

Писал на обоих. Сразу писал на перле один парсер файлов бд. Потом в процессе написания реализовал это на тикле. Дальше с усложнением парсинга писал только на тикле. Легче пошло. Как по маслу. Потом было что писал вебробота с обходом капчи. Тут перл подошел всем абсолютно. Вот такие пирожки. Надеюсь, кроме того что я быдлокодер, это натолкнет и на другие мысли.

anonymous
()

специально для продвинутого парсинга

«продвинутый парсинг» предполагает аццкую работу с деревьями. Ты же дро^W смотреть на дерево разбора не собираешься? А без паттерн-матчинга... Нда...

Детерминированный конечный tree-automata (сорри, не знаю как это по-русски), внезапно — F-алгебра. С весьма любопытными последствиями для языков, в которых это не пустой звук.

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

кроме того что я быдлокодер

С чего ты взял, что твой ответ заставит кого-то подозревать, что ты быдлокодер?:) Из чего это должно следовать?

А за ответ спасибо:)

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Не пишу на одном языке, и потому толком не знаю все :)

anonymous
()

Перл, однозначно.

chg ★★★★★
()

я бы проголосовал за перл

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

Parsec не тру, потому что говно тормозное. Attoparsec классный

Это да, когда задача стоит именно парсить большие объемы, и вообще БоС рулит.

Но это не мой случай. А как у него с выражениями, с приоритетом операций? Я что-то не нашёл, бегло взглянув на оглавление дока.

Конечно, можно и самому всё это сделать, но зачем, когда уже есть готовое.

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

Attoparsec классный: быстрее С
быстрее С

Отличная антиреклама

И в самой заметке тоже неплохо

The attoparsec parser does less work in some ways, for instance by not special-casing the Content-Length header"

Что мешает сделать идентичный парсер, сравнить и потом уже написать нормально: «наш парсер обрабатывает http-заголовки быстрее и корректнее чем парсер nginx написанный на С вручную»

anonymous
()

Ни один из предложенных.

Debasher ★★★★★
()

На мой взгляд для парсинга очень удобна поддержка pattern matching. Ну и языки с поддержкой этой штуки. В смысле это очень удобно для синтаксического анализа, а не лексического.

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

Я извиняюсь за нубский вопрос, но я часто вижу это магическое слово pattern matching, что переводится калькой как сопоставление с образцом. А что это такое, в конце то концов? Что за язык, не поддерживающий паттерн матчинг? Например? Сопоставление по регекспам это не pattern matching? А ветвления if-else/cond/case? Чем «настоящий» pattern matching отличается от этого?

terminator-101
() автор топика
Ответ на: комментарий от Aswed

goto, лол. Парсеры с goto. Чего еще интересного расскажешь?

Имхо он прав. Goto влияет на эффективность по-любому, это не только для парсинга, а вообще, всегда. Нелокальный выход позволяет отбросить кучу вычислений, заведомо ненужных. В других языках можно добиться того же велосипедами, типа throw/catch, call/cc, break/continue, но это тот же гоуту, вид сбоку.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

если ты не пишешь виртуальную машину или ядро операционной системы, то разницу в накладных расходах от try/catch по стравнению с goto ты не заметишь. Break/continue не используют дампы в стеке и преобразуются в goto напрямую, по этому расходы на них ВООБЩЕ НЕ УВЕЛИЧИВАЮТСЯ. А читаемость кода и удобство отладки try/catch и break/continue повышают в десятки раз. Написать код понятный машине может любая обезьяна, а вот читаемый человеком далеко не каждая.

Aswed ★★★★★
()
Ответ на: комментарий от terminator-101

Вот сравни читабельность паттерн матчинга и того же самого на простых ветвлениях. Пример выдуманный, но при написании парсеров я и похлеще условия встречал.

doSomethingWithList (lst :: [(Int,Stirng)]) =
  case lst of
    [] -> action 1
    ((12,"k"):_) -> action 2
    (_:_:(_,"hello"):(1,_):_) -> action 3
    [_,_] -> action 4
    (h:t) -> action 5

def doSometing(lst):
  if lst = []:
    action 1
  elif lst[0] = (12,"k"):
    action 2
  elif len(lst) > 3 && lst[3][1] == "hello" && lst[4][0] == 1:
    action 3
  elif len(lst) == 2:
    action 4
  else:
    action 5

Aswed ★★★★★
()

Хаскель

anonymous
()

Если хочешь месить текст регекспами, то перл конечно. У него самый удобный и лаконичный синтаксис для этих дел. Да и перловские регекспы самые продвинутые (название либы pcre как бы намекает). А про тикль здесь забудь. Получится чудовищное многословное спагетти. Тикль хорош для описания гуйни, не надо его притягивать куда ни попадя.

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