ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Строки

Сообщений 1 страница 12 из 12

1

Зачем реализовывать строки через Double, если можно реализовать через байты и биты, как везде?
Не, ну, в принципе, в один дабл влезет один Unicode codepoint, но это расточительно!

Ранее по теме.
Строки, хранение и обработка

0

2

Лис написал(а):

Зачем реализовывать строки через Double, если можно реализовать через байты и биты, как везде?

Потому что в первой версии РЯП есть тип Double и нет типа байт, и нет типа бит.
"как везде" - это не мой путь, хотя мой путь иногда может пересекать путь "как везде" :)

Лис написал(а):

ну, в принципе, в один дабл влезет один Unicode codepoint

Ну вот, уже хорошая идея!

Лис написал(а):

но это расточительно!

Помню, в 2003 году у меня был ПК с размером оперативки тридцать два мегабайта,
и мне более чем хватало.
А сейчас на домашнем компьютере стоит восемь гигов,
и по современным меркам - это скромно,
так что про объем можно не беспокоиться и вообще не думать.
Но идея радикальной экономии памяти (рэп) - это хорошая идея.

0

3

Правильно ли я понимаю, что прям счас от стремительной реализации строк отвращает отсутствие работы с массивами из Double, потому что строка это как бы массив? А массивов нет, потому что нет более низких абстракций типа понятий для описывания стека и/или кучи ?

0

4

Лис написал(а):

Правильно ли я понимаю, что прям счас от стремительной реализации строк отвращает отсутствие работы с массивами из Double, потому что строка это как бы массив?

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

Лис написал(а):

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

Массивов нет, потому что нет времени и-или желания,
которых нет потому, что хочется в первую голову сделать служебные и личные дела,
а уж потом, когда у меня в голове естественным образом появится мысль:
"Ну всё, служебные и личные дела сделал с запасом,
теперь-то уже можно реализовать механизм массивов в родимом РЯП",
вот тогда и можно приступить к реализации механизма массивов в родимом РЯП.

0

5

NuShaman написал(а):

Массивов нет, потому что нет времени и-или желания, которых нет

У меня другая точка зрения. Массивов нет, потому что им не придумали обобщающее название.

Строки от массивов существенно отличаются тем, что у строк есть длина и она может меняться. А массив свой размер как правило не меняет (по крайней мере в си).
А то что выделяется в куче - это уже ближе к объектам (reference types).

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

Итак, есть три (в данном случае) разновидности типов:
- типы фиксированного размера (т.е. в нашем случае только double)
- типы-массивы (у них размер входит в описание типа, чтобы не хранить его/размер в памяти/в рантайме)
- типы-строки (у них размер хранится в памяти в рантайме)

Причем типов-массивов много. Это объясняется как разницей в типах элементов, так и разницей в размерностях и длинах/размерах.

Всё это типы - и примитивные, и массивы, и строки. Но это неодинаковые типы. И хорошо было бы иметь слово или словосочетание в русскоязычной терминологии, которое бы описывало такие "разновидности типов". Но такого словосочетания нет.

Назовём их "типогруппами".
Множество всех типогрупп как сущность назовём "типы" (хотя это и нелогично, множество типогрупп логично так и назвать - "типогруппы") и пусть оно состоит из типогрупп (т.е. типогруппа - это  элемент множества "типjогруппы"). У нас есть вообще множество типов, а мы его структурируем иерархией из "полностью определённых типов" и "типогрупп".

типогруппа "строки" (на самом деле не строки, как и типогруппы - не типы)
  состоит из строкотипов, отдельные строкотипы - строки разной длины.
  Вообще строкотипы можно было бы разными способами параметризовать,
  например по применяемому алфавиту, получатся забавные эффекты типа того, что имена не смогут смешивать русские буквы с английскими,
  или не смогут содержать цифр,
  или по кодировке, чтобы не смешивать Unicode и китайскую таблицу-стандарт (не помню название),
  да даже, наконец, нуль-терминированные строки и паскалеподобные строки можно было бы использовать вместе в одном языке.
типогруппа "массивы"
  состоит из массивотипов, каждый массивотип описывает массив какой-то размерности и типа элементов
типогруппа "примитивные типы"
  состоит из примитивотипов, каждый примитивотип имеет размер в памяти и связанные с ним операции

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

И нет книжки, которая бы долго и детально расписывала, что и как с ними делать. Именно отсутствие книжки с проработанной терминологией мешает просто сесть и закодить это всё на произвольном языке программирования.
Мы видим, что людей, изучающих программирование и желающих сделать свой язык довольно много (складывается впечатление, что практически каждый студент американских ВУЗов разрабатывает по языку). Это значит, что дело не в личном времени NuShaman, а в общем уровне доступности и проработанности информации по вопросу реализации/написания системы типов на русском языке.

Отредактировано Лис (2021-11-27 10:00:36)

0

6

Лис написал(а):

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

Прочитал половину поста Лиса.
Отвечаю по существу:
В Солуни (РЯП) массив будет реализован как набор обычных переменных
(то есть переменных типа Double).
Массив будет тождественен строке (тождественен для машины).
Забегая вперед, предположим, что кодировка любой строки будет UTF-8.

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

Программист пишет:

Код:
массив[1] = 5

Вот и создалась переменная "массив[1]" со значением пять типа Double.
Однако сразу следует понять, что переменная "массив[1]" уже не есмь просто лишь обычная переменная,
а это уже элемент массива "массив" с индексом, равным единице.

Потом программист пишет:

Код:
массив[3] = 108

"Где же переменная массив[2]?", - спросит внимательный читатель.
"А нетути", - ответит НуШаман.

Тогда придется создать функцию "длина" и код для еёшного использования:

Код:
длина массива = длина(массив)

Что отдаст функция? 2 или 3?
Раз нет элемента 2, значит 2.

А если это строка, то чем она кончается, элементом 1 или 3?
Скорее всего, элементом 3,
а элемента 2 попросту нет.
Но его можно добавить потом.
Таким образом массив есмь двусвязный список,
при этом элементы массива последовательно возрастают (можно с пропусками).

0

7

Допустим, я реализовал механизм массивов.
Тогда программист пишет код:

Код:
переменная=5
переменная[1]=7
показать переменная
показать переменная[1]
показать переменная[0]

Что отобразит программа?

Код:
переменная = 5
переменная[1] = 7
переменная[0] = 5

Сразу открою секрет:
переменная без указания индекса
тождественна нулевому элементу массива,
обозванному по имени переменной.

NuShaman написал(а):

Забегая вперед, предположим, что кодировка любой строки будет UTF-8.

А ведь тип по умолчанию Double.
ВОПРОС: Что будет, если в строке прописать вещественное большое число, например, число 1234.56?
ОТВЕТ: Число округлится в меньшую сторону и возьмётся остаток от деления на число 256.
  Полученный результат будет использован в качестве значения элемента строки (в качестве символа).

0

8

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

И у меня возникла шальная мысль:
А не реализовать ли вещественный индекс массива?
Чтобы убить сразу не только двух зайцев,
а их бесконечное (ограниченное размером программы) множество :)

Тогда сразу ВОПРОС: как в качестве индекса задавать иррациональное или трансцендентное число (корень числа, число Пи)?
И как задавать число, бесконечное в записи в десятичной системе счисления,
но которое можно записать точно в виде дроби (1/3)?

0

9

Введём круглые скобки для заполнения массива.

Код:
массив[1] = 1
массив[2] = 2
массив[3] = 3
показать массив

Вывод:

Код:
массив = (1, 2, 3)

Тогда создадим процедуру показать_строка

Код:
массив[1] = 49
массив[2] = 50
массив[3] = 51
показать_строка массив

Вывод:

Код:
массив = 123

А тогда что отобразит код?:

Код:
массив = (1, 2, 3)
показать_строка массив

Что-то типа:

Код:
массив = $31 $32 $33

0

10

Лис написал(а):

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

ВОПРОС: Как обрезать строку?
ОТВЕТ: В следующем элементе после последнего элемента нужной строки
у значения нужно задать отрицательный знак.
Таким образом, само значение символа сохранится.
И в случае надобности значение может быть восстановлено
всего лишь путём присвоения положительного знака.

Пытливые умы спросят:
"Как же ж задать отрицательный знак у нуля?"
Для этого можно использовать любое вещественное число, чуть большее нуля,
например, для простоты число 0.1.

Так же можно задать новую команду удалить:

Код:
удалить( массив[2] )

По этой команде из памяти интерпретатора удаляется заданный элемент массива.

Так же командой удалить можно удалить любую обычную переменную,
ведь обычная переменная - нулевой элемент массива.
Поэтому обратиться к значению переменной "переменная"
можно и так: "переменная[0]".

0

11

NuShaman написал(а):

обычная переменная - нулевой элемент массива

Ну я тоже предлагал все символы считать строками.

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

Отредактировано Лис (2021-11-30 08:15:02)

0

12

Лис написал(а):

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

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

Лис написал(а):

нуль-терминированные строки

что это? динамический массив с признаком (символом) конца?
длина вычисляется в рантайме.

Лис написал(а):

Мы видим, что
людей, изучающих программирование и
желающих сделать свой язык довольно много
(складывается впечатление, что
практически каждый студент американских ВУЗов
разрабатывает по языку).
Это значит, что дело не в личном времени NuShaman,
а в общем уровне доступности и проработанности информации
по вопросу реализации/написания системы типов
на русском языке.

Я, как специалист-работник,
работающий на российскую компанию,
живущий в России,
закончивший российский ВУЗ,
предполагаю, что дело конечно же не в личном времени,
и даже не в проработанности информации,
и уж тем более не в общем уровне доступности,
а дело - в желании (или в нежелании) каждого конкретного человека
думать об этом.

0