Зачем реализовывать строки через Double, если можно реализовать через байты и биты, как везде?
Не, ну, в принципе, в один дабл влезет один Unicode codepoint, но это расточительно!
Ранее по теме.
Строки, хранение и обработка
Применение искинов - шоссе империализма (Стенгазета русификаторов ИТ) |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Применение искинов - шоссе империализма (Стенгазета русификаторов ИТ) » Археология (было "наследие Древних") » язык программирования "Солуни" » Строки
Зачем реализовывать строки через Double, если можно реализовать через байты и биты, как везде?
Не, ну, в принципе, в один дабл влезет один Unicode codepoint, но это расточительно!
Ранее по теме.
Строки, хранение и обработка
Зачем реализовывать строки через Double, если можно реализовать через байты и биты, как везде?
Потому что в первой версии РЯП есть тип Double и нет типа байт, и нет типа бит.
"как везде" - это не мой путь, хотя мой путь иногда может пересекать путь "как везде"
ну, в принципе, в один дабл влезет один Unicode codepoint
Ну вот, уже хорошая идея!
но это расточительно!
Помню, в 2003 году у меня был ПК с размером оперативки тридцать два мегабайта,
и мне более чем хватало.
А сейчас на домашнем компьютере стоит восемь гигов,
и по современным меркам - это скромно,
так что про объем можно не беспокоиться и вообще не думать.
Но идея радикальной экономии памяти (рэп) - это хорошая идея.
Правильно ли я понимаю, что прям счас от стремительной реализации строк отвращает отсутствие работы с массивами из Double, потому что строка это как бы массив? А массивов нет, потому что нет более низких абстракций типа понятий для описывания стека и/или кучи ?
Правильно ли я понимаю, что прям счас от стремительной реализации строк отвращает отсутствие работы с массивами из Double, потому что строка это как бы массив?
Если честно, строки я рассматриваю как самую последнюю особенность приближения языка программирования к человеку.
То есть строку действительно можно реализовать как массив,
и никаким другим образом больше не реализовывать тип строка.
А массивов нет, потому что нет более низких абстракций типа понятий для описывания стека и/или кучи ?
Массивов нет, потому что нет времени и-или желания,
которых нет потому, что хочется в первую голову сделать служебные и личные дела,
а уж потом, когда у меня в голове естественным образом появится мысль:
"Ну всё, служебные и личные дела сделал с запасом,
теперь-то уже можно реализовать механизм массивов в родимом РЯП",
вот тогда и можно приступить к реализации механизма массивов в родимом РЯП.
Массивов нет, потому что нет времени и-или желания, которых нет
У меня другая точка зрения. Массивов нет, потому что им не придумали обобщающее название.
Строки от массивов существенно отличаются тем, что у строк есть длина и она может меняться. А массив свой размер как правило не меняет (по крайней мере в си).
А то что выделяется в куче - это уже ближе к объектам (reference types).
Ну вот, поскольку в Си размер массивов не хранится в памяти, а учитывается только компилятором,
паскалеподобные строки от массива существенно отличаются тем, что они-то как раз свою длину в памяти хранят.
Итак, есть три (в данном случае) разновидности типов:
- типы фиксированного размера (т.е. в нашем случае только double)
- типы-массивы (у них размер входит в описание типа, чтобы не хранить его/размер в памяти/в рантайме)
- типы-строки (у них размер хранится в памяти в рантайме)
Причем типов-массивов много. Это объясняется как разницей в типах элементов, так и разницей в размерностях и длинах/размерах.
Всё это типы - и примитивные, и массивы, и строки. Но это неодинаковые типы. И хорошо было бы иметь слово или словосочетание в русскоязычной терминологии, которое бы описывало такие "разновидности типов". Но такого словосочетания нет.
Назовём их "типогруппами".
Множество всех типогрупп как сущность назовём "типы" (хотя это и нелогично, множество типогрупп логично так и назвать - "типогруппы") и пусть оно состоит из типогрупп (т.е. типогруппа - это элемент множества "типjогруппы"). У нас есть вообще множество типов, а мы его структурируем иерархией из "полностью определённых типов" и "типогрупп".
типогруппа "строки" (на самом деле не строки, как и типогруппы - не типы)
состоит из строкотипов, отдельные строкотипы - строки разной длины.
Вообще строкотипы можно было бы разными способами параметризовать,
например по применяемому алфавиту, получатся забавные эффекты типа того, что имена не смогут смешивать русские буквы с английскими,
или не смогут содержать цифр,
или по кодировке, чтобы не смешивать Unicode и китайскую таблицу-стандарт (не помню название),
да даже, наконец, нуль-терминированные строки и паскалеподобные строки можно было бы использовать вместе в одном языке.
типогруппа "массивы"
состоит из массивотипов, каждый массивотип описывает массив какой-то размерности и типа элементов
типогруппа "примитивные типы"
состоит из примитивотипов, каждый примитивотип имеет размер в памяти и связанные с ним операции
Вообще говоря, операции, связанные с типами имеют все типы. И типы входящие в строкотипы, и в массивотипы и в примитивотипы.
Но типогруппы обобщают одинаковые операции отдельных "полностью определённых типов".
И нет книжки, которая бы долго и детально расписывала, что и как с ними делать. Именно отсутствие книжки с проработанной терминологией мешает просто сесть и закодить это всё на произвольном языке программирования.
Мы видим, что людей, изучающих программирование и желающих сделать свой язык довольно много (складывается впечатление, что практически каждый студент американских ВУЗов разрабатывает по языку). Это значит, что дело не в личном времени NuShaman, а в общем уровне доступности и проработанности информации по вопросу реализации/написания системы типов на русском языке.
Отредактировано Лис (2021-11-27 10:00:36)
Ну вот, поскольку в Си размер массивов не хранится в памяти, а учитывается только компилятором,
паскалеподобные строки от массива существенно отличаются тем, что они-то как раз свою длину в памяти хранят.
Прочитал половину поста Лиса.
Отвечаю по существу:
В Солуни (РЯП) массив будет реализован как набор обычных переменных
(то есть переменных типа Double).
Массив будет тождественен строке (тождественен для машины).
Забегая вперед, предположим, что кодировка любой строки будет UTF-8.
Для массива не надо будет объявлять ни тип, ни размер.
Так как массив будет динамическим.
Но если программист сделает использование в массиве только конкретного заранее ограниченного и известного количества значений,
то никто ему не запретит.
По сути получится статичный массив, статичный для рантайма.
Программист пишет:
массив[1] = 5
Вот и создалась переменная "массив[1]" со значением пять типа Double.
Однако сразу следует понять, что переменная "массив[1]" уже не есмь просто лишь обычная переменная,
а это уже элемент массива "массив" с индексом, равным единице.
Потом программист пишет:
массив[3] = 108
"Где же переменная массив[2]?", - спросит внимательный читатель.
"А нетути", - ответит НуШаман.
Тогда придется создать функцию "длина" и код для еёшного использования:
длина массива = длина(массив)
Что отдаст функция? 2 или 3?
Раз нет элемента 2, значит 2.
А если это строка, то чем она кончается, элементом 1 или 3?
Скорее всего, элементом 3,
а элемента 2 попросту нет.
Но его можно добавить потом.
Таким образом массив есмь двусвязный список,
при этом элементы массива последовательно возрастают (можно с пропусками).
Допустим, я реализовал механизм массивов.
Тогда программист пишет код:
переменная=5 переменная[1]=7 показать переменная показать переменная[1] показать переменная[0]
Что отобразит программа?
переменная = 5 переменная[1] = 7 переменная[0] = 5
Сразу открою секрет:
переменная без указания индекса
тождественна нулевому элементу массива,
обозванному по имени переменной.
Забегая вперед, предположим, что кодировка любой строки будет UTF-8.
А ведь тип по умолчанию Double.
ВОПРОС: Что будет, если в строке прописать вещественное большое число, например, число 1234.56?
ОТВЕТ: Число округлится в меньшую сторону и возьмётся остаток от деления на число 256.
Полученный результат будет использован в качестве значения элемента строки (в качестве символа).
Нумерация в массиве идёт от единицы (отмежевались от языка Си).
В качестве индекса может выступать любое целое число,
записанное в десятичной системе счисления.
В том числе отрицательное.
Если в интерпретаторе не будет реализована встроенная длинная арифметика,
то индекс массива будет округляться до мощности четырех байт.
И у меня возникла шальная мысль:
А не реализовать ли вещественный индекс массива?
Чтобы убить сразу не только двух зайцев,
а их бесконечное (ограниченное размером программы) множество
Тогда сразу ВОПРОС: как в качестве индекса задавать иррациональное или трансцендентное число (корень числа, число Пи)?
И как задавать число, бесконечное в записи в десятичной системе счисления,
но которое можно записать точно в виде дроби (1/3)?
Введём круглые скобки для заполнения массива.
массив[1] = 1 массив[2] = 2 массив[3] = 3 показать массив
Вывод:
массив = (1, 2, 3)
Тогда создадим процедуру показать_строка
массив[1] = 49 массив[2] = 50 массив[3] = 51 показать_строка массив
Вывод:
массив = 123
А тогда что отобразит код?:
массив = (1, 2, 3) показать_строка массив
Что-то типа:
массив = $31 $32 $33
Когда из строки вырезают подстроку, иногда возникает желание уметь вырезать пустую подстроку,
ВОПРОС: Как обрезать строку?
ОТВЕТ: В следующем элементе после последнего элемента нужной строки
у значения нужно задать отрицательный знак.
Таким образом, само значение символа сохранится.
И в случае надобности значение может быть восстановлено
всего лишь путём присвоения положительного знака.
Пытливые умы спросят:
"Как же ж задать отрицательный знак у нуля?"
Для этого можно использовать любое вещественное число, чуть большее нуля,
например, для простоты число 0.1.
Так же можно задать новую команду удалить:
удалить( массив[2] )
По этой команде из памяти интерпретатора удаляется заданный элемент массива.
Так же командой удалить можно удалить любую обычную переменную,
ведь обычная переменная - нулевой элемент массива.
Поэтому обратиться к значению переменной "переменная"
можно и так: "переменная[0]".
обычная переменная - нулевой элемент массива
Ну я тоже предлагал все символы считать строками.
Но операция сложения, которая склеивает строки, будет делать что-то страшное с числами.
Она будет два числа не склеивать в один массив, а складывать в одно число.
Отредактировано Лис (2021-11-30 08:15:02)
И хорошо было бы иметь слово или словосочетание в русскоязычной терминологии,
которое бы описывало такие "разновидности типов".
Но такого словосочетания нет.
Смею предположить, что всё, что Вы, Лис, написали,
можно реализовать на современной версии языка Си.
Но я пользую Си лишь в рабоче-крестьянских и пролетарских целях,
поэтому с реализацией не смогу помочь.
нуль-терминированные строки
что это? динамический массив с признаком (символом) конца?
длина вычисляется в рантайме.
Мы видим, что
людей, изучающих программирование и
желающих сделать свой язык довольно много
(складывается впечатление, что
практически каждый студент американских ВУЗов
разрабатывает по языку).
Это значит, что дело не в личном времени NuShaman,
а в общем уровне доступности и проработанности информации
по вопросу реализации/написания системы типов
на русском языке.
Я, как специалист-работник,
работающий на российскую компанию,
живущий в России,
закончивший российский ВУЗ,
предполагаю, что дело конечно же не в личном времени,
и даже не в проработанности информации,
и уж тем более не в общем уровне доступности,
а дело - в желании (или в нежелании) каждого конкретного человека
думать об этом.
Вы здесь » Применение искинов - шоссе империализма (Стенгазета русификаторов ИТ) » Археология (было "наследие Древних") » язык программирования "Солуни" » Строки