Кто придумал метод обработки ошибок /try/catch [/finally]?
Мои вопросы носят скорее исторический характер, чем практический:
- Кто его придумал?
- Какой язык использовал его первым (и в какой степени)?
- Какова была первоначальная идея, лежащая в основе концепция (какие актуальные проблемы должны были быть решены в эти дни, приветствуются документы)?
- Является система условий LISPs предком текущей обработки исключений?
Ответы
Ответ 1
Сегодня Common Lisp система условий является относительным новичком. Дизайн был основан на предыдущих системах, но не был включен как часть общего языка Lisp до конца 80 вокруг времени CLTL2
Я считаю, что в главе условий в этой книге есть большой комментарий к истории и предыстории дизайна, а также ссылки на соответствующие исследования и предыдущие реализации подобных систем.
Ответ 2
У процессоров VAX была система обработки исключений на основе стека. В каждом кадре вызова одна 32-битная ячейка была выделена и заполнена нулем. Если вызываемая подпрограмма требует обработки исключений, все, что ей нужно было сделать, это заполнить эту ячейку адресом процедуры обработки исключений.
Когда произошло исключение, произойдет поиск стека. Это было легко, так как фреймы стека были соединены вместе. Первый стек стека с ненулевой записью приведет к тому, что стек перейдет в эту точку, и обработчик исключений будет вызван.
Я помню это как одну из особенностей процессора, которые были нацелены на языки более высокого уровня, но я не знаю, что был язык более высокого уровня, который использовал эту функцию. Я считаю, что он использовался библиотечным кодом, который, вероятно, был написан на ассемблере.
Ответ 3
Не вернется ли функция setjmp, longjmp в C? Ричи, Керниган и др.