Ур (язык программирования) - Ur (programming language)
Парадигмы | функциональный, реактивный |
---|---|
Семья | ML |
Разработано | Адам Хлипала |
Впервые появился | Декабрь 2014 г. [1] |
Стабильный выпуск | Выпуск 20200209/9 февраля 2020 г. |
Платформа | POSIX |
Лицензия | Открытый исходный код |
Расширения имени файла | .ur, .urs, .urp |
Интернет сайт | непредсказуемый |
Под влиянием | |
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 функция.
Клиентская часть браузера включает функциональный реактивное программирование объекты, использующие (источник а)
тип и сигнал монада.
"Допустим, вы хотите иметь виджет календаря на своей веб-странице, и вы собираетесь использовать библиотеку, которая предоставляет виджет календаря, и на той же странице есть также рекламное окно, основанное на коде, предоставляемом рекламной сетью. ", - сказала Хлипала.
«Чего вы не хотите, так это того, чтобы рекламная сеть могла изменять способ работы календаря или автора кода календаря, чтобы иметь возможность вмешиваться в показ рекламы».Пример программы
Это демонстрационная программа, показывающая код клиента, сервера и базы данных с Аякс общение из веб-демонстраций,[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
Библиотеки
- Предопределенный API
- Стандартная библиотека
- По функциональным тестам
- Ur wiki - Библиотеки и привязки FFI
Особенности и проблемы
- Обновление записи
тип данных 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 во вложенных дело или же позволять предложений и исчезает при вводе аннотации переменных во вложенных предложениях.
Рекомендации
- ^ UrWeb вышел из стадии бета-тестирования
- ^ а б c d е ж "Урская языковая семья". impredicative.com/ur. Получено 3 апреля 2016.
- ^ Хлипала, Адам (Январь 2015 г.). "Ur / Web: простая модель для программирования в Интернете". Массачусетский технологический институт / Ассоциация вычислительной техники (ACM). Получено 5 января 2015.
- ^ «Вынося тяжелую работу из веб-разработки». mit.edu. 23 декабря 2014 г.. Получено 29 декабря 2016.
- ^ Ур языковые демонстрационные программы
- ^ Хлипала, Адам (Январь 2015 г.). "Руководство Ur / Web - Файлы проекта". https://enn.github.io/urweb-doc. Получено 8 января 2015. Внешняя ссылка в
| publisher =
(помощь) - ^ Руководство Ur / Web - Структура веб-приложений
- ^ Неожиданная ошибка типа: «Подстановка в конструкторе заблокирована переменной слишком глубокого объединения»