タグ

ブックマーク / zenn.dev/mod_poppo (13)

  • GHC 9.10の新機能

    GHC 9.10.1-alpha1が2024年3月14日にリリースされました。正式版のリリースは4月ごろを目指しているようです(9.10.1 · Milestones · Glasgow Haskell Compiler / GHC · GitLab)。 この記事では、GHC 9.10の新機能を確認していきます。過去の類似の記事は GHC 9.2の新機能と、GHCの動向2021 GHC 8.10とGHC 9.0の新機能 GHC 9.4の新機能 GHC 9.6の新機能 GHC 9.8の新機能 です。 この記事は網羅的な紹介記事とはなっていません。是非、公式のリリースノート類も参照してください: 2.1. Version 9.10.1 — Glasgow Haskell Compiler 9.10.0.20240313 User's Guide docs/users_guide/9.10.1-

    GHC 9.10の新機能
  • UTF-8のバリデーションとモノイドと半群

    この記事はUTF-8のバリデーションとオートマトンの続きです。 前回はUTF-8のバリデーションが8状態のオートマトン (DFA) で表現できることを見ました。状態と遷移を擬似コードで書けば次のようになるでしょう: -- 8つの状態 data State = START | TAILx1 | TAILx2 | TAILx3 | A | B | C | D -- 入力バイトに応じて次の状態を返す。次の状態が該当しなかったら Nothing を返す next :: Word8 -> State -> Maybe State +----+----+-----+----+ | a0 | a1 | ... | aN | 8ビット整数列 +----+----+-----+----+ | | | v v v +----+----+-----+----+ | m0 | m1 | ... | mN | モノ

    UTF-8のバリデーションとモノイドと半群
  • インターフェースと型クラスの違いを考える

    この記事では、JavaライクなインターフェースとHaskellライクな型クラスを比較します。どちらも、複数の異なる型を統一的に扱うための仕組みです。 インターフェース インターフェースはご存知の方も多いと思いますが、コード例を載せておきます。 // インターフェースの定義 interface Greetable { String greet(); } // 実装の例1 class Hello implements Greetable { String message; Hello(String m) { this.message = m; } public String greet() { return "Hello " + message + "!"; } } // 実装の例2 class Goodbye implements Greetable { public String gree

    インターフェースと型クラスの違いを考える
    xef
    xef 2024/02/25
  • JSONの小ネタと、JSONに対する拡張

    JSONは最も普及したデータ形式の一つでしょう。JSONの仕様はECMA-404やRFC 8259として標準化されています。 ECMA-404 - Ecma International RFC 8259 - The JavaScript Object Notation (JSON) Data Interchange Format 細かいネタ 文字コード RFC 8259では、外部と交換するJSONテキストはUTF-8でエンコードされなければならないということになっています。BOMは禁止です。昔のRFCではUTF-16やUTF-32も許容されていました。 ただし、キーや文字列の中身としては単独のサロゲート(例:"\uD800")は禁止されていません。JSONのキーや文字列はUnicodeスカラー値の列とは限らないのです。 UTF-8を前提とする実装にとっては、単独のサロゲート(不正なUTF-

    JSONの小ネタと、JSONに対する拡張
    xef
    xef 2024/01/22
  • WasmGCを試す

    去る2023年は、WebAssemblyにGCを入れる仕様、WasmGCがChromeとFirefoxに実装された記念すべき年でした。WasmGCはコンパイラ作成者の長年の悲願であり(筆者の脳内調べ)、GCに依存する言語をWebAssembly上で動かすことを容易にします。2024年は、WasmGCがより広い環境で使えるようになることでしょう。まさにWasmGC元年と言っても過言ではありません(元年はなんぼあってもいいですからね)。 この記事は、2024年1月時点でのWasmGCの現状を、コンパイラ作成者の観点から調査したものです。筆者自身はWebAssemblyについては素人で、調べながら書いています。 概要と仕様 WasmGCの概要はChrome/V8界隈の人が書いた次の記事が参考になるでしょう: A new way to bring garbage collected program

    WasmGCを試す
  • unsafePerformIOではじめる愉快なHaskellプログラミング

    Haskellは「入出力のためにIOモナドを使う必要があるので難しい」というイメージを持たれがちです[要出典]。この記事ではそのイメージに異を唱えることを目指します。すなわち、モナドを使わずに入出力を含むプログラミングをやってみます。 と言っても、Haskell標準の入出力関数には IO 型がついていることに変わりはありません。ですが、 unsafePerformIO という魔法の関数を使うと、IO 型を外して値を取り出すことができるのです。この記事ではこれを最大限活用します。 module System.IO.Unsafe where -- 魔法の関数 unsafePerformIO :: IO a -> a

    unsafePerformIOではじめる愉快なHaskellプログラミング
    xef
    xef 2023/10/06
  • x86-64機械語入門

    この記事はx86-64の機械語を書けるようになるためのガイドとなることを目指します。読者はアセンブリー言語について既にある程度知っていることを想定します。 情報源 x86-64の機械語のオフィシャルなガイドはIntelのSoftware Developer ManualまたはAMDAMD64 Architecture Programmer's Manualです。 Intel SDM: Intel® 64 and IA-32 Architectures Software Developer Manuals AMD64 Architecture Programmer's Manual, Volumes 1-5 このほか、Cから呼び出される関数を定義したり、Cの関数を呼び出すためには、呼び出し規約の知識も必要です。使用される呼び出し規約はOSに依存し、Unix系では主にSystem V ABI

    x86-64機械語入門
  • Haskellプロジェクトのベストプラクティス

    Haskellプロジェクトの「良い習慣」と考えられるやつをまとめてみます。あくまで私の個人的な意見です。 プロジェクト固有のPrelude Prelude に相当するモジュールをプロジェクト独自に持っておくと便利ではないか、という話をします。代替Preludeの話ではありません。 プロジェクト固有のPreludeがあると便利な理由 理由の一つは、標準 Prelude の変化です。直近では次のような変化がありました: GHC 9.4: ~ 型演算子が追加(これまでは構文だった) GHC 9.6: liftA2 が追加 GHC 9.10(見込み): foldl' が追加 もっと昔に遡ると、Semigroup((<>)) が増えるやつなどがありました。 この帰結として、 新しいGHCで名前の衝突が起きやすくなる 新しいGHCで「冗長なインポート」の警告が出やすくなる ことが言えます。これらの問題

    Haskellプロジェクトのベストプラクティス
    xef
    xef 2023/08/08
  • 新しくプログラミング言語を作る際に数値型をどうするべきか

    この記事は、新しくプログラミング言語を設計する際に数値型をどうするべきかについて、私の持論をまとめたものです。 数の体系 JavaScript(BigInt以前)やLua(〜5.2)などは唯一の数値型が浮動小数点数型で、整数も実数も同じ「number」型で表現します。ミニマルな言語を作るのならそういう設計もアリかもしれませんが、ネイティブコンパイルも視野に入る実用的な言語を作るなら整数と実数を一緒くたにする設計はやめた方が良いと思います。 特に、JavaScriptにコンパイルする言語を作るからと言って、数値型の設計まで真似る必要はありません。 整数を浮動小数点数で表現すると、思わぬ性能低下の要因になったりします。最近(2023年2月)、次のツイートが話題になりました: これは正のゼロと負のゼロが値として区別され、正のゼロは内部的に整数扱いされるのに対し負のゼロはそうではないことによるもの

    新しくプログラミング言語を作る際に数値型をどうするべきか
  • 浮動小数点数の丸めの相対誤差を計算機イプシロンで評価する

    実数を浮動小数点数に丸めるときに相対誤差がどのくらいになるかを考えます。実数を浮動小数点数に丸める関数をR\colon\mathbf{R}\rightarrow\mathbf{F}とした時に \left|\frac{R(x)-x}{x}\right| あるいは \left|\frac{R(x)-x}{R(x)}\right| を評価したいです。 ここでは浮動小数点数の基数はb、精度はp桁とし、指数部の範囲は無制限とします。 区間b^i\le \lvert x\rvert\le b^{i+1}での浮動小数点数の刻み幅はb^{i-p+1}となります。この刻み幅をulp (unit in last place) と呼びます。 丸め関数Rは次の性質を満たすべきです: 単調である:x\le yの時、R(x)\le R(y) 元の値との差は1ulp未満である:b^i\le \lvert x\rvert

    浮動小数点数の丸めの相対誤差を計算機イプシロンで評価する
  • 浮動小数点数オタクがAtCoder Beginner Contest 284のD問題をガチで解説してみる

    こんにちは、浮動小数点数オタクのmod_poppoです。 昨日開催されたABC284のD問題でsqrtがどうのこうのという声がツイッターで観測されたので、ガチで考察してみます。 問題文(引用) まず最初に問題文を引用しておきます。 AtCoder Beginner Contest 284 | D - Happy New Year 2023 問題文 正整数Nが与えられます。Nは、2つの相異なる素数p, qを用いてN=p^2qと表せることがわかっています。 p, qを求めてください。 T個のテストケースが与えられるので、それぞれについて答えを求めてください。 制約 入力は全て整数 1\le T\le 10 1\le N\le 9\times 10^{18} Nは、2つの相異なる素数p, qを用いてN=p^2qと表せる 2023が7\times 17^2と素因数分解できることにちなんだ問題のよう

    浮動小数点数オタクがAtCoder Beginner Contest 284のD問題をガチで解説してみる
  • Haskellの環境構築2023

    この記事はHaskell Advent Calendar 2022の1日目の記事です。 この記事では、2022年12月時点のHaskellの環境構築手順を紹介します。2023年になっても通用するといいなあ。 対象とする環境 対象とする環境は以下の通りです: Unix系 macOS (Intel / Apple Silicon) Linux (x86_64 / aarch64) WSL2を含む(WSL1は不具合があった気がするので避けてください) Windows (x64) Arm系CPU搭載のコンピューターを使っている場合は、別途LLVMが必要になる場合があります。以下に当てはまる場合は、「補遺:LLVMバックエンドを使う」も読んでください: 64ビットArm(Apple Silicon Macや、Raspberry Pi OSの64ビット版など)で、GHC 9.0またはそれ以前のバージョ

    Haskellの環境構築2023
    xef
    xef 2022/12/01
  • Haskellでの型レベルプログラミング

    Haskellでの型レベルプログラミングの解説書です。

    Haskellでの型レベルプログラミング
    xef
    xef 2022/03/18
  • 1