[01:36:02] <valexеy> http://cs306501.userapi.com/v306501343/2a86/_oVhl6MGRIs.jpg
[01:52:56] <vlad2> Хе-хе.
[03:26:19] <vlad2> реальный профит на самом деле от компилятора
[03:26:52] <vlad2> чем проще компилятору объяснить чего ты от него хочешь (проверок каких инвариантов) - тем все будет доказуемее и формальнее
[03:27:24] <vlad2> поэтому математика тут, конечно, присутствует, но сама по себе бесполезна
[03:29:08] <vlad2> Вот эта вот херня с циклами, что вот у нас тут "инвариант", "охрана", а вот тут "не инвариант" - имеет нулевой профит, если компилятор не в курче твоих математических абстракций. А в случае оберонов он как раз не в курче.
[03:31:38] <vlad2> Можно, конечно, уткнутся в песок как info21 и делать ставку на write-only по формальной методике. Но оно не работает вне тепличныъ условий.
[03:33:58] <valexеy> vlad2: угу. и поэтому, по факту, на каком-нибудь Haskell'e все эти инварианты как раз имеют смысл.
[03:34:06] <valexеy> Ибо там компилеру ты можешь объяснить что же ты тут делаешь.
[03:34:58] <vlad2> Кстати про компиляторы.
[03:35:24] <vlad2> Я так понял Вирт выпилил из О7 форвард объявления функций.
[03:35:48] <vlad2> Так что взаиморекурсивные функции уже не напишешь.
[03:35:54] <vlad2> Без плясок с бубном.
[03:37:03] <valexеy> в java тоже нет форвардов, но проблем с рекурсией нема :-)
[03:37:10] <vlad2> Не говоря о косметике (типа правильного лэйоута - порядка функцций)
[03:37:26] <vlad2> В смысле да, я понимаю, что это не проблема.
[03:37:54] <vlad2> Но у него там вполне четко сказано - все идентификаторы обязаны быть объявлены перед использованием.
[03:38:15] <vlad2> И также упомянуто, что вызывать самого себя (счтая рекурсия) - тоже можно.
[03:38:19] <valexеy> где это сказано?
[03:38:34] <vlad2> У тебя дока под рукой?
[03:38:42] <vlad2> Где-то в самом начале, там где про scoe.
[03:38:44] <vlad2> scope
[03:38:45] <valexеy> угу
[03:40:06] <valexеy> 1. If a type T is defined as POINTER TO T1 (see 6.4), the identifier T1 can be declared textually
following the declaration of T, but it must lie within the same scope.

[03:40:13] <vlad2> Я аообще в плюсах сам придерживаюсь стиля без форвард деклараций. Но иногда случается, что они нужны.
[03:40:15] <valexеy> так что не вижу проблем :-)
[03:40:24] <vlad2> Да, я это видел.
[03:40:27] <vlad2> Но.
[03:40:43] <vlad2> Я подозреваю, что указателей на процедуры не бывает ;)
[03:40:59] <vlad2> Можно завести просто процедурную переменную - это да.
[03:41:43] <vlad2> Так же как и pointer to pointer.
[03:41:48] <vlad2> (не бывает)
[03:42:03] <vlad2> Ибо не С :_
[03:42:05] <vlad2> :)
[03:42:21] <valexеy> заведи указатель на процедурную переменную :-)
[03:42:59] <vlad2> Я так понял, что у него там "T" - это чисто рекорды и массивы (структурные типы)
[03:43:12] <vlad2> Указатель на INTEGER тоже нельзя
[03:43:38] <valexеy> брр
[03:43:53] <valexеy> прям какая-то недоява получается
[03:44:05] <vlad2> Может я конечно чего не допонял...
[03:44:20] <vlad2> Но я не видел как можно разыментовать такой указатель.
[03:44:34] <vlad2> А без раыменования смысла-то особого нет ;)
[03:44:45] <valexеy> а, все. капец.
[03:44:52] <valexеy> указатели бывают только на Record type
[03:44:59] <vlad2> Это ты вычитал?
[03:45:09] <vlad2> Я только по контекту так понял.
[03:45:18] <valexеy> вычитал
[03:45:28] <vlad2> А, ну значит я правильно понял :)
[03:45:32] <valexеy> "Variables of a pointer type P assume as values pointers to variables of some type T. It must be a record type. "
[03:45:39] <vlad2> Ну все, да, капец :)
[03:46:08] <vlad2> Тяжело без адресной арифметики.
[03:46:13] <valexеy> но, с другой стороны, процедурный тип же не должен знать о процедуре что-либо кроме ее сигнатуры
[03:46:24] <valexеy> так что процедурные типы - выход
[03:46:30] <valexеy> черезжопный: но выход
[03:46:34] <valexеy> проход, блин
[03:47:14] <vlad2> Да, там содом будет - заведение переменной, проиничивание ее..
[03:47:36] <valexеy> vlad2: во! http://www.inf.ethz.ch/personal/wirth/Articles/Oberon/PortingOberon.pdf от аффтара языка! Все разжевывается!
[03:47:46] <valexеy> И да, мы угадали про процедурную переменную.
[03:48:39] <vlad2> Дык, фигли ;) Не обзательно програмировать на обероне, чтоб понимать такие вещи.
[03:49:12] <valexеy> /me с пичалью смотрит на свои 128 байт ОЗУ, и понимает что ну максимум туда получится впихнуть 64 такие переменные.
[03:49:36] <valexеy> это если потом программу не запускать :-)
[03:49:49] <vlad2> ;)
[03:50:02] <vlad2> Там для указателей достаточно 1 байта ;)
[03:50:08] <vlad2> Так что 128 переменных.
[03:50:24] <vlad2> Или там большое ПЗУ,
[03:50:26] <vlad2> ?
[03:50:41] <valexеy> указатель - 2 байта
[03:50:51] <valexеy> там плоское адресное пространство.
[03:51:06] <valexеy> причем в расширенном режиме, указатель это 20ть бит
[03:51:46] <valexеy> то есть в том же пространстве замечательные адреса по которым лежат там вектора прерываний и так далее.
[03:52:15] <valexеy> а ПЗУ там от 2Кб до 16Кб в моем случае
[03:52:19] <valexеy> (а вообще, до мегабайта)
[03:52:40] <valexеy> Во! А вот и учебничек по актуальному оберону: http://www.inf.ethz.ch/personal/wirth/Articles/Oberon/PIO.pdf
[03:53:59] <vlad2> Кстати, а там официального сообщения после О7 не было? А то, может, я уже старье переусложненное имплеменчу? :)
[03:55:39] <valexеy> было еще два. или три.
[03:56:09] <vlad2> Вот блин. Надо будет поискать.
[03:56:22] <vlad2> В моем сообщении ничего нет про выпил локальных функций, кстати.
[03:56:28] <vlad2> Т.е. они там описаны.
[03:57:24] <valexеy_> vlad2: вот 2012: http://oberspace.dyndns.org/index.php/topic,296.0.html
[03:57:47] <valexеy> последний вот: http://oberspace.dyndns.org/index.php/topic,296.0.html
[03:58:29] <vlad2> О, спасибо!
[03:58:57] <vlad2> По поводу ворда - может у него мак.
[03:59:49] <valexеy_> ну, вообще, если закопаться в потроха вордовского документа, думаю можно вытащить версию ворда - мак это или венда
[04:01:31] <valexеy_> Блин. Афигеть советы:
[04:01:35] <valexеy_> Change all occurrences of SHORTINT and LONGINT to INTEGER. This may require the
elimination of calls of type transfers SHORT and LONG, an exercise in text editing. LONGREAL
has not been implemented in Oberon-ARM. Replace it by REAL, but do not expect exactly the
same results ☺
[04:02:42] <valexеy_> советует заменять целое (длинное целое, ога) на плавающую точку.
[04:02:49] <valexеy_> /me facepalm нафик
[04:03:17] <vlad2> Там смайлик ;)
[04:03:32] <valexеy_> издевательский, ога.
[04:04:10] <valexеy_> /me представил себе какой-нибудь алгоритм шифрования где вместо целых начали использовать плавающую точку
[04:07:11] <valexеy_> знаешь, у меня упорное ощущение складывается, что Вирт не пишет под встроенку, ну либо у него там ОЧЕНЬ жирные микроконтроллеры.
[04:07:29] <valexеy_> Потому как его нововведения в Оберон-07 сильно усложняют жизнь микроконтроллерщикам.
[04:11:53] <vlad2> Кстати. Это один из самых смущающих моментов в трансляции в js - это именно INTEGER.
[04:12:16] <vlad2> Потому как его в js нет.
[04:12:59] <valexеy_> там все флоатами?
[04:13:08] <vlad2> Т.е. нельзя странслировать i1 DIV i2 в i1 / i2
[04:13:13] <valexеy_> (какое в js внутреннее представление числа?)
[04:13:39] <vlad2> Во внутреннем - там оно конечно есть (как оптимизация). Но я ж не во внутреннее транслирую.
[04:14:24] <vlad2> Т.е. я не могу разделить целочисленно два жабаскриптовых числа.
[04:14:43] <vlad2> (эффективно)
[04:15:20] <vlad2> Пока не придумал что с этим делать.
[04:15:34] <vlad2> Но и более тонкие моменты - например, что делать с переполнением.
[04:15:37] <valexеy_> function integerDivision(x, y){
   return x/y>>0
}
[04:16:05] <valexеy_> по моему, достаточно эффективно :-)
[04:16:39] <vlad2> Ну как сказать ;)
[04:16:59] <valexеy_> jit соптимизит в целочисленку наверняка
[04:17:09] <vlad2> А вот что делать c INC(i) когда оно дойдет до 7FFFFFFF?
[04:17:36] <valexеy_> хороший вопрос. а что делать при трансляции в машкод x86? ;-)
[04:18:03] <valexеy_> то есть тут js-специфики нема
[04:18:28] <valexеy_> тут есть типичный undefined behavior от Вирта :-)
[04:18:43] <vlad2> Тут будет хреновый undefined behavior.
[04:18:59] <valexеy_> ?
[04:19:25] <valexеy_> ну, на каком-нибудь АРМе или иной железяке тоже halt может случиться ж-)
[04:20:04] <vlad2> Потому что там будет не просто мусор, а оно превратится в double. И этот double пойдет гулять там, где его совсем не ждут (потому что оно всегда целое с точки зрения компилтяора)
[04:20:20] <valexеy_> там именно double?
[04:20:33] <vlad2> Внутренне представление в движке - да.
[04:21:23] <vlad2> А каждое действие чекать на предмет переполнения - ужос-уэос.
[04:22:14] <valexеy_> да не. расслабься
[04:22:24] <valexеy_> смотри:
[04:22:26] <valexеy_> typedef double NSTimeInterval
[04:22:30] <valexеy_> NSTimeInterval is always specified in seconds; it yields sub-millisecond precision over a range of 10,000 years.


[04:22:54] <vlad2> И чего? :)
[04:22:58] <valexеy_> можешь взять калькулятор да прикинуть когда у double точность упадет ниже целого
[04:23:11] <vlad2> Когда-то падет.
[04:24:21] <valexеy_> угу. будет вероятно где-то когда число достигнет вот такого: 10^14
[04:25:20] <valexеy_> если на то пошло, то если у нас int8 a,b; то нельзя делать так: int8 c = a+b;
[04:25:22] <vlad2> Ладно. Может оно и заработает :)
[04:25:22] <valexеy_> никогда вообще
[04:25:39] <valexеy_> это здоровенная дырища в системе типов всех современных языков
[04:25:56] <valexеy_> потому как тип a+b будет int9
[04:26:51] <valexеy_> поэтому, кстати, не имеет смысла запрещать конвертацию из int16 в int8. потому как дополнительной безопасности это особо то и не добавляет.
[04:27:45] <valexеy_> потому как в системе типов вполне можно сделать int8 c = a*b; (при том что тип a*b должен быть int16)
[04:34:18] <vlad2> Для микроконтроллеров - может быть. Для десктопов - хочу нормальный варнинг.
[04:34:48] <valexеy_> в смысле?
[04:36:52] <valexеy_> я к тому, что система типов должна быть другая. варнинги тут не помогут :-)
[04:39:58] <valexеy_> тут нет никакой разницы микроконтроллер или макроконтроллер
[04:41:54] <valexеy_> спать!
[05:14:07] <vlad2> Ну вообще да, ругаться на каждое умножение - оверкил.
[18:18:42] <vlad2> "Однако ни одно из этих открытий не было признано Международным союзом теоретической и прикладной химии (IUPAC).
Всё потому что учёные до сих пор не смогли объяснить (с точки зрения атомной физики), какие процессы происходят в их ускорителях при получении тех или иных элементов."
[18:19:07] <valexey > это шо такое?
[18:19:07] <vlad2> Можно знатно потроллить info21 на предмет партизанства в физике ;)
[18:19:22] <vlad2> http://www.vesti.ru/doc.html?id=919435
[18:19:40] <vlad2> В дебагере посмотрели, о объяснить не смогли :)
[18:24:35] <valexey > :-)
[18:24:58] <valexey > vlad2: смотри какой у меня неправильный цикл! http://oberspace.dyndns.org/index.php/topic,261.msg9279.html#msg9279
[18:25:12] <vlad2> Вот какая формальна методика позволит избавится от таких ошибок: return a_s.compare( a_offset, a.m_data.size(), b_s, b_offset, a.m_data.size() );
[18:25:17] <vlad2> (крэш ковыряю)
[18:25:31] <vlad2> Причем этому коду больше года и он все время работал.
[18:25:50] <valexey > о, а ошибка у меня там походу таки есть :-)
[18:26:25] <vlad2> Кстати, я помню писал на слабо двоичный поиск. Ошиибку не нашли :)
[18:27:31] <valexey > но она не проявится конечно же.
[18:35:11] <valexey > vlad2: каг тебе мой быдлоцикл? ;-)
[18:35:18] <vlad2> Тяжело :)
[18:35:46] <vlad2> Поэтому луцчший циелд - это библиотечный алгоритм ;)
[18:36:24] <valexey > ну, библиотеку то тоже кто-то должен написать :-)
[18:38:38] <valexey > но я так и не понял что там шибко сложного в таких циклах
[18:38:56] <valexey > единственная сложность там была - учесть анизатропию целочисленных операций
[18:40:35] <valexey > да, а условие в форе позволило найти баг в одном из тестов. то есть в коде который тестировал этот самый бинарный поиск.
[22:49:00] <valexеy_> http://lenta.ru/news/2012/09/28/milkman/
[22:55:35] <vlad2> Хе-хе.
[22:56:04] <vlad2> Ничто так не способствует появлению говкода как спешка.
[23:12:33] <valexеy_> это точно
[23:37:14] <vlad2> И работа по 17 часов :)
[23:49:58] <vlad2> valexey: так ты писал тесты на свой цикл? ;)
[23:50:42] <vlad2> Я пока написал тест на крэш с std::string::compare - еще пару багов поймал ;)
[23:51:39] <vlad2> пока код не покрыт тестами - у него презумция говнокода ;)