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
にアクセスできるようになります。これは、UbuntuパッケージマネージャーのAPTトランスポートをHTTPS経由で有効にするための依存関係です。
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
の末尾に次の行を追加します。
〜/ .profile
. . . export DOTNET_CLI_TELEMETRY_OPTOUT=1
CTRL
およびX
キーを押して、nano
を終了します。 ファイルを保存するように求められたら、Y
を押してから、ENTER
を押します。
source
コマンドを使用して、新しい構成をアクティブ化できます。
source ~/.profile
今後、テレメトリは起動時にオフになります。
この時点で、.NET Coreランタイム、言語サポート、およびライブラリがインストールされており、いくつかの.NETアプリケーションを実行および構築できます。 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#ソースコードをコンパイルします。 これにより、アプリケーションを高速化し、特定のシステム用に事前設定された実行可能パッケージを作成して、プログラムの配布を容易にすることができます。
コンパイルは、ソースコードをバイナリファイルに変換する変換プロセスです。 この変換を実行するソフトウェアは、コンパイラと呼ばれます。 .NET Coreは、dotnet
CLIに依存してコンパイルを実行します。 これを実証するために、コンパイルケースを確認するための基本的な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
ファイルには、 HelloWorldプログラムが自動的に入力されています。
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
メッセージの出力を呼び出し、プログラム(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のプロセスと似ていますが、今回はプログラムのコンパイルに使用される特定のコマンドがあります。 fsharpc
コマンドはツールであり、コンパイル専用に作成されています。
今回は、hello.fs
ファイルを作成し、F#コードを記述します。 まず、ホームディレクトリに戻ります。
cd
次に、hello.fs
という名前の新しいファイルを開きます。
nano hello.fs
次の行をファイルに追加します。
hello.fs
open System
前に見たように、これはSystem
モジュールまたは名前空間をインポートし、組み込みのシステム関数やConsole
などのオブジェクトにアクセスできるようにします。
次に、コードをさらに数行追加します。
hello.fs
open System let hello() = printf "Who are you? " let name = Console.ReadLine() printfn "Oh, Hello %s!\nI'm F#." name
これらの新しい行は、ユーザー入力を読み取り、フィードバックメッセージを出力するhello()
関数を定義します。
これで、最後の行を追加できます。
hello.fs
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
上記のコマンドは、mono
コマンドで実行できるhello
実行可能ファイルを生成します。
mono hello
これにより、次の出力が得られ、ユーザー入力を待ちます。
OutputWho are you?
Sammy
と入力すると、次のようになります。
OutputOh, Hello Sammy! I'm F#.
最後のキーストロークを押すと、プログラムが終了します。
おめでとう! これで、Monoと.NET Coreの両方を使用して最初のF#プログラムを作成およびコンパイルしました。
結論
このチュートリアルでは、.NET Core環境とMono環境の両方をカバーするF#プログラミング用のツールをインストールしました。 また、F#コードの例とビルドされた実行可能ファイルもテストしました。 これらは、この実用的な機能言語を学ぶための最初のステップです。
次のステップは、学習 言語で、コミュニティに連絡することです。 また、プロジェクトがより複雑になると、コードとリソースをより効率的に管理する必要がある場合があります。 NuGetやPaketなどのパッケージマネージャーは、.NETを中心に構築された強力なエコシステムと、大規模なプログラムを編成するための選択ツールへの架け橋です。