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