タグ

ブックマーク / boleros.hateblo.jp (8)

  • コンパイル時Brainfuckコンパイラ ――C++14 constexpr の進歩と限界―― - ボレロ村上 - ENiyGmaA Code

    中3女子です。 この記事は C++ Advent Claneder2014 23日の参加記事です。 constexpr とは この記事を読んでいる層には、いまさら言及するまでもないと思われるので省略する。 必要であれば このあたり の資料を参照のこと。 C++14 シンタックス上の進歩とセマンティクス上の進歩 巷では C++14 になり constexpr が簡単になったという話をしばしば耳にする。たしかに簡単になった。 では何が簡単になったかというと、もっともわかりやすいのは複文とローカル変数、制御構文の制限緩和だろう。 条件分岐やループを if, while, for, switch 等でガリガリ書くことができるようになった(ただし goto は不可だ)。 非常に簡単になったといえるが、これはあくまでシンタックス上の進歩だ。 これによって何ができるかというセマンティクス上の問題について

  • C++14 時代の constexpr プログラミング作法 - ボレロ村上 - ENiyGmaA Code

    この記事は、C++ Advent Calendar 2013 の参加記事です。 前回は 西山信行 さんの記事でした。 まもなく C++14 時代が到来しようとしている。 ただでさえ実用的な言語機能である constexpr が C++14 での制限緩和によって神になろうとしている。 C++11 での constexpr の制限は、必然的に副作用のない関数型プログラミングを強制し、とても興味深いものではあった。 コードの可読性云々は主観によるのでここでは置くが、時には非効率な実装にならざるをえないケースもあったのは事実だ。 C++14 での constexpr は、古典的な実行時処理に慣れた者達にも非常に親しみやすいコードが書けるようになる。 ドラフトの直接的な内容については、すでに自分をはじめ有識者が解説を書いているので、そちらを参照するのが手っ取り早い。 constexpr 関数の制限緩

    C++14 時代の constexpr プログラミング作法 - ボレロ村上 - ENiyGmaA Code
  • C++標準ライブラリの非常に劣った実装が規格によって強制される - ボレロ村上 - ENiyGmaA Code

    中3女子です。 とある自由ソフトウェア主義者より、C++14 に関して非常に興味深い議論を教えてもらった。 よって、今回はそれについて述べる。 2013. Do library implementers have the freedom to add constexpr? http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3788.html @bolero_MURAKAMI もし、標準規格で、ある関数にconstexprが付されていないとして、ある実装では、その関数をconstexpr関数の制約に落とし込めるとして、そのような関数にconstexprを付すことは、規格違反なのか。規格準拠な拡張なのか。 2013-10-19 11:39:32 via web to @bolero_MURAKAMI @bolero_MURAKAM

  • constexpr 逆FizzBuzz - ボレロ村上 - ENiyGmaA Code

    中3女子です。 最近 Twitter で逆FizzBuzzが話題に上っていたので、constexpr で実装してみることにした。 なお、自分はこれまで逆FizzBuuz を実装したことはない。 どうやら様々なアプローチがあるらしいが、折角なので何も見ずに一から方法を検討することにする。 仕様・要件 逆FizzBuzz の内容は、概ね以下である。 Fizz, Buzz, FizzBuzz の文字列からなる配列を入力とする。 上記を生成するような FizzBuzz問題に対する入力値の範囲のうち、最初かつ最短のものを求める。 例: input : Fizz FizzBuzz Fizz Buzz answer: (12,20) まずは仕様を決めてしまおう。 answer を求める関数 inv_fizzbuzz を以下のように定義することとした。 template<typename ForwardR

    constexpr 逆FizzBuzz - ボレロ村上 - ENiyGmaA Code
  • C++11の糞仕様と戦ってアクセッサをconstexprにする - ボレロ村上 - ENiyGmaA Code

    中3女子です。 C++11が、C++03およびそれ以前に対して明らかに優れていることは今更言うまでもない。 しかしながら、C++11にも恥ずべき糞仕様は存在する。 その糞の代表例が、constexprメンバ関数が暗黙でconst修飾されることである。 これによってどんな問題が生ずるかを、まずは見てゆく。 constexprメンバ関数が暗黙でconst修飾される糞仕様の問題 まずは、適当な値のホルダクラスを考える。 template<typename T> struct Holder { T value; }; Holderはリテラルクラスの要件を満たすから、当然定数式として扱える。 constexpr auto t = Holder<int>{ 100 }; constexpr int i = t.value; では、下記のコードは合法か? constexpr int i = Holder

    C++11の糞仕様と戦ってアクセッサをconstexprにする - ボレロ村上 - ENiyGmaA Code
  • すごいユーザ定義リテラルたのしく遊ぼう - ボレロ村上 - ENiyGmaA Code

    中3女子です。 今回は、みんな大好きユーザ定義リテラルについて。 ユーザ定義リテラルは、値(整数、不動小数点数、文字列)に対するプログラマブルなサフィックスを定義することができる機能である。 例えば糖衣構文や単位を持った値を扱うために用いられる。 { constexpr auto duration = 4_mins + 33_secs; } ユーザ定義リテラルはいらない子か ところで、このユーザ定義リテラルは、方々で微妙な子扱いされている。 というのも、そもそもユーザ定義リテラルは直観的な記述を可能とするものであるはずなのだが、その用法には一見非直観的な落とし穴がある。 例えばユーザ定義リテラルの識別子は、アンダースコアで始めなければならない。 なぜなら、アンダースコアで始まらないサフィックスは、すべて予約されているからだ。 プログラマがアンダースコアで始まらないユーザ定義リテラルを定義し

    すごいユーザ定義リテラルたのしく遊ぼう - ボレロ村上 - ENiyGmaA Code
    xef
    xef 2013/04/16
  • constexpr アルゴリズムの実装イディオム その1 - ボレロ村上 - ENiyGmaA Code

    中3女子です。 今回は、constexpr におけるアルゴリズムの実装法について考える。 よく知られているように、constexpr 関数には言語規格上の制約が多くある。 ローカル変数が使えない、if や for などの制御構文が使えないなどは、C++11 に触れた者なら誰でも知っているだろう。 だが、それらは条件演算子や再帰によって、単純に代替できる問題である。 つまり、非 constexpr な実装に対して、処理の流れを質的に変えることなく constexpr に書き換えることができる。 単純に書き換えられる例: template<typename T> T const& runtime_min(T const& a, T const& b) { if (b < a) return b; return a; } template<typename T> constexpr T con

    constexpr アルゴリズムの実装イディオム その1 - ボレロ村上 - ENiyGmaA Code
  • constexpr で音階生成&シンセサイザー&音声合成 - ボレロ村上 - ENiyGmaA Code

    中3女子です。 このエントリは C++ Advent Calendar 2012 の 7 日目の記事です。 概要 この記事では Sprout C++ Library という拙作のライブラリによって、以下のようなプログラムを作成する。 コンパイル時音声処理ライブラリ Sprout.Compost の紹介 コンパイル時に基波形による音階を生成する コンパイル時に波形にエフェクトをかける コンパイル時に音声合成する なお、自分は音楽理論やサウンドプログラミングに関してまったく素人であり、その方面の用語や解説の不正確な部分についてはご容赦願いたい。 動作環境 記事内のコードは下記の環境でコンパイル・実行を行なっている。 コンパイラ : clang version 3.2 (trunk 159713) OS : Ubuntu 10.04 LTS (仮想環境) Memory : 3.0GiB RA

    constexpr で音階生成&シンセサイザー&音声合成 - ボレロ村上 - ENiyGmaA Code
  • 1