strlen

Jan. 24th, 2013 09:23 pm
thedeemon: (office)
[personal profile] thedeemon
В Идрисе один из базовых типов - String, внутри представленный как null-terminated C string. Знаете, как узнать длину такой строки? Сконвертить в список Char'ов, а потом посчитать его длину. А все потому, что хоть в рантайме идриса и есть нормальная функция вычисления длины (по-хорошему ее вообще стоило бы хранить, а не вычислять), в стандартную библиотеку ее забыли экспортнуть. У них там в академии своя атмосфера.

Date: 2013-01-24 05:25 pm (UTC)
From: [identity profile] gds.livejournal.com
> по-хорошему ее вообще стоило бы хранить, а не вычислять

Ваистену Так, Ибо!

Date: 2013-01-24 06:47 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
А она что, мутабельна?

Date: 2013-01-25 02:34 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Нет, строки там иммутабельны. Причем при создании строки там один раз strlen уже вызывается, чтобы знать, сколько памяти выделить. Но почему-то не хранится.

Я так понимаю, автор просто делал как ему проще, об эффективности не слишком заботился.

Date: 2013-01-24 06:48 pm (UTC)
From: [identity profile] http://users.livejournal.com/leo_bonart_/
"В Идрисе один из базовых типов - String, внутри представленный как null-terminated C string."
Я все понимаю, Холмс, но КАК?
Это же, мать его, всемирно известное, самое дорогое айтишное решение всех времен и народов.
За такое представление строки в любом современном языке у автора идеи надо вырезать яйца без наркоза.

Date: 2013-01-24 07:41 pm (UTC)
From: [identity profile] kodt-rsdn.livejournal.com
Который раз ловлю себя на том, что вместо "идрис" читаю "иблис". В обоих смыслах: арабско-адском и русско-матерном получается ибо-ваистену!

Date: 2013-01-24 08:03 pm (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
А где хранить длину? Перед строкой или рядом с указателем?
А на длину потратить 1, 2, 4 или 8 байт?
Если бы тогда приняли решение хранить длину, то сейчас бы жили в мире, где поля ввода в програм ограничены 256-ю символами, и в JavaScript строки тоже были бы не длинее 256 символов. Так же как целочисленные числа по традиции ограничены 52-ю битами.

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

Date: 2013-01-24 08:20 pm (UTC)
From: [identity profile] http://users.livejournal.com/leo_bonart_/
Так я не Кернигана с Ричи и Томпсоном ругаю - их решение не было ошибкой!
И баснословно дорогим оно оказалось только в позднейшем контексте доминирования си в системном программировании.
Но вот авторам идриса все это было прекрасно известно и понять их решение невозможно.
"Возможно, что нам повезло с эффектом второго порядка - решение с null terminated было настолько ужасно, что слава богу сейчас не удержалось, а чуть менее ужасное с хранением длины в первом байте не завоевало мир."
Не удержалось? Си все еще на коне, самые распространенные ОС используют именно такие строки. Они еще нас переживут.
А хранение длины рулит не потому сколько байт, а потому что хранение. Да и с конвертацией проблем сущий мизер, ибо из строки с хранимой длиной длина отдельно и массив символов отдельно получаются за О(1).

Date: 2013-01-26 06:13 am (UTC)
From: [identity profile] anatoly borodin (from livejournal.com)
Можно ж вместо длины хранить два указателя, begin и end. И хоть гигабайты между ними.

Date: 2013-01-25 02:39 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Видать, делал как проще, об эффективности особо не задумывался. А судя по забытому StrLen, его строки вообще мало волновали. :) С другой стороны, спасибо, что не как в хаскеле, где String = [Char].

Плюс, возможно, повлияло то, что компиляция идет через генерацию Си и вывов gcc.

Date: 2013-01-25 10:50 am (UTC)
From: [identity profile] maxim.livejournal.com
А что разве в Хаскеле разве не заоптимизированно String = [Char] ?

Date: 2013-01-25 10:58 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Там есть всякие ByteString'и, где символы подряд (одним куском или списком из массивов). А классический String таки ленивый список.

Date: 2013-01-24 11:14 pm (UTC)
From: [identity profile] 109.livejournal.com
если я правильно помню, строки с хранимой длиной называются pascal strings...

Date: 2013-01-25 05:48 am (UTC)
From: [identity profile] alexandr alexeev (from livejournal.com)
pascal strings - это один байт под длину и до 255 байт под саму строку. Если не ошибаюсь.

Date: 2013-01-25 06:33 am (UTC)
From: [identity profile] mpak666.livejournal.com
интересно как этот идрис работает с unicode :)

Date: 2013-01-25 06:58 am (UTC)
From: [identity profile] mpak666.livejournal.com
как замечательно :))) бритва Оккама в действии

Date: 2013-01-25 07:27 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Ага. :) При большом желании решается библиотечно. Char там внутри - инт, так что можно символами оперировать не толькео ascii, дальше нужно лишь написать свою конверсию из String в список Char'ов, и будут юникодные строки-списки.

Date: 2013-01-25 07:30 am (UTC)
From: [identity profile] mpak666.livejournal.com
но можно ли переопределить стандартные функции, чтобы другие библиотеки (например файловые) смогли работать после этого с unicode без дополнительных телодвижений?

Date: 2013-01-25 07:56 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Те функции, что в стандартной библиотеке (их совсем немного), привязаны к String и реализованы на Си тупейшим образом (через strlen, strcpy, fgets, etc.). Так что вряд ли.

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 9th, 2026 02:57 pm
Powered by Dreamwidth Studios