OberonCore https://forum.oberoncore.ru/ |
|
Строки https://forum.oberoncore.ru/viewtopic.php?f=29&t=1490 |
Страница 1 из 1 |
Автор: | Александр Шостак [ Четверг, 23 Апрель, 2009 21:00 ] |
Заголовок сообщения: | Строки |
Приветствую всех. Я являюсь большим поклонником строгих языков программирования вроде Паскаля, Оберона и т.д. Теоритически, на данный момент для меня Компонентный Паскаль является идеальным языком в том, что касается простоты и надёжности. С системой BlackBox ознакомился. Первое, что вызвало резкое недоумение - это всестороннее использования юникод-строк. В то время как определённый софт может быть расчитан на китайские кодировки, большинству практических приложений нужна нормальная работа с обычными байтовыми ascii-строками. В Блэкбоксе же все модули работают только с WideString. Далее. В Делфи есть чудеснейший, простой и надёжный тип данных, всю рутину по управлению за которыми берёт на себя компилятор - String. В Blackbox мы наблюдаем деградацию к СИ-варианту ограниченных строк (ARRAY OF X CHARS), либо ручному управлению их размерами. Наконец, снова эти ненадёжные #0. Паскаль строки интуитивны, не требуют ручной мутной работы по изменению размеров, могут содержать бинарные данные и функционал RTL не имеет в коде проверок в цикле вроде s[i] # 0X, которые я нашёл в модулях Блэкбокса. А как же присвоение одной строки другой? В Делфи копирования данных не происходит, а лишь изменяется счётчик ссылок. Я подумал, что стоит, наверное, написать свой класс строк, но есть она проблема. А вернее, их несколько. Во-первых, ARRAY OF CHAR и ARRAY OF SHORTCHAR органически друг друга не любят. Во-вторых, все операции должны будут идти не интуитивно (:=, +), а через вызовы функций. В-третих, из-за первого пункта нужно будет постоянно переводить строку из unicode в win-1251 и обратно. Интересует другое. Почему нельзя было сделать CHAR вариативным по размеру. Тогда код бы был один, а каждый бы юзал то, что ему необходимо (ребилд модулей - и всё основано на ascii). С уважением, Berserker. |
Автор: | Александр Шостак [ Четверг, 23 Апрель, 2009 21:19 ] |
Заголовок сообщения: | Re: Строки |
Цитата: s:=s$+ss$; Как я понимаю, данное выражение приведёт к полному сканированию обоих строк на $0 (даже если #0 - нормальная часть строки, при этом сперва обе строки приведутся к unicode), после чего произойдёт попытка уместить найденные подстроки в едином буфере S. Имхо, слишком ресурсоёмкие операции, особенно для больших буферов. Да, сообщение о языке, конечно, очень краткое, но там и большинство вещей не описаны. Технические детали передачи параметров процедурам, такие моменты, как работа со строками разных типов. А вот на SHORT внимание не обратил. Пробовал просто передать один тип в процедуру, предназначенную для другого. Если я правильно понимаю, "SHORT" приведёт к вызову UnicodeToWindows1251 из National? Или байты как-то банально обрежутся? Спасибо за ответ. |
Автор: | Пётр Кушнир [ Четверг, 23 Апрель, 2009 21:25 ] |
Заголовок сообщения: | Re: Строки |
Извините, я удалил сообщение, подумал, что говорю банальные вещи. |
Автор: | Александр Шостак [ Четверг, 23 Апрель, 2009 21:31 ] |
Заголовок сообщения: | Re: Строки |
Да нет, что Вы, SHORT - это то, что я упустил. Только в хэлпе написано: "projection", что стоит понимать как отсутствие перекодировки строк, а некая машинная обрезка что-ли (например, останутся только #0..#127). В общем, я сперва проверю всё. |
Автор: | Иван Кузьмицкий [ Четверг, 23 Апрель, 2009 21:34 ] |
Заголовок сообщения: | Re: Строки |
Хотелось бы уточнить - строк как таковых нет. Есть массивы, иногда интерпретируемые как цепочки литер (если есть $). Вопрос - а зачем надо постоянно преобразовывать из юникода в win1251 и обратно? Ведь "космические корабли уже давно бороздят просторы вселенной" ((с) Операция "Ы") ![]() |
Автор: | Евгений Темиргалеев [ Четверг, 23 Апрель, 2009 23:27 ] |
Заголовок сообщения: | Re: Строки |
Berserker писал(а): Первое, что вызвало резкое недоумение - это всестороннее использования юникод-строк. В то время как определённый софт может быть расчитан на китайские кодировки, большинству практических приложений нужна нормальная работа с обычными байтовыми ascii-строками. В Блэкбоксе же все модули работают только с WideString. Далее. Дык чем отличается использование SHORTCHAR строк от CHAR, в которых старший байт кода будет 0? Удвоенным размером строк. Так щас памяти хватает. Зато без всякой перекомпиляции, в этих строках можно и уникод при необходимости сохранить.Использование SHORTCHAR (как и SHORTINT, BYTE и SHORTREAL) обосновано только оптимизацией по объёму памяти. (Кажется про это где-то в документации сказано, но могу ошибаться.) Такая оптимизация для большинства приложений для персоналок не нужна. Зачем тогда усложнять? Цитата: В Делфи есть чудеснейший, простой и надёжный тип данных, всю рутину по управлению за которыми берёт на себя компилятор - String....А как же присвоение одной строки другой? В Делфи копирования данных не происходит, а лишь изменяется счётчик ссылок. В Делфи есть ещё и Variant и ещё много чего... Работу с этими типами выполняют библиотечные функции, которые неявно вызываются компилятором. В ББ всё проще. Компилятор поддерживает оперирование с простейшими типами. Всё остальное в явном виде делается как библиотеки. Разницы в маш. коде нет. Если Вы желаете сделать библиотеку для динамических строк по аналогии с Делфи, это всегда можно сделать.Я думаю, для Вас будет интересно почитать обсуждение по строкам: viewtopic.php?f=27&t=1151. В этой же теме, начиная с viewtopic.php?p=22775#p22775 идёт обсуждение аналогичной библиотеки, разрабатываемой Александром Ильином. Последнее (на данный момент) собщение: viewtopic.php?p=23103#p23103 Александр Ильин писал(а): Чем дальше занимаюсь строками, тем больше понимаю, что подсистема Text (BlackBox) и модуль Texts (Oberon System) - это и есть те самые библиотеки для работы с динамическими строками. Что-то более простое реализовать сложно....
|
Автор: | Пётр Кушнир [ Четверг, 23 Апрель, 2009 23:58 ] |
Заголовок сообщения: | Re: Строки |
Евгений Темиргалеев писал(а): Работу с этими типами выполняют библиотечные функции, которые неявно вызываются компилятором. Не совсем в тему, а есть ли возможность развить компилятор ББ с целью заиметь возможность создания таких расширений самостоятельно? Ну типа, плагин к компилятору, реализует всё, что необходимо, чтобы описать псевдомодуль. Например STRINGS, или MATRIX.
|
Автор: | Евгений Темиргалеев [ Пятница, 24 Апрель, 2009 00:25 ] |
Заголовок сообщения: | Re: Строки |
Добавление возможности ставить плагины? Это вопрос спорный. Надо сильно пересматривать структуру компилятора и много переделывать. Что не просто и чревато последствиями... Например, открытость кода - написал плагин и без него уже никто не скомпилит; а все ли захотят приделывать к своему компилятору чей-то плагин? Общий механизм введения таких типов - суть неоднократно обсуждамые "перегрузки операций". Которые убирают необходимость делать плагин. Но опять изменения и языка и компилятора... Итого, у нас есть самый простой способ: - сделать библиотеку. Супротив возможных: - сделать библиотеку+плагин для компилятора - сделать библиотеку и переопределить операции. И вопрос... оно нам надо? Если не ошибаюсь, и от приверженцев перегрузок было слышен общеизвестный лозунг "не трогай то, что работает". P.S. Исходники к-ра открыты и желающие что-либо добавить всегда могут попробовать это сделать... |
Автор: | Александр Шостак [ Пятница, 24 Апрель, 2009 01:08 ] |
Заголовок сообщения: | Re: Строки |
Спасибо, тему прочитал. Значит, вопрос уже подымался. Я, в отличие от Александра Ильина, всё же думаю использовать не константный piece, а pointer to array of shortchars. Да, Делфийские строки действительно близки к идеалу. Совместимы, с pchar, неограниченная длина, любые операции, любые байты, быстрый доступ к размеру. Имхо, это тот базовый тип, который должен быть "вживлён" в компилятор. Проблема модулей в том, что каждый из них юзает свои типы, не совместимые с другими: TYPE MyString = ARRAY 666 OF CHAR; ...Либо сложные объекты для поддержки того же rich text. Это уже проблема. Не понятно, зачем строки разных типов не совместимы друг с другом. Ладно, integer - скорость и высоту путать нельзя, но строка - это текст, и текст с текстом использовать можно. Цитата: Дык чем отличается использование SHORTCHAR строк от CHAR, в которых старший байт кода будет 0? Как мне передать short-строку в процедуру, что расчитана на wide-строку? Создать новую строку, записать старые символы через один (чтобы чередовались с нулём)? Так это не перевод той же кирилицы в юникод. Скорее всего проверки if s[i]='Я' уже работать не будет после такого приведения. Вот и говорю, что нужно постоянно вызывать UnicodeToWin1251 и обратную. Да, есть ли функция, обратная SHORT? Возможно, я чего-то ещё не понял в устройстве Blackbox, так что не пинайте сильно ногами, если что ![]() По идее выход должен быть следующим: S: TString; // Универсальный тип строка S.isWide: BOOLEAN; // Является строка юникодовой, или ascii S.toWide; // Преобразовывает строку в юникод. Если уже в юникоде, то возвращает данные, иначе выполняет ConvertWin1251ToUnicode S.toAscii; // Обратная операция. Если была юникодовая, то ConvertUnicodeToWind1251 S.Get: ARRAY OF SHORTCHAR; // Возвращает указатель на данные (POINTER TO ARRAY OF SHORTCHAR), при этом сперва вызывается toAscii S.GetW: ARRAY OF CHAR; // Тоже самое, но с юникод вариантом S.Set (NewValue: ARRAY OF SHORTCHAR); // Установка нового константного значения S.SetW (NewValue: ARRAY OF CHAR); // Тоже, но юникод S.Len: INTEGER; // Возвращает полную длину строки, исключая финальный #0 S.Assign(Destination, Source: TString); // Присваиваем значение одной строки другой. При этом они сперва приводятся к внутреннему типу первой. Глянул, наверное используя только легальные средства, сделать не выйдет. Но это не смертельно. Если модуль будет небольшим и проверенным, то е грех и Kernel/System заюзать. |
Автор: | Иван Горячев [ Пятница, 24 Апрель, 2009 01:39 ] |
Заголовок сообщения: | Re: Строки |
Berserker, а почему у Вас везде упоминается кодировка Win1251? Универсальная библиотека должна быть универсальной - ББ не только в России используется и не только под Windows (местами) бывает ![]() Функция, обратная SHORT - LONG ![]() |
Автор: | Александр Шостак [ Пятница, 24 Апрель, 2009 02:24 ] |
Заголовок сообщения: | Re: Строки |
Цитата: Berserker, а почему у Вас везде упоминается кодировка Win1251? Универсальная библиотека должна быть универсальной - ББ не только в России используется и не только под Windows (местами) бывает Для большинства случаев подойдёт, а если идеально, то конечно, реализацию функций unicode<>обратно нужно возлагать на сторонний модуль. Как там у вас правильно: абстрактный класс и модуль класса Host (или National). |
Автор: | Vlad [ Пятница, 24 Апрель, 2009 06:03 ] |
Заголовок сообщения: | Re: Строки |
Евгений Темиргалеев писал(а): Зато без всякой перекомпиляции, в этих строках можно и уникод при необходимости сохранить. Справедливости ради замечу, что в обычных байтовых строках юникод тоже можно хранить. Разница будет только в кодировке - UTF16 vs UTF8. UTF16 имеет больше смысла только потому, что именно эта кодировка используется в винде для представления юникода, поэтому использование UTF16 строк в BB избавляет от перекодирования при использовании виндовых функций. А вот, во всяких линуксах, насколько я знаю, предпочтение отдается UTF8, так что там будет проблема как раз с UTF16-строками. |
Автор: | Vlad [ Пятница, 24 Апрель, 2009 06:04 ] |
Заголовок сообщения: | Re: Строки |
Vlad писал(а): Евгений Темиргалеев писал(а): Зато без всякой перекомпиляции, в этих строках можно и уникод при необходимости сохранить. Справедливости ради замечу, что в обычных байтовых строках юникод тоже можно хранить. Разница будет только в кодировке - UTF16 vs UTF8. UTF16 имеет больше смысла только потому, что именно эта кодировка используется в винде для представления юникода, поэтому использование UTF16 строк в BB избавляет от перекодирования при использовании виндовых функций. А вот, во всяких линуксах, насколько я знаю, предпочтение отдается UTF8, так что там будет проблема как раз с UTF16-строками. P.S. А, например, на Маке - UTF32 ![]() |
Автор: | igor [ Пятница, 24 Апрель, 2009 06:07 ] |
Заголовок сообщения: | Re: Строки |
Berserker писал(а): Как там у вас правильно: абстрактный класс и модуль класса Host (или National). "Простите, не "у вас", а "у нас" " (С) Операция Ы ![]() ![]() Berserker писал(а): Я являюсь большим поклонником строгих языков программирования вроде Паскаля, Оберона и т.д. Теоритически, на данный момент для меня Компонентный Паскаль является идеальным языком в том, что касается простоты и надёжности.
|
Автор: | Александр Шостак [ Пятница, 24 Апрель, 2009 06:58 ] |
Заголовок сообщения: | Re: Строки |
Только я поклонник, а ещё не активный пользователь Оберон-систем. Так что пока лишь вливаюсь ![]() P.S Пишу в основном на Паскале (Virtual Pascal, Delphi), PHP и JavaScript. |
Автор: | Иван Горячев [ Пятница, 24 Апрель, 2009 09:01 ] |
Заголовок сообщения: | Re: Строки |
Berserker писал(а): Для большинства случаев подойдёт, а если идеально, то конечно, реализацию функций unicode<>обратно нужно возлагать на сторонний модуль. Как там у вас правильно: абстрактный класс и модуль класса Host (или National). Тут на сайте есть раздел "Полигон", там лежит ББ Community. В этом "чуде" должна быть подсистема Unicode. Посмотрите, вдруг пригодится |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |