Наша программа обрабатывает сетевые пакеты, в частности, заголовки TCP/IP/etc. В них числовые значения — смещения, счетчики, адреса — представлены в сетевом порядке байтов (big-endian); мы же работаем на x86 (little-endian). В стандартных структурах, описывающих заголовки, эти поля представлены простыми целочисленными типами (uint32_t
, uint16_t
). После нескольких багов из-за того, что порядок байтов забыли преобразовать, мы решили заменить типы полей на классы, запрещающие неявные преобразования и нетипичные операции. Под катом — утилитарный код и конкретные примеры ошибок, которые выявила строгая типизация.
Читать полностью »
Рубрика «типизация» - 2
Польза строгой типизации в C++: практический опыт
2019-10-12 в 20:38, admin, рубрики: c++, endianess, Программирование, типизацияТесты или типы? — Rust version
2019-09-20 в 19:33, admin, рубрики: Rust, ненормальное программирование, Программирование, типизацияПару дней назад 0xd34df00d опубликовал здесь перевод статьи, описывающей, что можно узнать о функции в разных языках, если рассматривать её как "чёрный ящик", не используя информацию о её реализации (но, разумеется, не мешая ей пользоваться компилятору). Разумеется, получаемая информация очень сильно зависит от языка — в исходной статье рассматривались четыре примера:
- Python — динамически типизированный, информации минимум, какие-то подсказки дают только тесты;
- C — слабо статически типизированный, информации ненамного больше;
- Haskell — сильно статически типизированный, с чистыми функциями, информации существенно больше;
- Idris — язык с зависимыми типами, информации достаточно, чтобы во время компиляции доказать корректность функции.
"Есть C, есть Haskell, а где же Rust?!" — немедленно прозвучал вопрос. Ответ — под катом.
Не шутите с NULL
2019-08-16 в 6:45, admin, рубрики: null, Блог компании ua-hosting.company, Курьезы, обработка пользовательского ввода, Программирование, Проектирование и рефакторинг, Развитие стартапа, типизация, хранение данныхДостойная пятницы история приключилась с американским исследователем в области безопасности Джозефом Тартаро (Joseph Tartaro). Захотелось ему выделиться, заказав не просто индивидуальный номер на авто, но и связав его со своим ремеслом. Первой мыслью было поиграться с SEGFAULT или чем-то вроде этого. Но в итоге он остановился на номере NULL для своей машины и VOID для своей жены. Почуяли неладное? О том, чем обернулась для него невинная шалость, о ещё одном курьёзном мистере Null и о поучительных багах при проверке типов данных в пользовательском вводе, читайте под катом.
Мы написали самый полезный код в своей жизни, но его выкинули на помойку. Вместе с нами
2019-06-04 в 15:02, admin, рубрики: api, javascript, TypeScript, Проектирование и рефакторинг, Совершенный код, типизация
Я повесил у себя в подвале боксерскую грушу, приклеил на нее стоковое фото типичного менеджера и запихал внутрь динамик, чтобы он проигрывал фразы, которые меня злят. Например, груша говорит: «Бизнесу не нужен твой идеальный код. Ему нужно решить проблему так, чтобы прибыль покрыла затраты. Если для этого нужен говнокод, значит будет говнокод». И начинаю дубасить.
Недавно я добавил в грушу запись: «Типы — это сложно и ненужно». В этот момент я бью так сильно, что рука чуть не ломается. Потому что с меня хватит. Пару месяцев назад я пережил один из самых вопиющих кейсов в своей карьере.
Мой друг Антоха попросил меня помочь с решением для одной большой-большой корпорации. Я согласился, и мы влезли в бездонную пучину корпоративного абсурда, кранча, войны с ничего не понимающими JS-никами и всеми видами несправедливости. Нам ничего нельзя говорить, поэтому мы будем говорить про типы, чтобы такая фигня никогда ни у кого не повторялась.
Читать полностью »
Почему люди не используют формальные методы?
2019-01-23 в 20:09, admin, рубрики: ACL2, alloy, Altran, Cleanroom, CompCert, Euclid, IronFleet, Isabelle, Praxis, smt, TLA+, z3, контрактное программирование, контракты, логика Хоара, математика, Надя Поликарпова, Программирование, решатель, типизация, формальные методы, формальные языки, языки спецификацийНа Software Engineering Stack Exchange я увидел такой вопрос: «Что мешает широкому внедрению формальных методов?» Вопрос был закрыт как предвзятый, а большинство ответов представляли собой комментарии типа «Слишком дорого!!!» или «Сайт — это не самолёт!!!» В каком-то смысле это верно, но мало что объясняет. Я написал эту статью, чтобы дать более широкую историческую картину формальных методов (FM), почему они на самом деле не используются и что мы делаем для исправления ситуации.
Прежде чем начать, нужно сформулировать некоторые условия. На самом деле существует не так много формальных методов: всего несколько крошечных групп. Это означает, что разные группы по-разному применяют термины. В широком смысле есть две группы формальных методов: формальная спецификация изучает запись точных, однозначных спецификаций, а формальная проверка — методы доказательства. Сюда входят и код, и абстрактные системы. Мало того, что мы используем разные термины для кода и систем, мы часто используем разные инструменты для их верификации. Чтобы ещё больше всё запутать, если кто-то говорит, что создаёт формальную спецификацию, обычно это означает и верификацию дизайна. А если кто-то говорит, что делает формальную верификацию, обычно это относится к верификации кода.
Читать полностью »
Решаем проблемы типов данных в Ruby или Make data reliable again
2018-12-14 в 13:51, admin, рубрики: appodeal, dry-rb, ruby, ruby on rails, Программирование, типизацияВ этой статье я хотел бы рассказать о том, какие проблемы с типами данных есть в Ruby, с какими проблемами столкнулся я, как их можно решить и как сделать так, чтобы на данные, с которыми мы работаем, можно было положиться.
Зависимые типы — будущее языков программирования
2018-12-07 в 13:09, admin, рубрики: idris, javascript, Блог компании Издательский дом «Питер», Компиляторы, математика, Программирование, Проектирование и рефакторинг, Семантика, типизацияВсем привет!
Несмотря на диковинность и некоторую отвлеченность рассматриваемой сегодня темы — надеемся, что она сможет разнообразить вам выходные. В конце поста помещаем три ссылки от автора, позволяющие познакомиться с зависимой типизацией в Idris, F# и JavaScript
Читать полностью »
Как запутать аналитика. Часть первая
2017-06-29 в 4:28, admin, рубрики: IT-стандарты, owl, Анализ и проектирование систем, аналитика, атрибуты, математика, ооп, Семантика, типизация— В армии научились совмещать пространство и время.
— Как?
— Очень просто! Прапорщик дает задание: «Сегодня будем копать от забора и до обеда»
В этой статье я начну рассказ о путаницах, которые регулярно встречаются, и которые кочуют в информационные модели без всякого критического анализа.
В прошлой статье я дал определения типу и атрибуту. Напомню их:
- Тип – это выделение кучки (подмножества) из кучи (множества) и наделение объектов этой кучки уникальным именем — существительным.
- Атрибут разделяет кучу (множество) на кучки (подмножества) и наделяет объекты этих кучек разными прилагательными.
Это было определение типа и определение атрибута на основе анализа – мы делили кучу на части. Фактически, это было построение типа при помощи анализа. Теперь я покажу, как можно строить типы и атрибуты на основе синтеза.
Читать полностью »
Статическая и динамическая типизация
2016-08-25 в 8:21, admin, рубрики: haskell, javascript, python, Rust, динамическая типизация, Программирование, статическая типизация, тип данных, типизация, метки: тип, тип данныхЭта статья рассказывает о разнице между статически типизированными и динамически типизированными языками, рассматривает понятия "сильной" и "слабой" типизации, и сравнивает мощность систем типизации в разных языках. В последнее время наблюдается четкое движение в сторону более строгих и мощных систем типизации в программировании, поэтому важно понимать о чем идет речь когда говорят о типах и типизации.
Тип — это коллекция возможных значений. Целое число может обладать значениями 0, 1, 2, 3 и так далее. Булево может быть истиной или ложью. Можно придумать свой тип, например, тип "ДайПять", в котором возможны значения "дай" и "5", и больше ничего. Это не строка и не число, это новый, отдельный тип.
Статически типизированные языки ограничивают типы переменных: язык программирования может знать, например, что x — это Integer. В этом случае программисту запрещается делать x = true
, это будет некорректный код. Компилятор откажется компилировать его, так что мы не сможем даже запустить такой код. Другой статически типизированный язык может обладать другими выразительными возможностями, и никакая из популярных систем типов не способна выразить наш тип ДайПять (но многие могут выразить другие, более изощренные идеи).
Динамически типизированные языки помечают значения типами: язык знает, что 1 это integer, 2 это integer, но он не может знать, что переменная x всегда содержит integer.
Среда выполнения языка проверяет эти метки в разные моменты времени. Если мы попробуем сложить два значения, то она может проверить, являются ли они числами, строками или массивами. Потом она сложит эти значения, склеит их или выдаст ошибку, в зависимости от типа.Читать полностью »
Схема аргументов javascript функции или C-style прототипы без тяжёловесных фреймворков
2013-10-01 в 6:09, admin, рубрики: call, javascript, аргументы, Си, типизация, метки: c++, call, javascript, аргументы, Си, типизацияМногие сталкивались с необходимостью использовать необязательные аргументы функции. Если такой аргумент один, да ещё и последний, то особых проблем не возникает.
function set(name, value){
if(value == undefined){
value = name;
}
...
}