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

Семья языков программирования Ur
Парадигмыфункциональный, реактивный
СемьяML
РазработаноАдам Хлипала
Впервые появилсяДекабрь 2014 г. [1]
Стабильный выпуск
Выпуск 20200209/9 февраля 2020 г.; 8 месяцев назад (2020-02-09)
ПлатформаPOSIX
ЛицензияОткрытый исходный код
Расширения имени файла.ur, .urs, .urp
Интернет сайтнепредсказуемый.com/ ur
Под влиянием
Haskell, ML[2]

Ура также называемый Ur / Web это Свободный и Открытый исходный код функциональный язык программирования специфический для Веб-разработка, сделано Адам Хлипала на Массачусетский Институт Технологий[3] что из одной программы производит сервер код, браузер клиентский код и SQL код, специфичный для выбранного база данных бэкэнд.

Ура поддерживает мощный вид метапрограммирование на основе типов строк.[2]

Ur / Web Ур плюс специальная стандартная библиотека и соответствующие правила для разбор и оптимизация. Ur / Web поддерживает создание динамические веб-приложения при поддержке SQL базы данных. Сигнатура стандартной библиотеки такова, что хорошо типизированные программы Ur / Web «не ошибаются» в очень широком смысле. Они не только не дают сбоев во время определенных поколений страниц, но также могут:[2]

  • Страдают от любых видов внедрение кода нападения
  • Возврат недействителен HTML
  • Содержать мертвые ссылки внутри приложения
  • Несоответствия между HTML-формы и поля, ожидаемые их обработчиками
  • Включите клиентский код, который делает неверные предположения о "AJAX "-стайл услуги, которые предоставляет удаленный веб-сервер
  • Попытка недействительна SQL запросы
  • Использовать неподходящий маршалинг или демаршалинг в общении с Базы данных SQL или между браузеры и веб-серверы

Этот безопасность типа это просто основа методологии Ur / Web. Также можно использовать метапрограммирование для создания важных частей приложения путем анализа структуры типов.[2]

В Ur / Web компилятор также создает очень эффективный объектный код, который не использует вывоз мусора.[2]

Реализация всего этого Открытый исходный код.[2]

SQL Шаблоны синтаксиса, встроенные в язык, облегчают работу с таблицами.

Хотя синтаксис основан на Стандартный ML язык включает концепции из Haskell с дополнительным типом манипуляции.

Аякс вызов / ответ сериализуется через монада называется сделка (соответствует Haskell IO), а его маршаллинг и декодирование инкапсулируются в rpc функция.

Клиентская часть браузера включает функциональный реактивное программирование объекты, использующие (источник а) тип и сигнал монада.

Ur / Web не только упрощает написание веб-приложений, но и делает их более безопасными.

"Допустим, вы хотите иметь виджет календаря на своей веб-странице, и вы собираетесь использовать библиотеку, которая предоставляет виджет календаря, и на той же странице есть также рекламное окно, основанное на коде, предоставляемом рекламной сетью. ", - сказала Хлипала.

«Чего вы не хотите, так это того, чтобы рекламная сеть могла изменять способ работы календаря или автора кода календаря, чтобы иметь возможность вмешиваться в показ рекламы».

[4]

Пример программы

Это демонстрационная программа, показывающая код клиента, сервера и базы данных с Аякс общение из веб-демонстраций,[5] с дополнительными комментариями для описания каждого из компонентов:

Файл интерфейса (ML -like подпись) с расширением .urs:

(* монада среды называется транзакцией, соответствует монаде ввода-вывода Haskell *)вал главный : единица измерения -> сделка страница

Файл реализации (расширение .ur):

тип данных список т = Ноль | Минусы из т * список тстол т : { Идентификатор : int, А : нить }  НАЧАЛЬНЫЙ КЛЮЧ Идентификатор(* доступ к базе данных на стороне сервера, вызываемый через AJAX XmlHttpRequest                    инкапсулировано как функция '' rpc '' (удаленный вызов процедуры) *)весело Добавить я бы s =    (* шаблон sql dml с {[выражение]} *)    dml (ВСТАВЛЯТЬ В т (Идентификатор, А) ЗНАЧЕНИЯ ({[я бы]}, {[s]}))весело дель я бы =    dml (УДАЛИТЬ ИЗ т КУДА т.Идентификатор = {[я бы]})весело искать я бы =    (* монадический код в стиле haskell *)    ро <- oneOrNoRows (ВЫБРАТЬ т.А ИЗ т КУДА т.Идентификатор = {[я бы]});    дело ро из        Никто => возвращаться Никто           (* return - это функция подъема монады *)      | Немного р => возвращаться (Немного р.Т.А)(* '' check '' вызывается обработчиком события onClick на стороне клиента,               поэтому он будет скомпилирован в JavaScript как встроенный клиентский скрипт *)весело проверить ls =    дело ls из        Ноль => возвращаться ()      | Минусы (я бы, ls ') =>            ао <- rpc (искать я бы);      (* Ajax-вызов на стороне сервера *)            тревога (дело ао из                   Никто => "Нада"                 | Немного а => а                 );            проверить ls 'весело главный () =    idAdd <- источник "";    aДобавить <- источник "";    idDel <- источник "";    (* создает веб-страницу с включениями JavaScript *)    возвращаться <xml><body>      кнопка < ценить=«Проверить значения 1, 2 и 3»              по щелчку={fn _ => позволять вал мой список = 1 :: 2 :: 3 :: []                               в                                  проверить мой список                               конец                               }/> 
<br/> кнопка < ценить="Добавлять" по щелчку={fn _ => я бы <- получать idAdd; а <- получать aДобавить; rpc (Добавить (readError я бы) а) (* Ajax-вызов на стороне сервера *) }/> источник={idAdd}/> источник={aДобавить}/>
<br/> кнопка < ценить="Удалить" по щелчку={fn _ => я бы <- получать idDel; rpc (дель (readError я бы)) (* Ajax-вызов на стороне сервера *) }/> источник={idDel}/> </body></xml>

Файл проекта (расширение .urp) должен содержать необязательный список директив, за которым следует список модулей проекта:[6]

# комментарий строки с префиксом хешапереписать url Module1 / main # установить корневой URL в Module1 / main functionexe myexenamedatabase имя базы данных = тест # атрибут базы данных. и параметрыsql noisy.sql
$ / список # модулей stdlib с префиксом "$ /"модуль2 # если используется модулем 1, он должен предшествовать емумодуль1 # основной модуль
  • на стороне сервера функции получения страницы без побочных эффектов (метод http GET) доступны через URL-адрес как / ModulePath / functionName, они должны иметь тип (единица -> страница транзакции).
  • Чтобы экспортировать страницу, которая может вызывать побочные эффекты, доступные только через HTTP POST, включите один аргумент обработчика страницы типа Basis.postBody.[7]

Скомпилировать:

urweb module1 # ищет module1.urp

Выполнить как веб-сервер (другие режимы CGI, FastCGI, ...):

./module1.exe -p 8081 # -h: справка по параметрам RTS

Библиотеки

Особенности и проблемы

  • Обновление записи
тип данных Mystruc k v = Пустой | Узел из {Ключ: k, Ценить: v}весело setKey [k][v] (* полиморфизм типов *)           (_: ord k) (* неявный экземпляр класса ord *)           (callerErrNote: нить) (k1: k) (мой: Mystruc k v) : Mystruc k v =   если k1 < kmin   тогда ошибка  setKey: незаконный k1 {[callerErrNote]}</xml>   еще дело мой из             Узел р => Узел (р -- #Ключ ++ {Ключ = k1})             | _ => ошибка  setKey: нет а Узел {[callerErrNote]}</xml>

соответствующая подпись (вид аннотаций (:: :) неявный; (: :) явный):

против Mystruc :: Тип -> Тип -> Тип    (* конструктор с двумя параметрами *)вал setKey : k ::: Тип -> v ::: Тип -> ord k -> нить -> k -> Mystruc k v -> Mystruc k v
  • Многоточие полей записи
  дело мой из    Узел {Ключ = k, ...} => делай что угодно k    | _ => ....
  • Ошибка «Подстановка в конструкторе заблокирована переменной слишком глубокой унификации»[8]

Эта ошибка возникает с типами арности> 0 во вложенных дело или же позволять предложений и исчезает при вводе аннотации переменных во вложенных предложениях.

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

  1. ^ UrWeb вышел из стадии бета-тестирования
  2. ^ а б c d е ж "Урская языковая семья". impredicative.com/ur. Получено 3 апреля 2016.
  3. ^ Хлипала, Адам (Январь 2015 г.). "Ur / Web: простая модель для программирования в Интернете". Массачусетский технологический институт / Ассоциация вычислительной техники (ACM). Получено 5 января 2015.
  4. ^ «Вынося тяжелую работу из веб-разработки». mit.edu. 23 декабря 2014 г.. Получено 29 декабря 2016.
  5. ^ Ур языковые демонстрационные программы
  6. ^ Хлипала, Адам (Январь 2015 г.). "Руководство Ur / Web - Файлы проекта". https://enn.github.io/urweb-doc. Получено 8 января 2015. Внешняя ссылка в | publisher = (помощь)
  7. ^ Руководство Ur / Web - Структура веб-приложений
  8. ^ Неожиданная ошибка типа: «Подстановка в конструкторе заблокирована переменной слишком глубокого объединения»

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