LINUX.ORG.RU

Rust vs C

 ,


3

7

Я Rust не знаю.
Допустим решил я написать быстрый лексер (разбиватель токенов),как я делаю это в Си:

typedef struct {
    const char* text;
    size_t      text_len;
    size_t      text_pos;

    const char* token;
    size_t      token_len;
} lexer_t;
 
void lexer_next_token(lexer_t* lexer);

И я могу получить все токены без выделения памяти,я просто иду по тексту и ставлю lexer_t.token в начало токена, и в token_t.token_len записываю длинну токена.А в расте как сделать подобную вещь?Тоже без выделения памяти естественно (ну кроме стека,где выделяется код возврата и 2 size_t для функии next_token).Верней можно ли сделать такое в расте?



Последнее исправление: linuhs_user (всего исправлений: 2)
Ответ на: комментарий от anonymous

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

extern crate memmap;
use memmap::{Mmap, Protection};
//...
fn main() {
    let file_mmap = Mmap::open_path("data", Protection::Read).unwrap();

    let bytes = unsafe { file_mmap.as_slice() };

    let mut lexer = Lexer::new(unsafe{std::str::from_utf8_unchecked(bytes)});

    let mut commas_count = 0;
    let mut words_count = 0;
    while let Some(token) = lexer.next() {
        if token.chars().next() == Some(',') {
            commas_count += 1;
        } else {
            words_count += 1;
        }
    }
    println!("Итого: {} слов и {} запятых", words_count, commas_count);
}

//..
int main(int argc, char* argv[])
{
    size_t  file_size;
    char*   file_data;
    int     cnt_word = 0, cnt_point = 0;
    lexer_t lexer = {0};
 
 
 
    int fd = open("data", O_RDONLY);
    file_size = 2000000000; 
    file_data = (char*)mmap(NULL, file_size, PROT_READ, MAP_POPULATE | MAP_PRIVATE, fd, 0);
 
    lexer.text_pos = 0;
    lexer.text = file_data;
    lexer.text_len = file_size-1;
 
    while(lexer_next_token(&lexer)) {
        if(lexer.token_len == 1 && lexer.token[0] == ',')
            cnt_point++;
        else
            cnt_word++;
    }
   
    printf("Итого: %d слов и %d запятых\n",cnt_word,cnt_point);
    munmap(file_data, file_size);
    close(fd);

}
~/rust-workspace/rust-lexer$ time ./clanglexer
Итого: 350000001 слов и 250000000 запятых

real	0m7,596s
user	0m7,436s
sys	0m0,152s
~/rust-workspace/rust-lexer$ time ./target/release/rust-lexer
Итого: 350000001 слов и 250000000 запятых

real	0m7,604s
user	0m7,465s
sys	0m0,132s

clang version 4.0.1-5 (tags/RELEASE_401/final), компилял с -O3

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

Показательно, что начал сразу с мухлежа.

Так на то он и аноним, что без задней мысли сливает свою репутацию ниже Марианской впадины.

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

Показательно, что начал сразу с мухлежа.

Что за херню ты несёшь, алёша?

Я чего-то поменял, но код вам не покажу, чтоб не дай бог не проверили.

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

Ок, давай чисто поржать. Добавим ммапинг в растовый вариант.

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

Если ты настолько тупой, что не можешь понять «я ничего не менял» - что поделать.

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

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

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

Поподробнее об этом. Только, пожалуйста, не пердани в лужу с первого поста.

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

А ты смотри, наслаждайся. Это тебя ждёт, если будешь подражать этим клоунам.

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

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

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

А какой у тебя процессор? У меня воспроизводится:

$ time ./a.out 
Итого: 350000001 слов и 250000000 запятых

real	0m3.764s
user	0m3.024s
sys	0m0.738s

$ time ./tokens/target/release/tokens
Итого: 350000001 слов и 250000000 запятых

real	0m5.595s
user	0m4.968s
sys	0m0.625s

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

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

Так на то он и аноним, что без задней мысли сливает свою репутацию ниже Марианской впадины.

Вот так балаболы и тонут. Перданут и тонут. Ну, впрочем, ничего нового. Ведь это я смухлевал, а не пацан на кофемолке бенчил.

Вся суть раста и его мамкиных «бенчеров», комнатных.

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

i7 4770

Пишет Apple LLVM version 9.0.0 (clang-900.0.37), это или четвертый или уже пятый, хрен пойми.

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

Клоун, ты смухлевал заюзав ммаппинг на C, но не добавив аналогичный для раста. И чё ты ноешь про кофемолку? Важно относительное сравнение.

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

Ты уже обосрался - зачем ты пытаешься что-то болтать?

Никакой ммаппинг ни на какие результаты не влияет. Это понятно любому идиоту, но ты пытаешься играть в дурочка. Я там чётко и ясно указал на этот факт. ммап не влияет на юзертайм, только на системтайм. Который ты, если осилишь, можешь «относительно» сравнить. И никакйо ммап тебе не помешает.

Так же, ты всё равно обосрался с системтаймом и сравнение итак криво.

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

Забыл самое важно. Основа любой не-хелворд реализации - это прежде всего человек. Это умение и понимание, а язык это то, что даёт возможность это умение и понимание превратить в профит.

Ты можешь пойти и спастить мою реализацию. Да, на примере чуть сложнее - ты обосрёшься. Но это неважно. Ведь штука в том, что ни ты, ни какой-либо другой раст-адепт(в 99.9% случаев) - этого не сделаете сами. Именно в этом и проблема адептов всех подобных «языков».

Ну не выберет человек со знанием и пониманием себе в «инструменты» это. Только за бабки и то вряд ли. Вот и получается, что выбирает это обычная студентота/школота/хипстота и прочее. Но ни знаний, ни понимания у этих персонажей нет.

От того неважно - дали тебе биндинг для ммапа, либо не дали. Ты можешь только повторить и не более того. И когда ты будешь что-то реализовывать сам - реализации, с которой пастить, у тебя может и не быть.

Именно руки дают профит, а не что-либо ещё. И наличие рук не требует наличия протезов и прочих растов.

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

Ты можешь пойти и спастить мою реализацию.

А ты разве постил тут свою реализацию парсера? Что-то не припомню.

Ну не выберет человек со знанием и пониманием себе в «инструменты» это.

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

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

А ты разве постил тут свою реализацию парсера? Что-то не припомню.

А я где-то говорил про реализацию парсера?

Отлично делаешь выводы за всю планету.

А мне что-то мешает это делать?

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

Дело не синтаксисе. Опять же - ты пытаешься врать и подменять понятия, впрочем, как и всегда.

Всё что я говорю о расте - это объективная реальность, которую никто оспорить, пока, не осилил.

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

Я могу делать вывод о том, что это продолжиться и дальше. Т.е. я сужу у людях моего и выше уровня. Вроде как ничего этому не мешает.

Именно по этой причине я не могу писать ни на чём. Я могу писать на всём, но это не имеет смысла. Убогий язык не даёт мне выразить в коде то, что я хочу и так, как я хочу. Я вынужден писать дерьмо.

Т.е. я не вижу смысла в развитии живя в мире пхп, жабки, раста. Зачем развиваться, зачем что-то понимать, если язык тебе не даёт? Это множит на ноль весь смысл от развития.

И в этом и есть причина, по которой я говорю то, что говорю. Я не верю, что человек, который может в уровень, для которого необходим С++ ограничить себя жабкой, либо растом. Это глупо.

То же самое и человек, уровень понимания которого требует си. Ему не нужны подпорки, которые мне только мешают. Они никому не нужны. Никому не нужны костыли при условии, что они умеют ходить.

Это всё очень просто. Если тебе хватет раста - это твой выбор. Но если у тебя он есть - это не значит, что он есть у других.

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

Ути пути, попался на мухлеже, а теперь жопой вертишь.

Давай я расскажу как всё было. Захотелось тебе доказать, что ты не просто чувак, который не осилил раст, а адепт зашибенной сишечки и она вдруг с каких-то щей существенно быстрее раста с «рантаймом, который во время компиляции разруливает llvm». Тем более код готов, запустить ничего не стоит. Взял ты 2 чужих реализации одного алгоритма, запустил, и результат тебя не устроил. Ты полез смотреть и увидел медленный способ чтения файла. Обращаю внимание, ты не добавил в C честную итерацию по utf8, ты решил подарить C ещё форы. Да и метод мухлежа интересный, ты не распараллелил алгоритм, ты просто заменил портабельное библиотечное чтение на системное, но побыстрее. То, что в первой выдаче на каком-нибудь стековерфлоу.

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

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

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

Надо новую херню? Взяли рандомный символ и рандомную логику.

Лет через 10 rust будет как китайский язык в иероглифах, их будет 2000 штук и все нужно выучить. Может сразу взять их за токены?

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

vs

gcc my.c
...
time ./a.out
real	0m0,273s
user	0m0,256s
sys	0m0,017s
https://pastebin.com/B2DuVjcE

Охренеть. Бесполезный парсер в два с половиной раза медленнее полезного и совершенно в лоб сделанного:

#include <stdlib.h>
#include <stdio.h>

#define IS_ID(c) ((c >= 'A' && c <= 'Z') || \
                  (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9'))

#define IS_SPACE(c) (c == ' ' || c == '\t' || c == '\n')

static char *lexer_next_token(char **pp, char *e, char **p_mem)
{
        char *p = *pp, *m;

        while(p < e && IS_SPACE(*p)) p++;
        if(p == e)
                return NULL;
        m = *p_mem;
        while(IS_ID(*p)) {
                *m++ = *p++;
                if(p == e)
                        break;
        }
        if(m == *p_mem)
                *m++ = *p++;

        *pp = p;
        p = *p_mem;

        *m = '\0';
        *p_mem = m + 1;

        return p;
}

int main(void)
{
        FILE   *file;
        size_t  file_size;
        char   *file_data, *end_data, *p;
        int     cnt_word = 0, cnt_point = 0;
        char  **tokens, *t;
        char   *mem, *p_mem;
        int     num_token = 0;

        file = fopen("data","r");
        fseek(file,0,SEEK_END);
        file_size = ftell(file);
        fseek(file, 0, SEEK_SET);

        p = file_data = malloc(file_size);
        fread(file_data, 1, file_size, file);
        fclose(file);
        end_data = file_data + file_size;
        tokens = malloc((file_size + 1) * sizeof(char *));
        p_mem = mem = malloc((file_size + 1 ) * 2);

        while((tokens[num_token] = t = lexer_next_token(&p, end_data, &p_mem))) {
//                printf("=%s=\n", t);
                if(t[1] == '\0' && t[0] == ',')
                        cnt_point++;
                else
                        cnt_word++;
                num_token++;
        }

        printf("Result: %d words and %d commas\n", cnt_word, cnt_point);
        return 0;
}
В отличии от вашего, этот запоминает токены в памяти (для работы синтаксическоо анализатора), в виде zero-terminating, да и [0-9] для идентификаторов добавлено. Заодно, понимает \n\t.
time a.out
Result: 4000000 words and 2500000 commas

real    0m0.087s
user    0m0.070s
sys     0m0.016s

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

Ути пути, попался на мухлеже, а теперь жопой вертишь.

Обожаю идиотов. Обосрался и продолжает всё игнорировать дальше.

Давай я тебе повторю.

Ты полез смотреть и увидел медленный способ чтения файла.

Тебе уже сказали, ламерюга, никакое чтение файла никто не мерил. Это раз.

Обращаю внимание, ты не добавил в C честную итерацию по utf8, ты решил подарить C ещё форы.

Дак ты же, поехавший, сравнивал раст-дерьмо и сишную реализацию без utf8? Это ведь ты это высрал, а не. Какого же хрена ты не добавил utf8 в сишную версию, амёбка? Это два.

А по поводу итерации по utf8 - она тут ничего не даст. Тут итак будет итерация по utf8.

Именно ты попытался пердануть, но обосрался. Как всегда.

Да и метод мухлежа интересный, ты не распараллелил алгоритм,

Вот ещё одна потуга от ламерюги к комнатным манипуляциях.

Я разбирал не алгоритм, ни код пацана, а именно что твою потугу на 5%. Остальное мне не интересно. А в дерьме ты уже сидишь.

ты просто заменил портабельное библиотечное чтение на системное, но побыстрее.

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

И третье - ты обосрался и в сравнении с «портабельным чтением» в реализации ТС"а. Там то же кто-то смухлевал?

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

Покажи мне первую выдачу, действуй, амёбка.

Но внезапно выяснилось, что системный вызов - это не что-то офигенно сложное

Внезапно выяснилось только одно - ты обосрался. Ты пришел и начал пердеть про 5%. Не я, не Вася, а ты. И ты обосрался, т.к. разница нихрена не 5%.

Ну и эти манипуляции от идиота для идиотов. Ты можешь вызвать сискол, но это ничего не даёт. Сисколы нужно не просто вызывать, а правильно вызвать. Первым без второго - ты можешь только подтереться, что ты и сделал.

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

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

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

В каком хайлоаде, дурак? Ты где тут хайлоад увидел?

Ты из результата бенча пытался высосать доказательство медленности раста. И тут же сам постарался, чтоб бенч мерил не пользовательский код, а разницу mmap vs обычное чтение. Поэтому я и пишу, что ты - жалкий врунишка.

Покажи мне первую выдачу, действуй, амёбка.

Блин, походу ты и правда считаешь, что отображаемые в память файлы - это блин тайное знание, доступное избранным. Спасибо, поржал.

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

Твой портянка почти в 2раза медленнее

Я и не надеялся, так как полностью бесполезный даже писать не хотелось. Но цифры то представлены.

и в 10раз говней.

Ясен пень, ибо было write-only, в лоб. Но на ноль делить нельзя. Этим, закрыв глаза, можно пользоваться, вариантом ТСа - никак от слова совсем.

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

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

Кстати, раст так-то так умеет?

uint8_t map[255] = {
  [0] = ZERO,
  [1 ... 254] = DELIM,
  [' '] = SPACE,
  ['A' ... 'Z'] = CHAR,
  ['a' ... 'z'] = CHAR,
};
anonymous
()
Ответ на: комментарий от khrundel

Блин, походу ты и правда считаешь,

Ещё раз. Первую выдачу в студию. Я тебе, балаболу, даже позволю не только первую, но и до десятой. Действуй. Это же так просто.

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

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

Мне понравилось. Давайте еще. Меньше оскорблений, больше по теме: «раст не нужен». Или лучше создайте тему такую. Я бы почитал. А то хотел учить его(раст) и теперь что-то сомнения какие-то. Фанатизм от рэйзерфлакона и подобных прет, а по делу от них ничего нет.

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

Я и не надеялся, так как полностью бесполезный даже писать не хотелось. Но цифры то представлены.

Ты не померил на одной и той же тачке. Я померил. Результаты сообщил.

Ясен пень, ибо было write-only, в лоб.

Ну вот что тебе помешало бахнуть там функцию? Бахнуть таблицу?

Как-то так:

type_t next(char * str) {
  return map[(uint8_t)(*(str + 1))];
}

type_t cur(char * str) {
  return map[(uint8_t)(*(str))];
}

tok_t tokenizer(char ** pstr) {
  char * str = *pstr, * start = str;

  while(true) {
    switch(cur(str)) {
      case SPACE: ++str; ++start; break;
      case CHAR: if(next(str) == CHAR) {++str; break;}
      case DELIM: ++str; *pstr = str; return (tok_t){start, str - start};
      case ZERO: *pstr = str; return (tok_t){};
    }
  }
}

На базе той таблицы, о которой я спросил выше. Тут и расширяемость и \t и что угодно.

Но на ноль делить нельзя.

Ну у ТС"а основная проблема в том, что он с тетриса сидит. Именно поэтому форматирование 10сантиметров. Хотя непонятно почему, если мы экономим ширину - не используем 2пробела.

А так - рядовая портянке не хуже обычной.

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

Я бы почитал.

Вы всерьез собрались читать потоки создания Царя?

Фанатизм от рэйзерфлакона и подобных прет

Кроме таких персонажей есть еще pftBest, red75prim и Virtuos86, как минимум. Их мнению о нужности Rust-а лично я доверяю гораздо больше, чем потокам сознания Царя на тему ненужности Rust-а.

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

Ну ты чудо. Набираешь в гугле простой запрос «how to read file faster», второй строчкой идёт ссылка на стековерфлоу, https://stackoverflow.com/questions/17925051/fast-textfile-reading-in-c И лучший ответ про ммаппинг. В первой ссылке, возможно, тоже про него, но ты стековерфлоу просил

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

Ты не померил на одной и той же тачке. Я померил. Результаты сообщил.

Действительно, всял его цифры на его коде и свои на своём. Но таки теперь убедился - если не добавлять в код ТСа [0-9] и \t\n , то никакой разницы, а если добавлять, то даже чуть-чуть медленнее. Как у вас получилось вдвое медленнее? Каждый может проверить же.

Но это не важно. Важно что результат мой юзабелен, а его - нет: токен только текущий, не zero-terminating. Добавьте эту юзабельность и его код будет работать не столько же, а в несколько раз медленнее.

Ну вот что тебе помешало бахнуть там функцию?

Это вы про ваши cur/next ? Это же типичные мусорные функции от нелюбителей указателей от неосиляторства. Фу фу таким быть.

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

Мою тему вынесут через пол часа. Это первое. Второе, у меня сейчас нет времени на все эти срачи. Я не успел с предыдущим разобраться, да и лень мне. Слишком много времени эти срачи тратят.

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

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

Люди пытаются идеализировать свой выбор, оправдывать его, находить причины выбора и сам выбор в ситуации, когда выбора просто нет. Всё это оправдывается «моими задачами» и прочим подобным.

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

И мышление их такое же не целостное. Кусок там, кусок так. Всё вместе - ахинея, но человек этого не видит.

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

Фанатизм от рэйзерфлакона и подобных прет

Я подозреваю, что ребята слишком молоды (AntonyRF, например, временами откровенно скатывается в школоло), чем и объясняется их чрезмерная принципиальность. Это примета возраста, надо делать скидку.

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

Но таки теперь убедился - если не добавлять в код ТСа [0-9] и \t\n , то никакой разницы, а если добавлять, то даже чуть-чуть медленнее. Как у вас получилось вдвое медленнее? Каждый может проверить же.

clang5. В новых гцц сломали. В пятом ещё более-менее.

Но это не важно. Важно что результат мой юзабелен, а его - нет: токен только текущий, не zero-terminating. Добавьте эту юзабельность и его код будет работать не столько же, а в несколько раз медленнее.

У тебя то же самое. Возвращает текущий токен. Он засунул возврат в общий контекст, чтобы вернуть false на нул. Это не значит, что из этого контекста нельзя писал в массив.

zero-terminating - ты добавил только потому, что ничего другого не осилил. Чисто, чтобы не заморачиваться. Тут нет ничего лучше - это тупо проще.

Это вы про ваши cur/next ?

Это я про макросню из 72 года.

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

Это не мусорные функции и ни к каким указателям они не относятся. Они существуют для того, чтобы не срать дерьмом map[(uint8_t)(*(str))] подобных внутри кейсов.

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

Сможешь ли ты, амёбка, найди ту фатальную, что ты допустил. Я даю тебе шанс. Впрочем, как и всем убогим.

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

Возвращает текущий токен.

А что по вашему надо было возвращать? Указатель на сдвинутый буфер файла? Да не вопрос. Но речь то про юзабельность.

Он засунул возврат в общий контекст,

И? При получении следующего всё предыдущее он теряет.

Это не значит, что из этого контекста нельзя писал в массив.

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

zero-terminating - ты добавил только потому, что ничего другого не осилил.

Пф. У меня обратное ощущение в вашей неосиляторстве. Единственно когда lenght удобнее '\0', это когда в таком странном входном алфавите представлены все символы. Если б не его желание посоревноваться скоростью с языками, где накидать указателей на память со всосанным файлом весьма проблематично (ещё надо было б продемонстрировать, как он это представляет с tty-шным stdin), то при getchar-ах и нет никакой сложности вставить любой неалфавитный признак конца токена, всё равно память под токены будет ваша, а не псевдо-mmap.

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

И? При получении следующего всё предыдущее он теряет.

Как и ты.

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

Как и тебе.

Да и вообще, что за херню ты несёшь? Какой массив, куда создать. char ** ничем не отличается от tok_t * . и записывается точно так же, только ещё проще.

Пф. У меня обратное ощущение в вашей неосиляторстве.

Кудахтать мне про моё неосиляторство сишки - это надо додуматься. Сильный аргумент.

Единственно когда lenght удобнее '\0', это когда в таком странном входном алфавите представлены все символы.

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

Единственная проблема - это с size_t в длине, но тут хватит и байта, ибо токены длиннее 255символов нахрен никому не упали.

всё равно память под токены будет ваша, а не псевдо-mmap.

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

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

Как и ты. Как и тебе. Да и вообще, что за херню ты несёшь? Кудахтать мне про моё неосиляторство сишки - это надо додуматься.

ЧТД.

Всегда нахаляву брать подстроки,

Она «халявная» пока она именно — подстрока, сама по себе, халява быстро кончается, как только становится самостоятельной строкой для юзанья.

это с size_t в длине, но тут хватит и байта, ибо токены длиннее 255символов нахрен никому не упали

Ааа, паскалист чтоле? Оно и видно, пропечатано, не ототрёшь.

Допустим, ему на следующей стадии нужно вывести контекст при ошибке. Как ты будешь делать это на твоей фигне? Да никак. А у него уже есть контекст. При этом - нахаляву.

Вы всё перепутали. То что возвращается строка, а не сложная структура с типом токена, номером строки и позиции в ней — это именно, о чём весь срач тут и начался с ТСом. Это не моя проблема, а его. Это у него невозможно вернуться к предыдущему токену, совсем. У меня все токены запоминаются, надо контекст ошибки, ну запоминайте, делов то.

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

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

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

Так же, амёбка умеет генерировать рандомную ахинею. В основном это вариации на тему знакомых, услышанных где-то шаблонов. Генерируются они просто. Амёбка пытается найти такую фразу, на которую у неё нет ответа.

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

По сути - это такие боты. Он услышал знакомое слово - погуглил. Высрал первую же херню, которая всплыла в его пустой черепушке.

Рассмотрим поведение мартышки на примере, текущем. Я не буду разбирать всё - вы можете поглядеть выше. Рассмотрим только пример с ммапом.

Амёбка увидела ммап - амёбка погуглила. Тут врубается защитная реакция типа «а ты чё не такой», т.е. попытка перевести контекст со своего прокола на прокол оппонента. В данном случае обвинение строиться на проекции своей никчёмности на меня. Т.е. если гуглил я сам и сам я ноль, то гуглил и он. Хотя на самом деле он знает, что это не так.

Но всё же, он надеется на то, что крыть мне нечем. Ведь крым ему свои слова нечем. И тут возникает проблема - кто сказал амёбке о том, что они увидела ключевое слово правильно?

Амёбка думала, что я говорю ей о mmap'e(на самом деле я уже десять раз намекал ей об этом). Почему же амёбка это не воспринимает, почему же этого не видит?

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

И результат предсказуем. Амёбка не смогла посмотреть на то, что мой ммап чем-то отличается, чем-то отличается именно в контексте «мало позвать систкол - надо позвать его правильно». Это слишком сложно для менее, чем одно извилины.

Именно поэтому все амёбки такие тупые. Ведь голова есть? Есть, а что там и как - да насрать. Точно так же и тут. Ключевое слово увидел и понеслось.

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

Ну и, собственно. Краткая версия для непонятливых.

Амёбка увидев mmap, увидев знакомое ключевое слово попыталось пердеть, но. Мой ммап имел нюанс, который, естественно, амёбке заметить не дано.

Именно поэтому я могу говорить «покажи» и амёбка не покажет. Именно поэтому она обосрётся и обосралась.

Первое - амёбка обосрался уже тогда, когда начал сливаться на ммапинг без нюансов. Он уже подписал себя под мусор.

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

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

Я считаю, что всего этого достаточно для доказательства того, что амёбка даже не подозревал о том, о чём я говорю. Об этом говорит и его реализация в которой он просто забыл, вернее даже и не вспоминал, когда пастил с СО «ммапинг» для раста. Там-то он был дефолтный.

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

ЧТД.

Меня всегда удивляли подобные персонажи. Тотально нулёвый, а пытается кого-то ловить.

Она «халявная» пока она именно — подстрока, сама по себе, халява быстро кончается, как только становится самостоятельной строкой для юзанья.

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

Ааа, паскалист чтоле? Оно и видно, пропечатано, не ототрёшь.

Нет, паскалист именно ты. Именно у больных появляются болезненные ассоциации.

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

Это оверхед, оверхед равный сишной строке. А паскаль-строка не столько про 255, а сколько про неявность. В конечном итоге у неё интерфейс аналогичный сишной, что в данном случае не так.

Вы всё перепутали. То что возвращается строка

Возвращается указатель. Ошибка новер раз.

а не сложная структура с типом токена

Возврат сложной/хреносложной структуры ничем не отличается от возврата какой угодно строки, так же как и указателя.

номером строки и позиции в ней — это именно, о чём весь срач тут и начался с ТСом.

Что ты несёшь, упоротый. Тебе сказали, что твой пердёжь в сторону «будет иначе» - не иначе. И тебе объяснили почему. Ты либо просто деревянный, либо врубил дурака.

Это не моя проблема, а его.

О боже, да ты совсем деревянный.

Это у него невозможно вернуться к предыдущему токену, совсем.

Ало, полено. Он тебе выкатил функцию с интерфейсом. Остальной код существует только для проверки этой функции.

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

Ты просто насрал инициализацию массива, которой у него не было. Это не значит, что её быть не может.

У меня все токены запоминаются,

Ничего у тебя не запоминается. Запоминание прикручено слева и в рамках lexer_next_token не реализовано.

надо контекст ошибки, ну запоминайте, делов то.

Нет, ты опять обосрался и несёшь херню. Ты начинаешь меня одалевать.

У тебя нет контекста. Ты не можешь его запомнить, алёша. Контекст превращает твою строку в ту же самую структуру. Ты, опять же, либо просто идиот, либо опять врубаешь дурака.

Точно так же, у него контекст достаётся на халяву, а у тебя нет.

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

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

Точно так же, у него контекст достаётся на халяву, а у тебя нет.

Вся его «халява» - в пожранной памяти псевдо-mmap-а. Как он может что-то запомнить, если запомнить некуда? Что тут не понятного? Каким тупицей надо быть, чтобы не понять то, что уже 4 раза и так и этак вам тут разжевали? И это я ещё не подходил к тому, что нафиг не нужны строки-токены, а нужны значения enum-ов, потому и халява та совершенно бесполезна. О чём и не удалось втолковать ТС-у, а вам как полному дауну и не стоит и начинать толковать...

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

Ну как я понимаю - ты поплыл? Совсем?

Вся его «халява» - в пожранной памяти псевдо-mmap-а.

Тебе уже сказали, вася, ро-ммап не жрёт память.

Как он может что-то запомнить, если запомнить некуда?

Если бы ты, как и прочие лсные рандомы, мог бы в матчасть - ты бы знал что такое ммап и как он работает. И как он может что-то запомнить не запоминая. Тем более, я уже на этот вопрос отвечал. Раза два тут.

И это я ещё не подходил к тому, что нафиг не нужны строки-токены

Если они не нужны - нахрен ты их высрал? Ты уж там определись. А во всё, в чём ты пытался подходить - ты обосрался.

А теперь смотри. Если токены-строки не нужны, то ИХ У ТС"А-то и нет. Ты же сам об этом кукарекал? Не?

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

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

О чём и не удалось втолковать ТС-у, а вам как полному дауну и не стоит и начинать толковать...

Обожаю лсных даунов, которые обгадятся 25 раз за 5попыток, но что поделать. Зато называть других даунами - всегда пожалуйста.

ТС"у ты можешь пытаться втолковывать всё, что угодно. Он зелёный и тебя загнать в дерьмо не может. Со мною это не прокатит. Любая твоя потуга будет помножена на ноль.

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

Тебе уже сказали, вася, ро-ммап не жрёт память.

Идиотик. Читать умеем? Нет у него mmap, а есть fseek/malloc/fread. Где там r/o?

Тем более, я уже на этот вопрос отвечал. Раза два тут.

А что, вас стоит читать? Да неужели? Два слова без тупости и также тупых оскорблений не можете связать? Не годится mmap для сколько-либо распространённых применений парсеров, тупой ввод с терминала — и привет.

токены-строки не нужны, то ИХ У ТС"А-то и нет.

У ТСа всё что есть - текущая позиция в файле. Всё. И это уже раз 5 говорю.

Он получает не только токены, но и индекс для исходника.

Вот же тупица то. Любой парсер имеет состояние - текущая позиция парсинга. Вам надо позицию токена в файле? Так это в моём коде первый аргумент минус длина текущего токена. Что, тупость не позволяет прочитать код, на который пытаетесь что-то вякать?

Со мною это не прокатит.

Лол. Вы же тяжело больны. Кого волнует «мною» от анонимуса да ещё с манией величия.

А так дышал...

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

У ТСа всё что есть - текущая позиция в файле. Всё.

Длинна токена еще.Видимо я не так назвал эту вещь,либо ты в упор не видишь.И так,пишу я лисп

struct Lexer {
    const char* text;
    unsigned    text_len;
    unsigned    text_pos;

    const char* token;
    unsigned    token_len;
    bool        token_is_string;
};

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

struct Node {
    const char* token;
    unsigned    token_len;
    bool        token_is_string;

    Node**      node_array;
    unsigned    node_count;

    Node*       parent;
};
Ну как то так,теперь можно составить дерево
Node* CreateAST_Tree(Lexer* lexer) {
    Node* root = NodeNew(NULL); /* parent = NULL */
    Node* this = root;

    while(LexerNextToken(lexer)) {
        if(myCmp(lexer,"(") == 0) {
            Node* new = NodeNew(this);

            /* копируем указатель,длинну,и флаг строки 
               никакой копии стоки нету */
            NodeSetData(new,lexer->token,
                        lexer->token_len,
                        lexer->token_is_string);

            this = new;
        }
        Остальное...
        ...
    } 
}

И как видишь я не копирую никаких строк,у меня существует только сам текст

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

Забыл Прикрутить «new» к «this»,добавь там мысленно AppendNode(this,new);

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