понедельник, 20 июня 2016 г.

Свойства. Дисциплинирующий

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

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

воскресенье, 19 июня 2016 г.

Свойства. Ошибкоустойчивый

Синтаксис и лексика языка должны быть такими, чтобы свести к минимуму вероятность трактовки программы с опечатками или забытыми знаками как корректной.

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

Ошибкоустойчивость важней однозначности. Для случаев ресурсоёмкой, сложной, или негарантированной диагностики ошибок в языке отдано предпочтение ловить ошибки с некоторой вероятностью, чем не ловить однозначно никогда.

Отладка как неотъемлемая часть процесса разработки должна найти соответствующее отображение в языке и инструментарии. В то же время она сама не должна служить источником дополнительных ошибок.

суббота, 18 июня 2016 г.

Свойства. Мощный

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

вторник, 14 июня 2016 г.

Свойства. Однозначный

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

Однозначность должна быть и в соответствии интуитивного понимания языка и его формальной семантики. Следует избегать положения, когда пользователь языка и воплотитель исполнителя языка рассуждали о нём в разных понятиях.

среда, 8 июня 2016 г.

Свойства. Простой

Полное описание языка*, не содержащее неоднозначных мест, должно быть по возможности кратким. В идеале, средний разработчик должен иметь возможность усвоить описание за один рабочий день.

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

* не следуеть путать описание языка и стандартной библиотеки

понедельник, 6 июня 2016 г.

Свойства. Простой для инструментария

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

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

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

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

Запутыватель логики(обфускатор) необходим как часть противодействия ряду атак, например, возвратно-ориентированного программирования. Учёт необходимости такой возможности позволит применять её более эффективно.

воскресенье, 5 июня 2016 г.

Свойства. Понятный

Язык должен быть простым, возможно, даже скучным. Он должен хорошо восприниматься разработчиком без требования к его длительной подготовке и изнурительного поддержания в форме. В нём не должно быть никаких подводных камней, никаких граблей, умением обходить которые могли бы гордиться адепты тайных знаний, ощущая своё превосходство перед новообращёнными.

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

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

Полное описание языка*, не содержащее неоднозначных мест, должно быть по возможности кратким. В идеале, средний разработчик должен иметь возможность охватить описание за один рабочий день.

* не следуеть путать описание языка и стандартной библиотеки

Свойства языка

Чтобы соответствовать званию языка для защищённого программирования, он должен обладать рядом свойств, соответствующих этой задаче. Каждое из них не уникально по отдельности, но вместе они придадут ему индивидуальности, что и обуславливает необходимость создания нового языка вместо использования существующих.

  1. Понятный
  2. Простой для разработчика
  3. Простой для инструментария
  4. Однозначный
  5. Ошибкоустойчивый
  6. Дисциплинирующий
  7. Мощный
  8. Эффективный
  9. Цельный
  10. Сопровождаемый

Введение

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

Важнейшим инструментом в руках программиста, способном существенно влиять на свойства приложений как в лучшую, так и худшую сторону, является язык программирования. И сейчас, в 21 веке по-прежнему широко используются языки, созданные десятилетия назад без современного уровня понимания и опыта для куда более скромных задач чем те, что ставятся сейчас. Это способствует появлению специфических ошибок в ПО, которых могло бы не быть при использовании более продуманных средств. Несмотря на многолетнее развитие старых языков, требование обратной совместимости обязало сохранить многочисленные недочёты и было закреплено в стандартах.

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

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

На мой взгляд, главным недостатком в целеполагании современных языков программирования является отсутствие приоритета возможности достижения корректности программы над другими свойствами.

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