XL (язык программирования) - XL (programming language)

XL
ПарадигмаМультипарадигма: концептуально ориентированный, императив, функциональный
РазработаноКристоф де Динешин
РазработчикКристоф де Динешин
Впервые появился2000
Стабильный выпуск
0.1 / февраль 2010 г.; 10 лет назад (2010-02)
Печатная дисциплинасильный
Операционные системыUnix-подобный
ЛицензияGPLv2
Интернет сайтXLR.sf.сеть
Под влиянием
Ада, C ++

XL («Расширяемый язык») - первый и пока единственный компьютер язык программирования разработан для поддержки концептуального программирования.[1]

XL имеет изменяемый программистом синтаксис и семантику. Компилятор плагины можно использовать для добавления новых функций к языку. Базовый набор плагинов реализует относительно стандартный повелительный язык. Программисты могут писать свои собственные плагины для реализации специфичных для приложений обозначений, таких как символическая дифференциация, которые затем можно использовать так же легко, как и встроенные языковые функции.

Язык

XL определяется на четырех разных уровнях:

  • XL0 определяет, как вводимый текст преобразуется в дерево синтаксического анализа.
  • XL1 определяет базовый язык с функциями, сопоставимыми с C ++.
  • XL2 определяет стандартную библиотеку, которая включает общие типы данных и операторы.
  • XLR определяет динамическую среду выполнения для XL на основе XL0.

XL не имеет примитивные типы ни ключевые слова. Все полезные операторы и типы данных, такие как целые числа или сложение, определены в стандартной библиотеке (XL2). XL1 - это портативный между разными средами исполнения. На XL2 такой гарантии нет: если конкретный ЦПУ не реализует умножение с плавающей запятой, соответствующее определение оператора может отсутствовать в стандартной библиотеке, а использование умножения с плавающей запятой может привести к время компиляции ошибка.

В Привет, мир программа в формате XL выглядит так:

  использовать XL.TEXT_IO  WriteLn "Привет, мир"

Альтернативной формой в стиле, более подходящем для крупномасштабных программ, будет:

 import IO = XL.TEXT_IO IO.WriteLn "Hello World"

Рекурсивная реализация факториал в XLR выглядит так:

 0! -> 1 Н! -> N * (N-1)!

Синтаксис

Синтаксис определяется на уровне XL0. Фаза XL0 компилятора может быть настроена с помощью файла описания синтаксиса, в котором определены такие свойства, как текстовое представление и приоритет операторов. Базовый файл синтаксиса определяет общие математические обозначения, такие как + для сложения, с обычно принятыми порядок действий.

Дерево синтаксического анализа состоит из 7 типов узлов, 4 листовой узел типы (целые, вещественные, текстовые и символьные) и 3 внутренний узел типы (инфиксный, префиксный и блочный).

  • целое число узлы представляют собой целое число буквальный, Такие как 2. В # можно использовать знак, чтобы указать основание, отличное от 10, как в (2#1001). Разделительное подчеркивание может использоваться для улучшения читаемости, как в 1_000_000.
  • настоящий узлы представляют собой нецелые числа, например 2.5. Можно использовать обозначения на основе и разделители, как для целочисленных узлов, например 16 # F.FFF # E-10 - действительный настоящий литерал.
  • текст узлы представляют текстовое содержимое. Обычно они заключаются в простые или двойные кавычки, например "Привет" или же 'а', но файл синтаксиса можно использовать для добавления других разделителей, в том числе для многострочного текстового содержимого.
  • символ узлы представляют имена или операторы. Имена представляют собой последовательность буквенно-цифровых символов, начинающуюся с буквы, например Привет. XL0 сохраняет регистр, но XL1 игнорирует регистр и подчеркивания, так что Джон Доу и Джон Доу одно и то же имя. Операторы - это последовательности не буквенно-цифровых символов, например * или же =/=.
  • инфикс узлы представляют собой два узла, связанных инфиксным символом, например А + 1 или же 2 и 3. В частности, инфиксные узлы используются для разделения строк с помощью инфиксного символа «новая строка».
  • префикс узлы представляют собой два последовательных узла, например Напишите "Привет". Он также используется для постфиксных обозначений, таких как 3! или же Открыть?.
  • блокировать узлы представляют собой узел, окруженный символами группировки, например (А), [Индекс]. Отступ внутри представлен блочным узлом.

Для файла синтаксиса по умолчанию следующий допустимый XL0 независимо от какой-либо семантики.

A = B + «Привет»

Он разбирается как:

инфикс ("=", символ ("A"), инфикс ("+", символ ("B"), текст ("Привет")))

Семантика XL1

Фаза XL1 определяется как последовательность операций с деревом синтаксического анализа XL0. Эти операции предоставляются различными надстройками компилятора, которые запускаются в зависимости от формы дерева синтаксического анализа.

Специальные конструкции, переведите и перевод, предоставляются подключаемым модулем, предназначенным для облегчения написания других подключаемых модулей. В Цитировать конструкция генерирует дерево синтаксического анализа. Вот как эти обозначения можно использовать для реализации подключаемого модуля под названием ZeroRemoval что исключает лишние сложения и умножения на ноль.

перевод ZeroRemoval, когда 'X' + 0, затем вернуть X, когда 'X' * 0, затем вернуть parse_tree (0)

Подключаемый модуль может быть вызван для всего файла из командной строки или более локально в исходном коде с помощью прагма обозначения следующим образом:

X: = {Дифференцировать} d (sin (omega * T) * exp (-T / T0)) / dT

Фаза XL1 содержит большой набор плагинов, в частности XLSemantics, которые предоставляют общие абстракции, такие как подпрограмма, тип данных и Переменная декларация и определение, а также основные структурное программирование операторы, такие как условные выражения или циклы.

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

Проверка типа XL1 статический, с общее программирование возможности, превосходящие возможности языков вроде Ada или C ++. Типы, такие как массивы или указатели, которые являются примитивными в таких языках, как C ++, объявлены в библиотеке в XL. Например, одномерный массив можно определить следующим образом:

 общий [Элемент : тип; Размер : целое число] тип множество

А проверенный универсальный тип - это универсальный тип, где условие указывает, как этот тип может использоваться. Такие типы не обязательно должны иметь общие параметры. Например, можно объявить тип упорядоченный если он имеет следующий оператор «меньше»:

// Тип упорядочивается, если он имеет упорядоченный тип меньше, чем родственный, если A, B: упорядоченный Test: boolean: = A 

Затем можно объявить неявно универсальную функцию, поскольку тип упорядоченный сам по себе является универсальным.

// Универсальная функция для минимум одного элемента function Min (X: order) return order is ... вычислить Y типа упорядоченный ... return Y

Это также относится к универсальным типам, которые имеют параметры, например множество. Функцию, вычисляющую сумму элементов в любом массиве, можно записать следующим образом:

 функция Сумма(А : множество) возвращаться множество.Элемент является   за я в 0..множество.Размер-1 петля     результат += А[я]

Списки аргументов типобезопасных переменных

Функции могут быть перегружен. Функцию можно объявить для использования переменного числа аргументов, используя ... в списке параметров (исторически ключевое слово Другой был использован для этой цели). В такой функции ... может использоваться для передачи переменного количества аргументов в другую подпрограмму, функция теперь называется Вариативные шаблоны:

// Общая функция для минимума из N элементов function Min (X: orders; ...) return order is result: = Min (...) if X 

Когда такая функция вызывается, компилятор рекурсивно создает экземпляры функций для соответствия списку параметров:

// Примеры использования только что объявленного Min X: real: = Min (1.3, 2.56, 7.21) Y: integer: = Min (1, 3, 6, 7, 1, 2)

Сокращение выражений: перегрузка оператора

Операторы могут быть определены с помощью написано форма объявления функций. Ниже приведен код, объявляющий добавление целых чисел:

 функция Добавлять(Икс, Y: целое число) возвращаться целое число написано Икс+Y

Такой письменные формы может иметь более двух параметров. Например, матричное линейное преобразование можно записать как:

 функция Линейный(А, B, C : матрица) возвращаться матрица написано А+B*C

Письменная форма может использовать константы, и такая форма более специализирована, чем форма без констант. Например:

 функция Равный(А, B : матрица) возвращаться логический написано А=B функция Нулевой(А : матрица) возвращаться логический написано А=0 функция IsUnity(А : матрица) возвращаться логический написано А=1

Механизм используется для реализации всех основных операторов. Выражение постепенно сокращается до вызовов функций с использованием письменных форм. По этой причине механизм упоминается как уменьшение экспрессии а не перегрузка оператора.

Итераторы

Итераторы XL позволяют программистам реализовать оба генераторы и итераторы.

импорт IO = XL.UI.CONSOLEитератор IntegerIterator (вар из Прилавок : целое число; Низко высоко : целое число) написано Прилавок в Низко высоко является    Счетчик: = Низкий пока Счетчик <= Высокий петля        урожай        Счетчик + = 1// Обратите внимание, что меня не нужно объявлять, потому что в итераторе объявлено 'var out'// Поэтому здесь делается неявное объявление I как целого числаза я в 1..5 петля    IO.WriteLn "I =", I

Статус и история развития

XL - это результат долгой работы над языковым дизайном, которая началась примерно в 1992 году. Язык был разработан и реализован в основном Кристоф де Динешин.

Исторически компилятор XL был написан на C ++. Он достиг точки, в которой большинство функций, описанных выше, работали правильно, но написание плагинов было кошмаром, потому что сам C ++ не расширяем, поэтому реализация переведитеподобных высказываний было невозможно. Дерево синтаксического анализа было более сложным, с десятками типов узлов, поскольку оно было разработано для межъязыковой поддержки. Moka был расширяемым компилятором Java-to-Java, использующим ту же инфраструктуру.

Отказавшись от межъязыковых целей и сложной структуры дерева синтаксического анализа, полностью переписать компилятора был запущен в 2003 году. Дерево синтаксического анализа было значительно упрощено до семи типов узлов XL0, используемых в настоящее время. Этот новый компилятор загруженный в 2004 году, и все новые разработки теперь пишутся на XL. Однако этот новый компилятор по-прежнему имеет неполную поддержку XL1, хотя в некоторых областях его возможности уже превосходят C ++.

Происхождение

XL1 был вдохновлен большим количеством других языков. В алфавитном порядке:

  • Ада вдохновил на крупномасштабную поддержку программы, Обработка исключений, постановка задач и возможности поддержки.
  • БАЗОВЫЙ более современные варианты, в которых отсутствуют номера строк и поддерживают структурированное программирование, показали, насколько простым может быть синтаксис языка программирования.
  • C использовался как стандарт, ожидаемый с точки зрения поддержки на уровне исполнения и на уровне компьютера. XL не требует для работы виртуальной машины.
  • C ++ и стандартная библиотека шаблонов продемонстрировал необходимость хорошей поддержки универсальных типов, включая неявное создание экземпляров универсальных типов (чего в Аде нет).
  • Фортран Постоянное превосходство в производительности над C и C ++ для приложений с большим количеством вычислений помогло определить, какие языковые конструкции могут помешать полезной оптимизации.
  • Ява продемонстрировали важность большой переносимой библиотеки поддержки. Контейнеры Java также продемонстрировали ограничения подхода, не основанного на общем программировании. Взаимодействие с кодом Java остается интересной проблемой для XL.
  • Лисп расширяемость считалась ключевым фактором его выживания и актуальности по сей день. Лисп был первым языком, который нормализовал объектно-ориентированные функции, несмотря на то, что он был разработан за много лет до изобретения объектно-ориентированных идей.
  • Пролог продемонстрировали, что альтернативные модели программирования иногда полезны и высокопроизводительны. Было сделано все возможное, чтобы надстройки в стиле Prolog могли быть написаны для XL.
  • Visual Basic показали, как представление дерева синтаксического анализа может быть отделено от его визуального представления. Мало кто редактирует формы VB в текстовом виде. Ожидается, что плагины времени редактирования XL когда-нибудь будут предоставлять аналогичные возможности, напрямую управляя деревом синтаксического анализа.

Семантика

XLR - это динамический язык, изначально предназначенный как серверная часть для компилятора XL1, отсюда и название, которое расшифровывается как среда выполнения XL. Он разделяет базовый синтаксис XL0 с XL1, но его поведение намного ближе к функциональному языку, тогда как XL1 призван в основном выглядеть как императивный язык. XLR имеет практически только один встроенный оператор «->», который обозначает перезапись. Обозначение слева от перезаписи преобразуется в обозначение справа от перезаписи.

Этот механизм используется для реализации стандартных обозначений:

  если истинный тогда TrueBody еще FalseBody -> TrueBody  если ложный тогда TrueBody еще FalseBody -> FalseBody

В языке программирования XL используется подход к программированию, в котором основное внимание уделяется тому, как концепции, которые живут в голове программиста, переводятся в представления которые находятся в код Космос.

Псевдо-метрики

Концептуальное программирование использует псевдо-метрики оценить качество кода. Они называются псевдометриками, потому что они связывают пространство понятий и пространство кода с четким пониманием того, что пространство понятий не может быть формализовано достаточно строго для определения реальной метрики. Псевдо-метрики концептуального программирования включают:

  • Синтаксический шум измеряет расхождения между понятием и синтаксисом, используемым для его представления. Например, точка с запятой в конце операторов в C можно рассматривать как синтаксический шум, потому что он не имеет эквивалента в пространстве понятий.
  • Семантический шум измеряет несоответствия между ожидаемым значением или поведением концепции и ее фактическим значением или поведением в коде. Например, тот факт, что целые типы данных переполняются (когда математические целые числа этого не делают), является формой семантического шума.
  • Пропускная способность измеряет, какую часть концептуального пространства может представлять данная конструкция кода. Например, перегруженный оператор сложения в C имеет более высокую пропускную способность, чем оператор Добавлять инструкции на языке ассемблера, поскольку оператор C может представлять сложение чисел с плавающей запятой, а не только целых чисел.
  • Соотношение сигнал / шум измеряет, какая часть пространства кода используется для представления реальных концепций, а не информации о реализации.

Правило эквивалентности, анализ эквивалентности

В правило эквивалентности проверяется, когда поведение кода соответствует исходной концепции. Эта эквивалентность может нарушиться во многих случаях. Целочисленное переполнение нарушает эквивалентность между математической концепцией целых чисел и компьютеризированной аппроксимацией концепции.

Многие способы нарушить эквивалентность получили определенные названия, потому что они очень распространены:

  • А ошибка домена это условие, при котором код выполняется за пределами область эквивалентности, это область, в которой совпадают концепция и реализация. Целочисленное переполнение - пример ошибки домена.
  • А концептуальный состав (также переработка концепции или же переработка концепции) является переписыванием концепции как другой концепции, потому что исходная концепция не может быть представлена ​​инструментами. В C использование указателей для выходных аргументов, поскольку C явно не поддерживает выходные аргументы, является примером приведения концепции.
  • А инверсия приоритета это форма синтаксического или семантического шума, вносимая каким-то общим правилом, установленным языком. Это называется инверсией приоритета, потому что язык имеет приоритет над концепцией. В Болтовня, все является объектом, и это правило приводит к нежелательным последствиям: выражение типа 2 + 3 * 5 не подчиняется обычному порядок действий (Smalltalk интерпретирует это как отправку сообщения * на число, полученное в результате 2 + 3, что дает результат 25 вместо 17).

Методология

Для написания кода концептуальное программирование рекомендует следующие шаги:

  1. Определите и определите соответствующие концепции в пространстве концепций.
  2. Определите традиционные обозначения для концепций или придумайте удобные для использования обозначения.
  3. Определите комбинацию программных конструкций, которая позволяет удобно представлять концепции в коде - это включает поиск обозначения кода, которое максимально соответствует обозначению, определенному на предыдущем шаге.
  4. Напишите код, максимально сохраняющий ожидаемое поведение и семантику соответствующих аспектов исходной концепции.

Многие инструменты программирования часто не обладают способностями к записи, поэтому концептуальное программирование иногда требует использования препроцессоры, предметно-ориентированные языки, или же метапрограммирование техники.

Языки

XL является единственным известным на сегодняшний день языком программирования, созданным специально для концептуального программирования, но концептуальное программирование может выполняться практически на любом языке с разной степенью успеха. Лисп и Четвертый (и их производные) являются примерами уже существующих языков, которые хорошо поддаются концептуальному программированию.[нужна цитата ]

Похожие работы

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

Рекомендации

  1. ^ Манчестер, Фил (16 января 2008 г.). «Погрузитесь в концептуальное программирование». Реестр. Получено 2010-02-03.

внешняя ссылка