Статьи

Введение в Опа

Ты пробовал опа? и если нет, то почему

Сеть растет не только по размеру, но и по важности. Современная сеть, как мы знаем, имеет мало общего с ее ранними днями появления статических страниц; сегодня это совсем не статично. Некоторые страницы даже получают название веб-приложений — например, Google Docs — приложений, доступ к которым осуществляется через браузер, и которые начинают представлять серьезную конкуренцию более традиционным моделям распространения.

Разработка этих приложений не проста. Они по своей природе распределены между клиентом — браузером — и сервером. Оба, как правило, разрабатываются с использованием различных технологий, и необходимо приложить значительные усилия для их взаимодействия.

Мы часто получаем сложный технологический стек. Язык программирования для серверной части, часто с платформой поверх него, язык программирования для клиентской стороны (обычно JavaScript) с некоторыми библиотеками (jQuery, Dojo, Prototype, …) и база данных и ее язык запросов , Все разные технологии, с разными концепциями и моделями. Добавьте конфигурацию и настройте связь между ними, и вы получите картину довольно сложной головоломки. Объединить все элементы не так просто.

Цель новой платформы веб-программирования, Opa, состоит в том, чтобы упростить эту картину и заменить этот сложный технологический стек одним языком программирования. Давайте посмотрим на некоторые простые программы Opa, чтобы понять, как они пытаются облегчить жизнь веб-разработчику.

Привет Опа!

Возможно, самая простая программа Opa заключается в следующем:

Server.start(Server.http,
  { title: "Hello web",
    page: function() { <h1>Hello web</h1> }
  }
)

Давайте попробуем понять, что здесь происходит. Во-первых, Server.start — это функция, которая запускает веб-сервер. Он принимает два аргумента, первый — это конфигурация сервера, включая порт, параметры шифрования и т. Д. — здесь мы просто используем настройки http по умолчанию.

Второй аргумент — это описание того, как сервер должен обрабатывать входящие запросы. Есть много вариантов для этого второго аргумента, здесь мы используем простой вариант одностраничного сервиса, который принимает запись с двумя полями: заголовок и страница.

Заголовок — это просто строка с заголовком этой страницы. Страница — это функция без аргументов, которая возвращает HTML-содержимое страницы. Обратите внимание, как мы использовали анонимную функцию для этого поля и что последнее выражение в функции — это возвращаемое значение. Также обратите внимание, как 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.

database mydb @mongo { int /counter = 0; }
function action(_) {
    /mydb/counter <- /mydb/counter + 1;
    #msg = <>Hello, user number {/mydb/counter}!</>;
}
function page() {
    <h1 onclick={action}>Hello, world</h1>
    <div id="msg">Click the header</div>;
}
Server.start(Server.http, { ~page, title: "Hello, world" });

Что делает эта программа? Он представляет страницу с заголовком «Hello, world» и сообщением «Нажмите на заголовок». При нажатии на заголовок сообщение заменяется на «Привет, пользовательский номер X», где X заменяется на количество нажатий на заголовок с момента создания службы, то есть: оно не будет сброшено при экземпляр, перезапуск веб-сервера.

База данных

Давайте внимательнее посмотрим на эту программу. Для подсчета кликов он использует базу данных и поэтому начинает с объявления базы данных mydb, содержащей единственное значение типа int в path / counter. Пути к базам данных в Opa — это места для значений БД, которые концептуально несколько похожи на пути к файловой системе. Это очень скромная база данных, но по существу нет ограничений на количество и сложность (то есть типы) путей.

Как вы можете видеть из функции действия, Opa тесно интегрирует программирование базы данных на базовом языке, обеспечивая удобный синтаксис для чтения и обновления базы данных; а также запросы , хотя это выходит за рамки этой статьи. С помощью простой аннотации (@mongo, здесь) можно выбрать механизм базы данных, который будет обеспечивать работу приложения, причем MongoDB является основным выбором в Opa на данный момент.

интерактивность

На страницу функции. Интересно, что статический HTML содержит обработчик событий, который указывает на функцию в нашей программе.

<h1 onclick={action}>Hello, world</h1>

где указанная функция выполняет некоторые операции с базой данных и DOM с использованием специального синтаксиса:

#msg = <>Hello, user number {/mydb/counter}!</>;

Здесь есть две вещи. Во-первых, #id = content означает: заменить содержимое элемента DOM, идентифицируемого по id, на content. Во-вторых, фрагмент 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 на форуме .