OSDev

для всех
Текущее время: 17 окт 2019, 13:15

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




Начать новую тему Ответить на тему  [ Сообщений: 285 ]  На страницу Пред.  1 ... 10, 11, 12, 13, 14, 15, 16 ... 29  След.
Автор Сообщение
СообщениеДобавлено: 19 дек 2014, 15:40 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1389
UTF16 и UTF32 -- тоже стандарт. Как и ASCII. UTF8 не шибко удобен для обработки строк из-за переменной длины символа; обработка UTF32 (или, при гарантии отсутствия суррогатных пар, UTF16) будет идти быстрей. Так что полностью исключать эти стандарты кодировки я б не стал.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 дек 2014, 15:57 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 963
Откуда: Дагоба
Так UTF-16 и UTF-32 автоматически входят в той концепции, которую я описал - отказ от символьного типа и инициализация строками массивов целых чисел.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 дек 2014, 16:35 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
SII писал(а):
В Дельфях не всё хорошо со строками

Не всё хорошо только одно -- их много! Остальное зависит от умения ими пользоваться.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 дек 2014, 19:53 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1389
Freeman писал(а):
Не всё хорошо только одно -- их много! Остальное зависит от умения ими пользоваться.


Не только. Например, в одних типах строк индексация идёт по байтам, а в других -- по символам. Сие вполне может породить проблемы на пустом месте. Поскольку это именно строки, то надо было бы сделать так, чтоб индексация всегда шла только по символам (а уж программист должен выбрать наиболее адекватный его задаче тип строк; например, если доступ к отдельным символам ему практически не нужен, то можно использовать и UTF8, но вот если он постоянно обращается по индексам, то этот тип будет неэффективен и надо брать UTF32, ну и т.д.).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 дек 2014, 21:06 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1113
Цитата:
Этот тип (пусть будет bool) – результат выполнения логических операций. Переменная такого типа может принимать значения true и false. Нельзя неявно приводить логическое значение к числовому. Нельзя числовое значение воспринимать как условие. Таким образом, штуковины вроде

Правильно почти как в паскале. В целом не напрягает приводить надо было менее 1% булевых типов.
Проблема тоьков в приведение к byte.

Цитата:
Видели когда-нибудь в старых программах проверки вида If ( ( 0>1 ) == 0 ) ? Были времена, когда такие проверки нужно было делать, чтобы знать, что думает компилятор по поводу совмещения логического и целого типов. Подобный код можно обнаружить (если я правильно помню) в исходниках Word для первых версий Windows (они были недавно открыты).

Думаю опечатка тут сдвиг 0>>1

Цитата:
Должен быть тип указателя с общими принципами как в C++, однако данный тип НЕ может быть неявно преобразован ни в число, ни в логическое значение. Нулевой указатель – это не тот же ноль, который «ноль» в числовом смысле. Это что-то типа nullptr. Отдельная константа (или объект, как хотите), означающая «нулевой указатель». Нулевой указатель может быть приведён к указателю любого типа (или наоборот).

Много где это называется nil (php,sql,pascal, JS)


Цитата:
Нужны ли «умные» указатели? Нет, на самом деле они не нужны, однако «умность», основанная, например, на подсчёте ссылок, может вполне быть частью отладочного механизма, который можно подключать или отключать. То есть умные указатели для сбора мусора точно не нужны, но для определения ошибок утечки памяти могут сгодиться.

Считаю нужны. Памяти вам чтоли жалко? Умные указатели нужны для потокобезопасных приложений при реализации многопоточных программ. Мы сможем контроллировать указатели. А не писать фабрики и фермы для рождения указателей разных классов.


Цитата:
Указатель ЯВУ, как мне кажется, должен быть похож скорее на итератор в C++. Операции прибавления или отнимания единицы – это не прибавить или вычесть число, равное размеру типа. Это переход на следующую или предыдущую запись в массиве. В общем случае, такая операция даже не обязана иметь сложность O(1).

Тогда это не указатель, а хэндел как в Java.
Но я бы оставил как в Си. Уж больно там удобная арифметика указателей.
А то в Delphi не очень и приходиться писать явно
Inc(PByte(AnyPointer),y*LineLen+x); // по байтам
Inc(PStrucure,y*LineLen+x); // по размеру TStrucure

Цитата:
Преобразовать указатель в число и обратно можно только изобразив рядом на столе пентаграмму и установив при этом 5 свечей по углам полученной звезды. И только в полночь при полной луне.

Так вот как эта скобка называется в ГОСТе а я и незнал. А символ Кронвеля при этом в пентогреме надо рисовать? :D


Цитата:
Это встроенный тип, а не костыль. Полноценный тип с операциями конкатенации и сопутствующими. Числовые типы могут быть явно или неявно приводиться в строковый. Неявно – когда всё ясно, а явно – это когда, например, число дробное и нужно указать точность отображения, программист явно указывает формат перевода. Должны быть операции перевода строки в число (это часто требуется при считывании данных из файла или из командной строки).

Это ужас! Только явное приведение. Не надо повторять ошибки PhP.

Цитата:
Должны быть операции перевода строки в число (это часто требуется при считывании данных из файла или из командной строки).

Некто не спорят. Но дихмо правильнее говорить должны быть операторы чтения и записи чисел как в строковых так и бинарном представление.
Причем такие операторы должны работать с потоками. Т.е как в паскале Read Write только с расширением на потоки TStream. Чтобы можно было читать из памяти.
И расширение на строки.

Цитата:
Желательно наличие для этого типа регулярных выражений, позволяющих искать или генерировать нужную подстроку, выполнять самые разнообразные замены и подстановки.

Думаю вам подойдёт стандарт реулярных выражений из ECMAScript Language Specification


Цитата:
В общем, трудно полностью описать строковый тип, но он должен быть естественным в языке.

Считаю что нет. Это решается стороннмии библиотеками. Тот же MySQL с этим не справился. Хотя и умеет кое-что.
Как по мне самый удобнее тип строк UCS32 (Unicode). Доступ к любому символу. UTF - тип не для работы а для передачи Transfer.
Но честно из Unicode я бы всётаки кое-что выкинул. Как то дикларитические знаки.


Время и дата

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

В PhP для этого есть удобный API всё делается 1-3 строчками.
Но немного доработать. Внутреннее представление я бы сделал астрономически правильным. Тогда и Юлиански и Григорианский форматы даты будут не проблемма.
А то будет как с Excel 6 форматов даты!!!! С годами накопились. :D


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 дек 2014, 02:35 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
SII писал(а):
Например, в одних типах строк индексация идёт по байтам, а в других -- по символам. Сие вполне может породить проблемы на пустом месте.

Нет, уважаемый Иван, в Delphi нигде нет адресации по символам. Адресация всегда идет по единицам измерения, которыми являются байты, 16-битные или 32-битные слова. В этих единицах считаются длины строк, индексы и всё остальное. Это физическое представление строковых данных, оно отделено от логического. Всё в соответствии со стандартом.

Стандарт Юникода чем-то похож на представление чисел в математике: кодовые точки, представляющие символы, не имеют разрядности. Сам по себе Юникод -- логический стандарт. А вот когда заходит речь о хранении и передаче символов, появляются представления UTF, оперирующие физическими, компьютерными единицами, -- байтами и словами. Коллега pavia правильно заметил.

pavia писал(а):
Но честно из Unicode я бы всётаки кое-что выкинул. Как то дикларитические знаки.

Юникод -- это стандарт. Плохой он или хороший, но это стандарт международного уровня, самый проработанный на данный момент. МКС в мире кодировок. Его можно не любить, но изменить по своему вкусу не получится. Придется или поддерживать (можно частично), или продолжать мучаться.

В продолжение темы Delphi, забыл написать в прошлый раз. В открытом FreePascal не смогли реализовать метастроки, а решили пойти своим путем, юниксовым. Назначили одну кодировку (UTF-8) расово верной, что-то в RTL поменяли, что-то забыли, и теперь у кого-то что-то под Linux работает/не работает, а у кого-то -- под Windows. При этом, поскольку в Windows Юникод основан на UTF-16, обработка строк крайне неэффективна, -- кодировка постоянно гоняется туда-сюда. Плюс из-за отсутствия единого понятия кодировки в самом компиляторе результат компиляции зависит от кодировки исходников и/или (!) ключей компиляции. В интернетах есть туча статей, объясняющих, как правильно камлать, чтобы кракозябры ушли... Вобщем, на контрасте с Delphi FreePascal можно приводить как плохой пример.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 дек 2014, 11:29 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1389
Freeman писал(а):
в Delphi нигде нет адресации по символам. Адресация всегда идет по единицам измерения, которыми являются байты, 16-битные или 32-битные слова. В этих единицах считаются длины строк, индексы и всё остальное


Ошибаетесь. Почитайте внимательно документацию.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 дек 2014, 18:07 
Аватара пользователя

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
Yoda писал(а):
Код:
int136 operator + (int136 a, int136 b) {
  int128 t = a.l + b.l;
  Result.l = int64(t);
  t = a.m + b.m + t>>64;
  Result.m = int64(t);
  Result.h = a.h + b.h + t>>64;
}

Ну вот, если теперь временно закрыть глаза на смешивание знакового и беззнакового типов (int64(t) может "вдруг" стать отрицательным), то как всё-таки компилятор догадается, что мы хотим использовать ADC?

Yoda писал(а):
либо потеряется переносимость и универсальность (если наложить запрет на табуляции).

В упор не пойму, как здесь потеряется переносимость и универсальность. Мы заявляем, что есть только два символа-разделителя: перевод строки и пробел. Причём пробелы в начале строки показывают степень вложенности. Если компилятор встречает tab, ругается самыми чёрными оборотами и грозит отрезать программисту левый мизинец.

Yoda писал(а):
Как вариант могу предложить следующее: постулировать, что оператор остатка работает только с беззнаковыми типами по обоим операндам. Таким образом, не возникнет ни неоднозначности, ни разногласия между математическим и программистским представлением.

Никак нельзя. В модулярной арифметике постоянно приходится брать остаток от отрицательных чисел. Потом нужно писать условие if ( x < 0 ) x += P, чтобы прийти к положительному остатку. На отрицательное число редко делят с этой целью, а вот отрицательное делимое - это такая же частая вещь, как и положительное. С точки зрения архитектуры ЭВМ у нас отрицательный остаток при делении отрицательного числа - это естественно, а вот с точки зрения математики выходит ерунда.

Yoda писал(а):
Не получится, т.к. для адресных операций не будет использоваться символ "*" (да и комментарии я хочу заменить). Вообще, это была крайне неудачная идея создателей языка. В моём синтаксисе это символ "@", что логично даже по его смыслу и названию.

Я всё время произношу "собака" или "сволочь" на символ @. А один из моих преподавателей заставлял говорить "коммерческое эт", за что (хотя и не только за это) я перестал ходить на его лекции : ) По комментариям мне тоже есть что сказать позже.

Yoda писал(а):
Но, думаю, на этот случай надежды надо возлагать на программистов и поведение самодельного int256 будет максимально адекватным

Ха-ха : ) Мне пришлось прервать чтение на этом месте, так смешно стало : )

Yoda писал(а):
Резервирование таких типов приведёт к тому, что эквивалентные по смыслу типы программистам придётся называть с нарушением логики.

Не помню, говорил ли, но я предлагаю зарезервировать такие слова не для того, чтобы ими нельзя было пользоваться, а для того, чтобы ими можно было сделать ТОЛЬКО типы данных и определить для них ТОЛЬКО те функции и операции, которые есть для встроенных типов. Таким образом, программист может писать что угодно, но интерфейс класса обязан соблюдать. Таким образом, мы вынуждаем программистов быть адекватными, потому как если просто надеяться на это... : ) я давно перестал верить в адекватность многих людей.

Yoda писал(а):
Вот тут у меня последние дни вкрадываться сомнения. Думается мне, что символьный тип всё же является лишним.

Он лишний. У меня его даже и нет в концепции. Нужны лишь механизмы создания символьных констант, чтобы можно было написать str[i]='A' или find ( str, 'A' ), и вот это самое 'A' будет преобразовано в числовой код на этапе компиляции.

Yoda писал(а):
И ещё, любые символьные константы должны трактоваться как беззнаковые.

Это да, верно. Ещё символьные константы нельзя переводить в числовые и логические типы. Для безопасности.

Yoda писал(а):
Операция конкатенации на этапе компиляции не вызывает проблем. Какие ещё операции касательно строк необходимо отразить в синтаксисе языка, мне пока не приходит в голову.

Обращение к символу str[i]. Правда, не факт, что данная операция будет иметь сложность O(1)... или тогда потребуется дополнительная память для хранения смещений каждого символа, если у них размер не одинаковый.

Yoda писал(а):
Необходима концепция безопасной функции, её главной особенностью является независимость результата от окружения. Таким образом компилятор может вызвать безопасные функции на этапе компиляции и подставить результат в код. Правда, пока что есть нюансы с реализацией таких функций применительно к строкам.

В смысле, эта функция которая не получает на вход никакую небезопасную функцию или переменную и не обращается к глобальным по отношению к ней данным? Это чем-то отличается по смыслу от constexpr для константных функций?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 дек 2014, 19:00 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
SII писал(а):
Ошибаетесь. Почитайте внимательно документацию.

Документация Delphi следует традиции Windows, которая сложилась еще в те времена, когда программистов нужно было срочно отучить от мысли "один символ = один байт", а суррогатных пар в стандарте еще не было. Сейчас же и Delphi, и Windows штатно работают с суррогатными парами, поэтому слово "character" в их документации -- не более чем эвфемизм.

Zealint писал(а):
В упор не пойму, как здесь потеряется переносимость и универсальность. Мы заявляем, что есть только два символа-разделителя: перевод строки и пробел. Причём пробелы в начале строки показывают степень вложенности. Если компилятор встречает tab, ругается самыми чёрными оборотами и грозит отрезать программисту левый мизинец.

Это нарушение декомпозиции. Символы табуляции отвечают за внешнее оформление исходников, а компилятору оно должно быть побоку, если язык имеет свободную запись.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 дек 2014, 19:40 
Аватара пользователя

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
Freeman писал(а):
если язык имеет свободную запись.

А я предлагаю не вполне свободную запись. У меня размер левого отступа определяет степень вложенности.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 285 ]  На страницу Пред.  1 ... 10, 11, 12, 13, 14, 15, 16 ... 29  След.

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


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

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


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB