Установка F# и настройка локальной среды разработки в Ubuntu 18.04

F# — это язык программирования с открытым исходным кодом, изначально разработанный в Microsoft Research для расширения .NET, набора инструментов, библиотек и языков Microsoft для создания приложений и сервисов. Помимо удивительно лаконичного синтаксиса, F# поддерживает несколько парадигм, то есть он может по-разному структурировать код, хотя изначально он был разработан, чтобы использовать преимущества функционального подхода.

Выбор определенной парадигмы (или стиля кода) определяет то, как мы будем думать и организовывать решение задач программирования в дальнейшем. При императивном подходе (эта модель проектирования используется в таких языках, как C++ или Java) разработчик шаг за шагом описывает, как компьютер должен выполнять задачу. Здесь речь идет о написании последовательности операторов, которые изменят состояния памяти при выполнении программы. Этот подход работает нормально до возникновения нестандартных ситуаций. Рассмотрим, например, распределенный объект, который используется несколькими приложениями одновременно. Вы можете захотеть прочитать его значение, а в этот же момент другой компонент попробует изменить его. Эти параллельные действия в области памяти могут привести к несогласованности данных и неопределенному поведению программы.

Функциональный подход предотвращает подобные проблемы, сводя к минимуму использование изменяемых состояний (то есть состояний, которые могут изменяться после их создания). Функция – это ключевое слово, которое говорит о математических преобразованиях некоторой информации, представленной в качестве аргументов. Функциональный код выражает программу, составляя решения в виде наборов функций, которые должны быть выполнены. Как правило, слои логики программы создаются с помощью функций, которые могут возвращать новую функцию или принимать другие функции в качестве входных данных.

Функциональное программирование с помощью F# дает ряд преимуществ:

  • Удобочитаемый и выразительный синтаксис, который упрощает сопровождение программы.
  • Код более отказоустойчивый и простой в отладке благодаря stateless функциям, которые можно изолировать для тестирования.
  • Нативные конструкции, которые облегчают асинхронное программирование и улучшают поддержку параллельных задач.
  • Доступ ко всем существующим инструментам в мире .NET, включая пакеты, разработанные сообществом.

Выбор среды выполнения

Поскольку F# является кроссплатформенным языком, потому поддержка моделей схожего поведения в разных операционных системах очень важна. .NET делает это с помощью среды выполнения. Система времени выполнения – это часть программного обеспечения, которая управляет выполнением программы, написанной на определенном языке программирования (в том числе ее взаимодействием с операционной системой и управлением памятью).

На самом деле в Linux доступны две реализации среды выполнения .NET: .NET Core и Mono. Изначально .NET работал только на Windows. Раньше для запуска приложений .NET на других платформах, таких как Linux и macOS, можно было обратиться к проекту сообщества Mono. Затем Microsoft запустила .NET Core, более быструю, модульную версию оригинальной платформы .NET, предназначенную для нескольких платформ.

На момент публикации этого мануала обе реализации могут использоваться для создания веб-приложений или утилит командной строки. При этом .NET Core не поставляет моделей для создания настольных приложений с графическим интерфейсом в Linux и macOS. Mono – единственная реализация, которая поддерживает мобильные и игровые платформы. Эти различия важно знать, так как выбранная среда выполнения будет определять ваши возможности. Вы также можете установить обе реализации, чтобы получить все функции и создать более производительный стек.

Данный мануал поможет вам установить F# на сервер Ubuntu 18.04 с помощью обеих реализаций — .NET Core и Mono. Также мы напишем тестовый код, чтобы ознакомиться с функциями сборки и компиляции.

Требования

Для работы вам понадобятся базовые знания командной строки и машина Ubuntu 18.04, настроенная по этому мануалу.

1: Установка F# с помощью .NET Core

Microsoft предоставляет .NET Core Software Development Kit (SDK) для разработчиков на F#. Software Development Kit, или SDK – это набор инструментов программирования, который позволяет создавать специализированные приложения и адаптировать их к различным операционным системам. Он традиционно включает в себя текстовый редактор, поддержку языков, среду выполнения и компилятор, а также некоторые другие компоненты. На этом этапе нам нужно установить SDK. Но сначала вы зарегистрируете репозиторий Microsoft и загрузите некоторые зависимости.

Установку и настройку мы будем выполнять в командной строке – это неграфический способ взаимодействия с вашим компьютером. То есть вместо того, чтобы нажимать на кнопки, вы будете вводить текст и получать отзывы компьютера тоже через текст.

Командная строка (также называется оболочкой или терминалом) может помочь изменить и автоматизировать многие задачи, которые вы выполняете на компьютере каждый день. Она является важным инструментом для разработчиков программного обеспечения. У терминала есть много команд, которые делают разработку более производительной.

Читайте также: Основы работы с терминалом Linux

В Ubuntu 18.04 вы можете найти приложение Terminal, щелкнув значок Ubuntu в верхнем левом углу экрана и введя terminal в строку поиска. Нажмите на значок приложения терминала, чтобы открыть его. Кроме того, вы можете одновременно нажать CTRL, ALT и T на клавиатуре, чтобы автоматически открыть приложение терминала.

После того, как вы открыли терминал, используйте команду wget для загрузки пакета, содержащего некоторые необходимые файлы, конфигурации репозитория Microsoft и ключ для взаимодействия с сервером.

wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb

Теперь добавьте репозиторий Microsoft и установите пакеты в вашу систему, используя команду dpkg -i.

sudo dpkg -i packages-microsoft-prod.deb

Затем активируйте репозиторий Universe, который представляет собой поддерживаемый сообществом архив программного обеспечения с бесплатным и открытым исходным кодом. Это даст вам доступ к apt-transport-https, зависимости для поддержки передачи данных менеджера пакетов APT через HTTPS.

sudo add-apt-repository universe
sudo apt install apt-transport-https

Далее обновите индекс локальных пакетов:

sudo apt update

Установите текущую версию .NET SDK. В этом мануале мы будем использовать версию 2.2:

sudo apt install dotnet-sdk-2.2

Теперь, когда у вас установлен .NET SDK, вы можете быстро проверить, все ли прошло хорошо, — для этого попробуйте запустить интерфейс командной строки (CLI) .NET Core, который будет доступен в оболочке после загрузки и установки SDK. Запросите информацию о настройке .NET, набрав в своем терминале:

dotnet --info

Когда вы запускаете команду dotnet в первый раз, отображается такой текстовый раздел:

Welcome to .NET Core!
---------------------
Learn more about .NET Core: https://aka.ms/dotnet-docs
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
Telemetry
---------
The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry
...

Это уведомление рассказывает о собранных данных и объясняет, что некоторые команды .NET CLI будут отправлять информацию об использовании в Microsoft. Скоро мы отключим это; а сейчас посмотрим на вывод dotnet —info.

Через некоторое время терминал отобразит информацию о вашей установке .NET:

.NET Core SDK (reflecting any global.json):
Version:   2.2.101
Commit:    236713b0b7
Runtime Environment:
OS Name:     ubuntu
OS Version:  18.04
OS Platform: Linux
RID:         ubuntu.18.04-x64
Base Path:   /usr/share/dotnet/sdk/2.2.101/
Host (useful for support):
Version: 2.2.0
Commit:  1249f08fed
.NET Core SDKs installed:
2.2.101 [/usr/share/dotnet/sdk]
.NET Core runtimes installed:
Microsoft.AspNetCore.All 2.2.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.2.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 2.2.0 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
To install additional .NET Core runtimes or SDKs:
https://aka.ms/dotnet-download

В зависимости от версии SDK выходные данные могут немного отличаться, но этот вывод подтверждает, что .NET Core готов к работе.

Как упоминалось ранее, функция телеметрии позволяет некоторым командам .NET CLI отправлять информацию об использовании в Microsoft. Она включена по умолчанию, но ее можно деактивировать, установив для переменной среды DOTNET\_CLI\_TELEMETRY_OPTOUT значение 1. Чтобы сделать это, добавьте новую строку в файл настроек среды .profile, открыв ее в текстовом редакторе. Для этого мы будем использовать nano:

nano ~/.profile

Добавьте следующую строку в конец .profile:

. . .
export DOTNET_CLI_TELEMETRY_OPTOUT=1

Выйдите из редактора, нажав клавиши Ctrl и X. Когда будет предложено сохранить файл, нажмите Y, а затем Enter.

Вы можете активировать новую конфигурацию, используя команду source:

source ~/.profile

Теперь телеметрия будет отключена при запуске.

На этом этапе у вас есть среда выполнения .NET Core, поддержка языков и библиотеки, что уже позволяет запускать и создавать некоторые приложения .NET. Также теперь доступен CLI dotnet для управления исходным кодом и двоичными файлами .NET. Вы можете начать создавать проекты на F# уже сейчас. Но, как говорилось ранее, среда .NET Core не предоставляет всех конструкций для полной кроссплатформенности. Сейчас вы, например, не можете заниматься разработкой мобильных приложений.

Чтобы решить эту проблему, на следующем этапе мы снова установим F#, но на этот раз с реализацией Mono.

2: Установка F# с помощью Mono

Вы можете использовать Mono, чтобы заполнить функциональные пробелы в .NET Core. Реализации Mono и .NET Core основаны на одной и той же стандартной библиотеке и поддерживают языки .NET, но на этом их сходство заканчивается. Они используют разные среды выполнения, разные CLI и компиляторы, что позволяет устанавливать их вместе для создания более надежной среды программирования. В этом разделе мы дополним свою среду инструментами Mono для программирования на .NET и запустим F# из командной строки.

Версия Mono доступна в репозиториях Ubuntu, но она может быть устаревшей. Лучше добавьте официальный репозиторий Mono в менеджер пакетов:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list

В этих командах мы использовали apt-key, чтобы извлечь ключи для защиты пакетов, переданных из официальных репозиториев Mono. Затем мы добавили источник пакетов Mono в свой список репозиториев.

Теперь обновите ваши репозитории:

sudo apt update

Затем загрузите инструменты Mono. В отличие от .NET Core, Mono не включает в себя инструменты F#, поэтому их нужно скачать отдельно. Установите fsharp и метапакет mono-complete с помощью следующей команды:

sudo apt install mono-complete fsharp

Примечание: Из-за размера этой загрузки процесс установки mono-complete может занять некоторое время.

После этого у вас будет компилятор fsharpc и интерактивная оболочка fsharpi или просто FSI. FSI – это среда внутри оболочки, которая получает вводимые пользователем данные в виде выражения, оценивает их, затем выводит результат и ожидает нового ввода. Это похоже на ввод команды в традиционной оболочке и просмотр результата, только здесь вводятся выражения F#. FSI предоставляет быстрый метод для тестирования кода или запуска скриптов.

Активируйте FSI с помощью следующей команды:

fsharpi

Это запустит интерактивный сеанс и заменит вашу обычную командную строку строкой fsharpi:

Microsoft (R) F# Interactive version 4.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
For help type #help;;
>

Вы можете вернуться к оболочке по умолчанию, запустив #quit;;. В fsharpi каждая командная строка заканчивается двойной точкой с запятой.

Давайте попробуем выполнить простую операцию, используя функцию printfn, чтобы отобразить сообщение, переданное в качестве параметра:

printfn "Hello World!";;

Вы получите следующий вывод:

Hello World!
val it : unit = ()
>

Здесь fsharpi оценивает выражение как значение типа unit. Затем выполняется код и выводится результат с его типом.

fsharpi также может запустить файл, содержащий код F#. Сценарий должен иметь расширение .fsx и выполняться из оболочки с помощью команды:

fsharpi some_script.fsx

Теперь, когда вы знаете, что установка F# прошла успешно, закройте оболочку:

> #quit;;

Установив Mono и .NET Core, вы можете писать любые программы на F#. FSI позволит вам протестировать код и запустить несколько сценариев, если это необходимо, но он будет выполняться медленно. Для выполнения сценария F# нужны дополнительные шаги, чтобы преобразовать исходный код в артефакты, понятные для процессора, что, следовательно, и замедляет работу. Чтобы исправить это, в следующем разделе мы скомпилируем код с помощью .NET Core, создав автономные двоичные файлы, которые можно сразу запустить.

3: Написание и компиляция кода F# с помощью .NET Core

Сейчас мы скомпилируем исходный код F# с помощью компиляторов командной строки .NET Core. Это позволит вам сделать ваши приложения быстрее и создавать подготовленные исполняемые пакеты для конкретных систем, что облегчит распространение программы.

Компиляция – это процесс преобразования, который превращает исходный код в двоичный файл. Программное обеспечение, которое выполняет это преобразование, называется компилятором. .NET Core использует CLI dotnet для выполнения компиляции. Чтобы продемонстрировать это, мы создадим базовый исходный код F#.

Dotnet CLI предоставляет полный набор инструментов для сборки приложений. Как правило, для выполнения задачи в оболочке используется связка команды и драйвера dotnet. Например:

  • dotnet new создаст проект
  • dotnet build  соберет проект и все его зависимости
  • dotnet add package добавит ссылку на пакет в файл проекта

Следующая команда создаст новый консольный проект под названием FSharpHello. Опция -lang устанавливает язык программирования, а опция -o создает каталог для размещения вывода.

dotnet new console -lang F# -o FSharpHello

Как только это будет сделано, перейдите в созданный каталог проекта:

cd FSharpHello

Этот каталог содержит конфигурационный файл проекта FSharpHello.fsproj и папку obj, которая используется для хранения временных файлов объектов. Существует также файл Program.fs, в котором находится исходный код по умолчанию. Откройте его в текстовом редакторе:

nano Program.fs

Файл был автоматически заполнен программой Hello World:

// Learn more about F# at http://fsharp.org
open System
[<EntryPoint>]
let main argv =
printfn "Hello World from F#!"
0 // return an integer exit code

Код начинается с импорта модуля System с open System, затем определяется точка входа в программу, то есть место, где запускается программа (при запуске из оболочки). Основная функция вызовет сообщение Hello World на консоль и остановит программу (вернет целочисленный код завершения).

Закройте файл.

Чтобы скомпилировать и запустить этот код, используйте следующее из каталога проекта ~/FSharpHello:

dotnet run

Программа запустится, выведя на экран следующий результат:

Hello World from F#!

Обратите внимание, для запуска этой программы потребовалось некоторое время, как и в случае с FSI. Как мы упоминали ранее, код можно запустить быстрее, создав исполняемый файл, то есть двоичный файл, который можно запустить непосредственно операционной системой. Вот как это сделать:

dotnet publish -c release -r linux-x64

Эта команда создаст исполняемый файл bin/release/netcoreapp2.2/linux-x64/publish/FSharpHello.dll. Это общая библиотека, которая будет работать на 64-битной архитектуре Linux. Чтобы экспортировать универсальный исполняемый файл для систем MacOS, вы должны заменить идентификатор среды выполнения linux-x64 (RID) на osx-x64.

Теперь выполните файл с помощью следующей команды:

dotnet bin/release/netcoreapp2.2/linux-x64/publish/FSharpHello.dll

На этот раз вы получите вывод намного быстрее, так как программа уже переведена в двоичную форму.

Теперь, когда вы знаете, как компилировать код в .NET Core, давайте посмотрим, как Mono компилирует программы с помощью специальной команды fsharpc.

4: Написание и компиляция программ F# с помощью Mono

Процесс компиляции Mono аналогичен процессу .NET Core, но в Mono есть специальная команда для компиляции программы. Команда fsharpc – это специальный инструмент для компиляции.

На этот раз создайте файл hello.fs и напишите немного кода F #. Сначала вернитесь в свой домашний каталог:

cd

Затем откройте новый файл hello.fs:

nano hello.fs

Добавьте следующую строку в файл:

open System

Как было показано ранее, это импортирует модуль или пространство имен System, предоставляя вам доступ к встроенным системным функциям и объектам, таким как Console.

Теперь добавьте еще несколько строк кода:

open System
let hello() =
printf "Who are you? "
let name = Console.ReadLine()
printfn "Oh, Hello %s!\nI'm F#." name

Эти новые строки определяют функцию hello() для чтения пользовательского ввода и для вывода сообщения обратной связи.

Теперь вы можете добавить последние строки:

open System
let hello() =
printf "Who are you? "
let name = Console.ReadLine()
printfn "Oh, Hello %s!\nI'm F#." name
hello()
Console.ReadKey() |> ignore

Здесь мы вызываем функцию hello(), а затем используем метод ReadKey(), чтобы завершить выполнение программы последним нажатием клавиши.

Сохраните и закройте файл.

Теперь с командой fsharpc используйте флаг -o, чтобы определить имя выходного файла и скомпилировать исходный код hello.fs:

fsharpc hello.fs -o hello

Предыдущая команда сгенерирует исполняемый файл hello, который вы можете запустить с помощью mono:

mono hello

Это отобразит следующий вывод и будет ждать ввода пользователя:

Who are you?

Если вы введете 8host, вы получите вывод:

Oh, Hello 8host!
I'm F#.

Нажмите клавишу, и программа закончит работу.

Поздравляем! Вы написали и скомпилировали свою первую программу на F# с помощью Mono и.NET Core.

Заключение

В этом руководстве вы установили инструменты для программирования на F#, включая среды .NET Core и Mono. Вы также протестировали простой код F# и создали исполняемые файлы. Это первые шаги к изучению этого языка.

Теперь вы можете начать знакомство с этим языком программирования и стать частью его сообщества. Поскольку со временем проекты становятся все более сложными, вам может потребоваться эффективное управление кодом и ресурсами. Менеджеры пакетов, такие как NuGet или Paket – очень важные компоненты экосистемы, построенной вокруг .NET, необходимые для организации больших программ.

Tags: , , , ,