Сеть растет не только по размеру, но и по важности. Современная сеть, как мы знаем, имеет мало общего с ее ранними днями появления статических страниц; сегодня это совсем не статично. Некоторые страницы даже получают название веб-приложений — например, Документы Google — приложений, доступ к которым осуществляется через браузер, и которые начинают представлять серьезную конкуренцию более традиционным моделям распространения.
Разработка этих приложений не проста. Они по своей природе распределены между клиентом — браузером — и сервером. Оба, как правило, разрабатываются с использованием различных технологий, и между ними необходимо приложить усилия.
Мы часто получаем сложный технологический стек. Язык программирования для серверной части, часто с платформой поверх него, язык программирования для клиентской части (обычно JavaScript) с некоторыми библиотеками (jQuery, Dojo, Prototype,…), а также база данных и язык запросов. Все разные технологии, с разными концепциями и моделями. Добавьте конфигурацию и настройте связь между ними, и вы получите картину довольно сложной головоломки. Объединить все элементы не так просто.
Цель новой платформы веб-программирования, Opa, состоит в том, чтобы упростить эту картину и заменить этот сложный технологический стек одним языком программирования. Давайте посмотрим на некоторые простые программы Opa, чтобы понять, как они пытаются облегчить жизнь веб-разработчику.
Привет, Опа!
Возможно, самая простая программа Opa заключается в следующем:
Server.start (Server.http, {title: "Hello web", page: function () {<h1> Hello web </ h1>} } )
Давайте попробуем понять, что здесь происходит. Во-первых, Server.start
Он принимает два аргумента, первый — это конфигурация сервера, включая порт, параметры шифрования и т. Д. — здесь мы просто используем настройки http по умолчанию. Второй аргумент — это описание того, как сервер должен обрабатывать входящие запросы. Есть много вариантов для этого второго аргумента, здесь мы используем простой вариант одностраничного сервиса, который принимает запись с двумя полями: заголовок и страница.
Title
Page
Обратите внимание, как мы использовали анонимную функцию для этого поля и что последнее выражение в функции — это возвращаемое значение. Также обратите внимание, как Opa «понимает» HTML и принимает его с помощью обычного синтаксиса.
Opa построен по современным стандартам, поэтому он поддерживает HTML5, о чем свидетельствуют существующие проекты сообщества, использующие: векторную графику WebGL, Canvas и SVG. Он также предлагает подключение к существующим сервисам, включая обширные библиотеки для: Facebook, Twitter, Dropbox и GitHub.
компиляция
Как мы запускаем приложение? В Opa это двухэтапный процесс. Сначала мы должны скомпилировать эту программу: (при условии, что мы сохранили ее в файле с именем hello.opa)
opa hello.opa
./hello.exe
С ростом популярности интерпретируемых языков можно задаться вопросом, почему Opa требует компиляции. Помимо обычного аргумента, что компиляция позволяет оптимизировать и улучшить общую производительность, у этого подхода есть как минимум два преимущества.
Компилятор Opa собирает и упаковывает все ресурсы приложения (включая изображения и тому подобное) в один конечный исполняемый файл (в нашем случае hello.exe). Это означает, что для его развертывания на сервере необходимо просто скопировать этот единственный файл и запустить его там. Нет внешних зависимостей. Нет забытых файлов.
Проверка типа
Далее, Opa — это язык строго статической типизации, и фаза компиляции имеет много проверок, включая проверку типов. Это означает, что компилятор может обнаружить большой класс ошибок в программировании и указать на них вам даже до запуска вашей программы. Это очень важно и фактически является одним из решающих различий между Opa и некоторыми другими веб-технологиями, такими как Node.js.
Чтобы лучше понять это, давайте посмотрим на нашу простую программу. Что если мы сделаем опечатку в одном из имен функций или полей? Что если мы забыли один аргумент? Что если страница вернула строку, а не фрагмент HTML? Во всех этих ситуациях компилятор указывает на ошибку с четким указанием проблемы.
Но проверки идут намного дальше, чем это. Существует много вариантов для второго аргумента функции Server.start. Средство проверки типов Opa достаточно сильное, чтобы определить, какие варианты допустимы, и принимать только те. Я сказал, что выводим, потому что в большинстве случаев вам не нужно аннотировать ваши программы типами (как, скажем, в Java), и вместо этого компилятор выполнит для вас вывод типов. Особенно в больших проектах: это спасатель жизни.
Простая демоверсия
Трудно судить о языке по тому, как пишется «Hello world», поэтому давайте рассмотрим немного более сложную, хотя и базовую, программу Opa.
база данных mydb {int / counter = 0; } функция action (_) { / mydb / counter <- / mydb / counter + 1; #msg = <> Здравствуйте, номер пользователя {/ mydb / counter} !; } страница функции () { <h1 onclick = {action}> Привет, мир </ h1> <div id = "msg"> Щелкните заголовок </ div>; } Server.start (Server.http, {~ страница, заголовок: «Привет, мир»});
Что делает эта программа? Он представляет страницу с заголовком «Hello, world» и сообщением «Нажмите на заголовок». При нажатии на заголовок сообщение заменяется на «Hello, user number x», где x заменяется числом нажатий на заголовок с момента создания службы, то есть: например, оно не будет сброшено , перезагружая веб-сервер.
База данных
Давайте внимательнее посмотрим на эту программу. Для подсчета кликов он использует базу данных и поэтому начинает с объявления базы данных mydb, содержащей единственное значение типа int в path / counter. Пути к базам данных в Opa — это места для значений БД, которые концептуально несколько похожи на пути к файловой системе. Это очень скромная база данных, но по существу нет ограничений по количеству и сложности путей.
Как вы можете видеть из функции действия, Opa тесно интегрирует программирование базы данных на базовом языке, обеспечивая удобный синтаксис для чтения и обновления базы данных; а также запросы, хотя это выходит за рамки этой статьи. С помощью простой аннотации можно выбрать ядро базы данных, которое будет обеспечивать работу приложения, причем MongoDB является основным выбором в Opa прямо сейчас.
интерактивность
На страницу функции. Интересно, что статический HTML содержит обработчик событий, который указывает на функцию в нашей программе.
<h1 onclick = {action}> Привет, мир </ h1>
где указанная функция выполняет некоторые операции с базой данных и DOM с использованием специального синтаксиса:
#msg = <> Здравствуйте, номер пользователя {/ mydb / counter} !;
Здесь есть две вещи. Во-первых, #id = content означает: заменить содержимое элемента DOM на id с содержимым. Во-вторых, фрагмент HTML содержит вставку, которая является простым и безопасным (подробнее об этом позже) способом вставки значений в строки / фрагменты HTML. Например, Java:
System.out.println (x + "+" + y + "=" + (x + y));
стал бы в Опе стать:
println ("{x} + {y} = {x + y}");
Унифицированное клиент / серверное кодирование
Во фрагменте из функции действия вставка является операцией чтения в базе данных. Интересной особенностью этой функции является то, что очевидно, что все манипуляции с базами данных должны выполняться на сервере, тогда как все манипуляции с DOM должны выполняться на клиенте. Компилятор Opa не только выясняет, что и где должно произойти, но также автоматически генерирует Javascript для клиента и прозрачно заботится обо всем взаимодействии клиент-сервер.
Конечно, разработчик может лучше контролировать происходящее и сам решать, куда и куда идти, с помощью простых аннотаций функций. Но приятно то, что перемещение функции с клиента на сервер (или наоборот) сводится к замене ключевого слова client на server, а остальное обрабатывается компилятором.
Стоит также отметить, насколько легко программировать обработчики событий и достигать интерактивности в Opa. На самом деле, язык предлагает мощные конструкции для сети в реальном времени, однако это выходит за рамки этой короткой статьи.
Безопасность
Одной из основных проблем веб-приложений, на которую Opa обращает особое внимание, является безопасность. С постоянным взаимодействием клиент-сервер и интерактивным характером веб-приложений очень важно убедиться, что конфиденциальная информация не протекает и что пользователи не могут делать вредных вещей. Опа использует двоякий подход к этой проблеме.
Помимо аннотаций функций клиент / сервер, он предоставляет две дополнительные функции сервера: открытые и защищенные, которые различают точки входа сервера, которые могут быть оптимизированы для производительности, и те, которые не должны быть доступны, событию для скомпрометированного клиента.
Вторая мера безопасности проистекает из вышеупомянутой типовой безопасности Opa. С одной стороны, это означает, что (как и для некоторых других языков высокого уровня) переполнение буфера или исключения нулевого указателя просто не могут произойти в Opa. С другой стороны, он предлагает защиту от самых популярных угроз безопасности, таких как XSS-атаки и инъекции кода. Эта защита возможна, потому что благодаря вводу Opa знает, что такое URL, что такое HTML и что такое запрос к базе данных (в отличие от языков с динамической / слабой типизацией, где все вышеперечисленное будет просто строкой) и, следовательно, может должным образом очистить все вставки.
В этой короткой статье у меня была только возможность рассказать о том, что предлагает Opa, но я надеюсь, что этого было достаточно, чтобы заинтересовать вас языком. Я надеюсь продолжить в ближайшем будущем больше новостей и учебных пособий об Opa. На данный момент, если вы хотите узнать больше, я предлагаю вам посетить веб-сайт Opa, где вы можете скачать его , прочитать руководство , блог (с многочисленными учебными пособиями) и кучу других статей об Opa . И если вы хотите узнать больше, вы можете познакомиться с полезным сообществом Opa на форуме .