LXC で Swift
〜 REPL / インタプリタ / コンパイラで実行 〜
2025-04-15 作成 福島
TOP > tips > lxc-swift
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob | Shell ]

0. 前準備

本稿では LXC (Linux コンテナ) に Swift 言語をインストールします。
ここを参考に LXC を構築しておいてください。(1 ~ 5)

コンテナを使用しない Linux にも同様にインストール可能です。

インストール要件
項目内容備考
プログラミング言語Swift version 6.0.3本稿記述時の最新版
コンテナ名称swift1-
OSRocky Linux release 9.5 (Blue Onyx)本稿記述時の最新版
IP アドレスDHCPテスト環境なので DHCP にしている。固定アドレスでも構わない
コンテナ環境LXC 4.0.12 Release 1.el9-


1. 作成した LXC の環境を確認

LXC を使用しない場合は省略。

$ su
# lxc-ls swift1 -f
NAME   STATE   AUTOSTART GROUPS IPV4      IPV6 UNPRIVILEGED  
swift1 STOPPED 1         -      -         -    false
• コンテナが停止していたので起動する。(STOPPED → RUNNING)
# lxc-start swift1
# lxc-ls swift1 -f
NAME   STATE   AUTOSTART GROUPS IPV4      IPV6 UNPRIVILEGED  
swift1 RUNNING 1         -      10.0.3.14 -    false
コンテナ「swift1」の IP アドレスが DHCP によって 10.0.3.14 になっている。ここに ssh でログインする。
# exit
$


2. Swift をインストール

• インストール前のストレージサイズを確認する。*1
$ su
# du -sh /var/lib/lxc/swift1/
513M    /var/lib/lxc/swift1/  
最小限のコンテナの容量はこの程度がふつう。
# exit

• コンテナ「swift1」にログインする。*1
$ ssh admin@10.0.3.14

• Swift 言語をインストールする。
swift1$ su
swift1# dnf install -y epel-release
swift1# dnf install -y swift-lang
swift1# exit
swift1$ exit

• インストール後のストレージサイズを確認する。*1
$ su
# du -sh /var/lib/lxc/swift1/
3.2G    /var/lib/lxc/swift1/  
実はインストール時に「Installed size: 2.6 G」が表示されていた。
Swift の実行環境がデカいのが分かる。
# exit
$

*1コンテナ不使用の場合は省略する。


3. 実行

3-1. コマンドラインと REPL、標準入力から実行する。
• コンテナ「swift1」にログインする。*2
$ ssh admin@10.0.3.14

swift1$ which swift
/usr/bin/swift  
swift1$ swift --version
Swift version 6.0.3 (swift-6.0.3-RELEASE)  
Target: x86_64-unknown-linux-gnu
• コマンドラインから実行する。
swift1$ swift -e 'print("Hello, Swift!")'
Hello, Swift!  
• REPL から実行する。
swift1$ swift repl  # repl を指定するとインタラクティブモードになる。
Welcome to Swift version 6.0.3 (swift-6.0.3-RELEASE).  
Type :help for assistance.
  1> print("Hello, Swift!") 
Hello, Swift!
  2> :exit 
:exit の代わりに をタイプしても構わない。
• 標準入力から実行する。
swift1$ echo 'print("Hello, Swift!"); print("Hello too, Swift.")' | swift repl
Hello, Swift!
Hello too, Swift.  
3-2. プログラムファイルを作成して実行する。
• プログラムファイルを作成する。
swift1$
cat > example-leap.swift << EOF
#!/usr/bin/swift

// うるう年を判別する関数
func isLeap(year:Int) -> Bool {
    var leap:Bool = false
    if year %   4 == 0 { leap = true  }
    if year % 100 == 0 { leap = false }
    if year % 400 == 0 { leap = true  }
    return leap
}

for y in stride(from:2020, to:2030, by:2) {   // Swift の for 文は少し変わっている
    print("\(y) 年は", terminator:"")         // print 関数の改行を抑止する
    if isLeap(year:y) { print("うるう年です") }
    else              { print("平年です")     }
}
EOF

• インタプリタとして実行する。
swift1$ swift example-leap.swift
2020 年はうるう年です  
2022 年は平年です
2024 年はうるう年です
2026 年は平年です
2028 年はうるう年です
• コンパイルして実行する。
swift1$ swiftc example-leap.swift
swift1$ ls -ogh
total 24K
-rwxr-xr-x. 1 18K Apr 11 16:56 example-leap       ← これを実行する。
-rw-r--r--. 1 444 Apr 11 16:50 example-leap.swift
swift1$ ./example-leap
2020 年はうるう年です  
2022 年は平年です
2024 年はうるう年です
2026 年は平年です
2028 年はうるう年です

実行ファイル example-leap の動作には Swift の環境が必要なため、
単体で他の計算機にコピーしても動作しない。(Swift は LLVM コンパイラ)

また、実行環境は GUI を使うことができないため CUI に限定される。
swift1$ find `cat /etc/ld.so.conf.d/swiftlang.conf` -name '*.swiftmodule' | grep -i 'SwiftUI' | wc -l
0 
swift1$ exit
$

*2コンテナ不使用の場合は省略する。