Клу

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
Клу
Класс языка Объектно-ориентированный, процедурный
Тип исполнения Компилируемый
Появился в 1974
Автор Барбара Лисков
Расширение файлов .clu
Система типов

Строгая,

статическая
Основные реализации Portable Clu, NativeCLU, Клу-Эльбрус, clu2c
Испытал влияние Симула, Лисп, Паскаль
Повлиял на Ада, C++, Java, Sather, Lua
Сайт pmg.lcs.mit.edu/CLU.html

Клу (англ. Clu, CLU) — объектно-ориентированный язык программирования, одним из первых реализовавший концепцию абстрактных типов данных и парадигму обобщённого программирования. Создан группой учёных Массачусетского технологического института под руководством Барбары Лисков в 1974 году, широкого применения в практике не нашёл, однако многие его элементы использованы при создании таких языков, как Ада, C++, Java, Sather, Python, C#.

История

Систематические работы над созданием языка программирования, реализующего на синтаксическом уровне идеи абстракции данных, начаты весной 1973 года Барбарой Лисков и сотрудником исследовательской лаборатории IBM Стивом Зиллесом (Steve Zilles). В сентябре 1973 года вышла их совместная заметка[1], где описана предварительная версия такого паскалеподобного языка, в ней фигурирует такая отличительная особенность будущего языка как кластеры[⇨]; на основе этой заметки подготовлен доклад на конференции SIGPLAN[англ.] по сверхвысокоуровневым языкам 1974 года[2]. К концу 1973 года Лисков и Зиллес уже определились с наименованием будущего языка: название «Clu» было выбрано от первых трёх букв английского слова cluster[3]. В качестве оппонента привлекался Остин Хендерсон (Austin Henderson).

В декабре 1973 года в лаборатории информатики Массачусетского технологического института при поддержке Национального научного фонда и DARPA начаты работы по созданию языка, руководила группой Лисков, на начальных стадиях над языком активно работал Зиллес, на постоянной основе в группе трудились три аспиранта — Расс Аткисон (Russ Atkinson), Крейг Шафферт (Craig Schaffert) и Алан Снайдер (Alan Snyder), периодически к работе подключались также студенты и сотрудники института. Все работы велись на машинах PDP-10.

Лисков выделила 7 ключевых принципов языка: строгий фокус на абстракцию данных (отказ от глубокой проработки возможностей, напрямую не связанных с абстракцией данных), минимализм, простота, выразительность средств, унификация (встроенные типы не должны отличаться от типов, определяемых программистом), безопасность и высокая производительность[4]. В соответствии с этими принципами в реализации избраны такие решения, как отказ от перечисляемых типов, параллельное присваивание, статическая типизация, проверка типов на этапе компиляции, сборка мусора на этапе выполнения. В 1974 году был реализован первый компилятор языка, выпускавший код на Лиспе, позднее компилятор переписан под генерацию программ на диалекте Лиспа MDL[англ.], имевшем более богатый набор встроенных структур данных и проверку типов на этапе компиляции. Первая реализация языка 1974 года называлась CLU .5, в ней поддерживались основные конструкции абстракции данных, но пока ещё не были реализованы обработка исключений[⇨] и итераторы[⇨], а реализация параметризованных типов требовала динамической проверки типов в среде выполнения. В 1975 году был в основном спроектирован механизм обработки исключений.

К 1976 году все ключевые элементы языка были реализованы, в 1977 году написан первый компилятор, генерировавший код на ассемблере. Компилятор создавался на самом языке Клу, чем должен был продемонстрировать выразительность средств языка. Построение компилятора, порождающего высокопроизводительные программы, потребовало создания специальной среды выполнения, реализующей сборку мусора, отладку, особые техники отработки исключений и поддержки итераторов. В 1979 году проектирование языка завершено[5], в 1980 году выпущен полноценный компилятор для PDP-10, несколько позднее реализованы компиляторы для MC68000 и VAX. Трудозатраты на создание языка оценены в 14 человеко-лет[6].

В середине 1980-х годов компилятор Клу реализован для советских суперкомпьютеров «Эльбрус», язык был отобран среди прочих кандидатов (Ады, Модулы-2, Симулы) как наиболее целостно воплощающий концепцию абстрактных типов данных, при этом достаточно простой в реализации[7]. В 1989 году выпущен компилятор для SPARC под управлением SunOS.

В начале — середине 1990-х годов был создан компилятор clu2c, генерирующий кроссплатформенный код на Си, а также несколько версий Portable Clu со сборками для Linux, NetBSD, Mac OS, Windows NT, Digital Unix (на Alpha), но практический интерес к языку существенно снизился, и с конца 1990-х годов реализации фактически не развивались, а новое программное обеспечение на Клу не разрабатывалось.

Барбара Лисков стала лауреатом премии Тьюринга 2008 года, в номинации проектирование языка Клу и создание серии эффективных компиляторов для него отмечены как фундаментальный вклад в информатику, доказавший практическую осуществимость идей абстракции данных и превративший теоретическую концепцию в общепризнанный в индустрии программирования подход[8].

Кластеры

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

Начальный фрагмент описания кластера полиморфного списка (с операциями в лисп-нотации):

list = cluster [t: type] is create, car, cdr, cons, elems
  rep = array [t]
  create = proc () return (cvt) % создание списка
             return (rep$new ())
           end create;
  car    = proc (l:cvt) return (t) signals (empty) % получение первого элемента списка
             if rep$empty (l)
               then signal empty
               else return (rep$bottom(l))
             end
           end car;
  % другие операции
end list

В определении кластера указывается спецификация — набор операций над типом, определяется внутреннее представление (rep) и описывается реализация операций. Используются такие конструкции, как преобразование типа из внутреннего представления в объектное и обратно (cvt), $-нотация для доступа к операциям типа. Создание реализации кластера и его экземпляра реализуется указанием конкретного типа:

lint = list [int]; % список целых чисел
l:lint := lint$create(); % создание экземпляра списка
l := lint$cons(1, lint$cons (2, lint$cons(3, l))) % конструирование списка

Встроенные типы также реализуются как кластеры[9]. В отличие от определяемых в программном коде кластеров, никакая операция над базовыми встроенными типами данных Клу (int, real, bool, null, char, string) не может изменить структуру и значение объекта (всякий раз создаётся новый экземпляр объекта с зафиксированным соответствующим состоянием). Но в стремлении к унификации доступ к операциям над встроенными типами доступен в кластерной нотации: int$add(n1,n2) складывает n1 с n2, string$fetch(s,i) обеспечивает доступ к i-му символу строки s, а string$concat(s1,s2) конкатенирует строки s1 и s2, притом реализован синтаксический сахар, обеспечивающий сокращённую запись таких операций: n1+n2, s[i] и s1||s2 соответственно, который распространяется на одноимённые операции (add, fetch, concat), вводимые в определяемых разработчиком кластерах.

Как полиморфные кластеры реализованы встроенные композитные типы, называемые в Клу «генераторами типов» — массивы, последовательности, записи, структуры (постоянные записи), объединения, варианты[англ.][10].

Итераторы

Одной из ключевых новаций языка стало введение абстракции управления — итератора. Идея итератора в том, чтобы обеспечить обобщённую реализацию доступа к элементам абстрактного типа данных вне зависимости от его параметризации и внутренней структуры. Пример итератора полиморфного списка:

elems = iter (l:cvt) yields (t)
         for elt:t in rep$elements(l) do
           yield (elt)
         end
        end elems

Вызов такого итератора:

for i:int in lint$elems(l) do
  writeint (i)
end

Применение итератора позволяет исключить использование явных счётчиков цикла в условиях, когда заранее неизвестна конкретная реализация типа данных.

Идея итератора, построенного по принципу сопрограммы, была впоследствии заимствована в таких языках, как Icon, Sather[англ.], Python, Ruby, C# (начиная с версии 2.0)[11].

Обработка исключений

В Клу реализована структурная обработка исключений, исключительные ситуации в языке подразделяются на статические и динамические, первые используются для завершения исполнения блока в пределах одного программного блока (вызываются оператором exit s(x1, …, xn)), вторые — завершают выполнение программы (вызываются оператором signal s(x1, …, xn)). В обоих случаях обработка исключительной ситуации выполняется программным блоком, начинаемым ключевым словом except, если статическое исключение не обработано в текущем блоке, то оно передаётся в следующий; исключения, не обработанные в программе прерывают её выполнение с выдачей соответствующих сообщений. Исключения, которые может генерировать процедура, задаются в её спецификации, исключения рассматриваются как альтернативный выход из процедуры, то есть, процедура должна передать на выход заявленное в спецификации значение при помощи оператора return, либо выдать одно из заявленных в спецификации исключений при помощи операторов signal или resignal (вызывается в блоке except для повторения вызывавшего исключения) с соответствующими параметрами. Во встроенных типах реализованы стандартные исключения.

При проектировании механизма исключений были заимствованы решения из ПЛ/1 и Mesa[англ.], но используемая в них модель возобновления исключений существенно упрощена и структурирована[12], и важным нововведением стала возможность передачи параметров исключений.

Примечания

  1. Barbara Liskov, Steve Zilles. An Approach to Abstraction (англ.) // Computation Structures Group Memo. — 1973. — Vol. 88.
  2. Barbara Liskov, Stephen Zilles. Programming with Abstract Data Types (англ.) // Proceedings of the ACM SIGPLAN symposium on Very high level languages. — N. Y.: ACM, 1974. — Vol. 9. — P. 50–59. — doi:10.1145/800233.807045. Архивировано 22 декабря 2012 года.
  3. Лисков, 1992, «CLU was chosen as the name of the language in the fall of 1973. The name was selected because it is the first three letters of „cluster.“», p. 3.
  4. Лисков, 1992, p. 8.
  5. Лисков, 1992, «We did a final pass at the language design during 1979», p. 22.
  6. Лисков, 1992, p. 21.
  7. Сафонов, 1989, с. 194.
  8. ACM Turing Award Goes to Creator of Influential Innovations in Computer Software Design. MIT’s Liskov Pioneered the Standard for Modern Programming Language and Software Reliability (англ.). Turing Award. ACM (10 марта 2009). — ««Liskov designed the CLU programming language, an object-oriented language incorporating „clusters“ to provide coherent, systematic handling of abstract data types, which are comprised of a set of data and the set of operations that can be performed on the data. She and her colleagues at MIT subsequently developed efficient CLU compiler implementations on several different machines, an important step in demonstrating the practicality of her ideas. Data abstraction is now a generally accepted fundamental method of software engineering that focuses on data rather than processes, often identified as „modular“ or „object-oriented“ programming»». Дата обращения: 30 ноября 2012. Архивировано 16 января 2013 года.
  9. Сафонов, 1989, с. 198.
  10. Сафонов, 1989, с. 201—207.
  11. Jed Liu, Aaron Kimball, Andrew C. Myers. Interruptible Iterators (англ.) // POPL ’06 Conference record of the 33rd ACM SIGPLAN-SIGACT symposium on Principles of programming languages. — N. Y.: ACM, 2006. — Vol. 1 (41). — P. 283—294. — ISBN 1-59593-027-2. — doi:10.1145/1111037.1111063.
  12. Лисков, 1992, p. 16.

Литература

  • Барбара Лисков, Джон Гатэг. Использование абстракций и спецификаций при разработке программ. — М.: Мир, 1989. — 424 с. — ISBN 5-03-000489-0.
  • Владимир Сафонов. Язык программирования Клу и система Клу-Эльбрус // Языки и методы программирования в системе «Эльбрус». — М.: Наука, 1989. — С. 189—242. — 389 с. — ISBN 5-02-013983-1.
  • Barbara Liskov, Russell Atkinson, Toby Bloom, Eliot Moss, J. Craig Schaffert, Robert Scheifler, Alan Snyder. CLU Reference Manual (англ.) / edited by G. Goos, J. Hartmanis. — Berlin — Heidelberg — New York: Springer-Verlag, 1981. — 190 p. — (Lecture Notes in Computer Science[англ.], vol. 114). — ISBN 3-540-10836-X.
  • Barbara Liskov. A History of CLU (англ.). History of programming languages (1 апреля 1992). doi:10.1145/234286.1057826. Дата обращения: 30 ноября 2012. Архивировано 16 января 2013 года.