"© Федор Пи. "Механизм функционирования языка программирования."
© Федор Пи. "Механизм функционирования языка программирования."
Функциональные языки программирования.
Языки программирования интересны тем, что на их основе строятся целостные работающие системы программирования, имеющие практические материальные результаты в наблюдаемом мире.
В Новый год я приобрел книжку "Изучаем HASKELL", современного языка программирования относящегося к семейству функциональных языков программирования, как ML, Lisp, Scala, Clojure и могу отследить концепцию построения языка.
"Основной отличительной чертой функционального программирования является возможность работы с функциями так же, как с любыми другими данными имеющимися в программе."
Здесь я предполагаю изложить мое представление механизма функционирования языка программирования и мне хотелось бы услышать в чем конкретно заключаются слабости и сильные стороны моего подхода.
Хотя я и не имею опыта программирования на языках типа Lisp, тем не менее с концепциями построения языков с нуля знаком.
Сущности, имеющие количественные и качественные свойства.
По-моему, в основании языка (хаски) лежит утверждение:
- существуют символы;
При уточнении вопроса, что собой представляют символ и символы приходим к утверждению, что символы являются экземплярами некоторого изначально заданного шаблонного набора, именуемого алфавитом.
Символы в алфавите имеют уникальное количественное свойство, которое задает очередность следования символов в шаблонном наборе алфавита.
Это количественное свойство символа в алфавите (в реализации языка) именуется кодом символа. Все символы в алфавите имеют еще одно общее для всех символов алфавита количественное свойство именуемое длиной кода.
И так:
- символы имеют количественные свойства: (по крайней мере) одно общее, присущее всем символам алфавита и одно уникальное для каждого символа из алфавита.
Далее. Следует предполагать, что символы алфавита обладают также и качественными свойствами. По аналогии с количеством, символы должны обладать по крайней мере одним общим качественным свойством и одним уникальным качественным свойством для каждого символа из алфавита.
- символы имеют качественные свойства: (по крайней мере) одно общее, присущее всем символам алфавита и одно уникальное для каждого символа из алфавита.
С вариантами кандидатами именоваться качественными свойствами символов проблемы, по-моему, нет.
Общим качественным свойством присущим всем символам является способность образовывать упорядоченные цепочки из символов экземпляров шаблонного набора. Собственно, алфавит является примером такой упорядоченной цепочки, в котором все символы представлены единственными экземплярами и упорядочены по значению их уникального количественного свойства.
Цепочки из символов в языке именуются также строками и/или списками, являющиеся синонимами используемого мною термина "цепочка".
- возможно создавать произвольные цепочки из символов экземпляров базового алфавита;
Процесс вычисления является реализацией качества.
Уникальное качественное свойство символа есть его функциональность, собственно существование которой и позволяет осуществлять процесс вычисления, задавая первым символом цепочки способ свертки всех следующих за первым символом оставшихся символов цепочки.
Используется единственная схема реализации функциональности - это что делать с первым элементом списка (головой списка) и что делать с оставшейся частью списка (хвостом списка).
Вообще-то, выбор функциональности задается не первым элементом (головой) списка, а задается через имя функции предшествующее списку. Это имя, представляющее собой уникальную цепочку символов алфавита, и есть расширение заложенной в реализацию языка функциональности символов алфавита. Особенность обработки первого и всех последующих элементов списка является реализацией процесса вычисления (свертки) через рекурсивную схему.
- процесс вычисления представляет собой переход цепочки символов в другую цепочку символов;
Примером вычисления цепочки символов является и алфавит, переводящий последовательность символов в ту же самую последовательность символов.
Кроме описанных принципов: конечности алфавита и наличия у символов количественных и качественных свойств, возможности строить цепочки, в реализации языка используется еще несколько возможностей расширяющих применение.
Это, например, принцип рекурсии, позволяющий в качестве символов цепочек использовать составные символы, являющиеся цепочками символов.
Также очень важным является использование совместно с основным алфавитом символов других, более коротких специализированных алфавитов, имеющих собственную уникальную функциональность.
Это алфавиты двоичной логики, состоящий из двух символов: true и false, позволяющий осуществлять сравнения и алфавит арифметики, реализующий систему исчисления и позволяющий получать численные оценки.
- существует алфавит двоичной логики;
- существует алфавит арифметики, реализующий систему исчисления;
Базовый алфавит.
Должно быть возможным сформулировать и пробовать доказать теорему, что количественные свойства символов алфавитов степени двойки больших единицы могут быть построены на базисе алфавита двоичной логики.
Но вопрос каким образом при этом порождаются качественные свойства символов алфавита более нетривиален. Хотя, возможно, для небольших количеств решается однозначно.(?)
Можно, например, посмотреть на набор функциональностей заложенный разработчиками языка хаски. Список изначальных функциональностей следующий: создание пустого списка; добавление элемента в хвост существующего списка; проверка списка на пустоту; получение головы списка; получение хвоста списка;
Алфавит русского языка начинается с буквы "А", функциональностью которой, по-моему мнению, является определение свойства дискретности.
Модель мира.
Существование символов предполагает также существование модели мира, сводящейся к утверждению:
- существует вместилище для символов;
Процесс программирования, по-моему, требует существование понятий программа и компьютер.
Программа, как некоторая изначально заданная извне (программистом) иерархия списков;
Должно имееться также некоторое вместилище, именуемое компьютер и в который помещается созданная программа;
В компьтере уже имеется иерархия списков именуемая библиотекой, с заложенной в язык встроенной функциональностью;
Среди списков программы имеется особенный список, назначенный первым для вычисления;
Процесс вычисления по программе завершается, например, итогом получения пустого или невычислимого списка, либо исчерпываются возможности компьтера, как вместилища списков, либо продолжается бесконечно во времени;
Собственно, последний вариант процесса вычисления особенно интересен, так как напоминает реально наблюдаемый мир, в котором становится возможным "забыть" с чего все началось.
Тем неменее, чтобы являться полноценным языком описания реально наблюдаемого мира необходимо изначально заложить в язык качественные и количественные свойства понятий пространства, времени, материи. Но таких свойств в функциональных языках программирования, к сожалению, нет.
12 февраля 2015 г.
* * *