Язык программирования ECL и Система была расширяемым языком программирования высокого уровня и средой разработки, разработанной в Гарвардском университете в 1970-х. Название «ECL» расшифровывалось как «Extensible Computer Language» или «EClectic Language». Некоторые публикации использовали название «ECL» для всей системы и «EL / 1» (расширяемый язык) для самого языка.
ECL была интерактивной системой, в которой программы были представлены внутри системы; был совместимый компилятор и интерпретатор. У него был синтаксис, подобный АЛГОЛу, и система расширяемого типа данных с типами данных первоклассных граждан. Объектами данных были значения, а не ссылки, и соглашения о вызовах давали выбор между вызовом по значению и вызовом по ссылке для каждого аргумента.
ECL в основном использовался для исследований и обучения в области проектирования языков программирования, методологии программирования (в частности, программирования с помощью трансформационного уточнения ) и среды программирования в Гарварде, хотя говорят, что они также используются в некоторых правительственных учреждениях. Впервые он был реализован на PDP-10, а более поздняя (только интерпретируемая) реализация на PDP-11 была написана в BLISS -11 и перекрестно составлен на ПДП-10.
Процедура ECL для вычисления наибольшего общего делителя двух целых чисел в соответствии с алгоритмом Евклида может быть определена как следует:
1 gcd <- 2 EXPR(m:INT BYVAL, n: INT BYVAL; INT) 3 BEGIN 4 DECL r:INT; 5 REPEAT 6 r <- rem(m, n); 7 r = 0 =>n; 8 m <- n; 9 n <- r; 10 END; 11 END
Это присвоение процедурной константы переменной gcd
. Строка
EXPR (m: INT BYVAL, n: INT BYVAL; INT)
указывает, что процедура принимает два параметра типа INT
с именем m
и n
и возвращает результат типа INT
. (Типы данных называются режимами в ECL.) Класс связывания BYVAL
в каждом объявлении параметра указывает, что этот параметр передается по значению. Вычислительные компоненты программы ECL называются формами. Некоторые формы напоминают выражения других языков программирования, а другие - утверждения. Выполнение формы всегда дает значение. Конструкция REPEAT
... END
является формой цикла. Выполнение конструкции
r = 0 =>n
, когда форма r = 0
оценивается как TRUE
, вызывает завершение выполнения цикла со значением n
. Значение последнего оператора в форме блока (BEGIN
... END
) становится значением формы блока. Значение формы в объявлении процедуры становится результатом вызова процедуры.
В дополнение к классу связывания BYVAL
, ECL имеет классы связывания SHARED
, LIKE
, UNEVAL
, и В СПИСКЕ
. Bind-class SHARED
указывает, что параметр должен быть передан по ссылке. Bind-class LIKE
вызывает передачу параметра по ссылке, если возможно, и по значению, если нет (например, если фактический параметр является чистым значением, или переменная, к которой должно применяться преобразование типа). Bind-class UNEVAL
указывает, что абстрактное синтаксическое дерево для фактического параметра должно быть передано формальному параметру; это дает программистам исключительную гибкость при изобретении собственных нотаций со своей собственной семантикой оценки для определенных параметров процедуры. Класс привязки LISTED
аналогичен UNEVAL
, но предоставляет возможности, аналогичные функциям varargs в C : LISTED
bind-class может появляться только в последнем формальном параметре процедуры, и этот формальный параметр привязан к списку представлений абстрактного синтаксического дерева, по одному для каждого оставшегося фактического параметра. ECL имеет встроенную функцию EVAL
для оценки абстрактного синтаксического дерева ; в качестве альтернативы существуют функции, с помощью которых программисты могут исследовать узлы абстрактного синтаксического дерева и обрабатывать их в соответствии со своей собственной логикой.
PISEL = Труды международного симпозиума по расширяемым языкам, Гренобль, Франция, 1971, опубликованные в ACM SIGPLAN Notices 6 : 12, декабрь 1971 г.