Как установить F # и настроить среду локального программирования в Ubuntu 18.04

_ Автор выбрал Free Software Foundation для получения пожертвования в рамках Write для DOnations программа.

Вступление

https://fsharp.org [F #] - это язык программирования с открытым исходным кодом, изначально разработанный в Microsoft Research для расширения .NET, набора инструментов, библиотек и языков Microsoft для сборки. приложения и услуги. Помимо удивительно лаконичного синтаксиса, F # поддерживает несколько paradigms, что означает, что он может выполнять различные типы структурирования кода, хотя в первую очередь он был разработан, чтобы использовать преимущества подхода функционального программирования. ,

Принятие определенного paradigm или стиля кода определяет то, как мы будем думать и организовывать решение задач программирования. С imperative подход, модель дизайна, используемая в таких языках, как C++ или Java, Разработчик шаг за шагом описывает, как компьютер должен выполнить задачу. Речь идет о написании последовательности операторов, которые изменят состояния памяти при выполнении программы. Это работает нормально, пока мы не столкнемся с нерегулярными ситуациями. Рассмотрим, например, shared object, который используется несколькими приложениями одновременно. Мы можем захотеть прочитать его значение в то же время, когда другой компонент его модифицирует. Это конкурентные действия в области памяти, которые могут привести к несогласованности данных и неопределенному поведению.

В functional code design мы предотвращаем подобные проблемы, сводя к минимуму использование mutable states или заявляя, что может измениться после того, как мы их сделаем. Функция - это ключевое слово, обозначающее математические преобразования некоторой информации, представленной в качестве аргументов. Функциональный код выражает то, что программа, составляя решение в виде набора функций, которые должны быть выполнены. Как правило, мы создаем слои логики, используя функции, которые могут возвращать другую функцию или принимать другие функции в качестве входных данных.

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

  • Более читаемый и выразительный синтаксис, который повышает удобство сопровождения программы.

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

  • Нативные конструкции, которые облегчают асинхронное программирование и более безопасный параллелизм.

  • Доступ ко всем существующим инструментам в мире .NET, включая пакеты для сообщества.

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

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

На самом деле в Linux доступны две реализации .NET: .NET Core и https://www.mono-project.com [Mono] , Исторически .NET работал только на Windows. В те дни можно было обратиться к проекту сообщества Mono для запуска приложений .NET на других платформах, таких как Linux и macOS. Затем Microsoft запустила .NET Core, более быстрое, модульное подмножество оригинальной платформы .NET, предназначенное для нескольких платформ.

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

В этом руководстве вы настроите среду программирования F # в Ubuntu 18.04, используя среды выполнения .NET Core и Mono. Затем вы напишете несколько примеров кода для тестирования и обзора методов сборки и компиляции.

Предпосылки

Чтобы завершить этот урок, вам понадобится базовое знакомство с командной строкой и компьютером под управлением Ubuntu 18.04 с https://www.digitalocean.com/community/tutorials/initial. -server-setup-with-ubuntu-18-04 # step-2-% E2% 80% 94-creation-a-new-user [пользователь без полномочий root с привилегиями sudo].

Шаг 1 - Установка F # с .NET Core

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

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

Командная строка, также известная как shell или terminal, может помочь изменить и автоматизировать многие задачи, выполняемые на компьютере каждый день, и является важным инструментом для разработчиков программного обеспечения. Есть много команд терминала для изучения, которые могут позволить вам делать более мощные вещи. Для получения дополнительной информации о командной строке обратитесь к учебнику Introduction to Linux Terminal.

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

изображение: https: //assets.digitalocean.com/articles/eng_python/UbuntuDebianSetUp/UbuntuSetUp.png [Терминал Ubuntu]

После того, как вы открыли терминал, используйте команду + 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, который в Ubuntu является поддерживаемым сообществом архивом программного обеспечения, которое является бесплатным и открытым исходным кодом. Это даст вам доступ к + apt-transport-https +, зависимости для включения APT-транспорта в Ubuntu через HTTPS.

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

Далее обновите доступные загрузки:

sudo apt update

Наконец, установите current version .NET SDK. Этот урок будет использовать версию 2.2:

sudo apt install dotnet-sdk-

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

dotnet --info

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

OutputWelcome 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:

Output.NET Core SDK (reflecting any global.json):
Version:
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//

Host (useful for support):
 Version:
 Commit:  1249f08fed

.NET Core SDKs installed:
  [/usr/share/dotnet/sdk]

.NET Core runtimes installed:
 Microsoft.AspNetCore.All  [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
 Microsoft.AspNetCore.App  [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
 Microsoft.NETCore.App  [/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:

~ / .Profile

. . .
export DOTNET_CLI_TELEMETRY_OPTOUT=1

Выйдите из + nano +, нажав клавиши + 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, но она может быть устаревшей. Вместо этого добавьте official 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 в свой список репозиториев.

С новым списком источников, добавленным для APT, обновите ваши репозитории:

sudo apt update

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

sudo apt install mono-complete fsharp

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

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

fsharpi

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

OutputMicrosoft (R) F# Interactive version 4.1
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

>
Вы можете вернуться к оболочке по умолчанию, запустив `+ # quit

`. В ` fsharpi +` каждая командная строка заканчивается двойной точкой с запятой.

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

printfn "Hello World!";;

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

OutputHello World!
val it : unit = ()

>

Из предыдущего взаимодействия + fsharpi + оценивает выражение как значение https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/unit-type [+ unit + type]. Затем выполняется код и результат печатается с его типом.

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

fsharpi .fsx

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

> #quit;;

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

Шаг 3 - Написание и компиляция F # программ с .NET Core

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

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

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

  • + dotnet new + создаст проект

  • + dotnet build + создаст проект и все его зависимости

  • + dotnet add package добавит ссылку на пакет в файл проекта

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

dotnet new console -lang F# -o

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

cd

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

nano Program.fs

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

Program.fs

// 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 +, затем определяете точку входа в программу, то есть место, где программа запускается при запуске из оболочки. Функция + main вызовет печать сообщения` + Hello World` на консоль и остановит программу (+ вернет целочисленный код выхода +).

Выход из файла.

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

dotnet run

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

OutputHello World from F#!

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

dotnet publish -c release -r linux-x64

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

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

dotnet bin/release/netcoreapp/linux-x64/publish/.dll

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

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

Шаг 4 - Написание и компиляция F # программ с Mono

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

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

cd

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

nano hello.fs

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

hello.fs

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

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

hello.fs

open System

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

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

hello.fs

open System

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

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

Сохраните и выйдите из файла.

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

fsharpc hello.fs -o hello

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

mono hello

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

OutputWho are you?

Если вы введете ++, вы получите следующее.

OutputOh, Hello !
I'm F#.

Нажмите последнее нажатие клавиши, и программа завершится.

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

Заключение

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

Следующими шагами могут быть learn language и связаться с https: //fsharp.org/community/projects/[community]. Кроме того, поскольку проекты становятся все более сложными, вам может потребоваться более эффективное управление кодом и ресурсами. Менеджеры пакетов, такие как https://www.nuget.org [NuGet] или Paket, являются мостом к сильной экосистеме, построенной вокруг .NET, и инструментам выбора для организации больших программы.