Происхождение синтаксиса try/catch/finally
Вопрос для мастеров этимологии: какой язык программирования был первым, кто использовал синтаксис try/catch/finally, найденный в современных языках Java/.NET?
3 ответа
Я считаю, что это был C++, и я думаю, что Java/C# наконец добавлен для очистки ресурсов (наконец, не в C++). К сожалению, у меня нет ссылок... пока.
Удобная страница со всем синтаксисом исключений: http://en.wikipedia.org/wiki/Exception_handling_syntax
Я считаю, что это C++. Если нет, то Страуструпу нужно отдать должное. В своей статье: http://www.research.att.com/~bs/except.pdf Он не упоминает никаких влияний и не ссылается ни на какие другие материалы, кроме его собственного.
Написал в Твиттере Майк Файкс, поделился со мной Павел Капала:
MacLisp добавил функцию
ERR
, который сигнализирует об ошибке. ЕслиERR
вызывается в динамическом контекстеERRSET
форма, то аргументERR
возвращается как значениеERRSET
форма.Программисты вскоре начали использовать
ERRSET
а такжеERR
не для того, чтобы ловить и сигнализировать об ошибках, но для более общих целей управления (динамические нелокальные выходы). К сожалению, это использованиеERRSET
также тихо улавливал неожиданные ошибки, затрудняя отладку программ. Новая пара примитивов,CATCH
а такжеTHROW
был введен в MacLisp в июне 1972 годаERRSET
может быть зарезервировано для предполагаемого использования перехвата ошибок.Урок
ERRSET
а такжеCATCH
это важно. ДизайнерыERRSET
и позжеERR
имел в виду конкретную ситуацию и определил пару примитивов для решения этой ситуации. Но поскольку эти средства обеспечивали сочетание полезных и мощных возможностей (отслеживание ошибок и динамические нелокальные выходы), программисты начали использовать эти средства непреднамеренным образом. Затем дизайнерам пришлось вернуться и разделить желаемое на куски с альтернативными интерфейсами. Эта модель тщательного проектирования, непреднамеренного использования и последующего редизайна распространена в эволюции Lisp.
- из "Эволюции Лиспа" Гая Стила и Ричарда Габриэля
Источник: https://twitter.com/mfikes/status/881943130588753920
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">“The Evolution of Lisp,” by Guy Steele and Richard Gabriel</p>— Mike Fikes (@mfikes) <a href="https://twitter.com/mfikes/status/881950560508940288">July 3, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
C++ был первым основным языком программирования, который ввел исключения (наконец, не требуется в C++, потому что деструкторы детерминированы). Из статьи Страуструпа: http://www2.research.att.com/~bs/hopl2.pdf
наибольшее влияние на дизайн обработки исключений в C++ оказала работа над отказоустойчивыми системами, начатая в университете Ньюкасла в Англии Брайаном Ранделлом и его коллегами и продолжавшаяся во многих местах с тех пор
Common Lisp предшествовал C++ на долгое время и был основан на более ранних Lisp. Java, конечно же, была создана людьми Lisp, которые хорошо об этом знали. Но Java - это Лисп, загрязненный C, поэтому они также добавили чушь спецификации проверенных исключений.
Common Lisp пошел дальше и фактически позволил catch взаимодействовать с подпрограммой throw, в том числе указать, что throw должен продолжаться. Стек просто не раскручивали, пока не был сделан захват. Это означало, что вы могли выдавать предупреждения, например, о нехватке памяти, а также о сбоях.