Открытие языка программирования

  • простые правила;
  • документирование;
  • самодокументированность;
  • поддержка множества парадигм;
  • метапрограммирование;
  • рефлексия;
  • отсутствие избыточности;
  • высокая оптимизация.

Документирование

Документирование не должно ограничиваться голыми блоками комментариев. Это поняли, например, создатели и многочисленные пользователи утилиты Doxygen. Фактически подготовка документации представляет собой тот же самый синтаксический разбор с генерацией текста по результатам. Это возможно сделать средствами самого языка.

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

Объектная парадигма

Пусть А — объект, S — селектор сообщения. Диспетчеризация представляет собой операцию M = A S, где M — метод, т. е. исполнимый объект, выполняемый при посылке сообщения объекту.

Посылка сообщения в виде A S X = (A S) X, где X — параметры, обеспечивает разделение операций диспетчеризации и собственно обработки параметров сообщения.

Именованные аргументы

Smalltalk предоставляет хороший способ именования методов: части имени рассеиваются между аргументами как бы именуя их.

 cond IfTrue: x IfFalse: y
 

Где IfTrue:IfFalse: — название метода.

Логика синтаксического разбора достаточно проста: в один идентификатор собираются куски, завершающиеся двоеточием до появления ограничивающего токена.

Множественное представление

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

5 -> a
a + 9              # 14
a bits + 9 bits    # 1, 0, 1, 0

Направление присвоения

Традиционно языки используют операцию присвоения «справа налево» (a ← b), то есть значение правого аргумента присваивается левому. С точки зрения логики вычислений более подходило бы присвоение «слева направо» (b → a).

Генерализация

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

Обобщённые типы операций, которые можно применить на множестве типов:

  • сложение, умножение, вычитание и деление (различные математические объекты).

Обобщённые арифметические операции

Для многих объектов можно найти набор операций, аналогичных четырём арифметическим.

Умножение

Пусть существует бинарная операция, которая обладает следующими свойствами:

  • ассоциативность: tex:(a * b) * c = a * (b * c) = a * b * c,
  • наличие единичного элемента: tex:a * 1 = 1 * a = a;

и возможно следующими:

  • коммутативность: tex:a * b = b * a,
  • наличие нулевого элемента: tex:a * 0 = 0 * a = 0.

Такую операцию назовём умножением.

Сложение

Пусть существует операция, обладающая следующими свойствами:

  • ассоциативность: tex:(a + b) + c = a + (b + c) = a + b + c,
  • при наличии умножения — дистрибутивность: tex:(a + b) * c = (a * c) + (b * c), a * (b + c) = (a * b) + (a * c);
  • наличие нулевого элемента: tex:a + 0 = 0 + a = a

а также возможно следующими:

  • коммутативность: tex:a + b = b + a.

Такую операцию назовём сложением.

Деление

Пусть существует операция, обратная умножению, то есть:

tex:a * b = c \to c / b = a,

где равенство возможно выполняется с некоторой погрешностью представления. Такую операцию назовём делением.

Возможно таких операций две (для девого и правого операнда умножения):

tex:a * b = c \to c / b = a (левое деление),
tex:a * b = c \to c \backslash a = b (правое деление).

Вычитание

Пусть существует операция, обратная делению, то есть:

tex:a + b = c \to a - b = a,

Назовём такую операцию вычитанием.

Операции с порядком

Свойство упорядоченности — наличие у объекта четырёх взаимоисключающих отношений:

  • больше (>),
  • меньше (<),
  • равно (=),
  • не определено (если порядок частичный).

Определение порядка

Определение порядка определяется следующими операциями:

  • три операции с тем же названием, что и сами отношения (<, =, >), возвращающие истину, если реализовано соответствующее соотношение,
  • комбинационные операции (, <>, >=, <>=), возвращающие истину, если реализовано любое из указанных соотношений (меньше или равно, меньше или больше, больше или равно, меньше или больше или равно),
  • отрицания операций выше (~<, ~>, ~=, ~⇐, ~<>, ~>=, ~<>=), отличаются тем, что при неопределённом опрядке позвращают истину.

Операции <>= и ~<>= фактически определяют наличие упорядоченности элементов

Если порядок полный (соотношение «не определено» не реализуется), то для операций выполняются следющие соотношения:

  • <>= всегда возвращает истину, а ~<>= всегда возвращает ложь;
  • остальные операции образуют тождественные пары: < и ~>=, > и ~⇐, = и ~<>, и ~>, >= и ~<, <> и ~=.

Минимум и максимум

Максимумом назовём такой элемент, который больше или равен двум другим и не существует элемента меньшего таковому с указанными свойствами. Если такой элемент существует и единственен, то операцию, возвращающую его назовём max.

Аналогично с минимумом.

Лямбда-исчисление и традиционное процедурное программирование

Нет ничего зазорного в том, чтобы традиционные функции определять через лямбда-операции, т. е. вместо

идентификатор тело

писать

тело → идентификатор

(где → — операция присвоения)

cherdak/otkrytyj_jap.txt · Последние изменения: 2011/12/28 20:38 — vovanium
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution 3.0 Unported