LINUX.ORG.RU

Вспомогательный высокоуровневый ЯП

 , , ,


0

1

Уже лет 10 как использую для большинства задач сишку или кресты. Однако время от времени бывает натуральная халтурка типа «перелопатить полтерабайта логов и кое-что посчитать». По природе я очень нетерпелив и ждать, пока awk сделает это, меня не хватает.

Есть ли какой-либо удобный язык, которым можно перемалывать гигабайты логов, время от времени рисовать GUI к перемалывалке логов, который бы был лаконичным, эффективным и вот с такенными здоровыми аккумуляторами?

Первым делом на ум приходит perl, но как-то он мне не очень приятен. python и ruby выглядят неплохо, но до лаконичности perl'а им далековато.

Какие еще есть варианты? Слышал много хорошего про haskell, но так и не понял, можно ли на нем писать быстро и «на коленке».

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

Haskell, Ocaml, Scala, C# - низкоуровневые языки

Да, вся кажущаяся «высокоуровневость» достигается в этих языках исключительно сахаром.

anonymous
()

sql

один раз загоняешь лог в базу и херачишь sql запросы

это при условии что будет >1 запроса и в один проход файл не парсится

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

вся кажущаяся «высокоуровневость» достигается в этих языках исключительно сахаром

Сахаром можно добавить синтаксис, но не семантику (систему типов с выводом, сборщик мусора)

Вообще по твоим понятиям BASIC — высокоуровневый, так как интерпретатор, а Haskell — низкоуровневый, так как компилируется. И то, что программа в три строки на хаскеле превращается в 50 на юейсике тебе не важно.

В общем, можно конечно переопределить термины и называть «высокоуровневым» любой интерпретируемый язык. Но есть общепринятое значение термина: язык более высокоуровневый, если он представляет больше абстракций. В этом смысле Tcl достаточно низкоуровневый, так как нет ни нормальных замыканий, ни встроенной поддержки объектов, ни макросистемы, ни системы типов. Для скриптов всё это не надо, но можешь попробовать написать на чистом Tcl хотя бы IDE для того же Tcl.

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

Если возьмете ruby, то не нужно, пожалуйста, велосипедить с нуля без веской причины

Лолшто? Тебе какое дело чем люди занимаются в свое удовольствие?

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

один раз загоняешь лог в базу и херачишь sql запросы

Шутишь?

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

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

Так только в Common Lisp есть штатная возможность на ходу поправить скрипт и продолжить работу без потери состояния.

Было бы круто после правки сохранить образ, чтобы в следующий раз запустилась поправленная версия, а sbcl вроде умеет только save-lisp-and-die. Насколько я знаю только современные смолтолковские среды в этом преуспели, они еще и исходник сохранят вместе с собой.

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

язык более высокоуровневый, если он представляет больше абстракций

Некоторые считают, что не предоставляет, а годен для построения абстракций.

В этом смысле Tcl

В этом смысле Tcl заруливает все, потому что на нем легок реализуется любая управляющая конструкция.

но можешь попробовать написать на чистом Tcl хотя бы IDE для того же Tcl.

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

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

а задача была озвучена? распарсить построчно самая простая часть задачи, данные нужно аггрегировать по разл. критерям. При необходимости создать несколько отчётов из одних данных подход с sql может быть оправдан

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

Высокоуровневый язык не обязан быть тормозным: C++, Haskell, Lisp, Java, Racket.

«Ассемблер, си, джава и прочие низкоуровневые языки» (c) rigidus

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

Было бы круто после правки сохранить образ, чтобы в следующий раз запустилась поправленная версия, а sbcl вроде умеет только save-list-and-die.

Если очень не хочется перезапускать образ после сохранения, то

This can be worked around by forking another process that saves the core. (c) SBCL manual

Насколько я знаю только современные смолтолковские среды в этом преуспели, они еще и исходник сохранят вместе с собой.

Их в git неудобно складывать.

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

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

Другими словами нужен редактор и интроспекция.

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

Если очень не хочется перезапускать

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

This can be worked around by forking another process that saves the core. (c) SBCL manual

Там какой-то архитектурный прикол, которые совершенно никак не пофиксить?

Их в git неудобно складывать.

Вроде есть экспорт в текст, но я не смотрел подробно.

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

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

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

Там какой-то архитектурный прикол, которые совершенно никак не пофиксить?

It corrupts the current Lisp image enough that the current process needs to be killed afterwards.

В общем, можно было бы форкать образ из потрохов sbcl, но это никому не надо. Так как единственный случай, когда нельзя убиться при сохранении образа, а потом из этого образа продолжить — работа с сетью или открытые окна GUI. Но в этом случае всё равно из образа ничего толком получить нельзя будет и становится сомнительным смысл создания образа вообще. Ну а если «очень хочется», то fork и вперёд.

monk ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

в общем, если почти всё кроссплатформенно, то это «почти» оборачивается гемором

ну тут требуется какой-то мегакостыль ваять, что-бы была совместимость.

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

Если перловка работает также, нахрен тогда нужен awk?

1. я про gawk

2. gawk намного проще в освоении. Перл хороший ЯП, но если изучить по диагонали, то получается уродский говнокод.

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

и да, сами перловые регекспы при неправильном применении могут работать ГОДАМИ(sic!). У меня и пруфы есть на эту тему, если тебе интересно.

Ну и опять-таки, если возможностей gawk ТСу хватает, то зачем ему перл?

emulek
()
Ответ на: комментарий от monk

Высокоуровневый язык не обязан быть тормозным: C++

C++ это очень _разный_ ЯП. Что именно ты имеешь ввиду, мне непонятно. У C++ нет какого-то «уровня», «уровень» есть у C++ программиста.

emulek
()
Ответ на: комментарий от DarkEld3r

есть в glibc, вполне рабочее.

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

4.9

ты про что?

emulek
()
Ответ на: комментарий от next_time

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

если писать исключительно на CAR/CDR и если говнокомпьютер 1970го года только это и умеет, то LISP — вполне быстрый ЯП.

emulek
()
Ответ на: комментарий от mv

Постоянно беру и пробую. Часто плюю, на перле, лиспе или си пишу.

молодец, но я про gawk. AFAIK оно на glibc, а реализация regex'пов в свежей glibc очень неплоха.

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

молодец, но я про gawk. AFAIK оно на glibc, а реализация regex'пов в свежей glibc очень неплоха.

$ rpm -qf `which awk`
gawk-3.1.7-10.el6.x86_64

Мне обычно считать надо.

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

Ты вендоподобную ось используешь? Какой тебе awk тогда? Бери сразу пистон, и стреляй.

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

Короче, можно было бы внутри питона хранить так, как это делает Qt, там кажись UTF-16. В общем UTF хатю. Файл в какой-то ОС в какой-то кодировке, но ведь можно переделать в универсальную, разве не?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от next_time

в C# динамика тоже есть.

В C# она отнюдь не сразу появилпсь. Но в приличном статически типизированном языке динамика делается без проблем. В Хаскеле, ЕМНИП, она есть, в Ocaml.

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

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

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

С клиническими я общаюсь только по настроению, извиняй.

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

Но в приличном статически типизированном языке динамика делается без проблем

А ну ка сделай в своей позорной статике вот это:


(de f () (prinl x))

(de context (x) (f))

(context 1)
(context 2)

#  1
#  2

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

Надо же, сразу отсосал.

Да ты еще и педераст, anonimous. Таких мечтателей, как ты, посылать нах легко и приятно. ПНХ, недочеловек.

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

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

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

Да ты еще и педераст, anonimous

Я то активный

Да какая разница. Педераст есть педераст.

Ну ладно, ты сделал мне приятно

Ты помечтал обо мне и сделал себе приятно - молодец. А теперь ложись спать, а то санитар рассердится и объяснит, кто из вас активный.

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

у меня gawk-4.1.1-i486-2

Мне обычно считать надо.

считать awk неудобно, оно не для этого нужно. ТСу нужен

язык, которым можно перемалывать гигабайты логов

перелопатить полтерабайта логов и кое-что посчитать

emulek
()
Ответ на: комментарий от I-Love-Microsoft

там кажись UTF-16

в это говно даже смайл не влезет ☹

В общем UTF хатю

попроси в microsoft.

Файл в какой-то ОС в какой-то кодировке, но ведь можно переделать в универсальную, разве не?

можно. Только заниматься этим должна OS или FS. А не язык программирования.

emulek
()
Ответ на: комментарий от DarkEld3r

но плюсовые регекспы в GCC починили/реализовали совсем недавно.

есть и были glibc'шные. Они быстро работают, а написать обёртки в стиле C++ несложно. Или неосилил?

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

А ну ка сделай в ... статике вот это:

Будет что-то вроде

map<string, variant> global;

variant f() { cout << global["x"]; }

variant context(variant x) 
{ 
  variant old = global["x"];
  f();
  global["x"] = old;
}

context(1);
context(2);
monk ★★★★★
()
Ответ на: комментарий от DarkEld3r

плюсовые регекспы в GCC починили/реализовали совсем недавно.

Но главное зачем, если оно уже 100500 раз сделано.

// devision by zero

// failure

emulek
()
Ответ на: комментарий от monk

но можешь встроенной поддержки объектов, ни макросистемы, ни системы типов. Для скриптов всё это не надо, но можешь попробовать написать на чистом Tcl хотя бы IDE для того же Tcl.

Писали уже и по моему не одну. Но Tcl-щики к ним не очень склонны.

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

Там какой-то архитектурный прикол, которые совершенно никак не пофиксить?

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

Можно взять и конспирологическую версию. Пока SBCL-щики оставляют ситуацию с «большим» образом как есть и дают на этом зарабатывать парням LispWorks, те делятся «неправедными» доходами :)

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

В UTF-16 влезает ровно то же, что и в UTF-8. Проблема в том, что не все кодеры знают о существовании суррогатных пар.

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

В UTF-16 влезает ровно то же, что и в UTF-8. Проблема в том, что не все кодеры знают о существовании суррогатных пар.

интересно, как эти «суррогатные пары» например парсить регекспом? В utf-8, буква «ф», это просто 0xD1, 0x84, потому найти букву «ф» также просто, как например «QW». А вот с сурогатными парами всё в 10 раз сложнее, и в 10 раз медленнее.

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

// failure

Ты или придираешься или тупишь. Ещё раз: регекспы есть в стандарте, поэтому изобретать велосипед не хочется. Лично у меня нет никаких проблем с тем, чтобы взять буст и использовать их регекспы. Когда компилятор подтянется, то заменить boost:: на std::, что собственно, и сделано уже.

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