Pull to refresh
0
0
Алексей@Fduch

User

Send message
Компилятор анализирует сам код. Если ты написал Ensures, то он проверит, что ты в самом коде метода не нарушил это условие. Многие стандартные функции помечены как [Pure] — это означает, что они никак не меняют состояние объекта. Ещё есть случай совсем внешних библиотек. У них нет контрактов и система, отдавая им переменную, или принимая от них значение, не знает, что произойдёт. Для таких случаев есть Assume. Assume похож на Requires, но если Requires находится в начале метода и проверяет добросовестность вызывающего метода, то Assume просто делает недоказуемое утверждение (сопровождающееся проверкой в Debug версии). Вообще, задача, конечно, непростая. Как я понимаю, Code Contracts дествуют по принципу «виновен, пока не доказано обратное».

У меня был совершенно глупый случай, когда я не мог понять почему контракт считается недоказаным. У меня в программе был набор списков. Был метод, позволяющий добавить новый список в набор. При этом было условие, что длина нового списка должна быть такая же, как и длины уже существующих (проверялось при помощи Requires). Но инвариант, который постулировал, что длины всех списков равны, оказывался недоказуем. Причина банальна: тот, кто передал мне список для добавления, может всего добавить в него элемент, изменив длину и нарушив мой инвариант.
Данная проблема, как мне кажется, решается не очень сложно.
Пишем код с использованием контрактов вроде Code Contracts. Компилятор проверяет, что внутри библиотеки/баррикады контракты не нарушены. После этого, можно [будет] сказать компилятору убрать код проверок, для которых доказано, что они всегда верны. Таким образом, реальные проверки останутся только по периметру баррикады, а корректность баррикады гарантируется компилятором, анализирующим контракты.

В Code Contracts можно задать (Requires) условия для аргументов метода. Также можно пообещать (Ensures) что для при выходе из метода будут выполнены определённые условия для результата и конечных значений аргументов (да аргументы могут меняться внутри процедуры). Также можно пообещать, что аргументы не изменятся если в методе возникнет исключение. Инварианты пишутся в отдельном методе.
При компиляции с соответствующими опциями, все утверждения проверяются и выводятся ворнинги, причём довольно осмысленные. Например, увидев код вроде int a = 1 << (arg1.Prop — 8), компилятор предложил добавить проверки на то, чтоm 7 < arg1.Prop < 39.
Забавно, что, как я понимаю, всё это давно есть в VB.Net в виде расширенной поддержки Linq-to-XML.
Вместо:
var element = XElement.Parse(books);
string firstBooksTitle =
element.Element(«book»).Element(«title»).Value;
string firstBooksAuthor =
element.Element(«book»).Element(«author»).Attribute(«name»).Value;
string secondBooksTitle =
element.Elements().ElementAt(1).Element(«title»).Value;

Пишем просто
Dim element = XElement.Parse(books)
Dim firstBooksTitle = element.<book>.<title>.Value;
Dim firstBooksAuthor = element.<book>.<author>.@name.Value;
Dim secondBooksTitle = element.Skip(1).Take(1).<title>.Value

В таком синтаксисе поддерживаются неймспейсы, элементы (дети/потомки), атрибуты и индексация элементов:
contact.<ns:phone>
phone.@type
contacts...<name>
contacts...<name>(0)
contacts...<name>.Value

Создавать XML тоже становится намного удобнее. (в VB.Net вообще есть XML литералы)

msdn.microsoft.com/en-us/library/bb384833.aspx
msdn.microsoft.com/en-us/library/bb384974.aspx
Разве
var factorial = YC(YC)(fac => x => x = 0? 1: x * fac(x — 1));
не одна строка?
Самоотправилось…

C#
delegate TReturn SelfApplicable<TReturn>(SelfApplicable<TReturn> self);

SelfApplicable<Func<Func<Func<int, int>, Func<int, int>>, Func<int, int>>>
YC = y => f => x => f(y(y)(f))(x);
var factorial = YC(YC)(fac => x => x = 0? 1: x * fac(x — 1));
Не думал, что на JS для этого нужно столько кода…
На VB.Net и C# намного компактнее:

C#

VB.Net
Delegate Function SelfApplicable(Of TReturn)(ByVal self As SelfApplicable(Of TReturn)) As TReturn
Dim YC As SelfApplicable(Of Func(Of Func(Of Func(Of Integer, Integer), Func(Of Integer, Integer)), Func(Of Integer, Integer))) = _
Function(y) Function(f) Function(x) f(y(y)(f))(x)
Dim factorial = YC(YC)(Function(fac) Function(x) If(x = 0, 1, x * fac(x — 1)))

P.S. <code> не пашет =(
Джаву выкинули по решению суда за несколько лет до этого. В XP SP1 добавили возможность выбора дефолтного браузера, почтового клиента, медиа плеера, чата и JVM. MS решила, что этого достаточно и попыталась вернуть JVM. Не вышло.
Я подробно описал всё это немного ниже.
>Не самую лучшую и самую быструю, а самую быструю на вендах
Под самой лучшей подразумеваю «best Java support».
>Хотя, вероятно, по графике, микросовтовская ВМ была самой быстрой и «вообще», поскольку остальные были на операционках с Х-ами, где обогнать ведновый гуй более чем сложно.
А как же Sun JVM? Её что, не было?
>И на какой они там версии остановились, помните? из-за чего, даже при наличии явы в браузере она была малоюзабельна
Действительно, на какой? Ибо Sun запретила микрософту реализовывать джаву выше, чем Java 1.1.4. «The settlement document outlined that Microsoft also could not advance J++ beyond its mirrored implementation of Java, version 1.1.4.»
>Как то вы противоречите цитатам, которые сами же приводите.
>Из цитаты следует так же, что JNI была создана не с испугу от появления RNI, а, наоборот, микросовты прикрутили «расширили» JNI своим несовместимым «расширением» (чем и убили идею явы).
Из моей цитаты это не следует. Там написано только что в 1998 к добавила JNI в дополнение к RNI. Чтобы разобраться точнее, давайте обратимся к первоисточникам и посмотрим на историю появления Java, RNI и JNI. Для этого обратимся к посмотрим описание от Sun — www.public.iastate.edu/~java/docs/guide/nativemethod/jniTOC.doc.html Я хотел привести несколько цитат, но там нужно цитировать почти всё www.public.iastate.edu/~java/docs/guide/nativemethod/intro.doc.html.
Краткое содержание:
JavaSoft выпустила JDK 1.0 с NMI. Он плохой, поэтому ему ищут замену. Делать свою замену Sun не хочет. Есть две реализации — более быстрая и удобная RNI от Microsoft (основана на NMI) и более портабельная JRI от Netscape. Какую же выбрать? Решают всё-таки делать свою версию — JNI, несовместимую с NMI, которая была раньше и на основе которой MS построила JVM. (замечаем, что JNI появляется позже)
Всё это происходит не позже 1996, во время выхода IE3, впервые поддерживающего Java апплеты. Дальше, в 1997 (судя по www.osp.ru/cw/1997/10/18618/ и истории JDK) начинается разлад: Microsoft обвиняет JavaSoft в нарушении совместимости и отказе от NMI (который использовала MS) и переходе на JNI. Microsft грозит JavaSoft судом за нарушение контракта и совместимости с JDK 1.0.
Цитата:
Может, это просто ошибка JavaSoft? По словам Фитцжеральда, все значительно сложнее. «Новый интерфейс был спроектирован так, что Java-программы, разработанные с помощью новой версии JDK, не работали на Microsoft JVM, — утверждает Фитцжеральд. — Это целенаправленные действия, а не ошибка».

Далее: В середине 1997 Microsoft выпускает IE4 (то есть выпускает OSR обновление Win95, в которое он входит). Справиться с саботажем/изменением от Sun Microsoft за такое короткое время не успела (или всё ещё надеется заставить Sun изменить решение), поэтому IE4 не поддерживает JNI (о чём MS сообщила, ссылаясь на «time, complexity, compatibility, and competition… you can pick any two.»). Популярный платный браузер Netscape, к слову, тоже его не поддерживал (у них — своя проприетарная JRI). Через несколько недель Sun подаёт на MS в суд за недостаточную поддержку JDK 1.1 (c Netscape решили не судиться).
Пока шли суды, MS продолжала использовать свою JVM в 1998 вышла следующая версия Java — 1.2, но суд уже постановил запретить MS развивать поддержку джавы дальше версии 1.1.4.
В Windows XP MS JVM не было (видимо, следствие антимонопольного дела). В SP1 Microsoft добавила возможность выбора дефолтного браузера, почтового клиента, медиа плеера, чата и JVM. Решила, что это удовлетворит антимонопольный комитет, MS вернула свою JVM в систему. Sun не согласилась с этим и по суду обязала Microsoft исключить JVM из Windows (что MS сделала в XP SP1a). Также Microsoft было запрещено распространять Windows 98, Office 200/XP и Visual Studio 6/98.

Я достаточно подробно описал вам историю? Если что-то ещё непонятно, спрашивайте, не стесняйтесь.
Пропустил ссылку =(
Но, посмотрев на остальные комментарии, вы увидите, что мой ответ не теряет актуальности.
>Вы это всерьез что ли? Да не нужно ничего специально отдавать в IE
Да, всерьёз. Отдают же. Зайдите на сайты www.crashie.com, chessfield.ru/ своим любимым браузером, установив User Agent от IE, и попробуйте что-либо сделать.
>мало-мальски сложная верстка сама в нем успешно расползется. Вспомните хотя бы квадратные сиськи :-)
В моём IE сиськи выглядят нормально. А как насчёт чего-нибудь попрактичнее вроде скруглённых уголков? Они так смешно выглядят в браузерах, которые так понтовались их поддержкой: img-fotki.yandex.ru/get/4513/sad-wind.2/0_60ad4_b910cf60_orig ie.microsoft.com/testdrive/HTML5/BorderRadius/Default.html

>И ненависть к Microsoft тут вообще ни разу ни при чем
Сознательная, требующая училий порча чего-либо для пользователей продуктов Microsoft — это и есть самая настоящая ненависть.
А почему не просто в IE? А эта ссылка выглядит в Firefox 1?
Давайте лучше назовём это Mozilla Outbreak
Чтобы наступил рай, придётся ещё выкинуть Lynx (нихрена не поддерживает, кривая вёрстка), Opera (туча косяков, глючащие куки), Firefox (кривой XSLT, неполная поддержка стандартов) и Chrome (неполная поддержка стандартов). Вот тогда наступит счастье.
>Ведь этим можно агитировать людей! Ты что, пользуешься IE? Да ты знаешь, что его используют, как вывеску для рассадников разврата и наркомании?
Всегда поражаюсь, какие откровенно нечестные приёмы обожают «честные, открытые, белые, пушистые» ненавистники Microsoft.
То сделают сайт, где веб-сервер специально отдаёт IE (или любому браузеру с соответствующим User Agent) сломанную верстку (или скрипт, жрущий память). То начнут рассказваать наивным пользователям сказки про то, что в Windows Vista невозможно проигрыва спираченные mp3'шки и фильмы. Воистину, прав Линус — «ненависть к Microsoft — это болезнь».
Не стыдно вам?
Стравнил. Результаты разные.
Кстати, как Вы скачаете wget? Он далеко не везде есть по умолчанию.
совсем по секрету: они позволяют не только запускать bash, но и ставить Gentoo и XFCE.
хабрахабр
жрёт
собственные
теги
=)

P.S. С JVM в Windows XP всё было немного запутанней:
Cначала в XP JVM убрали (по решению суда). В SP1 снова вернули. Sun снова подала в суд и и MS выпустила SP1a без JVM.

The initial edition Windows XP RTM did not ship with a Java virtual machine 2001, due to the settlement. This required users that wanted to run Java Applets in Internet Explorer to download and install either the standard Sun Java virtual machine, or locate a copy of the Microsoft Java virtual machine elsewhere.

Service Pack 1 (SP1) for Windows XP was released on September 9, 2002. It contained post-RTM security fixes and hot-fixes, compatibility updates, optional .NET Framework support, and enabled technologies for new devices such as Tablet PCs. It also included the Microsoft Java virtual machine.[6]

On February 3, 2003, Microsoft released Service Pack 1 (SP1) again as Service Pack 1a (SP1a). This release removed Microsoft's Java virtual machine as a result of the lawsuit with Sun Microsystems.
Никто не видит, что враньё написано?
Microsoft получил возможность для инновационного развития и смог убрать всю ненужную кросс-платформенную поддержку. «Джаву» быстро вымели метлой из IE6. Само по себе, это не удивляет и не является чем-то тревожным. Поддержка Java со стороны Microsoft всегда была вялой. В былые времена Sun и другие компании поставляли плагины для IE, с помощью которых Java правильно работала в Internet Explorer. Даже без одобрения Microsoft, пользователи могли бы продолжить их использование. К сожалению, Microsoft также прекращает поддержку плагинов.
Автор «случайно забывает», что Sun в судебном порядке заставила Micrososft убрать Java из винды. Для этого MS даже пришлось перевыпустить SP1.
Поддержка Java со стороны Microsoft всегда была вялой.
Да, конечно. Поддержка была просто ужасно вялой. MS всего-то сделала самую лучшую (и самую быструю/одну из самых быстрых) JVM.
The Microsoft JM won the PC Magazine Editor's choice awards in 1997 and 1998 for best Java support. In 1998 a new release included the Java Native Interface which supplemented Microsoft's proprietary Raw Native Interface (RNI) and J/Direct. Microsoft claimed to have the fastest Java implementation for Windows, although IBM also made that claim in 1999 and beat the Microsoft and Sun virtual machines in the JavaWorld Volano test.
Более того, я уверен, что MS любила джаву и хотела активно использовать её в Windows. К сожалению, джава представляла собой «клетку», из которой нельзя было общаться со «внешним миром. Для решения этой проблемы, MS создала RNI, который позволил программам на Java эффективно взаимодействовать с другими (не Java программами). Sun, видимо, очень испугалась, поэтому тут же a) подала в суд на Microsoft, запрещая им Java разработку; b) сделала свою собственную RNI, которую назвала JNI. MS пришлось отказаться от Java и создать .Net.
Там не только скриншоты. Недавно выяснилось, что айфон иногда самопроизвольно делает фотографии камерой.
>Гугл — гаражный стартап, который поднялся благодаря талантам его основателей. А не как Microsoft.
в нике пропущена буква d

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Date of birth
Registered
Activity