Парадигмы | функциональный , реактивный |
---|---|
Семья | ML |
Разработано | Адам Хлипала |
Впервые появился | Декабрь 2014 [1] |
Стабильный выпуск | Выпуск 20200209/9 февраля 2020 г . |
Платформа | POSIX |
Лицензия | открытый источник |
Расширения имени файла | .ur, .urs, .urp |
Веб-сайт | предположительный |
Под влиянием | |
Haskell , ML [2] |
Ur также называют Ur / Web является свободным и открытым исходным кодом функциональный язык программирования специфичен для веб - разработки , созданный Адам Chlipala в Массачусетском технологическом институте [3] , что из одной программы производит сервера код, браузер клиентского кода и SQL кода специфического для выбранной базы данных .
Ur поддерживает мощный вид метапрограммирования, основанный на типах строк. [2]
Ur / Web - это Ur плюс специальная стандартная библиотека и связанные с ней правила для синтаксического анализа и оптимизации. Ur / Web поддерживает создание динамических веб-приложений на базе баз данных SQL . Сигнатура стандартной библиотеки такова, что хорошо типизированные программы Ur / Web «не ошибаются» в очень широком смысле. Они не только не дают сбоев при создании определенных страниц, но и могут: [2]
- Страдают от любых атак с использованием инъекций кода.
- Вернуть неверный HTML
- Содержать мертвые ссылки внутри приложения
- Несоответствия между HTML-формами и полями, ожидаемыми их обработчиками.
- Включите клиентский код, который делает неверные предположения о службах в стиле AJAX, которые предоставляет удаленный веб-сервер.
- Попытка неверных SQL- запросов
- Использовать неправильный маршалинг или демаршалинг при взаимодействии с базами данных SQL или между браузерами и веб-серверами.
Эта безопасность типов - только основа методологии Ur / Web. Также можно использовать метапрограммирование для создания важных частей приложения путем анализа структуры типов. [2]
Ur / Веб - компилятор также создает очень эффективный объектный код , который не использует сбор мусора . [2]
Реализация всего этого с открытым исходным кодом . [2]
Шаблоны синтаксиса SQL, встроенные в язык, облегчают работу с таблицами.
Хотя синтаксис основан на Standard ML, язык включает концепции Haskell с дополнительными манипуляциями с типами.
Вызов / ответ Ajax сериализуются с помощью монады, называемой транзакцией (соответствует вводу - выводу Haskell ), а ее маршаллинг и декодирование инкапсулируются в функцию rpc .
Клиентская часть браузера включает функциональные средства реактивного программирования , использующие монаду(source a)
типа и сигнала .
"Допустим, вы хотите иметь виджет календаря на своей веб-странице, и вы собираетесь использовать библиотеку, которая предоставляет виджет календаря, и на той же странице есть также рекламное окно, основанное на коде, предоставляемом рекламной сетью. , "Сказала Хлипала.
«Чего вы не хотите, так это того, чтобы рекламная сеть могла изменять способ работы календаря или автора кода календаря, чтобы иметь возможность вмешиваться в показ рекламы».[4]
Пример программы [ править ]
Это демонстрационная программа, показывающая код клиента, сервера и базы данных с использованием Ajax , из веб-демонстраций [5] с дополнительными комментариями для описания каждого из компонентов:
Файл интерфейса ( подпись типа ML ) с расширением .urs:
(* монада среды называется транзакцией, соответствует монаде ввода-вывода Haskell *) val main : unit -> страница транзакции
Файл реализации (расширение .ur):
список типов данных t = Nil | Cons из т * список ттаблица t : { Id : int , A : string } PRIMARY KEY Id(* доступ к базе данных на стороне сервера, вызываемый через AJAX XmlHttpRequest, инкапсулированный как функция '' rpc '' (удаленный вызов процедуры) *) fun add id s = (* шаблон sql dml с {[выражение]} *) dml ( INSERT INTO t ( Id , A ) ЗНАЧЕНИЯ ({[ id ]}, {[ s ]}))fun del id = dml ( УДАЛИТЬ ОТ t ГДЕ t . Id = {[ id ]})забавный поиск id = (* монадический код в стиле haskell *) ro <- oneOrNoRows ( ВЫБРАТЬ t . A FROM t WHERE t . Id = {[ id ]}); case ro of None => return None (* return - это функция подъема монады *) | Некоторые г => возврат ( Некоторые г . Т . )(* '' check '' вызывается обработчиком события onClick на стороне клиента, поэтому он будет скомпилирован в JavaScript как встроенный клиентский скрипт страницы *) fun check ls = case ls of Nil => return () | Минусы ( id , ls ' ) => ao <- rpc ( идентификатор поиска ); (* Ajax-вызов на стороне сервера *) предупреждение ( случай ao of None => "Nada" | Some a => a ); контрольный ls 'fun main () = idAdd <- источник "" ; aAdd <- источник "" ; idDel <- источник "" ; (* генерирует веб-страницу с включениями JavaScript *) return <xml> <body> <button value = "Проверить значения 1, 2 и 3" onclick = { fn _ => let val mylist = 1 :: 2 :: 3 :: [] in check mylist end } /> <br/> <br/> <button value = "Добавить" onclick = { fn _ => id <- получить idAdd ; а <- получить Добавить; rpc ( add ( readError id ) a ) (* вызов Ajax на стороне сервера *) } /> <ctextbox source = { idAdd } /> <ctextbox source = { aAdd } /> <br/> <br/> < значение кнопки = "Удалить" onclick = { fn _ => id <- получить idDel ; rpc ( del ( readError id )) (* вызов Ajax на стороне сервера *) }/> <ctextbox source = { idDel } /> </body> </xml>
Файл проекта (расширение .urp) должен содержать необязательный список директив, за которым следует список модулей проекта: [6]
# комментарии к строке с префиксом хеша rewrite url Module1 / main # установить корневой URL на Module1 / main functionexe myexenamedatabase dbname = test # атрибут базы данных. и параметрыsql noisy.sql
$ / list # модули stdlib с префиксом "$ /" module2 # если они используются модулем 1, он должен предшествовать модулю module1 # основной модуль
- На стороне сервера функции получения страницы без побочных эффектов (метод http GET) доступны через URL-адрес как / ModulePath / functionName, они должны иметь тип (unit -> страница транзакции) .
- Чтобы экспортировать страницу, которая может вызывать побочные эффекты, доступные только через HTTP POST, включите один аргумент обработчика страницы типа Basis.postBody . [7]
Скомпилировать:
urweb module1 # ищет module1.urp
Выполнить как веб-сервер (другие режимы - CGI , FastCGI , ...):
./module1.exe -p 8081 # -h: Справка по параметрам RTS
Библиотеки [ править ]
- Предопределенный API
- Стандартная библиотека
- По функциональным тестам
- Ur wiki - Библиотеки и привязки FFI
Особенности и проблемы [ править ]
- Обновление записи
тип данных mystruc k v = Пусто | Узел из { Key : K , Value : v }fun setKey [ k ] [ v ] (* полиморфизм типов *) (_: ord k ) (* неявный экземпляр класса ord *) ( callerErrNote : string ) ( k1 : k ) ( my : mystruc k v ) : mystruc k v = если k1 < kmin, тогда ошибка <xml> setKey : недопустимый k1 {[ callerErrNote ]} </xml> иначе case my of Узел r => Узел ( r - #Key ++ { Key = k1 }) | _ => Ошибка <XML> SetKey : не Узел {[ callerErrNote ]} </ XML>
соответствующая подпись (вид аннотаций (:: :) неявный; (: :) явный):
con mystruc :: Type -> Type -> Type (* конструктор с двумя параметрами *)val setKey : k ::: Тип -> v ::: Тип -> ord k -> строка -> k -> mystruc k v -> mystruc k v
- Многоточие полей записи
case my of Node { Key = k , ... } => doWhatever k | _ => ....
- Ошибка «Подстановка в конструкторе заблокирована переменной слишком глубокой унификации» [8]
Эта ошибка возникает с типами arity> 0 во вложенных предложениях case или let и исчезает, когда тип аннотирует переменные во вложенных предложениях.
Ссылки [ править ]
- ^ Бета-версия UrWeb завершена
- ^ a b c d e f "Семья языков программирования Ur" . impredicative.com/ur . Проверено 3 апреля 2016 года .
- ^ Chlipala, Адам (январь 2015). «Ur / Web: простая модель для программирования в Интернете» . Массачусетский технологический институт / Ассоциация вычислительной техники (ACM) . Проверено 5 января 2015 года .
- ^ "Вынося тяжелую работу из веб-разработки" . mit.edu. 23 декабря 2014 . Проверено 29 декабря +2016 .
- ^ Ур языковые демонстрационные программы
- ^ Chlipala, Адам (январь 2015). "Руководство Ur / Web - Файлы проекта" . https://enn.github.io/urweb-doc . Проверено 8 января 2015 года . Внешняя ссылка в
|publisher=
( помощь ) - ^ Руководство Ur / Web - Структура веб-приложений
- ^ Неожиданная ошибка типа: «Подстановка в конструкторе заблокирована слишком глубокой унификационной переменной»
Внешние ссылки [ править ]
- Домашняя страница вашего языка
- Страница Ur / Web-проекта на GitHub
- Ура вики