Delphi и ObjFPC такие разные

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Re: Delphi и ObjFPC такие разные

Сообщение скалогрыз » 02.11.2014 23:13:30

stanilar писал(а):Именно поэтому мне не нравятся нововведения эмбаркадеры, включая поддержку юникода.

WideString-и появились ещё при борланде
pda писал(а):Язык без уникода сейчас задаром никому не нужен.

php?
pda писал(а):
stanilar писал(а):Лучше бы делали совместимость FPC с стандартным си, чтобы типа можно было компилировать fpc исходники сишным компилятором.

Даже боюсь спросить - как вы это видите...

примерно так?
хотя очевидно, что gnu pascal загнулся... хотя FPC предлагает синтаксическую совместимость с ним.
hinst писал(а):да я бы сказал что не только будущее безрадостное, но и настоящее безрадостное

да ну! =) ref-counting же прикрутили!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Delphi и ObjFPC такие разные

Сообщение pda » 02.11.2014 23:34:05

скалогрыз писал(а):WideString-и появились ещё при борланде

А толку? Если стандартная VCL такие строки не поддерживала.

скалогрыз писал(а):php?

Представьте себе я пишу и на нём и знаю, зачем они пытались выпустить php6 с таким же финтом ушами. К счастью для php, там нет стандартного фреймворка и народ потихоньку решил насущную проблему своими силами. Хотя свежи воспоминания от разворачивания на американском хостинге, где народ пощёлкав клювом спросил "а что такое mbstring"?

скалогрыз писал(а):примерно так?

gpc был написан на C, по этому им и собирался. Или вы имели ввиду, что fpc должен был на выходе давать исходник на C, чтобы потом gcc собирать его?
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Delphi и ObjFPC такие разные

Сообщение Mikhail » 03.11.2014 00:17:27

Кто-нибудь вообще может объяснить зачем вообще нужен UTF-16? UTF-8 лучше подходит и с ним меньше проблем, ИМХО.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Delphi и ObjFPC такие разные

Сообщение kazalex » 03.11.2014 01:00:49

UTF-16 это хороший компромисс между действительно удобной в использовании, но весьма затратной в хранении UTF-32 и удобной в обмене данными UTF-8. UTF-16 лучше чем UTF-8, когда требуется посимвольная работа со строкой т.к. весь диапазон BMP (0 .. 65535, а это, в общем-то, все имеющиеся сегодня языки) покрывается UTF-16 без использования суррогатных пар. UTF-8 покрывает только ASCII, все остальное требует кодирования. При этом, для проверки корректности суррогатной пары UTF-16 требуется два сравнения диапазонов, а для проверки корректности последовательностей UTF-8 таких проверок будет 26. Поэтому UTF-16 очень правильный выбор для внутреннего представления юникода, а UTF-8 очень правильный выбор для его представления при обмене данными.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: Delphi и ObjFPC такие разные

Сообщение pda » 03.11.2014 01:30:07

Mikhail писал(а):Кто-нибудь вообще может объяснить зачем вообще нужен UTF-16? UTF-8 лучше подходит и с ним меньше проблем, ИМХО.


UTF-8 хорошо подходит для фиксированных строк. Ну или для строк, которые надо только складывать. А вот если нужен простой и быстрый способ доступа к произвольному символу, то тут уже желателен UTF-16, потому что в нём символы "фиксированной" длины, в отличие от UTF-8, где длина символа может изменяться от 1 до 4 байт (в пределе до шести, но стандарт такие сейчас запрещает).

Это если коротко. Если длинно, то надо смотреть историю уникода. Изначально UTF-8 не было, когда решили объеденить все символы в одну таблицу, просто выбрали символ, длиной в 2 байта (65536 символов хватит всем). И первоначально разбазаривали их настолько, что во второй версии стандарта там был даже клинконский... Затем во время разработки операционной симтемы Plan9 был придуман UTF-8, который имел важное преимущество - вся латиница автоматически оказывалась уникодом. Кроме того, стандарт пришёлся ко двору в unix, где не пришлось переделывать файловые системы, т.к. имя файла в них было просто потоком байт. И для поддержки файлов на языках, отличных от английского, при монтировании приходилось указывать кодовую страницу. Эта проблема и сейчас осталась на флешках с FAT. Правда теперь пропали строгие пределы длины имени файла, если раньше они были 255 символов, то теперь - 255 байт. А уж сколько символов влезет - как повезёт.

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

Итак нормализация. Что это такое? А это вот что. Представье себе европейские символы, проде буквы "ё", только их там больше и они не являются неотъемлимой частью буквы, а могут то быть, то не быть. Это называется диактрические знаки. Есть они даже в англйском, хотя многие не подозревают об этом. Например, слово "сотрудничество" правильно писать "coöperation", чтобы показать, что двойное "o" не читается, как "у". (Правда сами англичане об этом знают и по этому на практике никогда не пишут. :))

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

Пришлось допиливать стандарт и проводить разъяснительную работу. Во первых, было введено понятие "кодовая точка" (code point). Смысл такой - кодовая точка - это или символ или диактрика, которая меняет предыдущий символ или ещё какая-нибудь служебная последовательность. А сам символ состоит из одной или более кодовых точек. Причём, не важно, UTF-8 у вас или UCS2. Как вы можете догадаться, это слегка неудобно. Кроме того, если начать кодировать символы как угодно, то начнётся полная анархия. Строки, которые состоят из одинаковых символов перестанут быть равны друг другу. Так пришли к идее нормализации. Их целых 4 вида, но наиболее популярная NFC - все символы хранятся в максимально компактном виде. И в 99% случаев мы имеем "кодовая точка" = символ.

Незадолго до этого популяризировалась Java, привнеся внутреннюю реализацию строк на UTF-16, что занимало больше памяти, но позволяло быстро обращаться к символу по его номеру.

Однако, на этом история не кончилась. Оказалось, что для некоторых менее распространённых языков, с учётом новой системы двух байт уже нехватает и полную кодовую точку пришлось расширять до 4 байт, выведя UCS4. А UCS2 заменили на UTF-16, который почти такой же, но для определённого диапазона полная кодовая точка занимает уже два UTF-16 блока, т.е. 4 байта. Это окончательно поставило крест на идее обращения к символу по номеру, как к элементу массива, но тем не менее переход на UCS4 так и не произошёл, т.к. когда это всё происходило, память ещё не ставили гигабайтами и всех задушила жаба. А теперь уже так сложилось, как сложилось.

Однако, тем не менее, у UTF-16 есть небольшое преимущество. Итерация по символам реализуется проще, чем в UTF-8, т.к. каждое слово (2 байта) надо всего лишь проверить на вхождение в заданный диапазон. Есть так же и выигрыш в памяти, по сравнению с UTF-8. Но только для мультиязычных текстов. Так например, кириллица в UTF-8 занимает обычно 3 байта на символ, так что храня текст в UTF-16 вы немного выиграете в памяти.

Резюмируя: UTF-16 существует по историческим причинам, как компромис по потреблению памяти и скорости обработки, как правило несущественный в наши дни.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Delphi и ObjFPC такие разные

Сообщение bormant » 03.11.2014 01:42:29

Так например, кириллица в UTF-8 занимает обычно 3 байта на символ
это какая же?
Если правильно путаю, весь диапазон U+0400..U+04FF отлично кодируется 2 байтами.
http://utf8-chartable.de/unicode-utf8-t ... start=1024
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Delphi и ObjFPC такие разные

Сообщение скалогрыз » 03.11.2014 06:37:47

pda писал(а):А толку? Если стандартная VCL такие строки не поддерживала.
...
Представьте себе я пишу и на нём и знаю, зачем они пытались выпустить php6 с таким же финтом ушами. К счастью для php, там нет стандартного фреймворка и народ потихоньку решил насущную проблему своими силами.

В том то всё и дело, что проблема решалась точно так же в VCL во времена Delphi 5, 6 и 7 - народ решил проблему своими силами.
Ибо unicode WinAPI доступен был и открыт. Используя ООП можно было легко переопределить метод создания окна и создавать unicode-ные окна.
Более правильным решением были unicode компоненты (те же кнопки, таблицы, мемы. диалоги и т.п) , и такие библиотеки были созданы. Так что у знающих людей unicode уже работал тогда вполне успешно (и на win NT и 9х).

pda писал(а):gpc был написан на C, по этому им и собирался. Или вы имели ввиду, что fpc должен был на выходе давать исходник на C, чтобы потом gcc собирать его?

я имею в виду, что gnu pascal, являясь front-endom для GCC, поидее позволяет собирать проекты состоящие из языков C и паскаль одновременно.
хотя как сильно придётся танцевать с бубном я не знаю. Но точно знаю, что этого не стоит делать, т.к. библиотек поддерживающих gnu-pascal скорей всего нет.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Delphi и ObjFPC такие разные

Сообщение Mikhail » 03.11.2014 10:50:50

kazalex писал(а):UTF-16 лучше чем UTF-8, когда требуется посимвольная работа со строкой т.к. весь диапазон BMP (0 .. 65535, а это, в общем-то, все имеющиеся сегодня языки) покрывается UTF-16 без использования суррогатных пар.

Почему? Ведь UTF-16 не предполагает фиксированный размер символа.

kazalex писал(а): При этом, для проверки корректности суррогатной пары UTF-16 требуется два сравнения диапазонов, а для проверки корректности последовательностей UTF-8 таких проверок будет 26.

Откуда там 26 проверок, где? :shock:

PS единственное преимущество, на мой взгляд, это более быстрая работа за счет большего размера символа и, как следствие, меньшего количества условных переходов, во время обработки строки. С точки зрения API между UTF-8 и UTF-16 разницы нет.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Delphi и ObjFPC такие разные

Сообщение kazalex » 03.11.2014 16:21:51

Mikhail писал(а):Почему? Ведь UTF-16 не предполагает фиксированный размер символа.

Фиксированным размером в UTF-16 покрыт весь BMP. Этого более чем достаточно, если вам не требуется работать с мертвыми или крайне редко используемыми языками. А детект суррогата просто одна проверка диапазона.

Mikhail писал(а):Откуда там 26 проверок, где?

Там восемь проверок на маркерные символы и для каждого маркера от одного до трех символов последовательности. В целом набегает 26 проверок. По этой ссылке есть Table 3-7. Well-Formed UTF-8 Byte Sequences, где маркеры и последовательности указаны.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: Delphi и ObjFPC такие разные

Сообщение Sergei I. Gorelkin » 03.11.2014 16:41:10

Корректный utf-8 декодер может быть реализован и без проверок вообще: http://bjoern.hoehrmann.de/utf-8/decoder/dfa/
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Delphi и ObjFPC такие разные

Сообщение pda » 03.11.2014 17:32:38

bormant писал(а):Если правильно путаю

Да, вы правы. Это я ошибался.

скалогрыз писал(а):и такие библиотеки были созданы

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

скалогрыз писал(а):хотя как сильно придётся танцевать с бубном я не знаю

Да не особо. Он делает obj, которые потом линкуются с любыми другими obj на чём угодно. Fpc создаёт совместимые obj и может линковать gcc'шные. Вот статья на тему.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Delphi и ObjFPC такие разные

Сообщение kazalex » 03.11.2014 18:03:37

Sergei I. Gorelkin писал(а):Корректный utf-8 декодер может быть реализован и без проверок вообще

Согласно стандарту и RFC не может. Чем чревато отсутствие проверок можно прочитать в том-же RFC, впрочем автор и сам об этом говорит:
It is sometimes desireable to recover from errors when decoding strings that are supposed to be UTF-8 encoded. [b]Programmers should be aware that this can negatively affect the security properties of their application.[b]
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: Delphi и ObjFPC такие разные

Сообщение Mikhail » 03.11.2014 18:08:35

kazalex писал(а):Фиксированным размером в UTF-16 покрыт весь BMP. Этого более чем достаточно, если вам не требуется работать с мертвыми или крайне редко используемыми языками. А детект суррогата просто одна проверка диапазона.


Это не важно, обработку все-равно нужно вести последовательно. Следовательно никаких
Код: Выделить всё
s[i]:='S'

kazalex писал(а):Там восемь проверок на маркерные символы и для каждого маркера от одного до трех символов последовательности. В целом набегает 26 проверок. По этой ссылке есть Table 3-7. Well-Formed UTF-8 Byte Sequences, где маркеры и последовательности указаны.


Не увидел там 26 проверок. 8 получается, в худшем случае.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Delphi и ObjFPC такие разные

Сообщение kazalex » 03.11.2014 18:14:58

Mikhail писал(а):Следовательно никаких s[i]:='S'


s[Pos('с', s)] := 'С';

Mikhail писал(а):Не увидел там 26 проверок. 8 получается, в худшем случае.

Восемь проверок только для маркеров, т.е. только для того, чтобы определить начало байтовой последовательности. А потом еще каждый байт последовательности нужно проверить на корректность.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: Delphi и ObjFPC такие разные

Сообщение Mikhail » 03.11.2014 18:23:18

kazalex писал(а):s[Pos('с', s)] := 'С';


А Pos как работает догадываетесь? :D Уж лучше последовательная обработка сразу.

kazalex писал(а):Восемь проверок только для маркеров, т.е. только для того, чтобы определить начало байтовой последовательности. А потом еще каждый байт последовательности нужно проверить на корректность.

Гм
(1 байт) 0aaa aaaa
(2 байта) 110x xxxx 10xx xxxx
(3 байта) 1110 xxxx 10xx xxxx 10xx xxxx
(4 байта) 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx

Я вижу всего 8.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Пред.След.

Вернуться в Потрепаться

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

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

Рейтинг@Mail.ru