OSDev

для всех
Текущее время: 11 май 2024, 08:21

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




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

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

Я считаю, что это неправильно. Ноль - неправильное решение, это очевидно. Наличие разных вариантов - плохое решение, это тоже очевидно, я писал выше о необходимости запретить различные интерпретации одного и того же.

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

Мы совершенно в разных областях работаем (это и не плохо и не хорошо, просто мы разные). Ваши "весьма редкие" случаи у нас происходят с вероятностью, близкой к 1. У нас и компьютеры, в которых меньше 64 Гб оперативной памяти, принято называть не иначе как детскими игрушечными калькуляторами. Вот, у меня такой дома, на нём всего 24 Гб. При этом нам совершенно не важно, что думают по этому поводу остальные программисты : ) Вообще не волнует : ) Ну прямо-таки совершенно : )

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

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

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

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

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

Да, пожалуй, так и есть : ) Это единственная причина, по которой я пытаюсь что-то придумать и трачу на это весьма немало времени.

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

Я уже высказался выше о том, что меня не удивляет текущее состояние продукта (он мёртв, даже мертвее жабы).


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

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Zealint писал(а):
... Но нужны сравнения с Intel C++, на практике он давал решения, которые могли на порядок обгонять GCC, но это было давно.

Заинтриговало. Загрузил, посмотрел. Приложение оказалось медленней в 3 раза, но хорошо, что время компиляции такое же как у GCC.
В этот раз я использовал счётчик времени, а прошлый раз оценивал приблизительно "на глаз". Точные цифры - с GCC 1 секунда, с Intel C++ 3,4 секунды.
Для Windows используется пакетный файл
echo %time%
call Cycles.12.exe Complete20.in
echo %time%
pause

Для Linux
time -f %e ./Cycles.12 Complete20.in


Последний раз редактировалось Himik 15 дек 2014, 21:46, всего редактировалось 1 раз.

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

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

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

Сергей, я в недоумении. Куда опять дели байт?

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

Что ж, верно. Тогда давайте я перестану смешивать собственно язык и среду программирования. Мне трудно представить полностью графический язык программирования, непонятно, как лексический анализатор должен будет распознавать всякие «многоэтажные» математические записи. Язык должен быть plain-text, а отображение должно быть привычным для математика, а удобными для программирования должны быть оба этих инструмента. Вот, пока у меня именно такое мнение. Так можно делать в Maple, переключаться меду режимами, если что.
Yoda писал(а):
А я почём знаю? Я даже не уверен, что изменения не могут затронуть первые 32 символа. Я бы по крайней мере, попробовал бы там тоже навести какое-то подобие порядка. Пожалуй, можно утверждать, что точно устоялись символы с кодами 10, 32-126. Даже символ с кодом 13 - порождение зла, его то с одной стороны приткнут, то с другой, то вообще выкинут, то изобретают специальные моды открытия файла для работы с ним.

Печально. Я вот хотел бы отказаться от многих ключевых слов типа for, if, заменив их разными визуальными символами. Видимо, от идеи придётся отказаться пока.

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

Я вот тут не согласен. Можно взять и запретить, и наплевать на отзывы. Конечно, тут можно возразить, дескать, я не авторитет, чтобы решать данный вопрос. Но есть вещи, которые нужно отрубать жёстко. Ещё вариант: отступы в языке делать ТОЛЬКО символом tab и никаким больше. Пробел в начале строки будет синтаксической ошибкой. Но блин, это не сработает, так как многие редакторы настраиваются их пользователями так, чтобы tab сразу заменялся на пробелы (у меня это 2 пробела и чхать на всё : ) ) Мы здесь приходим к неоднозначности, в моей концепции (которую я пытаюсь продумать) сказано, что не должно быть никаких неоднозначностей. И здесь вопрос ребром: либо запрещаем tab, либо создаём какие-то совершенно однозначные правила его использования. Современный tab в отступах - это такое же недоразумение, как возврат каретки. Имхо.
Yoda писал(а):
16-битные целые числа к 32-битным тоже явно приводить?

Нет, можно, как было предложено, создать чёткую иерархию и правила преобразования.
Yoda писал(а):
А если есть типы, определённые пользователем, с тем же видом отношений между ними?

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

Оператор «<<» для ostream придётся прописать для нашей собственной строки, раз мы её определяем.
Yoda писал(а):
А если учесть, что результатом умножения всегда является удвоенный размер, нужно ли явно приводить результат к тому же типу после умножения?

Нет, оператор умножения должен возвращать тот размер, который определён в его коде. Если прописано, что возвращается удвоенный размер, значит возвращается удвоенный, если нет, то нет. Умножение чисел с бесконечной точностью, например, не возвращает удвоенный по размеру тип, а возвращает тот же тип. Если мы пишем, c=a*b, значит компилятор должен понять, что вернуть нужно тип decltype(с), либо ошибку (если нет такого оператора умножения). На самом деле, это непростой вопрос, заставлять компилятор из контекста определять тип результата. Например, программист может от выражения a*(b*c) хотеть, чтобы в скобках тип на время или навсегда стал удвоенным, чтобы случилось переполнение и отрезание старшей половины, чтобы тип стал не удвоенным, а утроенным. Я не думаю, что эту проблему можно оставить на откуп компилятору. Лучше прописать явно, чего мы хотим. Например,
Код:
int64 a, b, c;
a*int128(b*c) // явно хотим, чтобы b*c имело удвоенный тип.
a*(b*c) // явно хотим, чтобы b*c имело тот же тип.
int128(a*(b*c)) // явно хотим, чтобы b*c имело тот же тип, а умножение на a уже удвоенный.

У Вас имеется более удачный вариант решения проблемы? Я считаю, что приводить тип к int128, а затем выполнять умножение – это пустая трата ресурсов.
Yoda писал(а):
А если вспомнить, что даже операции с плавающей точкой как правило приводят к потере точности (а то и к переполнению), нужно ли после каждой операции над числами типа float приводить результат к float?

Если это не следует из контекста, то да. Если написана команда float=float*float, то умножаем как есть с одинарной точностью. Если написано double = float*float, значит нужно обеспечить умножение с удвоенной точностью. Это непривычно для программиста на C++, как и предыдущие примеры, но я лучше не придумал.
Yoda писал(а):
Моя точка зрения состоит в том, что константы не должны иметь точно указанного размера, как например 1ULL в C/C++, т.к. они всегда используются только в каком-то контексте. Любые константные вычисления компилятор должен производить с бесконечной точностью и по результату приведения к конечному требуемому типу выдавать ОШИБКУ, если число выходит за целевой диапазон значений.

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

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

Хорошо, Ваша точка зрения ясна, но она лежит в области программирования транслятора. Возможно, мало кого из пользователей будет волновать, что транслятор будет чуть сложнее. Моё неприятие подобной записи скорее эмоционально-эстетическое. Плюрализм на способы записи одного и того же выражения здесь создаёт у меня какой-то внутренний дискомфорт. Возникает необходимость задумываться над тем, как мне «вот здесь» написать – «0.5» или «.5», а как «вот здесь», а как мне написать число «0»? Написать «0.» или «.0» или просто «.»? И т. д.. Тут же появляется несколько сторонников того и другого лагеря, они начинают устраивать холивар на пустом месте, провоцируется драка, создаются разные ветки языка, обиды и негодования друг на друга и т. д. и т. п.
Yoda писал(а):
Всё верно. А префиксную запись типа 0xABCD я бы запретил. Да и восьмеричную систему счисления тоже запретил бы. Только два суффикса - b и h.

У Вас есть исследования, которые позволяли бы столь смело выбрасывать восьмеричную систему? Я ни разу за 15 лет ей не воспользовался в реальной программе (если не считать тупых университетских задач, придуманных, видимо, для детей младше 3-х лет). Но я – это я, моя категоричность иногда бесит людей, поэтому я стараюсь прислушиваться к ним, если они говорят достаточно аргументированно.
Yoda писал(а):
Никаких апострофов перед суффиксами. Неоднозначность решается просто, - любое число должно начинаться с цифры. 0ABCDh - число, ABCDh - переменная.

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

Ну так я согласен, сам так думаю, просто придерживаюсь принятой сейчас в обществе терминологии, чтобы меня понимали. Меня также не устраивает деление языков на типы: функциональный, императивный, декларативный. Это как делить людей на сангвиников, флегматиков, меланхоликов и холериков, а затем делать из этого далеко идущие выводы о поведении людей, постоянно ошибаясь и навешивая на них пустые ярлыки. Всегда имеем либо смесь парадигм программирования в одном языке, либо плохой язык программирования. Типизация не должна быть сильной или слабой, она должна быть просто. Если Вы тоже так считаете, то с этого момента я не буду говорить «сильная типизация», а буду считать, что типизация есть и небезопасное преобразование типов, а также смешивание логики в процессе преобразования запрещены.


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

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
Himik писал(а):
Zealint писал(а):
... Но нужны сравнения с Intel C++, на практике он давал решения, которые могли на порядок обгонять GCC, но это было давно.

Заинтриговало. Загрузил, посмотрел. Приложение оказалось медленней в 3 раза, но хорошо, что время компиляции такое же как у GCC.
В этот раз я использовал счётчик времени, а прошлый раз оценивал приблизительно "на глаз". Точные цифры - с GCC 1 секунда, с Intel C++ 3,4 секунды.
Для Windows используется пакетный файл
echo %time%
call Cycles.12.exe Complete20.in
echo %time%
pause
Для Linux
time -f %e Cycles.12 Complete20.in

Ну, отлично, спасибо за работу : ) Разумеется, здесь мы не должны тут же говорить, что GCC стал лучше Intel С++, но прогресс в целом не может не радовать. Конечно, ещё не факт, что загруженная Вами версия Intel С++ является полной, а не обрезанной для ознакомления. Вы уверены, что GCC не параллелил циклы автоматически?


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

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
[ 12 ] :: Короткое замечание по поводу break

Во-первых, оператор типа break (как бы его не называли), должен иметь параметр, указывающий, из какого именно цикла мы выходим. Это есть в языке Жаба, я знаю, но считаю странным, что данная возможность до сих пор не появилась в языке C++.

Во-вторых, с помощью break в мыслимом мною языке можно выходить из любого блока кода. Идея в том, что
Код:
if ( A ) {
  // Много кода
  if ( B )
    break; // выходим из этого блока кода и НЕ идём в else.
  // Много кода
}
else {
  // Много кода
}

всяко лучше, чем
Код:
do {
  if ( A ) {
    // Много кода
    if ( B )
      break;
    // Много кода
  }
  else {
    // Много кода
  }
} while ( false );


При этом можно указать у break параметр, из какого именно блока выходим. Например, break 2 значит выйти из двух блоков – этого и того, в который он завёрнут.

UPD: тут нужно аккуратно подумать, откуда на самом деле будет выходить break в примере с if, так как if(B) порождает вложенный блок кода, но, думаю, идея понятна.

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


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

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Zealint писал(а):
Вы уверены, что GCC не параллелил циклы автоматически?

Меняю количество ядер процессора в виртуалке, результат не меняется. Да оказалось что в GCC автоматического параллелилизма нет, и более того, при попытке использования #pragma parallel получается не верный результат вычисления (может быть нужны команды синхронизации).

Поправка
time -f %e ./Cycles.12 Complete20.in
писал по памяти, забыл ./
ни как к этому Unix-идиотизму не привыкну.


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

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Zealint писал(а):
UPD: тут нужно аккуратно подумать, откуда на самом деле будет выходить break в примере с if, так как if(B) порождает вложенный блок кода, но, думаю, идея понятна.

break действует только на блок цикла (или switch), игнорируя блоки if.
Было бы не плохо именовать циклы, соответственно, для break указывать имя прерываемого цикла. Но и просто число уровней тоже хорошо.
Да, пожалуй switch вложенный в for это наиболее тяжёлый случай для выхода из цикла.


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

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
Himik писал(а):
Было бы не плохо именовать циклы, соответственно, для break указывать имя прерываемого цикла. Но и просто число уровней тоже хорошо.

Разумно (не только циклы, но и условия). Но тогда возникает вопрос: можно ли использовать для именования циклов метки?
Код:
first : for ( ... ) {
  second : for ( ... ) {
    if ( A )
      break first;
  }
}

Или именование циклов должно быть отделено от механизма меток?


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

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Zealint писал(а):
Разумно (не только циклы, но и условия). Но тогда возникает вопрос: можно ли использовать для именования циклов метки?
Хорошая идея.


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

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
В Аде табуляция -- пробельный символ, а соответственно, может быть там, где может быть пробел. Однако компилятор должен кидать предупреждение (а если указано -- и ошибку), когда встречает табуляцию где-нибудь в исходниках, поскольку её использование является нарушением правил оформления кода (хотя технически код остаётся корректным). ИМХО, вполне разумный подход.


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

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


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

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


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

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