Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
AtCoder の言語アップデートの提案内容について

言語アップデートのスプレッドシートが公開されましたので、この文書は2019年7月3日をもって更新を停止します。

透明性を持って広く議論を行うため今後の更新等につきましては haskell-jp/atcoder-haskell-resources リポジトリに移りましたので、そちらをご参照ください。


はじめに

  • 本文書の内容は reddit または haskell-jp 公式 slack の random チャンネル等の内容に基づきます。

そもそもこの提案はまとめようとしたのは、以下のツイートを見つけたからです。

【良いお知らせ】AtCoderの言語アップデートテストが6月に行われる"予定"です。入れたい言語とかがある人は、Ubuntuでのバージョンを固定した導入方法、および必要なライブラリやコンパイルオプションや実行コマンドあたりを調べておいてください。

上記のツイートは以下のURLから引用しています。

後になって、とあるライブラリが無い/GHCのバージョンが古すぎる/もっと良いコンパイルオプションがある等の理由によって AtCoder で Haskell を選びづらいという状況ができるだけ発生しないように、これから AtCoder を通して Haskell の理解を深めようと思う人の大半が満足できる環境を提案できたらと思います。(また、現状の不満も同様に解決できたらと思っています)

目的

  • AtCoder の Haskell 環境を整備する
  • 以下の内容について Haskell-jp コミュニティの意見をまとめる
    • コンパイラ&ライブラリのインストール方法について
    • GHC のバージョン
    • ライブラリ
    • コンパイルオプション

まとめた内容の提出方法はスプレッドシートへの書き込みという感じになるようです。

こんな感じで統一見解を出して貰えるとたしかにいいかも。AtCoder的にはspreadsheetを公開するだけになると思うから、そこに補足とかを書いてもらえるとわかりやすい

上記のツイートは以下のURLから引用しています。

現状の AtCoder の Haskell 環境について

現在の AtCorder の環境は ルール に記載されています。以下の表は該当箇所だけ抜き出したものです。(OS についてはツイートの内容に基づきます)

項目
OS Ubuntu
コンパイラ Haskell (GHC 7.10.3)
コマンド ghc -o ./a.out -O2 ./Main.hs
インストール方法 Haskell Platform

GlobalPackageDB に登録されているパッケージとバージョンの一覧

import Distribution.Simple
import Distribution.Simple.GHC
import Distribution.Verbosity
import Distribution.Simple.Program
import Distribution.Simple.PackageIndex

import Data.List

main :: IO ()
main = do
  (_, _, conf) <- configure silent Nothing Nothing defaultProgramConfiguration
  installedPackageIndex <- getPackageDBContents silent GlobalPackageDB conf
  mapM_ putStrLn $ map (pretty . fst) $ allPackagesBySourcePackageId installedPackageIndex
  
pretty (PackageIdentifier name ver) = unPackageName name ++ "-" ++ intersperse '.' (concatMap show $ versionBranch ver)

出力結果 (バージョン適当に繋げたのでちょっとバグってる)

Cabal-1.2.2.5.0
GLURaw-1.5.0.2
GLUT-2.7.0.3
HTTP-4.0.0.0.2.2.0
HUnit-1.3.0.0
ObjectName-1.1.0.0
OpenGL-2.1.3.1.0
OpenGLRaw-2.6.0.0
QuickCheck-2.8.1
StateVar-1.1.0.1
array-0.5.1.0
async-2.0.2
attoparsec-0.1.3.0.1
base-4.8.2.0
bin-package-db-0.0.0.0
binary-0.7.5.0
bytestring-0.1.0.6.0
case-insensitive-1.2.0.5
cgi-3.0.0.1.2.2.2
containers-0.5.6.2
deepseq-1.4.1.1
directory-1.2.2.0
exceptions-0.8.0.2
fgl-5.5.2.3
filepath-1.4.0.0
ghc-7.1.0.3
ghc-prim-0.4.0.0
half-0.2.2.1
hashable-1.2.3.3
haskeline-0.7.2.1
haskell-src-1.0.2.0
hoopl-3.1.0.0.2
hpc-0.6.0.2
hscolour-1.2.3
html-1.0.1.2
integer-gmp-1.0.0.0
mtl-2.2.1
multipart-0.1.2
network-2.6.2.1
network-uri-2.6.0.3
old-locale-1.0.0.7
old-time-1.1.0.3
parallel-3.2.0.6
parsec-3.1.9
pretty-1.1.2.0
primitive-0.6.1.0
process-1.2.3.0
random-1.1
regex-base-0.9.3.2
regex-compat-0.9.5.1
regex-posix-0.9.5.2
rts-1.0
scientific-0.3.3.8
split-0.2.2
stm-2.4.4
syb-0.6
template-haskell-2.1.0.0.0
terminfo-0.4.0.1
text-1.2.1.3
tf-random-0.5
time-1.5.0.1
transformers-0.4.2.0
transformers-compat-0.4.0.4
unix-2.7.1.0
unordered-containers-0.2.5.1
vector-0.1.1.0.0
xhtml-3.0.0.0.2.1
zlib-0.5.4.2

この結果より、Haskell Platform の Core Libraries, provided with GHCLibraries with Full Platform に列挙されているパッケージが含まれていることがわかった。

言語を bash にして ghc-pkg list でもっと簡単に確認できた・・・。

ghc について

素の GHC が依存するライブラリについては Haskell Hierarchical LibrariesGHC Commentary: Libraries に色々と説明がある。

環境の構築方法について

Haskell Platform

MEMO

  • パッケージを追加する場合は cabal install --global mwc-random のようにする
    • オプション無しで --user 相当だとすると、unix ユーザーが変わると見えなくなってしまいます。

問題点

Ubuntuですと、aptで入れると最新のcosmicでも2014.2.0.0(GHC7とか)が入ってしまうようなので最新のパッケージをいれるようにはしたいですね(Haskell-platformで行くなら)

パッケージ: haskell-platform (2014.2.0.0.debian5)

じゃぁgeneric-linuxならどうやねん、と思ったら、generic-linux向けのHaskell Platformのインストーラーはないからstackかghcupを使え、と... 結局stackに帰ってきた

ppa

stack

MEMO

  • PATH$(stack path --programs)/ghc-<version>/bin/ を追加する必要がありそう
  • stack exec ghc -- でコンパイルすると良い
  • パッケージのインストールは stack install vector のように行う

ghcup + cabal

ライブラリについて

まだブレインストーミング段階です。以下は slack に出てきたライブラリをリスト化したものです。(アルファベット順)

ライブラリの決め方や候補についての意見 (まだまだ募集中)

  • 基本的には haskell platform に含まれるものが使えたら良いんじゃないか?
  • 特定の問題で利用できるという明確な利用意図があった方が良いのかもしれない
  • 極めてベーシックなデータ構造系以外はない方がプロコン的には面白いんじゃないか?
    • 具体例: vector, array, hashmap
    • データ構造については haskell-jp wiki の データ構造列伝 に色々とまとまっている
  • 競技プログラミングとしての面白さは減らさずに便利 (または制限時間やメモリの問題をクリアするために必要となってくるよう) なパッケージを選べたら良いのではないか?
  • Python (NumPyは除く) みたいに、できるには出来るけど効率悪いかもよ?みたいな状態で止めておくのが無難かもしれない?
  • C++ 標準で入ってそーなデータ構造は入れてもよさそう
    • stl
    • C++ のほうも C++17 を入れていいみたいな話になってるのかな。それ基準で考えましょう
  • UnionFindとか地味に欲しいのですが地味に候補が多い

疑問

  • ライブラリをどれぐらいまでインストールできるか?

コンパイルオプションについて

コンパイル時間の考察

確か以下のプログラムを使って計測したと思う・・・。(要確認)

import System.Random.MWC

-- http://blog.livedoor.jp/rtabaladi_58/archives/65158189.html の例を借用
main :: IO ()
main = do
  gen <- createSystemRandom
  randValue <- uniform gen :: IO Int
  print randValue

あんまりちゃんと比較できていないけど、なぜか stack exec 経由だと少し早い?

haskell-platform

# time ghc -o ./a.out -O2 ./Main.hs
real    0m4.089s
user    0m1.820s
sys     0m0.530s

ppa

# time ghc -o ./a.out -O2 ./Main.hs
real    0m2.552s
user    0m1.370s
sys     0m0.460s

stack

# time stack exec -- ghc -o ./a.out -O2 ./Main.hs
real    0m1.819s
user    0m1.280s
sys     0m0.260s

ghcup

# time ghc -o ./a.out -O2 ./Main.hs
real    0m3.397s
user    0m1.330s
sys     0m0.580s

環境構築の具体例

動作確認には以下の mwc-random パッケージを使ったコードを利用しています。

import System.Random.MWC

-- http://blog.livedoor.jp/rtabaladi_58/archives/65158189.html の例を借用
main :: IO ()
main = do
  gen <- createSystemRandom
  randValue <- uniform gen :: IO Int
  print randValue

ghcup

FROM ubuntu:bionic-20190307
RUN apt-get update
RUN apt-get install -y \
  curl 
RUN apt-get install -y \
  gcc \
  make \
  libgmp-dev \
  libnuma-dev \
  libtinfo-dev
RUN curl https://get-ghcup.haskell.org -sSf | sh

ENV PATH ~/.cabal/bin:/root/.ghcup/bin:$PATH
RUN echo "source /root/.ghcup/env" >> ~/.bashrc

RUN cabal v2-update
RUN cabal v2-install --global --lib \
  mwc-random-0.14.0.0 \
  vector-algorithms-0.8.0.1

###########################
# ghc: 8.6.3
# cabal-install: 2.4.1.0
###########################

haskell-platform

FROM ubuntu:bionic-20190307
RUN apt-get update
RUN apt-get install -y \
  haskell-platform

# v2 コマンドには対応していない
RUN cabal update
RUN cabal install --global \
  mwc-random-0.14.0.0 \
  vector-algorithms-0.8.0.1

###########################
# ghc: 8.0.2
# cabal-install: 1.24.0.2
###########################

ppa

FROM ubuntu:bionic-20190307
RUN apt-get update
RUN apt-get install -y \
  software-properties-common

# https://launchpad.net/~hvr/+archive/ubuntu/ghc/
RUN add-apt-repository ppa:hvr/ghc
RUN apt-get update

RUN apt-get install -y \
  libtinfo-dev \
  ghc-8.6.4 \
  cabal-install-2.4

ENV PATH /opt/ghc/bin:$PATH

RUN cabal v2-update
RUN cabal v2-install --global --lib \
  mwc-random-0.14.0.0 \
  vector-algorithms-0.8.0.1

###########################
# ghc: 8.6.4
# cabal-install: 2.4.1.0
###########################

stack

FROM ubuntu:bionic-20190307
RUN apt-get update
RUN apt-get install -y \
  curl

RUN curl -sSL https://get.haskellstack.org/ | sh

ENV PATH /root/.local/bin:$PATH

RUN stack install \
  mwc-random \
  vector-algorithms

###########################
# ghc: 8.6.4
# stack: 1.9.3
###########################

Haskell (AtCoder) に関するリソース

この文書をまとめるにあたって

以下の方々の発言を引用させていただきました。(slack, github name のアルファベット順)

  • @Akihito Kirisaki
  • @autotaker
  • @cohei
  • @fumieval
  • @gksato
  • @igrep
  • @kakkun61
  • @khibino
  • @matonix
  • @matsubara0507
  • @mod_poppo
  • @suiheilibe
  • @waddlaw
  • @りんご姫

ご協力ありがとうございます。

@gksato

This comment has been minimized.

Copy link

@gksato gksato commented Jul 2, 2019

改善提案にはあまり関係しないでしょうが、現在の環境について確認したことがあったので一つ。
言語Bashで

$ ghc-pkg list

が走るということで、ピンときて

$ stack ghc

を走らせてみたところ、stackが見つからないとのことで、stackではなくHaskell Platformからのインストールのようです。

@waddlaw

This comment has been minimized.

Copy link
Owner Author

@waddlaw waddlaw commented Jul 3, 2019

stackではなくHaskell Platformからのインストールのようです。

情報ありがとうございます!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment