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

Фактор
NewFactorLogo.png
Парадигма мультипарадигма : функциональная , конкатенативная , стек-ориентированная
Разработчик Слава Пестов
Впервые появился 2003 г.
Стабильный выпуск
0.98 / 31 июля 2018 г. ( 2018-07-31 )
Печатная дисциплина сильный , динамичный
Операционные системы Windows , macOS , Linux
Лицензия Лицензия BSD
Интернет сайт factorcode.org
Под влиянием
Радость , Форт , Лисп , Себя

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

История

Слава Пестов создал «Фактор» в 2003 году как скриптовый язык для видеоигры . Первоначальная реализация, теперь называемая JFactor, была реализована на Java и работала на виртуальной машине Java . Хотя ранний язык внешне напоминал современный Factor с точки зрения синтаксиса , современный язык сильно отличается в практическом плане, и текущая реализация намного быстрее.

Со временем язык значительно изменился. Первоначально программы Factor были сосредоточены на манипулировании объектами Java с помощью возможностей отражения Java . С самого начала философия дизайна заключалась в модификации языка для соответствия программам, написанным на нем. По мере того, как реализация Factor и стандартные библиотеки становились более детализированными, необходимость в определенных языковых функциях становилась очевидной, и они были добавлены. В JFactor не было объектной системы, в которой вы могли бы определять свои собственные классы , и ранние версии собственного Factor были такими же; в этом смысле язык был похож на Scheme . Сегодня объектная система является центральной частью Фактора. Другие важные языковые функции, такие как классы кортежей , встраивание комбинаторов, макросы , определяемые пользователем слова синтаксического анализа и современная словарная система, добавлялись лишь по частям, когда их полезность становилась очевидной.

Интерфейс внешних функций присутствовал с самых ранних версий Factor, и аналогичная система существовала в JFactor. Это было выбрано вместо создания подключаемого модуля к части реализации C для каждой внешней библиотеки, с которой Factor должен взаимодействовать, и имеет то преимущество, что он более декларативен , быстрее компилируется и легче писать.

Реализация Java изначально состояла только из интерпретатора , но позже был добавлен компилятор байт-кода Java . Этот компилятор работал только над определенными процедурами. Версия Factor для Java была заменена версией, написанной на C и Factor. Изначально он состоял только из интерпретатора, но на смену интерпретатору пришли два компилятора, используемые в разных ситуациях. Со временем реализация Фактора росла значительно быстрее.

Описание

Фактор является динамически типизированным , функциональным и объектно-ориентированным языком программирования . Код построен вокруг небольших процедур, называемых словами. В типичном коде это 1–3 строки, а процедура длиной более 7 строк встречается очень редко. То, что идиоматически выражается одной процедурой на другом языке программирования, в Factor записывается несколькими словами.

Каждое слово принимает фиксированное количество аргументов и имеет фиксированное количество возвращаемых значений. Аргументы к словам передаются в стеке данных с использованием обратной польской записи . Стек используется только для организации вызовов слов, а не как структура данных. Стек в Factor используется аналогично стеку в Forth ; для этого они оба считаются стековыми языками . Например, ниже приведен фрагмент кода, который выводит «привет, мир» в текущий выходной поток:

"hello world" print

printэто слово в ioсловаре, которое берет строку из стека и ничего не возвращает. Он выводит строку в текущий выходной поток (по умолчанию терминал или графический прослушиватель).

Факторная функция может быть реализована в Факторе следующим образом:

: factorial ( n -- n! ) dup 1 > [ [1,b] product ] [ drop 1 ] if

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

Фактор подчеркивает гибкость и способность расширять язык. Есть система для макросов, а также для произвольного расширения синтаксиса Factor. Синтаксис Factor часто расширяется, чтобы учесть новые типы определений слов и новые типы литералов для структур данных. Он также используется в библиотеке XML для предоставления буквального синтаксиса для генерации XML. Например, следующее слово принимает строку и создает объект документа XML, который является документом HTML, подчеркивающим строку:

 : make-html ( string -- xml )
    dup
    <XML
        <html>
            <head><title><-></title></head>
            <body><h1><-></h1></body>
        </html>
    XML> ;

Слово dupдублирует верхний элемент в стопке. Знак <->означает заполнение этой части XML-документа элементом из стека.

Реализация и библиотеки

Фактор включает в себя большую стандартную библиотеку, полностью написанную на этом языке. К ним относятся

  • Кроссплатформенный набор инструментов с графическим интерфейсом, созданный на основе OpenGL и различных оконных систем, используемый для среды разработки.
  • Привязки к нескольким библиотекам баз данных, включая PostgreSQL и SQLite .
  • HTTP сервер и клиент, с фреймворком печи.
  • Эффективные однородные массивы целых чисел, чисел с плавающей запятой и структур C.
  • Библиотека, реализующая регулярные выражения, генерирующая машинный код для сопоставления.

Внешняя функция интерфейс встроен в фактор, позволяющий для связи с C , Objective-C и Fortran - программы. Также имеется поддержка выполнения и взаимодействия с шейдерами, написанными на GLSL .

Фактор реализован на языках Factor и C ++ . Первоначально он был загружен из более ранней реализации Java. Сегодня синтаксический анализатор и оптимизирующий компилятор написаны на этом языке. Некоторые базовые части языка реализованы в C ++, например, сборщик мусора и некоторые примитивы.

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

Компилятор Factor реализует множество расширенных оптимизаций и использовался в качестве цели для исследования новых методов оптимизации.

использованная литература

внешние ссылки