So-net無料ブログ作成

Twitterまとめ投稿 2018/06/12 [Twitter]


コメント(0) 

Twitterまとめ投稿 2018/06/10 [Twitter]


コメント(0) 

Twitterまとめ投稿 2018/06/09 [Twitter]


コメント(0) 

Twitterまとめ投稿 2018/06/06 [Twitter]


コメント(0) 

インタプリタの言語がなぜコンパイルできないのかを知りたい。 [プログラミング]

どこぞでRubyと似たCrystalという言語が、コンパイル言語でメモリの消費も少なく実行も速いとされていた。まぁコンパイル言語にほぼ通底する特徴なわけで。

http://ja.crystal-lang.org/
https://crystal-lang.org/

しかし、根本的にLL言語のようなインタプリタな言語がなぜコンパイルできないのか、という事が分かっていない。コンパイル言語をインタプリタで実行することはできるが、その逆は大体できない。何が引っかかっているんだろう。

よく静的とか動的とか言われてますが、コンパイルしないことによって融通が利くように作られているのはわかります。コンパイルする事によって動作が固まってしまう事を含めて静的というのだろうけど、具体的な部分がどういうところなのかが分かっていない。JITなる動作環境がいろいろな言語には用意されているようだけれども、どこいらまでJust In Timeにネイティブ動作させているのかがよく分からない。

そもそもJavaとかコンパイラなのかインタプリタなのか分からん言語もあるし。一応使う前にコンパイルをするけれども、JVMというインタプリタ用のバイトコードなわけでしょ? 謳い文句ばかり覚えているので内容が伴っていない。


Crystal は Ruby とよく似たプログラミング言語ですが、ネイティブコードにコンパイルされ、Ruby よりずっと効率的に動作するものを目指しています。一方で、そのために Ruby が持っている動的な機能についてはいくらか制限されています。


とCrystalの翻訳ページには書かれているのだけれど、それが実際に何なのか差分らしき記述が見つからない。そこが知りたいところなのにね。


ここでの互換性&移植性のテストを見ているとかなり厳しい模様で。

https://qiita.com/5t111111/items/2d7133ef8dfac2e53f25

まぁこの時よりは少しは進捗があっただろうから、いい方向に進んでいるといいのだけれど。

ただ一方で、Ruby という動的型付けを最大限に活かしたプログラミング言語に対しては、どれだけ表面を似せたとしても、そこに静的型チェックが入ることによる変化は非常に大きくて、設計やコーディングスタイルに深く影響します。それがこの記事で書いているような非互換性につながっています。


「動的型付け」と「静的型チェック」という言葉が重要そう。Rubyに関して動的型付けが言語仕様にどれだけ影響しているか、という事になるんだろうけど、そこをコンパイルが通り抜けられないという事なんだろうね。Rubyはそこそこ使っていたけれど、どこが動的型付けの部分だなんて意識して使っていたはずもないので、改めてそこは見返してみないといけない。


初めてのRubyという結構古い本をひっくり返して、動的型付けの例を探してみた。

初めてのRuby

初めてのRuby

  • 作者: Yugui
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2008/06/26
  • メディア: 大型本



#ユーザーの入力が1ならBarから、それ以外はBazから派生する
class foo < (user_input == "1" ? Bar : Baz)
  #処理
end

実際にCrystalで実行したわけじゃないけど、実行に詰まりそうなコードである。

確かに実行されるまでクラスの継承関係が決まらないなんて、静的型チェックというプロセスにおいて辛すぎると言わざるを得ないだろう。もしかしたら動くかもしれないけど、他にも動的に解釈される部分は多そうなので詰みになること間違いなしだろう。


なので、インタプリタでやっている言語はそれなりの意味があってそうしているわけで、もしそうじゃなければ実行速度も大きさもコンパクトになっているコンパイラ言語にしているって話ですよね。別にCrystalの素養が悪いと言っているわけじゃないけど、標準ライブラリから別物と考えた方がよさそうです。そもそも無理を押してコンパイルできるようにしているんです。

そういや、仕事でC言語のソースを見て動作してくれという依頼があって、それまでコンパイルしてDLLにして読み込んでいたのだけれど、それをアプリ側で何とかしろと言われて白目をむいたことがある。結局、C言語のインタプリタを作るんですか?と詰め寄って止めさせたのだけれど、C言語のインタプリタがOSSであった気がしたので無理すればできなくはなかったのかもしれないと思ったりしている。

https://root.cern.ch/cint

パースとかしてくれるにしても、やっぱしんどそうだな。まぁそういう仕事もないわけだけれども。

コメント(0) 
共通テーマ:パソコン・インターネット

Twitterまとめ投稿 2018/06/05 [Twitter]


コメント(0) 

Twitterまとめ投稿 2018/06/04 [Twitter]


コメント(0) 

Twitterまとめ投稿 2018/06/03 [Twitter]


コメント(0) 

NVENCのサンプルコードがリブートしたら動かなくなった。 [徒然]

Video_Codec_SDK_8.0.14のコンパイルが通って、NvEncoderとNvTranscoderが動いてご満悦な感じでしたが、OSをリブートするとCUDA関係らしいエラーが…。

Video_Codec_SDK_8.0.14/Samples/NvEncoder$ ./NvEncoder  -i out.yuv -o test.mp4 -size 674 440
NvEncoder.cpp line 143: cuInit error:0x64
NvEncoder: NvEncoder.cpp:144: NVENCSTATUS CNvEncoder::InitCuda(uint32_t): Assertion `0' failed.

Video_Codec_SDK_8.0.14/Samples/NvTranscoder$ ./NvTranscoder 
cuInit(0, __CUDA_API_VERSION, hHandleDriver) has returned CUDA error 100


はじめで転んでいるので、CUDAの設定の問題なんだろうなと思うのだが、ブート時に有効になっていないのかなと思ったり。たぶん前はCUDA自体を使っていないコードなので、コメントアウトしてなんとかしたんだと思った。

$ ./NvEncoder  -i out.yuv -o test.mp4 -size 674 440
NvEncoder: ../common/src/NvHWEncoder.cpp:491: NVENCSTATUS CNvHWEncoder::NvEncOpenEncodeSessionEx(void*, NV_ENC_DEVICE_TYPE): Assertion `0' failed.
中止 (コアダンプ)


ん〜コメントアウトしても容易に解決しないな。CUDAがきちんと動いてくれる方面を確かめたほうが良さそうだな。ブートされてリセットされてしまう設定というのは何なんだろう。コンパイルができているという話であれば、やっぱり環境が動かすのに足りていない状態になってしまったんだろうな。

そもそもcuInit()の引数の数がWebのものと違ったり気持ち悪いところはある。


$ nvidia-smi 
Failed to initialize NVML: Driver/library version mismatch


ドライバがなんか良くないみたい。というか、それまでなんで動いていたんだろう…。

前はNvidiaのサイトのインストールイメージが出来が悪かったので(特にグラフィックドライバが腐っていて表示されなくなったことがあった)、地元のリポジトリのみでやろうとしていたんだけど、どうにもうまく行かないので本家のUbuntuのインストーラで入れてみる。CUDA Toolkit 9.2なるものを入れてみた。

あ、リブートしたら動いた。苦労せずとも
https://developer.nvidia.com/cuda-downloads
で普通に入れていれば問題なかったってばよw

もう面倒くさいのでNVIDIAにおまかせでいいや。というかはじめからそうできれば問題なかったのだが、下手な前知識が無駄な事態を招いてしまった。

タグ:NVENC
コメント(0) 
共通テーマ:パソコン・インターネット

Twitterまとめ投稿 2018/06/02 [Twitter]


コメント(0)