OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 25 Апрель, 2024 17:31

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Строки
СообщениеДобавлено: Четверг, 23 Апрель, 2009 21:00 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Приветствую всех.
Я являюсь большим поклонником строгих языков программирования вроде Паскаля, Оберона и т.д. Теоритически, на данный момент для меня Компонентный Паскаль является идеальным языком в том, что касается простоты и надёжности.
С системой 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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Четверг, 23 Апрель, 2009 21:19 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Цитата:
s:=s$+ss$;

Как я понимаю, данное выражение приведёт к полному сканированию обоих строк на $0 (даже если #0 - нормальная часть строки, при этом сперва обе строки приведутся к unicode), после чего произойдёт попытка уместить найденные подстроки в едином буфере S. Имхо, слишком ресурсоёмкие операции, особенно для больших буферов.

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

А вот на SHORT внимание не обратил. Пробовал просто передать один тип в процедуру, предназначенную для другого. Если я правильно понимаю, "SHORT" приведёт к вызову UnicodeToWindows1251 из National? Или байты как-то банально обрежутся?

Спасибо за ответ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Четверг, 23 Апрель, 2009 21:25 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Извините, я удалил сообщение, подумал, что говорю банальные вещи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Четверг, 23 Апрель, 2009 21:31 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Да нет, что Вы, SHORT - это то, что я упустил. Только в хэлпе написано: "projection", что стоит понимать как отсутствие перекодировки строк, а некая машинная обрезка что-ли (например, останутся только #0..#127). В общем, я сперва проверю всё.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Четверг, 23 Апрель, 2009 21:34 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Хотелось бы уточнить - строк как таковых нет. Есть массивы, иногда интерпретируемые как цепочки литер (если есть $).
Вопрос - а зачем надо постоянно преобразовывать из юникода в win1251 и обратно? Ведь "космические корабли уже давно бороздят просторы вселенной" ((с) Операция "Ы") :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Четверг, 23 Апрель, 2009 23:27 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
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) - это и есть те самые библиотеки для работы с динамическими строками. Что-то более простое реализовать сложно....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Четверг, 23 Апрель, 2009 23:58 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Евгений Темиргалеев писал(а):
Работу с этими типами выполняют библиотечные функции, которые неявно вызываются компилятором.
Не совсем в тему, а есть ли возможность развить компилятор ББ с целью заиметь возможность создания таких расширений самостоятельно? Ну типа, плагин к компилятору, реализует всё, что необходимо, чтобы описать псевдомодуль. Например STRINGS, или MATRIX.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Пятница, 24 Апрель, 2009 00:25 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Добавление возможности ставить плагины? Это вопрос спорный. Надо сильно пересматривать структуру компилятора и много переделывать. Что не просто и чревато последствиями... Например, открытость кода - написал плагин и без него уже никто не скомпилит; а все ли захотят приделывать к своему компилятору чей-то плагин?

Общий механизм введения таких типов - суть неоднократно обсуждамые "перегрузки операций". Которые убирают необходимость делать плагин. Но опять изменения и языка и компилятора...

Итого, у нас есть самый простой способ:
- сделать библиотеку.
Супротив возможных:
- сделать библиотеку+плагин для компилятора
- сделать библиотеку и переопределить операции.
И вопрос... оно нам надо? Если не ошибаюсь, и от приверженцев перегрузок было слышен общеизвестный лозунг "не трогай то, что работает".

P.S. Исходники к-ра открыты и желающие что-либо добавить всегда могут попробовать это сделать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Пятница, 24 Апрель, 2009 01:08 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Спасибо, тему прочитал. Значит, вопрос уже подымался. Я, в отличие от Александра Ильина, всё же думаю использовать не константный 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 заюзать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Пятница, 24 Апрель, 2009 01:39 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Berserker, а почему у Вас везде упоминается кодировка Win1251? Универсальная библиотека должна быть универсальной - ББ не только в России используется и не только под Windows (местами) бывает ;)

Функция, обратная SHORT - LONG :) Но для корректного перевода в/из юникода одной функции мало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Пятница, 24 Апрель, 2009 02:24 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Цитата:
Berserker, а почему у Вас везде упоминается кодировка Win1251? Универсальная библиотека должна быть универсальной - ББ не только в России используется и не только под Windows (местами) бывает

Для большинства случаев подойдёт, а если идеально, то конечно, реализацию функций unicode<>обратно нужно возлагать на сторонний модуль. Как там у вас правильно: абстрактный класс и модуль класса Host (или National).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Пятница, 24 Апрель, 2009 06:03 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
Зато без всякой перекомпиляции, в этих строках можно и уникод при необходимости сохранить.


Справедливости ради замечу, что в обычных байтовых строках юникод тоже можно хранить. Разница будет только в кодировке - UTF16 vs UTF8. UTF16 имеет больше смысла только потому, что именно эта кодировка используется в винде для представления юникода, поэтому использование UTF16 строк в BB избавляет от перекодирования при использовании виндовых функций. А вот, во всяких линуксах, насколько я знаю, предпочтение отдается UTF8, так что там будет проблема как раз с UTF16-строками.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Пятница, 24 Апрель, 2009 06:04 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Vlad писал(а):
Евгений Темиргалеев писал(а):
Зато без всякой перекомпиляции, в этих строках можно и уникод при необходимости сохранить.


Справедливости ради замечу, что в обычных байтовых строках юникод тоже можно хранить. Разница будет только в кодировке - UTF16 vs UTF8. UTF16 имеет больше смысла только потому, что именно эта кодировка используется в винде для представления юникода, поэтому использование UTF16 строк в BB избавляет от перекодирования при использовании виндовых функций. А вот, во всяких линуксах, насколько я знаю, предпочтение отдается UTF8, так что там будет проблема как раз с UTF16-строками.


P.S. А, например, на Маке - UTF32 ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Пятница, 24 Апрель, 2009 06:07 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Berserker писал(а):
Как там у вас правильно: абстрактный класс и модуль класса Host (или National).
"Простите, не "у вас", а "у нас" " (С) Операция Ы :) :wink:
Berserker писал(а):
Я являюсь большим поклонником строгих языков программирования вроде Паскаля, Оберона и т.д. Теоритически, на данный момент для меня Компонентный Паскаль является идеальным языком в том, что касается простоты и надёжности.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Пятница, 24 Апрель, 2009 06:58 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Только я поклонник, а ещё не активный пользователь Оберон-систем. Так что пока лишь вливаюсь :)
P.S Пишу в основном на Паскале (Virtual Pascal, Delphi), PHP и JavaScript.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки
СообщениеДобавлено: Пятница, 24 Апрель, 2009 09:01 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Berserker писал(а):
Для большинства случаев подойдёт, а если идеально, то конечно, реализацию функций unicode<>обратно нужно возлагать на сторонний модуль. Как там у вас правильно: абстрактный класс и модуль класса Host (или National).


Тут на сайте есть раздел "Полигон", там лежит ББ Community. В этом "чуде" должна быть подсистема Unicode. Посмотрите, вдруг пригодится


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB