rksoftware

Visual Studio とか C# とかが好きです

プログラミング言語 Swift を完全に理解する

Swift とは JVM 上で動くスクリプト言語だという事は知っています。
非常に有名なプログラミング言語であるにも関わらず、しかし事前知識はそれだけで他のことは全く知りませんでした。

こんな有名なプログラミング言語を知らないなんて、それは少し恥ずかしいな、と思い立って。プログラミング言語 Swift を調べてみたいと思います。

■ まずはネット検索

ネット検索すると、公式のサイトなどよりも先に Wikipedia の記事が見つかります。
en.wikipedia.org

これを読んでみようと思いますが、どうも日本語記事はない様子。

この画像の左下。Languages に日本語がありません。確かに日本で使われている話も聞いたことありませんし、あまり日本では使われていないのかもしれません。

■ ちなみに C# では

ちなみに我らが C# ではこんな感じです。
en.wikipedia.org

非常に多くの言語で記事が作成されています。

■ Swift の概要

というわけで Wikipedia の記事を読んでみます。読んでみるとどうも Swift というプログラミング言語は次のような言語とのことです。

  • シカゴ大学とアルゴンヌ国立研究所が 2007 年に作った
  • Java VM 上で動作する
  • スクリプト言語
  • OSS ライセンスは Apache License 2.0
  • コマンドラインプログラムやファイルを扱うのが得意
  • プログラマが意識しなくても自動的に並行処理が行われる

■ チュートリアルの URL、と思ったけどまずは クイックスタート

というわけで、調査を進めていきます。
今回見つけた公式チュートリアルの URL です。
http://swift-lang.org/swift-tutorial/doc/tutorial.html

というところまで探したところでクイックスタートを見つけました。まずはこちらで環境を整えるチャレンジをしてみたいと思います。
http://swift-lang.org/guides/release-0.96/quickstart/quickstart.html

[ まずは ] まずは成功しなかったパターンです

今回の記事は後で成功しますが、まずは試してみて成功しなかったパターンも記載していこうと思います。。うまくいかない方法を一つ見つけた、というやつです。実際高価値記事!

■ Java の準備

ドキュメントによると JDK 1.7 以上が必要という事です。私の環境には Microsoft OpenJDK 11 がインストール済みでした。
この Java でやっていきます。

■ Swift コマンド

次の URL から Java で作られた Swift コマンドをダウンロードします。
http://swift-lang.org/packages/swift-0.96.2.tar.gz

ダウンロードしたら tar コマンドで展開します。今の Windows には tar コマンドがあるので PowerShell のターミナルを開いて次のように。ここで意識したいのが Swift の動作環境です。公式サイトによるとマルチプラットフォームで Windows も動作環境とされています。
( GUI を持たず Java で実行されますし )

tar xfz swift-0.96.2.tar.gz

展開してみると bin フォルダの中に swift.bat ファイルがありました。もしや Windows でも動くのか!? と思ったらダメでした。というのがまずこれからの流れです。

■ swift.bat

実行してみると......動きません。

PS > \swift-0.96.2\bin\swift.bat
-Djava.endorsed.dirs=C:\Users\XXXXXXXXXXXX\Downloads\swift-0.96.2\lib\endorsed is not supported. Endorsed standards and standalone APIs
in modular form will be supported via the concept of upgradeable modules.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

どうもこの -Djava.endorsed.dirs という Java の起動オプション、Java 9 以降には存在せずエラーになるようです。ということはこの bat、Java 8 以前、2017 年以前のものということですね。公式サイト等を見ていると Swift は 2016 年にほとんど止まっているようなのでそういうことなのでしょう。

とりあえず起動オプションを外してみます。場所は \swift-0.96.2\bin\swift.bat ファイルの 52 行目です。

set OPTS=-DCOG_INSTALL_PATH="%SWIFT_HOME%" -Dswift.home="%SWIFT_HOME%"%COG_OPTS% -Djava.endorsed.dirs="%SWIFT_HOME%\lib\endorsed"

set OPTS=-DCOG_INSTALL_PATH="%SWIFT_HOME%" -Dswift.home="%SWIFT_HOME%"%COG_OPTS% 

実行すると

PS > \swift-0.96.2\bin\swift.bat
Swift 0.96.2 git-rev: b9611649002eecd640fc6c58bbb88cb35ce03539 heads/release-0.96-swift 6287
No Swift script specified

動作はしました。ただ今はまだ Swift で実行するコードを指定していないのでエラーになっています。

■ Swift のコード

環境はできたようなので、クイックスタートのコードファイルを次の URL からダウンロードします。
http://swift-lang.org/guides/release-0.96/quickstart/hello.swift

ダウンロードしたファイルの中のコードはこんな感じでした。これが Swift のコードなんですね!

// Define file as a type
type file;

// A simple app that echo's a string to a file
app (file output) echo (string s) {
   echo s stdout=@output ;
}

// Map a filename to a variable of type file
file output <"hello.out">;

// Call the app
output = echo("hi");

Swift のコードは読めませんがなんとなく、何をするコードかは分かりますね。簡単で学習しやすい言語なのかもしれません。

hello.out というファイルに hi と出力するようですね。分かります。

■ もういちど Swift 実行

実行してみます。

PS > \swift-0.96.2\bin\swift.bat hello.swift
2023-01-22 XX:XX:XX,XXX+0900 DEBUG Loader Detailed exception:
com.typesafe.config.ConfigException$BadPath: path parameter: Invalid path 'env.=::': Token not allowed in path expression: '=' (you can double-quote this token if you really want it here)
        at com.typesafe.config.impl.Parser.parsePathExpression(Parser.java:1095)
        at com.typesafe.config.impl.Parser.parsePath(Parser.java:1135)
        at com.typesafe.config.impl.Path.newPath(Path.java:224)
        at com.typesafe.config.impl.PropertiesParser.fromPathMap(PropertiesParser.java:79)
        at com.typesafe.config.impl.ConfigImpl.fromAnyRef(ConfigImpl.java:260)
        at com.typesafe.config.impl.ConfigImpl.fromPathMap(ConfigImpl.java:200)
        at com.typesafe.config.ConfigFactory.parseMap(ConfigFactory.java:855)
        at com.typesafe.config.ConfigFactory.parseMap(ConfigFactory.java:866)
        at org.griphyn.vdl.util.SwiftConfig.getSubstitutions(SwiftConfig.java:336)
        at org.griphyn.vdl.util.SwiftConfig.load(SwiftConfig.java:253)
        at org.griphyn.vdl.karajan.Loader.loadConfig(Loader.java:598)
        at org.griphyn.vdl.karajan.Loader.main(Loader.java:148)
Could not start execution:
        path parameter: Invalid path 'env.=::': Token not allowed in path expression: '=' (you can double-quote this token if you really want it here)

動きません!

ちょっと Java のことは全然わからないので。org.griphyn.vdl.karajan is 何ぞ......。

■ Swift はどうもかつては Windows でも動いていた形跡

Swift はどうもかつては Windows でも動いていた形跡があります。しかし動かなかったので、おとなしく今回は WSL で試してみようと思います。

ここからは動作するパターンです

ここからは動作するパターンです。Ubuntu です。

■ WSL の準備

まずは Windows の WSL (Windows Subsystem for Linux) の準備です。ターミナルでコマンドを実行します。

wsl --install Ubuntu

今回は Ubuntu 22.04.01 がインストールされました。

■ swift コマンド実行

ひとまず WSL で swift コマンドを実行してみます。
http://swift-lang.org/packages/swift-0.96.2.tar.gz
http://swift-lang.org/guides/release-0.96/quickstart/hello.swift

xxxxxxxxxx@XXXXXXXXXX:/mnt/x/xxxxxxxxxxxx$ /mnt/x/xxxxxxxxxxxx/swift-0.96.2/bin/swift hello.swift
/mnt/x/xxxxxxxxxxxx/swift-0.96.2/bin/swift: line 178: java: command not found

java コマンドが見つからない、と怒られました。それはそうですね。まだインストールしただけで何も環境を整えてませんからね。Java をインストールします。

■ Java のインストール

Java のインストール方法はこちら。
learn.microsoft.com

# Valid values are only '18.04' and '20.04'
# For other versions of Ubuntu, please use the tar.gz package
ubuntu_release=`lsb_release -rs`
wget https://packages.microsoft.com/config/ubuntu/${ubuntu_release}/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install msopenjdk-17
$ java --version
openjdk 17.0.6 2023-01-17 LTS
OpenJDK Runtime Environment Microsoft-7209853 (build 17.0.6+10-LTS)
OpenJDK 64-Bit Server VM Microsoft-7209853 (build 17.0.6+10-LTS, mixed mode, sharing)

openjdk 17.0.6 がインストールされました。

■ 実行

満を持して実行!

$ /mnt/x/xxxxxxxxxxx/swift-0.96.2/bin/swift hello.swift
-Djava.endorsed.dirs=/mnt/c/Users/owner/Downloads/swift-0.96.2/lib/endorsed is not supported. Endorsed standards and standalone APIs
in modular form will be supported via the concept of upgradeable modules.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

エラーになりました。これは先ほど Windows で試みたときにも見たやつですね。

■ swift ファイルを編集

\swift-0.96.2\bin\swift ファイルも編集してみましょう。\swift-0.96.2\bin\swift ファイルの 44 行目です。

OPTIONS="$OPTIONS -Djava.endorsed.dirs=$SWIFT_HOME/lib/endorsed"

OPTIONS="$OPTIONS "

■ もういちど実行

$ /mnt/x/xxxxxxxxxxxx/swift-0.96.2/bin/swift hello.swift
Swift 0.96.2 git-rev: b9611649002eecd640fc6c58bbb88cb35ce03539 heads/release-0.96-swift 6287
RunID: run008
Progress: Xxx, xx Jan 2023 xx:xx:31+0900
Progress: Xxx, xx Jan 2023 xx:xx:32+0900  Active:1
Final status: Xxx, xx Jan 2023 xx:xx:32+0900  Finished successfully:1

うごいたっぽいです。

ここで実行した Swift のコードを見てみましょう。

// Define file as a type
type file;

// A simple app that echo's a string to a file
app (file output) echo (string s) {
   echo s stdout=@output ;
}

// Map a filename to a variable of type file
file output <"hello.out">;

// Call the app
output = echo("hi");

先ほども見ましたが、どうやら hello.out というファイルに hi と書き込むコードですね?

■ 実行結果確認

実際 hello.out というファイルが作られているので中身を見てみましょう。

hi

計画通り! 動作しました。

Swift の歴史

ここで少し立ち止まって、プログラミング言語 Swift の歴史を調べてみましょう。

■ 歴史

情報がほとんどなく、そろってもいなく、見つけた情報を表にしてみました。

プログラミング言語 Swift Apple Swift
2007/03/02 登場
SWIFT 0.1
-
2007/07/19 SWIFT 0.2 -
2007/10/04 SWIFT 0.3 -
2008/03/18 SWIFT 0.4 -
2008/04/16 SWIFT 0.5 -
2008/08/25 SWIFT 0.6 -
2008/11/11 SWIFT 0.7 -
2009/01/30 SWIFT 0.8 -
2009/04/27 SWIFT 0.9 -
2010/12/23 SWIFT 0.91 -
2011/04/13 SWIFT 0.92.1 -
2011/11 SWIFT 0.93 -
不明 (2012?) SWIFT 0.94 -
不明 (2013?) SWIFT 0.94.1 -
不明 (2014?) SWIFT 0.96 -
2014/06/02 -
Wikipedia ページ作成
登場
Wikipedia ページ作成
2015/08/05 最新リリース(0.96.2) -
2016/12/21 公式サイトの最終更新? -

情報ソースはこの辺りです。
Swift - Downloads
Index of /guides
en.wikipedia.org

? の年は私が想像で、不明期間を等間隔にした年です。

Apple 社が同名のプログラミング言語を発表したタイミングでようやく Wikipedia に記事が作成されたようですね。
公式サイトの更新は止まっているようですが Swift の開発は今でも GitHub で続けられているようです。
github.com

チュートリアル

というわけでチュートリアルを開始します。

■ Swift のチュートリアル

色々寄り道をしましたがようやくチュートリアルです。チュートリアルを修めて Swift を完全に理解しましょう。

公式サイトのページはこちらです。
swift-lang.org

■ Swift のインストールフォルダ

チュートリアルでの (というか標準のインストール手順でも) 準備として Swift コマンドのあるフォルダを PATH に追加するように書かれています。
けれども、どうも追加しなくても良さそうなのでそのまま進めていきましょう。今回は Swift コマンドは

/mnt/c/Swift/cmd/bin/swift

に置きました。

■ まずはバージョンの確認

まずはチュートリアルの動作のバージョンが設定されているとのことで、バージョンの確認方法が書かれています。

$ swift -version

チュートリアルの動作バージョンは java 1.7 以上と swift-0.96 とのことです。チュートリアルには書いていませんが、せっかくなので Java と Swift 両方のバージョンを見てみましょう。

$ java --version
openjdk 17.0.6 2023-01-17 LTS
OpenJDK Runtime Environment Microsoft-7209853 (build 17.0.6+10-LTS)
OpenJDK 64-Bit Server VM Microsoft-7209853 (build 17.0.6+10-LTS, mixed mode, sharing)
$ /mnt/c/Swift/cmd/bin/swift --version
Swift 0.96.2 git-rev: b9611649002eecd640fc6c58bbb88cb35ce03539 heads/release-0.96-swift 6287

問題なさそうですね。

■ チュートリアルのリソースをダウンロード

チュートリアル用のリソースをダウンロードします。git から clone するか zip をダウンロードするか、どちらも良いとのこと。今回は作ったばかりの環境で git も整えていなので zip をダウンロードしてみます。

git の場合の取得元

https://github.com/swift-lang/swift-tutorial.git

zip の場合の取得元

https://github.com/swift-lang/swift-tutorial/archive/master.zip

zip 取得のコマンド

zip 取得は次のコマンドが案内されています。

wget https://github.com/swift-lang/swift-tutorial/archive/master.zip
unzip master.zip
mv swift-tutorial-master swift-tutorial
cd swift-tutorial

このコマンド、最初の 1 行目がダウンロードで、2 行目が zip の展開です。この 1 行目は成功しますが、2 行目は失敗してしまいました。

Command 'unzip' not found, but can be installed with:
sudo apt install unzip

*unzip** コマンドをインストールせよと。今回は面倒なので Windows で展開しました。( WSL でやっているので。ファイルをそれなりに色々と整った Windows から操作できる環境でやっています )
展開した後の 3 行目でフォルダのリネームをしているのですが、Windows 標準の展開ではチュートリアルの想定をフォルダ構成を変わってしまいました。この辺りも Windows 上で良い感じに整えて続けていきます。

4 行目でディレクトリを移動して次のステップへ進みます。

mv swift-tutorial-master swift-tutorial
cd swift-tutorial

■ チュートリアルのセットアップ

ここで Swift の環境構築とは別にチュートリアルのセットアップが必要とのこと。次のコマンドです。

source setup.sh 

ちょっと setup.sh の中を見てみましょう。

######################### CONFIGS ###########################

export BEAGLE_USERNAME=""
export BEAGLE_PROJECT=""
export MIDWAY_USERNAME=""
export AWS_CREDENTIALS_FILE=""
export URL_OF_AD_HOC_MACHINE_1=""
export AD_HOC_1_USERNAME=""
export AD_HOC_N_USERNAME=""
export OSG_USERNAME=""
export OSG_PROJECT=""
export BLUES_USERNAME=""
export CLOUD_HEADNODE="http://HEADNODE_ADDRESS:50010"
#############################################################


# ensure that this script is being sourced
if [ ${BASH_VERSINFO[0]} -gt 2 -a "${BASH_SOURCE[0]}" = "${0}" ] ; then
  echo ERROR: script ${BASH_SOURCE[0]} must be executed as: source ${BASH_SOURCE[0]}
  exit 1
fi


# Setting scripts folder to the PATH env var.
TUTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

if [ _$(which cleanup 2>/dev/null) != _$TUTDIR/bin/cleanup ]; then
  echo Adding $TUTDIR/bin:$TUTDIR/app: to front of PATH
  PATH=$TUTDIR/bin:$TUTDIR/app:$PATH
else
  echo Assuming $TUTDIR/bin:$TUTDIR/app: is already at front of PATH
fi


# Set PATH for specific hosts

if hostname | grep bridges; then

    module load java # Get Oracle Java 1.8.x
    SWIFT=/home/wilde/swift/rev/swift-0.96.2
    PATH=$SWIFT/bin:$JAVA:$PATH

    module unload mpi/intel_mpi
    module load mpi/gcc_mvapich
    export CC="mpicc"
    echo "modules adjusted: unloaded mpi/intel_mpi; loaded mpi/gcc_mvapich"
    echo "This list should should show mpi/gcc_mvapich as only MPI:"
    module list

elif hostname -f | grep "edison" ; then
    echo "Configuring for Edison"
    module swap PrgEnv-intel PrgEnv-gnu
    export PATH=$PWD/part07:$PATH
    export CC="cc"

    pushd .
    cd part07/ ;
    make clean ; make
    popd

    pushd .
    cd part08/ ; rm hipi
    make clean ; make
    popd


elif hostname -f | grep "ncsa.illinois.edu" ; then
    # BW does not have a clearly identifiable hostname on the login nodes

    module load java # Oracle java java/jdk1.8.0_51
    module unload PrgEnv-cray/5.2.82
    module load PrgEnv-gnu/5.2.82
    SWIFT=~wilde/scratch/swift/rev/swift-0.96.2
    PATH=$SWIFT/bin:$PATH
    export CC="cc"

elif hostname | grep comet; then

    JAVA=/oasis/scratch/comet/xdtr1/temp_project/jdk1.8.0_91/bin
    SWIFT=/oasis/scratch/comet/xdtr1/temp_project/swift/swift-0.96.2/bin
    PATH=$SWIFT:$JAVA:$PATH

elif hostname | grep workflow.iu; then

    SWIFT=/opt/swift/swift-0.96.2/bin
    JAVA=$(echo /opt/swift/jdk1.*/bin)
    PATH=$SWIFT:$JAVA:$PATH
    export X509_USER_PROXY=/tmp/x509.$USER.$RANDOM

elif [ -d /usr/local/bin/swift-trunk ] && [ -d /usr/local/bin/jdk1.7.0_51 ]; then

    JAVA=/usr/local/bin/jdk1.7.0_51/bin
    SWIFT=/usr/local/bin/swift-trunk/bin
    PATH=$JAVA:$SWIFT:$PATH

elif [ -d /opt/swift/swift-0.96.1 ] && [ -d /opt/swift/jdk1.7.0_51 ]
then
    export SWIFT=/opt/swift/swift-0.96.1/bin
    export JAVA=/opt/swift/jdk1.7.0_51/bin
    export PATH=$SWIFT:$JAVA:$PATH
    export X509_USER_PROXY=/tmp/x509.$USER.$RANDOM
fi

echo "Swift version is $(swift -version)"

return

重い。あと .sh ファイルなので当然ですが、Windows では動きませんね? チュートリアルの動作条件に書いてないようですけれども。Swift 自体はマルチプラットドームで Windows でも動作すると公式サイトでは言っているだけに少し残念です。いいんですけど。WSL あるし。大丈夫です。問題ない。

■ チュートリアルの概要

チュートリアルは何かを書いて動かしていくスタイルではなく、用意されたプログラムを解説を読みながら実行していくスタイルです。先ほど取得したリソースにもチュートリアルのステップごとにフォルダが用意されています。このように。

$ ls -l /mnt/c/Swift/swift-tutorial/
total 56
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX    10 Dec 14  2016 README.asc
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 app
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 bin
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 doc
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 23795 Dec 14  2016 ec2.asc
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX   441 Dec 14  2016 local.conf
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 mandelbrot
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 mpi
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  6079 Dec 14  2016 nersc.conf
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 part01
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 part02
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 part03
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 part04
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 part05
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 part06
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 part07
drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  4096 Feb 12 17:07 part08
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  2979 Dec 14  2016 setup.sh
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 14509 Dec 14  2016 swift.conf
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  1842 Dec 14  2016 test_all.sh
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  8052 Dec 14  2016 xsede.conf

part01 ~ part10 のディレクトリですね。参考に一つ目 part01 の中を見てみましょう。

l$ ls -l /mnt/c/Swift/swift-tutorial/part01/
total 0
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 113 Dec 14  2016 p1.swift
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX  13 Dec 14  2016 swift.conf

Swift のプログラムと .conf ファイルが入っています。それぞれ見てみましょう。

p1.swift

type file;

app (file o) simulation ()
{
  simulate stdout=filename(o);
}

file f <"sim.out">;
f = simulation();

swift.conf

../local.conf

p1.swift は simulate コマンドを実行して sim.out ファイルに書き込むプログラムですね。
swift.conf は別の .conf ファイルを読んでいます。こちらも見てみましょう。

../local.conf

sites: [localhost]

site.localhost {
    execution {
        type: "local"
        URL : "localhost"
    }
    staging             : direct
    workDirectory       : "/tmp/"${env.USER}"/swiftwork"
    maxParallelTasks    : 20
    initialParallelTasks: 20
    app.ALL { executable: "*" }
}

TCPPortRange: "50000,51000"
lazyErrors: false
executionRetries: 0
keepSiteDir: true
providerStagingPinSwiftFiles: false
alwaysTransferWrapperLog: true

どうも .conf はリモート実行の設定をするようですね。part01 のこれはローカル実行みたいですね。

■ simulate コマンド

ここで simulate コマンドとは? というところですが、 .sh ファイルのようです。チュートリアルのリソースの app フォルダの中にいます。このフォルダは先の setup.sh でパスに追加される手筈のようですね。
環境のコマンドをそのまま実行できてしまう。Swift 、なかなか便利そうですね。

$ ls -l /mnt/c/Swift/swift-tutorial/app/simulate.sh
-rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 3076 Dec 14  2016 /mnt/c/Swift/swift-tutorial/app/simulate.sh

simulate.sh

#! /bin/bash

sleep 1
printparams()
{
  printf "\nSimulation parameters:\n\n"
  echo bias=$bias
  echo biasfile=$biasfile
  echo initseed=$initseed
  echo log=$log
  echo paramfile=$paramfile
  echo range=$range
  echo scale=$scale
  echo seedfile=$seedfile
  echo timesteps=$timesteps
  echo output width=$width
}

log() {
  printf "\nCalled as: $0: $cmdargs\n\n"
  printf "Start time: "; /bin/date
  printf "Running as user: "; /usr/bin/id
  printf "Running on node: "; /bin/hostname
  printf "Node IP address: "; /bin/hostname -I
  printparams
  printf "\nEnvironment:\n\n"
  printenv | sort
}

addsims() {
  while read f1 ; do
    read -u 3 f2 
    if [ _$f1 = _ ]; then f1=$lastf1; fi
    if [ _$f2 = _ ]; then f2=$lastf2; fi
    printf "%${width}d\n" $(($f1+$f2)) 
    lastf1=$f1
    lastf2=$f2
  done <$1 3<$2
}

# set defaults

bias=0
biasfile=none
initseed=none
log=yes
paramfile=none
range=100
scale=1
seedfile=none
timesteps=0
nvalues=1
width=8
cmdargs="$*"

usage()
{
  echo $0: usage:
  cat <<END
    -b|--bias       offset bias: add this integer to all results
    -B|--biasfile   file of integer biases to add to results
    -l|--log        generate a log in stderr if not null
    -n|--nvalues    print this many values per simulation            
    -r|--range      range (limit) of generated results
    -s|--seed       use this integer [0..32767] as a seed
    -S|--seedfile   use this file (containing integer seeds [0..32767]) one per line
    -t|--timesteps  number of simulated "timesteps" in seconds (determines runtime)
    -x|--scale      scale the results by this integer
    -h|-?|?|--help  print this help
END
}

# FIXME: NOT YET IMPLEMENTED:
#    -p|--paramfile  take these parameters (in form param=value) from this file 
#    -p|--paramfile) paramfile=$2 ;;

while [ $# -gt 0 ]; do
  case $1 in
    -b|--bias)      bias=$2      ;;
    -B|--biasfile)  biasfile=$2  ;;
    -l|--log)       log=$2       ;;
    -n|--nvalues)   nvalues=$2   ;;       
    -s|--seed)      initseed=$2  ;;
    -S|--seedfile)  seedfile=$2  ;;
    -t|--timesteps) timesteps=$2 ;;
    -r|--range)     range=$2     ;;   
    -w|--width)     width=$2     ;;
    -x|--scale)     scale=$2     ;;
    -h|-?|--help|*) usage; exit  ;;
  esac
  shift 2
done
    
# process initial seed

if [ $initseed != none ]; then
  RANDOM=$initseed
fi

# process file of seeds

if [ $seedfile != none ]; then
  seed=0
  while read $seedfile s; do
    seed=$(($seed+$s))
  done <$seedfile
  RANDOM=$seed
fi

# run for some number of "timesteps"

sleep $timesteps

# emit N (nvalues) "simulation results" scaled and biased by argument values

simout=$(mktemp simout.XXXX)
for ((i=0;i<$nvalues;i++)); do
  # value=$(( (($RANDOM)*(2**16))+$RANDOM ))
  value=$(( (($RANDOM)*(2**48)) + (($RANDOM)*(2**32)) + (($RANDOM)*(2**16)) + $RANDOM ))
  printf "%${width}d\n" $(( ($value%range)*scale+bias))
done  >$simout

# process file of biases

if [ $biasfile != none ]; then
  addsims $simout $biasfile
else
  cat $simout
fi
rm $simout

# log environmental data

if [ $log != off ]; then
  log 1>&2
fi

■ 前半と後半

という事で、用意された Swift コードファイルを順次実行することでチュートリアルが進んでいきます。チュートリアルの説明にもありますが、part 1 ~ 3 ではローカルの並列実行をためして、part 4 ~ 6 ではリモート実行を試す内容になっています。ちょっとチュートリアルとしては言っていることが重い気もしなくもないですね。

リモート実行では、大学や研究機関、パブリッククラウドなどのサイトでの実行が試せる内容になっているようです。実際のところ動かしても目には見えないので体感として分かりませんが。でもコンピュータリソースをデフォルトで分散共有できるのは素晴らしいと思います。

■ 完全に理解した!

というわけで Swift 完全に理解したつもりになりました!
(実際にはまだチュートリアル動かしていませんが、手順は動かすだけなので今のところはこれで良いでしょう)