Происхождение синтаксиса 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>&mdash; 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 должен продолжаться. Стек просто не раскручивали, пока не был сделан захват. Это означало, что вы могли выдавать предупреждения, например, о нехватке памяти, а также о сбоях.

Другие вопросы по тегам