Hamilton C shell — это клон Unix C shell и утилит [1] [2] для Microsoft Windows, созданный Николь Гамильтон [3] в Hamilton Laboratories как полностью оригинальная работа, не основанная на каком-либо предыдущем коде. Впервые он был выпущен на OS/2 12 декабря 1988 года [4] [5] [6] [7] [8] [9] и на Windows NT в июле 1992 года. [10] [11] [12] Версия OS/2 была прекращена в 2003 году, но версия Windows продолжает активно поддерживаться.
Оболочка Hamilton C отличается от оболочки Unix C в нескольких отношениях. К ним относятся архитектура компилятора , использование потоков и решение следовать соглашениям Windows, а не Unix. [8] [9]
Оригинальная оболочка C использует специальный парсер. Это привело к жалобам на его ограничения. Он работает достаточно хорошо для тех вещей, которые пользователи вводят интерактивно, но не очень хорошо для более сложных команд, которые пользователь может потратить время на написание в скрипте. Например, невозможно передать вывод оператора foreach в grep . Существовало ограничение на то, насколько сложную команду он мог обработать. [13]
Напротив, Hamilton использует нисходящий рекурсивный синтаксический анализатор , который позволяет ему компилировать операторы во внутреннюю форму перед их запуском. [1] [8] В результате операторы могут быть вложены или конвейеризированы произвольно. [6] Язык также был расширен встроенными и определяемыми пользователем процедурами, локальными переменными, плавающей точкой и дополнительными выражениями, операторами редактирования и подстановки, включая конструкцию подстановочных знаков «неопределенный каталог», записанную как « ...
», которая соответствует нулю или более уровням каталогов, как требуется для соответствия остальной части шаблона. [14]
Не имея fork или высокопроизводительного способа воссоздать эту функциональность, Hamilton вместо этого использует возможности потоков Windows . [6] [8] Когда создается новый поток, он запускается в том же пространстве процесса и разделяет все состояние процесса. Если один поток изменяет текущий каталог или содержимое памяти, это изменяется для всех потоков. Гораздо дешевле создать поток, чем процесс, но между ними нет изоляции. Чтобы воссоздать отсутствующую изоляцию отдельных процессов, потоки кооперируются для совместного использования ресурсов с помощью блокировок . [15]
Hamilton отличается от других оболочек Unix тем, что он также напрямую поддерживает соглашения Windows для букв дисков , косых черт в именах файлов , экранированных символов и т. д. [9]