Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

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) типа и сигнала .

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

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

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

[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 и исчезает, когда тип аннотирует переменные во вложенных предложениях.

Ссылки [ править ]

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

Внешние ссылки [ править ]

  • Домашняя страница вашего языка
  • Страница Ur / Web-проекта на GitHub
  • Ура вики