OSDev

для всех
Текущее время: 12 май 2024, 10:51

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




Начать новую тему Ответить на тему  [ Сообщений: 285 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9, 10 ... 29  След.
Автор Сообщение
СообщениеДобавлено: 13 дек 2014, 23:42 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Не так давно обновил свой основной инструмент. Перешел на новую версию Delphi. Давно не обновлял. Был приятно удивлён количество предупреждений выросло (различных более 2000 штук), но все по делу. В основном семантические предупреждения. Но зато ошибки позволяют ловить до начала функционального тестирования.


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

Зарегистрирован: 15 апр 2014, 14:13
Сообщения: 127
Zealint писал(а):
В связи с наличием более-менее строгой типизации, возникает вопрос с тем, как транслятор должен интерпретировать неименованные константы в программе. Допустим, написано выражение
Код:
Int32 a = 1024;

Здесь всё ясно, компилятор видит, что происходит инициализация целого типа размером 32 бита и вопроса о типе числа 1024 не возникает. А теперь мы делаем иначе:
Код:
Int32 a = 10 + (65536*65536);

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

Конкретно по приведённому вами примеру в Java всё решается так - компилятор вычисляет все выражения с известными значениями на этапе компиляции (то есть сводит выражение к одному числу), затем выбирает минимальную размерность типа, без потерь вмещающую число, ну а далее идёт стандартное преобразование типов при присваивании. Если при этом теряется точность - компилятор ругается и заставляет программиста явно приводить типы.
Zealint писал(а):
А что делать, когда пишется a [ 10 ]? Какой тип имеет число 10?

Здесь опять всё просто - потребителем результата выражения является массив, для которого производится индексация. В Java размер массива ограничен 31 битом (32-й бит под знак), поэтому после вычисления конкретного значения выражения компилятор просто сравнивает получившееся значение с 31 битом и выносит вердикт - влазит или нет.

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

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

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

А вот бы osdev.ru на подобный форум перешёл :) Там просто пишешь текст, потом выделяешь и не хватаясь за мышь нажимаешь комбинацию клавиш, в результате быстро получаешь богатое разнообразие форматирования.


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

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
эмбрион писал(а):
Конкретно по приведённому вами примеру в Java всё решается так - компилятор вычисляет все выражения с известными значениями на этапе компиляции (то есть сводит выражение к одному числу), затем выбирает минимальную размерность типа, без потерь вмещающую число, ну а далее идёт стандартное преобразование типов при присваивании. Если при этом теряется точность - компилятор ругается и заставляет программиста явно приводить типы.

Выбирается минимальная размерность, вмещающая результат или промежуточные числа?

эмбрион писал(а):
Здесь опять всё просто - потребителем результата выражения является массив, для которого производится индексация. В Java размер массива ограничен 31 битом (32-й бит под знак), поэтому после вычисления конкретного значения выражения компилятор просто сравнивает получившееся значение с 31 битом и выносит вердикт - влазит или нет.

Сразу протестую. Бывает, что нужно 36 бит.

эмбрион писал(а):
В общем-то и по остальным вашим вопросам всё обстоит примерно так же. По сути сам единый стандарт Java исключает большинство вопросов.

Вы опять пытаетесь решать сразу, как должно быть в итоге : ) А если я не все вопросы задал? А может ещё кто-то что-то придумает, более удобное? Я размышляю, жду размышлений других участников и аргументации, почему что-то плохо, а что-то хорошо. Если бы стандарт Java решал большинство вопросов, у меня бы их не было, и Java вряд ли считался бы в моём кругу мёртвым языком.

эмбрион писал(а):
Так что в мире много чего уже есть готового к использованию.

Всё это уже давно можно делать в Word, однако как Вы думаете, почему я не программирую в Word?

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

К phpbb можно прикрутить возможность набирать даже самые сложные формулы. Есть mathjax или хотя бы как на форуме dxdy.ru. Но вряд ли в этом есть здесь необходимость.


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

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
Метасреду-рисовалку для Java делал Максим Кизуб, SymADE называлась. Я как-то занес себе в ссылки, а потом забыл. Что сейчас с ней, не знаю.


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

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
Нет, Максим пытался сделать среду, в которой можно было бы писать на разных языках, объединяя их достоинства. Смысл в том, что семантически-ориентированное программирование рассматривается им как возможность хранить в IDE дерево разбора и отображать его на любом языке по желанию программиста с любой степенью детализации кода, то есть редактировать семантическое дерево, а не код программы. Идея почему-то считается Максимом революционной, хотя он и подчёркивает, что она не новая. В общем-то, для меня неудивительно, что проект не развивается. Судя по всему, автор тоже быстро (за два года) понял безнадёжность проекта. Или ему никто помогать не захотел.


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

Зарегистрирован: 15 апр 2014, 14:13
Сообщения: 127
Zealint писал(а):
Выбирается минимальная размерность, вмещающая результат или промежуточные числа?

Вообще в спецификации указано, что при вычислениях используется тот промежуточный тип, который достаточен для данного значения. А про ошибки переполнения сказано - давить без эксепшенов. Поэтому полностью стандартный компилятор даст 0 вместо 256*256*256*256. Но поскольку вычисление констант происходит на этапе компиляции, а не выполнения, в принципе возможны варианты.
Zealint писал(а):
Бывает, что нужно 36 бит.

Значит в Java придётся делать 32 массива по 2Gb. То есть двумерный массив. В стандарте есть ограничение на размер массива, вытекающее из ограничения на предельное значение 32-битного знакового слова.

По большому счёту - некоторое минимальное удобство от использования одного массива в весьма редких случаях вы предлагаете возвести в закон и в следствии этого отказаться от стандартизации. Логическое завершение такому подходу есть винегрет из компиляторов С, например.

Хотя я, как и указывал ранее, за компиляторы, которые сами решат, что массив будет длиннее 31-го бита и автоматом разобьют его на запчасти.
Zealint писал(а):
Вы опять пытаетесь решать сразу, как должно быть в итоге : ) А если я не все вопросы задал?

Сдаётся мне, что как раз я нахожусь в положении того, кому навязывают чужое мнение. Вот стоит показать, как в Java-мире люди решают задачи, как сразу становлюсь врагом :)
Zealint писал(а):
Если бы стандарт Java решал большинство вопросов, у меня бы их не было, и Java вряд ли считался бы в моём кругу мёртвым языком.

Ну конечно, всех вопросов ни один стандарт пока не решил. Но вывод про "мёртвость" в результате явно попахивает учОными, которые считают, что на земле жизни нет, а вот на марсе вполне даже может быть. (УчОные, это не лично вы, если что :) )
Zealint писал(а):
Всё это уже давно можно делать в Word, однако как Вы думаете, почему я не программирую в Word?

Есть много вариантов объяснения. Например - мы ленивы и нелюбопытны :)


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

Зарегистрирован: 15 апр 2014, 14:13
Сообщения: 127
Freeman писал(а):
Метасреду-рисовалку для Java делал Максим Кизуб, SymADE называлась. Я как-то занес себе в ссылки, а потом забыл. Что сейчас с ней, не знаю.

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


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

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Zealint писал(а):
Мне что-то не нравится, но я пока не могу понять, что именно. Могли бы Вы написать оператор сложения полностью правильно для int72 (на любом языке, который можно понять без лишних пояснений)? При этом, если Вы пользуетесь int128 для промежуточных результатов, то нужно описать и его.

int128 не нужно описывать, это должен быть последний встроенный тип.

Код:
int72 operator + (int72 a, int72 b) {
  int128 t = a.l + b.l;
  Result.l = int64(t);
  Result.h = a.h + b.h + t>>64;
}


Zealint писал(а):
Совершенно верно, однако есть визивиг (wysiwyg) редакторы для TeX, которые оставляют скрытым plain-text, лежащий в основе.

В данном случае ТеХ - это язык программирования, а визивиги - среды разработки. Таким образом, собственно языком является неудобоваримое текстовое представление.

Zealint писал(а):
Вы не ответили на мой вопрос о том, какие по-Вашему символы в UTF-8 следует считать устоявшимися. Или вопрос некорректен?

А я почём знаю? Я даже не уверен, что изменения не могут затронуть первые 32 символа. Я бы по крайней мере, попробовал бы там тоже навести какое-то подобие порядка. Пожалуй, можно утверждать, что точно устоялись символы с кодами 10, 32-126. Даже символ с кодом 13 - порождение зла, его то с одной стороны приткнут, то с другой, то вообще выкинут, то изобретают специальные моды открытия файла для работы с ним.

Zealint писал(а):
Yoda писал(а):
Но здесь есть своя засада - символ табуляции!

Я предлагаю запретить символ табуляции и назначить на эту кнопку что-то другое в моём редакторе, а ещё считать данный символ синтаксической ошибкой. Ведь, например, в C++ многие символы будут синтаксической ошибкой, и если в новом языке добавить в этот список tab, то ничего по сути не изменится. Просто 9-й символ будет восприниматься таким же запрещённым, как, например, 31-й.

Это нереально и единственно, к чему может привести, это к куче негативных отзывов. С моей точки зрения было бы правильней стандартизировать: табуляция - это ВСЕГДА 8 позиций. Но даже в этом случае обязательно будут недоразумения.

Zealint писал(а):
Можно альтернативный вариант: во внутреннем plain-формате скобки для блоков кода есть, а во внешнем формате их нет.

Вот опять вы смешиваете. Внутренний формат - это и есть язык.

Zealint писал(а):
Я считаю, что нужно запретить неявное преобразование типов.

16-битные целые числа к 32-битным тоже явно приводить?
А если есть типы, определённые пользователем, с тем же видом отношений между ними?
А если есть необъемлющие типы, которые было бы удобно приводить автоматически? Например, функция вывода сообщений ожидает указатель на константную строку символов, а у вас собственный тип данных строк, нужно ли позволить неявное приведение или каждый раз надо писать:
Код:
cout << static_cast <const char *>(mystr);
?
А если учесть, что результатом умножения всегда является удвоенный размер, нужно ли явно приводить результат к тому же типу после умножения?
А если вспомнить, что даже операции с плавающей точкой как правило приводят к потере точности (а то и к переполнению), нужно ли после каждой операции над числами типа float приводить результат к float?

Zealint писал(а):
А теперь мы делаем иначе:
Код:
Int32 a = 10 + (65536*65536);

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

Моя точка зрения состоит в том, что константы не должны иметь точно указанного размера, как например 1ULL в C/C++, т.к. они всегда используются только в каком-то контексте. Любые константные вычисления компилятор должен производить с бесконечной точностью и по результату приведения к конечному требуемому типу выдавать ОШИБКУ, если число выходит за целевой диапазон значений.

Zealint писал(а):
Более сложный вопрос
Код:
Int32 a = 10 + (65536*65536)/65536;

Это выражение будет ли вычислено правильно? Формально, тип ответа сходится по размерности, но промежуточные результаты выходят за его рамки. Что должен делать компилятор? Чем по-умолчанию должно быть число 65536?

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

Zealint писал(а):
Чтобы не было подобных проблем, можно попытаться сделать следующее.

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

Zealint писал(а):
на удивление почти всегда программа получалась быстрее и проще (именно «и», а не «или»). Мистика.

Никакой мистики.

Zealint писал(а):
Записи типа
Код:
double a = .5
double a=5.

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

Полностью согласен. Разумное объяснение: запись типа .5 усложняет лексический анализ, т.к. при встрече символа "." в потоке требуется проверка следующего символа, не число ли. Если язык допускает нумерованные поля, то потребуются ещё более сложные телодвижения для анализа, необходимо ли трактовать a.5 как пятое поле структуры "a" или переменную "a", за которой следует константа с плав.тчк.

Zealint писал(а):
Теперь что делать с константами в других системах счисления? Вот здесь как раз суффиксы и будут наиболее удобным решением: b, o, h. Например,
Цитата:
int16u a = AB'CD'h // шестнадцатеричное
int16u a = 1010'1011'1100'1101'b // двоичное, не может быть конфликта с шестнадцатеричным из-за суффикса b, так как тут нет суффикса h

Всё верно. А префиксную запись типа 0xABCD я бы запретил. Да и восьмеричную систему счисления тоже запретил бы. Только два суффикса - b и h.

Zealint писал(а):
Есть одна проблема, как не перепутать имя переменной ABCDh с шестнадцатеричной константой? Я думаю, что апостроф нужен перед суффиксом всегда, то есть константа должна иметь вид ABCD'h, без апострофа это будет литерал.

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

Zealint писал(а):
Теоретически, можно использовать даже произвольное основание int32 a = 123_5, что будет означать 123 в пятеричной системе, а int32 a = 123_3 будет уже ошибкой компиляции. Но, мне кажется, поддержка произвольной системы счисления на уровне языка не нужна...

Много лет назад у меня была аналогичная идея, причём с точно такой же записью. И я также пришёл к выводу о полном отсутствии такой необходимости в рамках компилятора. Хотите системы счисления - пишите мультисистемный калькулятор, а для языка программирования это явно избыточно.

Лирическое отступление по поводу типизации. Дэн Гроссман, ведущий на курсере курс "Языки программирования" от Вашингтонского университета, считает (и я в этом с ним полностью согласен), что деление на слабую и сильную типизацию некорректно, ибо нет чёткого определения такого разделения. В каждом языке есть свои правила приведения типов, что можно приводить неявно, а что нельзя. С/С++ являются не слабо, а плохо типизированными языками. Например, в С проблемой является не смешение целочисленного и булевого типов, а отсутствие булевого.

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

<<< OS Boot Tools. >>>


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

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
SII писал(а):
В Аде очень просто: есть внутренний тип компилятора ("истинный целый", так сказать); именно к нему и будут относиться константы, для которых тип не задан явно. Этот тип автоматически совместим с любыми подтипами этого внутреннего типа (а любые явные целые типы являются там подтипами внутреннего целого типа, любые вещественными типы -- подтипами внутреннего вещественного). Проблем с разрядностью/точностью возникнуть не может, поскольку здесь мы имеем дело с константой, а значит, компилятор точно знает, сколько под неё необходимо места, и может сравнить потребное место с реально задаваемым (например, при присваивании значении константы переменной).

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

SII писал(а):
Случайно написать & вместо && или наоборот вполне возможно -- а потом лови такую ошибку. А вот случайно написать reinterpret_cast иди ещё что-нибудь подобное невозможно -- а значит, такие средства можно смело предоставлять программисту.

В хорошо типизированном языке операторы & и && не смешаются, поэтому отлов таких ошибок не вызовет никаких проблем. А вот на набивание reinterpret_cast и прочих "многабукав_операторов" у меня уйдёт бОльшая часть рабочего времени (вместо производительного труда по созданию логики работы программы).

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

<<< OS Boot Tools. >>>


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

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
эмбрион писал(а):
Zealint писал(а):
А теперь мы делаем иначе:
Код:
Int32 a = 10 + (65536*65536);

Подобные вопросы не возникают в Java.

Только не надо опять проталкивать вашу любимую джаву, в которой даже нет беззнаковых типов, в качестве эталона ЯВУ.

эмбрион писал(а):
Здесь опять всё просто - потребителем результата выражения является массив, для которого производится индексация. В Java размер массива ограничен 31 битом (32-й бит под знак)...

Вот-вот :mrgreen:.

эмбрион писал(а):
Значит в Java придётся делать 32 массива по 2Gb. То есть двумерный массив. В стандарте есть ограничение на размер массива, вытекающее из ограничения на предельное значение 32-битного знакового слова.

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

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

Здесь никто не защищает С. Здесь обсуждаются возможные концепции нового, перспективного ЯВУ. А вот вы, похоже, настолько крепко застряли в своей любви к Джаве, что готовы даже защищать её недостатки и считаете, что ничего лучше быть не может.

эмбрион писал(а):
Сдаётся мне, что как раз я нахожусь в положении того, кому навязывают чужое мнение. Вот стоит показать, как в Java-мире люди решают задачи, как сразу становлюсь врагом :)

Разве? А мне показалось ровно наоборот.

эмбрион писал(а):
Но вывод про "мёртвость" в результате явно попахивает учОными, которые считают, что на земле жизни нет, а вот на марсе вполне даже может быть. (УчОные, это не лично вы, если что :) )

Попахивающим учОным требуются языки, которые позволяли бы работать с гигантскими массивами данных без ничем не оправданной потери эффективности на совершенно чуждое архитектуре процессора ограничение в 2Гб на массив и постоянно-периодический сбор мусора.

_________________
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 ... 4, 5, 6, 7, 8, 9, 10 ... 29  След.

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


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

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


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

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