Язык программирования Sound

Средство обработки унифицированных по назначению данных (Sound — system for operating with unified data) разрабатывается для внятного программирования, обеспечивающего соответствие результатов вычислений назначениям. Под назначением данных понимается формальная спецификация вычислений, приводящих к этим данным. Язык программирования Sound нужен как универсальный инструмент, позволяющий транслировать вычислительную логику в любой язык программирования.

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

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

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

from Compute where {DigitsRange=range(0), Sequence=Array, Number=Int} call NumberToDigits(100, 2)

module Compute:
    type Sequence, DigitsRange, Number
    
    func NumberToDigits (x: Number, base: Number) -> a: Sequence[DigitsRange] =
    {
        if x < 0:
            Error.NegativeNumber(x)
        k: DigitsRange = 0  # количество цифр
        y = x  # тип назначается автоматически
        for:
            next_digit(@y, base, @a, k) -> ok: Bool =
            {
                digit = lowest_digit (y, base) -> d: Number = 
                {
                    d = y % base    
                }
                @a[k] = digit
                @y /= base
                ok = (y != 0)
            }
            if ok:
                k += 1
            else:
                stop
        if k == 0:
            k = 1
            a[0] = 0
    }

Важным моментом в языках программирования являются имена, обозначающие те или иные понятия. В языке Sound есть три типа имен: 1) имена, обозначающие непосредственно данные того или иного типа; 2) имена, обозначающие конкретные типы данных; 3) имена, обозначающие абстрактные типы данных.

e24e3125d281f374df4b102143a258d6.jpg

В Sound абстрактный тип данных — это имя, на место которого можно подставить имя любого конкретного типа данных, для которого логика вычислений не запрещает это сделать.

Пример абстрактного типа данных — индексируемый контейнер. Индексация производится с помощью типа «диапазон». В случае фиксированного числа индексов они перечисляются через запятую и берутся в квадратные скобки, в случае переменного числа индексов вводится тип «многомерный диапазон», который берется в двойные квадратные скобки. В качестве диапазона может выступать тип номеров индексов, специфичных для конкретного контейнера. Это означает, что язык может запретить индексировать с помощью одного и того же диапазона, скажем, числовую и строковую последовательности, потому что смысл индексов может различаться. Это может оказаться удобным в случаях, когда приходится работать сразу со многими данными, и каждая переменная-индекс обозначает обращение к данным определенного типа.

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

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

·        внешние интерфейсы — модели данных

·        внутренние интерфейсы — структуры данных

·        назначения — семантика данных

В рассмотренном примере в качестве назначения данных выступает повторение блока с переходом из состояния с номером k в состояние с номером k+1.

Технология Sound может быть реализована в рамках любого языка программирования, поэтому язык Sound можно транслировать в любой ЯП. Согласно принципу хранимой программы, всякая программа — это данные, которые могут быть обработаны транслятором. Поэтому в примере с цифрами числа массив первоначально не объявлен, и детали, относящиеся к выделению памяти, могут быть описаны вне вычислительного модуля.

© Habrahabr.ru