OSDev

для всех
Текущее время: 01 июл 2025, 12:42

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




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

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 976
Откуда: Дагоба
Himik писал(а):
Тогда уж пусть сразу тип переменных неявно меняется на double, раз уж на то пошло. В вопросе повышения точности вычисления нужно идти до конца.

Если результат требуется float, то нет смысла менять тип на double.

Himik писал(а):
Логично, только неявных преобразований слишком много. Если компилятору кажется, что "что-то здесь не так", то пусть лучше выдаст сообщение, а программист подумает и сам решит.

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

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

<<< OS Boot Tools. >>>


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

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Yoda. Вы меня поняли совершенно неправильно. А жаль. Видимо придётся всё подробно расписать. А этого хотелось бы избежать.

Существует очень много типов данных:
двоичные десятичные шестнадцатеричные
Кольцо, Поле, упорядоченные
Фиксированной длины и переменной
модулная: одномодульная, многомодульная
Натуральные, рациональный, иррациональные, реальные, комплексные
кватернионы,тензоры, матрицы, нечёткая арифметика
Булева алгебра, квантовая арифметика, арифметика многочленов и другие мало популярные.

Не говоря уже о комбинациях.

Так вот не существует строгой иерархии типов. У разных типов чисел некоторые свойства выпадают из иерархии.
К примеру у нечёткой логике не соблюдается упорядоченность.
У матриц умножение не соответствует кольцу чисел. И есть дополнительные операции.
У кватернионов забыл, но тоже какого-то свойства не хватает.
У тензеров аж несколько операций умножение.
Из целых чисел нельзя извлечь квадратный корень.
У реальных чисел не определена функция arcsin(2)
Из матриц корень только у определенного класса.

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

По поводу конвертирования и операций.
Возможны разные варианты. Я уже упоминал вкратце стандарты Си, Паскаля, Верилог.
Ещё я не ссылался на SQL и другие стандарты.

Но не обязательно их вводить в стандарт к примеру есть такой язык Форт, не путать с фортраном. В нем можно переопределить и создать любые лексемы и любую грамматику языка. В FASM с его макросами сделано нечто подобное.

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


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

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Yoda писал(а):
Himik писал(а):
Тогда уж пусть сразу тип переменных неявно меняется на double, раз уж на то пошло. В вопросе повышения точности вычисления нужно идти до конца.

Если результат требуется float, то нет смысла менять тип на double.

Himik писал(а):
Логично, только неявных преобразований слишком много. Если компилятору кажется, что "что-то здесь не так", то пусть лучше выдаст сообщение, а программист подумает и сам решит.

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

Не получиться. Данный подход годиться только для ассемблера. Либо мы тогда конвертируем все входные данные сразу до меньшего типа либо получим разброд и шатания на формулах сложнее 3-х операций в формуле.

Код:
Float32=Float32*Float64*Float32*Floatf64;

В математики это кольцо чисел коммутативно. А у вас неоднозначность из-за скобок.
точно такая же как с
Код:
I=I++ + ++I;

или
Код:
int Nute;
func f1(int valu)
{
Nute=value;
}
Foo(f1(1),f1(2),f1(3),f1(4)); //Как правило в ЯВУ порядок вызова функций не определен


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

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 976
Откуда: Дагоба
pavia писал(а):
У кватернионов забыл, но тоже какого-то свойства не хватает.

Коммутативности. a*b != b*a

pavia писал(а):
Существует очень много типов данных:
...
Так вот не существует строгой иерархии типов.
...
Так вот всё это надо описывать. А так как есть ещё и комбинации, то этого хотелось бы избежать. Расползания сил на создания законченной арифметики.
...
Но не обязательно их вводить в стандарт к примеру есть такой язык Форт, не путать с фортраном. В нем можно переопределить и создать любые лексемы и любую грамматику языка.
...
И тут надо просто принять Соломоново решение. Не работает тут Бритва Оккама. Но проанализировать данные можно. Я бы сказал нужно.И решить что нужно что второстепенно.

Вы хотите сказать, что нужно определиться, что язык должен поддерживать, а что нет? Я вам ответил: у языка нет ограничений, просто часть типов является встроенной, а часть реализуется в виде библиотек. После перегрузки операторов использование библиотечных типов практически неотличимо от встроенных, вся разница синтаксической поддержки заключается только в необходимости вызова конструкторов для создания объектов библиотечных типов. Например, для создания комплексной переменной встроенного типа я мог бы записать z = 2+3i. Если в языке нет их поддержки, запись будет выглядеть как z = new Complex (2, 3).

pavia писал(а):
Но решение надо обоснованное, не просто это нравиться сделаем это не нравиться. Иначе мы ни к чему не придем. Либо мы выписываем плюсы и минусы а после смотрим. Либо просто голосуем, по разным пунктам. Есть и другой вариант автор топика просто постулирует, то что возьмет грубо говоря с потолка. Если мы делаем систему для учёных, то наверно надо проанализировать их работы.

Для своего языка я постулирую: встроенными базовыми типами являются целые числа разрядности от 8 до 128 бит, числа с плавающей точкой от 32 до 128 бит, комплексные числа разрядности от 32 до 128 бит, булевый тип, символьный тип. Все остальные типы являются библиотечными, но некоторые типы (например, целые числа неограниченного размера) должны входить в стандартные языковые библиотеки. Такое решение принято на основе анализа частоты использования типов и эффективности реализации.

pavia писал(а):
Не получиться. Данный подход годиться только для ассемблера. Либо мы тогда конвертируем все входные данные сразу до меньшего типа либо получим разброд и шатания на формулах сложнее 3-х операций в формуле.

Код:
Float32=Float32*Float64*Float32*Floatf64;

В математики это кольцо чисел коммутативно. А у вас неоднозначность из-за скобок.

Не вижу, где здесь неоднозначность? В данном случае компилятор обязан вывести предупреждение, что результат имеет меньшую точность, чем исходные данные, считать всё в 64 битах и результат привести к 32 битам.

Вот у меня только одно сомнение - подобным сообщениям необходимо присваивать статус замечаний или же ошибок.

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

<<< OS Boot Tools. >>>


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

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
Yoda писал(а):
72-64 = 8 бит.

А, я понял. Я предполагал, что у нас должно было быть минимум три поля. А если тип данных int136?

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

Поэтому я и хотел бы убить сразу двух зайцев: избавиться от лишних скобок и вынудить создавать правильные отступы, так как неправильные будут означать семантически иной смысл. Это не избавляет от других возможностей сделать код унылым, но хотя бы приближает к этому.
Yoda писал(а):
Да нет же, вариантов на самом деле три: опасное, безопасное и условно-безопасное.
1. Опасное - приведение целого числа к типу "указатель".
2. Безопасное - преобразование 32-битного числа в 64-битное.
3. Условно безопасное - преобразование 32-битного числа в 16-битное.

Каким будет преобразование int64 -> real64? А int32 -> real64?
Yoda писал(а):
А если у вас таблица десятеричных чисел? А если двоичных чисел? Как раз 0 здесь совсем не лишний.

Разумно. А если перепутать «0» с «O»? Вы приводили это в качестве аргумента отказа от восьмеричного суффикса «o».

Yoda писал(а):
Zealint писал(а):
Кстати, остаток от деления «математический» или «программистский»?

А в чём разница?

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

Ну так а большие константы на этапе компиляции тоже будут вычисляться посредством библиотек?
Yoda писал(а):
Я думаю, ** - будет достаточно понятно и удобно.

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

Допустим, что резервировать мы не будем. Но нужна гарантия, что если в язык придётся добавлять новый тип, например, int256, то это не испортит чужих программ.

Yoda писал(а):
Zealint писал(а):
Должен быть тип rational, который содержит числитель и знаменатель типа int. То есть дробь с бесконечной точностью.

Исключительно в качестве стандартной библиотеки. Кстати, да, забыл, целый тип бесконечной точности также должен входить в СТАНДАРТНУЮ библиотеку.

Рациональные числа довольно часто требуются в научной среде. Ничем не меньше обычных целых. Maple даже с самого начала их воспринимает по-умолчанию. Написать там 7/5, то будет именно 7/5, а не 1.4 и уже тем более не 1.


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

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
[ 14 ] :: Некоторые нечисловые типы данных

Какие ещё простые типы данных должен предоставлять язык? Вот некоторые из них.

Логический тип

Этот тип (пусть будет bool) – результат выполнения логических операций. Переменная такого типа может принимать значения true и false. Нельзя неявно приводить логическое значение к числовому. Нельзя числовое значение воспринимать как условие. Таким образом, штуковины вроде
Код:
Int done = 0;

While ( ! done )

запрещены.

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

Ещё одна совершенно печальная вещь, связанная с желанием совмещать целый и логический типы, это так называемый vector < bool > в C++. Такая наивная попытка создать битовый массив и затем воспользоваться возможностью бродить по массиву через указатель:
Код:
vector < bool > a;
bool * p = & a[4];
int x = * ( p + 1 );

завершается весьма печально. Разумеется, проблема «решается» прокси классами, но эти самые прокси классы (в данном случае) – это уже следствие ошибок (или недоработок) стандартизации.

Сколько ещё нужно уроков, чтобы понять необходимость явного запрета на бездумное смешивание совершенно разных по своей логике типов данных? Я думаю, проще больше на подобные грабли не наступать. Число и результат логической операции НЕЯВНО друг к другу НЕ приводятся. Если нужно явно – создаётся механизм преобразования.

Указатель

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

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

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

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

Массив

Массив как встроенный тип должен быть безопасным. Это должен быть скорее контейнер, как vector в C++, но не совсем. В этом массиве должны быть функции, позволяющие отследить обычные для массивов ошибки программиста в отладочном режиме. Если включён отладочный режим, любое обращение к элементу массива должно проходить проверки на выход за границы. Разница между массивом и контейнером vector в том, что встроенные в язык массив НЕ должен содержать ничего лишнего, помимо указанного пользователем числа элементов. Если пользователь указал, что ему нужно 10 элементов по int64, значит будет выделено РОВНО 80 последовательных байт без каких-либо вариантов (понятно, что ещё будет 8 байт на указатель и, возможно, информация, необходимая для его удаления, но сам массив будет длиной 80 байт). Массив может быть многомерным. Разница между таким массивом и тем, что есть в С, - это наличие функций проверки безопасности, которые можно подключать и отключать.

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

Строка

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

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

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

Строка должна уметь переводить себя в разные кодировки. Как это будет выглядеть, дело другое, но должна. Дело в том, что язык, видимо, придётся делать с использованием utf-8, других вариантов я не вижу. Строка по умолчанию тоже utf-8, но выводить её в файл, возможно, придётся в 1251 или 866, а то и в другие однобайтовые распространённые форматы. Я считаю, что даже если это не делать встроенным в язык свойством строки, то это должно как минимум входить в стандартную бибилиотеку.

Время и дата

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

Честно скажу, меня реально запарило настраивать эти таймеры в разных компиляторах C++. В одном работает, в другом нет, исправляешь, а потом на виртуалке вообще лажа. Это очень мешает. Если я хочу получить время в любом формате (хоть в миллисекундах от 1980 года, хоть в минутах от сегодняшнего полудня), я должен легко и просто сделать буквально одним вызовом функции. ЯВУ должен обеспечивать работу со временем по-человечески.

[ Продолжение следует ]


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

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 241
Откуда: Санкт-Петербург
Zealint писал(а):
Дело в том, что язык, видимо, придётся делать с использованием utf-8, других вариантов я не вижу. Строка по умолчанию тоже utf-8, но выводить её в файл, возможно, придётся в 1251 или 866, а то и в другие однобайтовые распространённые форматы.

Строка по умолчанию -- это метастрока. Именно так сделано сейчас в Embarcadero Delphi, где UnicodeString, несмотря на название, -- именно метастрока, каждый экземпляр которой хранит размер символа и его фактическую кодировку. А компилятор -- не тупое чудище из прошлого века, а современный инструмент, учитывающий кодировку исходных текстов и кодировку среды выполнения и выполняющий все необходимые преобразования, чтобы смысл кода от них не зависел.

Например, у меня исходник в кодировке Windows-1251:
Код:
const
  Pascal: UTF8String = 'Паскаль';
begin
end.

Если скомпилировать его в Delphi 2009 или старше, в EXE-файле строка будет представлена кодами:
Код:
D0 9F D0 B0 D1 81 D0 BA D0 B0 D0 BB D1 8C 00

Видно, что фактическая кодировка строки -- UTF-8, то есть соответствует синтаксису, а не случайным факторам. Исходник можно пересохранить в UTF-8 или UTF-16 (или даже в Shift-JIS -- в ней тоже есть кириллица), результат компиляции от этого не изменится.

В Delphi много разных косяков и нестыковок, но новая модель строк -- чуть ли не единственное, что в Embarcadero было сделано правильно. Как заметил кто-то в Интернете, только два известных языка, не имевшие Юникода от рождения, сумели перейти на него и не загнуться, -- это Delphi и Python. А вот PHP не смог, например.

Короче, нужную гибкость сможет обеспечить только метастрока. Назначение какой-то единственной кодировки расово верной -- порочная практика.

_________________
Путь успеха Циолковского — правильно умереть


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

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1449
Как по мне, в языке должно быть несколько строковых типов, где явно указывается, какую кодировку должен использовать компилятор для внутреннего представления этих строк. Что же касается внешнего представления (в исходной программе), то оно с внутренним никак не связано: во время компиляции при необходимости просто осуществляется преобразование из одной кодировки в другую.

В Дельфях не всё хорошо со строками, но в общем и целом это, пожалуй, лучшее, что сейчас есть на практике.


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

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 976
Откуда: Дагоба
Zealint писал(а):
А, я понял. Я предполагал, что у нас должно было быть минимум три поля. А если тип данных int136?

Тогда так:
Код:
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;
}


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

Я бы безоговорочно согласился с вами, если бы не засада с табуляциями, приводящая к тому, что либо визуальное представление может не совпасть с семантикой (если табуляция не равна 8), либо потеряется переносимость и универсальность (если наложить запрет на табуляции).

Zealint писал(а):
Каким будет преобразование int64 -> real64? А int32 -> real64?

int64 -> real64 - условно-безопасное.
int32 -> real64 - безопасное.

Zealint писал(а):
Yoda писал(а):
А если у вас таблица десятеричных чисел? А если двоичных чисел? Как раз 0 здесь совсем не лишний.

Разумно. А если перепутать «0» с «O»? Вы приводили это в качестве аргумента отказа от восьмеричного суффикса «o».

Поэтому я и говорю - префиксов быть вообще не должно, а суффиксы можно, но только не те, которые визуально могут быть легко перепутаны с цифрами. Т.о. суффиксов "l" и "I" тоже быть не должно.

Zealint писал(а):
Yoda писал(а):
Zealint писал(а):
Кстати, остаток от деления «математический» или «программистский»?

А в чём разница?

В математике остаток всегда положительный.

Да, точно, - у меня как-то в этом направлении мысль даже не повернулась. Интересный вопрос. Я думаю, это надо как-то стандартизировать, но как, пока не знаю. Программисты не берут остаток от деления отрицательных (или на отрицательные) чисел, по крайней мере я ни разу не сталкивался с такой необходимостью в своей практике и не видел такого кода на практике. Как вариант могу предложить следующее: постулировать, что оператор остатка работает только с беззнаковыми типами по обоим операндам. Таким образом, не возникнет ни неоднозначности, ни разногласия между математическим и программистским представлением.

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

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

Да, т.к. постулируется, что этот тип должен входить в стандартные языковые библиотеки.

Zealint писал(а):
Yoda писал(а):
Я думаю, ** - будет достаточно понятно и удобно.

В одном из постов Вы жаловались, что нельзя поделить на указатель, так как получается комментарий. Не получится ли здесь так, что Вы будете умножать на указатель?

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

Zealint писал(а):
Допустим, что резервировать мы не будем. Но нужна гарантия, что если в язык придётся добавлять новый тип, например, int256, то это не испортит чужих программ.

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

Zealint писал(а):
Рациональные числа довольно часто требуются в научной среде. Ничем не меньше обычных целых. Maple даже с самого начала их воспринимает по-умолчанию. Написать там 7/5, то будет именно 7/5, а не 1.4 и уже тем более не 1.

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

Zealint писал(а):
Строка

Это встроенный тип, а не костыль. Полноценный тип с операциями конкатенации и сопутствующими. Числовые типы могут быть явно или неявно приводиться в строковый.

Вот тут у меня последние дни вкрадываться сомнения. Думается мне, что символьный тип всё же является лишним. По сути он не отличается от целочисленного и, более того, все эти свистопляски с разными символьными типами (long char) и кривыми объявлениями типа L"Это строка", u8"Это тоже строка" на самом деле вызывают только раздражение. Вместо этого должна быть возможность инициализировать целочисленные массивы юникодовыми символьными строками. Например:
uint8 str1[] = "Это строка";
uint16 str2[] = "Это строка";
uint32 str3[] = "Это строка";
В первом случае массив чисел будет инициализирован кодовой последовательностью UTF-8, во втором - UTF-16, в третьем - UTF-32. Таким образом можно обеспечить 100% совместимость с недрами ОС Windows, не прибегая к кривым объявлениям, режимам компиляции Unicode и безумным макросам _T("...") для объявления строк. И ещё, любые символьные константы должны трактоваться как беззнаковые. Эта свистопляска с трактовкой char как знакового или беззнакового типа в зависимости от пожелания компилятора меня откровенно достала.
Операция конкатенации на этапе компиляции не вызывает проблем. Какие ещё операции касательно строк необходимо отразить в синтаксисе языка, мне пока не приходит в голову.

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

Это легко делается на уровне библиотек.

Zealint писал(а):
Строка должна уметь переводить себя в разные кодировки. Как это будет выглядеть, дело другое, но должна. Дело в том, что язык, видимо, придётся делать с использованием utf-8, других вариантов я не вижу. Строка по умолчанию тоже utf-8, но выводить её в файл, возможно, придётся в 1251 или 866, а то и в другие однобайтовые распространённые форматы. Я считаю, что даже если это не делать встроенным в язык свойством строки, то это должно как минимум входить в стандартную бибилиотеку.

Я сейчас склоняюсь к мысли, что надо постулировать, что стандартной для языка является кодировка UTF-8. В конце концов, другие кодировки рано или поздно отомрут. Перекодирование в другие кодировки можно выполнять системными библиотеками. Чтобы не возникало накладных расходов на частое преобразование констант, я вижу такой выход. Необходима концепция безопасной функции, её главной особенностью является независимость результата от окружения. Таким образом компилятор может вызвать безопасные функции на этапе компиляции и подставить результат в код. Правда, пока что есть нюансы с реализацией таких функций применительно к строкам.

Zealint писал(а):
Спорный вопрос о том, нужны ли типы, определяющие время и дату.

Я думаю, что время должно быть не встроенным типом, а стандартным библиотечным.

_________________
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, 14:37 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 976
Откуда: Дагоба
SII писал(а):
Как по мне, в языке должно быть несколько строковых типов, где явно указывается, какую кодировку должен использовать компилятор для внутреннего представления этих строк.

Существуют сотни кодировок. Отражать их все в синтаксисе языка мне кажется неправильным подходом. Лучше применить волевое решение: стандарт языка - UTF-8 и точка. Это никоим образом не мешает поддержать все остальные кодировки на уровне библиотек.

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

<<< OS Boot Tools. >>>


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

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


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

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


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

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