Клу

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Клу
Класс языка:

Объектно-ориентированный, процедурный

Тип исполнения:

Компилируемый

Появился в:

1974

Автор(ы):

Барбара Лисков

Расширение файлов:

.clu

Система типов:

Строгая, статическая

Основные реализации:

Portable Clu, NativeCLU, Клу-Эльбрус, clu2c

Испытал влияние:

Симула, Лисп, Паскаль

Повлиял на:

Ада, C++, Java, Sather

Сайт:

http://www.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» было выбрано от первых трёх букв отличительной особенности будущего языка — кластеров (clusters)[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), но практический интерес к языку существенно снизился, и реализации фактически не развиваются, программное обеспечение на Клу не разрабатывается.

Барбара Лисков стала лауреатом премии Тьюринга 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. — Т. 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. — Т. 9. — С. 50–59. — DOI:10.1145/800233.807045
  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. Сафонов, 1988, с. 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 March 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. — Т. 1 (41). — С. 283—294. — ISBN 1-59593-027-2. — DOI:10.1145/1111037.1111063
  12. Лисков, 1992, p. 16

Литература[править | править вики-текст]