Алексей Махоткин

домашняя страница

Критика Standard ML — безопасность

Andrew W. Appel, «Критика Standard ML»

«Некоторые ошибки программирования не всегда могут быть обнаружены [компилятором], и нужно, чтобы их можно было бы легко обнаружить на этапе выполнения; ни в коем случае не следует позволять им привести к результатам, которые зависят от машины или от реализации и которые нельзя выразить в терминах языка. Этот критерий я называю безопасностью.» Ч. А. Р. Хоар, 1973

Одна из самых приятных вещей в ML заключается в том, что он безопасен: программа не может повредить среду выполнения так, что её последующее исполнение будет противоречить семантике языка (Я благодарен руководству по языку Modula-3 за эту формулировку). Нельсон делит языки программирования на три генеалогические категории: семья BCPL, включающая C и C++, состоящая из небезопасных языков; семья Algol, включающая Pascal и Ada, состоящая из почти безопасных языков; и семья «наследников математики», включающая Lisp, ML, Smalltalk и CLU, которые являются безопасными (за исключением случаев, когда Lisp-программисты отключают проверку типов во время исполнения, потому что она слишком дорого обходится). Конечно же, есть еще языки FORTRAN и COBOL, которые не входят ни в одну из этих категорий.

В безопасном языке все ошибки, которые могут привести к «крушению» программы (вызвать поведение, необъяснимое в терминах исходного языка) обнаруживаются на стадии компиляции или на стадии выполнения. (В ML все, что обнаружено на стадии выполнения, считается «исключением», а не «ошибкой»; исключениями являются такие события, как арифметическое переполнение, ошибка доступа к массиву, а также попытка обратиться к первому элементу пустого списка.) Из-за этого становится значительно проще рассуждать о поведении программы: если выражение использует первый элемент a списка l, то мы можем быть уверены, что l — это на самом деле список, а не неправильно понятое целое число. Более того, большой класс ошибок выделения памяти, обычный для небезопасного языка, просто невозможен в ML.

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

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

Comments