Ubuntu18.04でF#をインストールしてローカルプログラミング環境をセットアップする方法
著者は、 Free Software Foundation を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
F#は、アプリケーションとサービスを構築するためのMicrosoftのツール、ライブラリ、および言語のセットである .NET を拡張するために、MicrosoftResearchで最初に開発されたオープンソースプログラミング言語です。 非常に簡潔な構文に加えて、F#は複数のパラダイムをサポートします。つまり、主に関数型プログラミングアプローチを利用するように設計されていますが、さまざまなタイプのコード構造化を実行できます。
特定のパラダイム、またはコードのスタイルを採用することで、プログラミングの問題解決の考え方と整理方法が決まります。 命令型アプローチ、 C++やJavaなどの言語で使用される設計モデルを使用して、開発者はコンピューターがタスクを実行する方法を段階的に説明します。 これは、プログラムの実行時にメモリの状態を変更する一連のステートメントを作成することです。 これは、不規則な状況が発生するまでは正常に機能します。 たとえば、複数のアプリケーションで同時に使用される共有オブジェクトについて考えてみます。 別のコンポーネントが値を変更しているのと同時に、その値を読み取りたい場合があります。 これらは、データの不整合や未定義の動作を引き起こす可能性のある、メモリ位置に対する同時アクションです。
関数型コード設計では、可変状態、または作成後に変更される可能性のある状態の使用を最小限に抑えることで、この種の問題を防ぎます。 ここでのキーワードは関数であり、引数として提供されるいくつかの情報の数学的変換を指します。 関数型コードは、実行する関数のセットとしてソリューションを構成することにより、プログラムが何であるかを表現します。 通常、別の関数を返すか、他の関数を入力として受け取ることができる関数を使用して、ロジックのレイヤーを構築します。
F#を使用した関数型プログラミングには、次のような多くの利点があります。
- プログラムの保守性を向上させる、より読みやすく表現力豊かな構文。
- テスト用に分離できるステートレス関数により、コードが破損しにくく、デバッグが容易です。
- 非同期プログラミングとより安全な並行性を促進するネイティブ構造。
- コミュニティ共有パッケージを含む、.NETの世界にあるすべての既存のツールへのアクセス。
ランタイムの選択
F#はクロスプラットフォームであるため、さまざまなオペレーティングシステムで同様の実行モデルの動作を維持することが不可欠です。 .NETは、ランタイムを使用してこれを実現します。 ランタイムシステムは、特定のプログラミング言語で記述されたプログラムの実行を調整し、オペレーティングシステムとのインターフェイスやメモリ管理などを処理するソフトウェアです。
Linuxで利用できる.NETランタイム実装は、実際には .NETCoreとMonoの2つです。 歴史的に、.NETはWindowsでのみ機能していました。 当時は、コミュニティのMonoプロジェクトに頼って、LinuxやmacOSなどの他のプラットフォームで.NETアプリケーションを実行することができました。 その後、Microsoftは、複数のプラットフォームを対象とする、元の.NETFrameworkのより高速なモジュラーサブセットである.NETCoreを立ち上げました。
このチュートリアルの公開時点では、どちらもWebアプリケーションまたはコマンドラインユーティリティの構築に使用できます。 とはいえ、.NET CoreはLinuxおよびmacOSでGUIデスクトップアプリケーションを作成するためのモデルを出荷していませんが、Monoはモバイルおよびゲームプラットフォームをサポートする唯一のモデルです。 選択するランタイムによってビルドするプログラムが形成されるため、これらの違いを理解することが重要です。 また、すべてのユースケースを考慮し、より生産的なスタックを作成するために、.NETCoreとMonoの両方をインストールすることを選択することもできます。
このチュートリアルでは、.NET CoreとMonoの両方のランタイムを使用して、Ubuntu 18.04でF#プログラミング環境をセットアップします。 次に、ビルドメソッドとコンパイルメソッドをテストおよびレビューするためのコード例をいくつか記述します。
前提条件
このチュートリアルを完了するには、コマンドラインと、sudo権限を持つ非rootユーザーで Ubuntu18.04を実行しているコンピューターの基本的な知識が必要です。
手順1— .NET Coreを使用したF#のインストール
Microsoftは、F#開発者向けに .NET Coreソフトウェア開発キット(SDK)を提供しています。 ソフトウェア開発キットは、プログラマーが特殊なアプリケーションを作成し、それらをさまざまなオペレーティングシステムに適合させることを可能にするプログラミングツールのセットです。 従来、他のコンポーネントの中でも、テキストエディタ、言語サポート、ランタイム、コンパイラが含まれています。 このステップでは、このSDKをインストールします。 ただし、最初に、Microsoftリポジトリを登録し、いくつかの依存関係を取得します。
コマンドラインでインストールとセットアップを完了します。これは、コンピューターと対話するための非グラフィカルな方法です。 つまり、ボタンをクリックする代わりに、テキストを入力し、テキストを介してコンピューターからフィードバックを受け取ることになります。
シェルまたはターミナルとも呼ばれるコマンドラインは、コンピューターで毎日実行するタスクの多くを変更および自動化するのに役立ち、ソフトウェア開発者にとって不可欠なツールです。 あなたがより強力なことをすることを可能にすることができる学ぶべき多くのターミナルコマンドがあります。 コマンドラインの詳細については、Linuxターミナルの概要チュートリアルをご覧ください。
Ubuntu 18.04では、画面の左上隅にある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 リポジトリをアクティブにします。これは、Ubuntuでは、無料でオープンソースのソフトウェアのコミュニティが管理するアーカイブです。 これにより、にアクセスできるようになります apt-transport-https
、HTTPSを介したUbuntuパッケージマネージャーAPTトランスポートを有効にするための依存関係。
- sudo add-apt-repository universe
- sudo apt install apt-transport-https
次に、利用可能なダウンロードを更新します。
- sudo apt update
最後に、.NETSDKの現在のバージョンをインストールします。 このチュートリアルでは、バージョン2.2を使用します。
- sudo apt install dotnet-sdk-2.2
.NET SDKがインストールされたので、すべてがうまくいったかどうかを確認する簡単な方法は、SDKをダウンロードしてインストールするとシェルで使用できる.NET Coreコマンドラインインターフェイス(CLI)を試すことです。 ターミナルに次のように入力して、.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
...
この通知は収集されたデータに関するものであり、一部の.NETCLIコマンドが使用状況情報をMicrosoftに送信することを説明しています。 これはすぐに無効になります。 今のところ、からの出力を見てください dotnet --info
.
しばらくすると、ターミナルに.NETのインストールに関する情報が一覧表示されます。
Output.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のバージョンによっては、出力が若干異なる場合がありますが、これにより、.NETCoreを使用する準備ができていることが確認されます。
前述のように、テレメトリ機能を使用すると、一部の.NETCLIコマンドで使用状況情報をMicrosoftに送信できます。 デフォルトで有効になっていますが、 DOTNET\_CLI\_TELEMETRY_OPTOUT
環境変数から 1
. これを行うには、に新しい行を追加します .profile
テキストエディタで開いて、環境カスタマイズファイルを作成します。 このチュートリアルでは、 nano
:
- nano ~/.profile
末尾に次の行を追加します .profile
:
. . .
export DOTNET_CLI_TELEMETRY_OPTOUT=1
出口 nano
を押すことによって CTRL
と X
キー。 ファイルを保存するように求められたら、を押します Y
その後 ENTER
.
を使用して新しい構成をアクティブ化できます source
指図:
- source ~/.profile
今後、テレメトリは起動時にオフになります。
この時点で、.NET Coreランタイム、言語サポート、およびライブラリがインストールされており、いくつかの.NETアプリケーションを実行および構築できます。 The dotnet
CLIは、.NETソースコードとバイナリの管理にも使用できます。 F#プロジェクトの構築を開始することもできますが、前述のように、.NET Core環境は、完全にクロスプラットフォームであるために必要なすべての構成を提供するわけではありません。 今のところ、たとえばモバイルアプリケーションの開発には使用できません。
この問題を解決するために、次のステップでF#を再度インストールしますが、今回はMonoを使用します。
手順2— Monoを使用したF#のインストール
Monoを使用して、.NETCoreによって残された機能の残りのギャップを埋めることができます。 Monoと.NETCoreはどちらも同じ標準ライブラリに基づいており、どちらも.NET言語をサポートしていますが、類似点はここで終わります。 それらは異なるランタイム、異なるCLI、および異なるコンパイラーを使用し、それらを並べてインストールして、より信頼性の高いプログラミング環境を作成することを可能にします。 このセクションでは、.NETプログラミング用のMonoツールを使用して環境を補完し、コマンドラインからF#プログラムを実行します。
モノのバージョンは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パッケージのソースをリポジトリリストに追加しました。
APT用に追加された新しいソースリストを使用して、リポジトリを更新します。
- 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
促す:
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
式をユニットタイプ値として評価します。 次にコードが実行され、結果がそのタイプとともに出力されます。
fsharpi
F#コードを含むファイルを実行することもできます。 スクリプトには、 .fsx
次のコマンドを使用して、シェルから拡張および実行されます。
- fsharpi some_script.fsx
F#のインストールが機能していることがわかったので、シェルを次のように残します。
> #quit;;
Monoと.NETCoreをインストールすると、あらゆるタイプのF#プログラムを作成する準備が整います。 FSIを使用すると、コードをテストし、必要に応じていくつかのスクリプトを実行できますが、実行は遅くなります。 F#スクリプトを実行するには、追加の手順を実行して、ソースコードをプロセッサが理解できるアーティファクトに変換するため、速度が低下します。 これを解決するために、次のセクションでは、.NET Coreを使用してコードをコンパイルし、マシンですぐに実行できるスタンドアロンのバイナリファイルを作成します。
ステップ3— .NET Coreを使用したF#プログラムの作成とコンパイル
この手順では、.NET Coreで提供されるコマンドラインコンパイラを使用してF#ソースコードをコンパイルします。 これにより、アプリケーションを高速化し、特定のシステム用に事前設定された実行可能パッケージを作成して、プログラムの配布を容易にすることができます。
コンパイルは、ソースコードをバイナリファイルに変換する変換プロセスです。 この変換を実行するソフトウェアは、コンパイラと呼ばれます。 .NETCoreは dotnet
コンパイルを実行するCLI。 これを実証するために、コンパイルケースを確認するための基本的なF#ソースを作成します。
The dotnet
CLIは、完全なアプリケーションビルドツールチェーンを提供します。 一般に、コマンドと dotnet
ドライバーは、タスクを完了するためにシェルで使用されます。 例えば:
dotnet new
プロジェクトを作成しますdotnet build
プロジェクトとそのすべての依存関係を構築しますdotnet add package
プロジェクトファイルへのパッケージ参照を追加します
以下は、という新しいコンソールプロジェクトを作成します FSharpHello
. The -lang
オプションは、コーディングするプログラミング言語を設定します。 -o
オプションは、出力を配置するディレクトリを作成します。
- dotnet new console -lang F# -o FSharpHello
これが完了したら、新しく作成したプロジェクトディレクトリに移動します。
- cd FSharpHello
このディレクトリには、 FSharpHello.fsproj
プロジェクト構成ファイルと obj
一時オブジェクトファイルを保存するために使用されるフォルダ。 もあります Program.fs
デフォルトのソースコードが存在するファイル。 テキストエディタで開きます。
- nano Program.fs
ファイルには、 HelloWorldプログラムが自動的に入力されています。
// 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
次に、プログラムのエントリポイント、つまりシェルから起動したときにプログラムが開始する場所を定義します。 The main
関数はを要求します Hello World
コンソールにメッセージを出力し、プログラムを停止します(return an integer exit code
).
ファイルを終了します。
このコードをコンパイルして実行するには、プロジェクトディレクトリから以下を使用します ~/FSharpHello
:
- dotnet run
プログラムが実行され、次の出力が画面に出力されます。
OutputHello 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— Monoを使用したF#プログラムの作成とコンパイル
Monoのコンパイルプロセスは.NETCoreのプロセスと似ていますが、今回はプログラムのコンパイルに使用される特定のコマンドがあります。 The 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
これにより、次の出力が得られ、ユーザー入力を待ちます。
OutputWho are you?
入力した場合 Sammy
、次のようになります。
OutputOh, Hello Sammy!
I'm F#.
最後のキーストロークを押すと、プログラムが終了します。
おめでとう! これで、Monoと.NET Coreの両方を使用して最初のF#プログラムを作成およびコンパイルしました。
結論
このチュートリアルでは、.NET Core環境とMono環境の両方をカバーするF#プログラミング用のツールをインストールしました。 また、F#コードの例とビルドされた実行可能ファイルもテストしました。 これらは、この実用的な機能言語を学ぶための最初のステップです。
次のステップは、学習 言語で、コミュニティに連絡することです。 また、プロジェクトがより複雑になると、コードとリソースをより効率的に管理する必要がある場合があります。 NuGetやPaketなどのパッケージマネージャーは、.NETを中心に構築された強力なエコシステムと、大規模なプログラムを編成するための選択ツールへの架け橋です。