EssenR2
の編集
https://khfdpl.osask.jp:443/wiki/?EssenR2
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
2016_10
2016_11
2016_12
BracketName
Essen
Essen0
Essen1
Essen2
Essen3
Essen4
EssenMemo0001
EssenMemo0002
EssenMemo0003
EssenMemo0004
EssenMemo0005
EssenMemo0006
EssenMemo0007
EssenMemo0008
EssenMemo0009
EssenMemo0010
EssenMemo0011
EssenR2
EssenR2_ess03f
EssenR2_ess03h
EssenR2_ess03i
EssenR2_ideas
EssenR2_jit00
EssenR2_jit01
FormattingRules
FrontPage
Help
IP
InterWiki
InterWikiName
InterWikiSandBox
K
KHPC
KHPC_v000doc01
KHPC_v001doc01
KHPC_v002doc01
KHPC_v003doc01
MenuBar
OSC
OSC20181027
OSC20190222
OSC20191123
OSC20230401
OSC20230528
OSC20231021
OSC20240310
OSC20241026
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
SandBox
SltVA
VariableArray
WikiEngines
WikiName
YukiWiki
advcal20161205
advcal20161206
advcal20161209
advcal20161210
advcal20161215
eoml0001
eoml0002
essen_ex01_0001
impressions
kcl_malloc
khfdpl_result1
members
memo0001
memo0002
note0001
note0002
note0003
note0004
note0005
note0006
oldworks
oldworks00
oldworks06
oldworks12
oldworks13
osaskjp_index
persistent_C
populars
pr20161105
pr20161105b
scsc
seccamp2017
spam_test
uxf
uxf_01
uxf_02
uxp
* Essen Rev2 -(by [[K]], 2017.07.31) ** (0) -EssenRev1が完成しないうちから、Rev2の構想が進んでしまいました。 ** (1) -EssenRev2では実行方式がJITコンパイル方式になります。 -EssenRev1では「速度はどうでもいい、速さがほしければインラインC言語で書けばいい」という立場をとっていましたが、JITコンパイル方式にするだけで性能が100倍くらい変わりそうで、やっぱりそんなに差が出るのならJITコンパイル方式を採用すべきかもなあ、と考え方が変わったのです。 --10倍未満なら、まあそんなもんだよなーと思えたのですが・・・。 -JITコンパイル方式だと、変換速度は実行速度にほとんど影響しないので、アルゴリズムをあまりがんばらなくてもよくなります。それは気楽なので、メリットの一つです。 --もちろん、ダメダメなコードを生成してはいけませんが。 ** (2) -JIT00 : 仮想アセンブラ(JIT00) → 機械語 --CPUに依存する最下層のレイヤ -JIT01 : Essen → JIT00 --EssenからJIT00へ変換するレイヤ -それぞれのレイヤは、C言語のライブラリ関数として実装されます。別々の実行ファイルになるわけではありません。実行したいプログラムを文字列として読み込んで、それをJIT01にかけて、その結果をJIT00にかけて、出てきたバイナリをC言語の関数呼び出しで呼び出せば、それで実行できるという仕組みです。 ** (3) 主な仕様 -真偽値はintだが、最下位ビットのみで真偽をあらわす。他のビットはごみ。C言語のように0かそれ以外かという基準ではない。 --そもそも0かそれ以外かという基準だと、すべてのビットを見なければいけないということであり、ハードウェア的にやさしくない。 --しかもどのビットが化けても偽が真に化ける。EssenRev2ならビット化けのリスクは1ビット分しかない。 --なお、真偽値を0か-1かであらわすことにすれば、ビット化けのリスクはもっと減らせるが(ビット化けがあっても多数決で修正できる)、それはそれでコストが増すのでやらないことにする。 -C言語ではintは16ビット以上、longはint以上、long longはlong以上というだけで、それ以上の規定がない。これはよくないと[[K]]は思っている。だからEssenRev2ではこうする。 --intは32ビット以上。longは64ビット以上。 --Essenでは上記さえ満たしていれば、intのビット幅とlongのビット幅が逆転していても問題はない。さらに「intがそのマシンにとって自然なビット幅」というルールはない。 --同様にfloatは32ビット以上。doubleは64ビット以上。 --intとfloatを基本型として、それ以外は拡張型とする。 -こう書けば機種異存のないコードが作りうるという仕様になっているだけで、仕様の範囲で書きさえすれば自動的に機種依存しなくなるというレベルは目指さない(それをやると遅くなるなどの弊害があるので)。 -&&や||の演算子は作らずに、&や|で代用する。&&や||には最初の項で真偽値が確定したら次の項は評価しないというルールがあるけど、EssenRev2ではどんな場合でも両方評価する。 --ヌルポインタを使うif文が一行で書けないという心配があるかもしれないが、そもそもEssenは不正なポインタで読み込んでもヌルが返ってくるだけで落ちたりはしないので、その心配は杞憂である。書いても何も起きないだけ。 --どうしても&&や||的な挙動がほしい場合は、ifを二回使えばよい。それで十分だろう。
タイムスタンプを変更しない
* Essen Rev2 -(by [[K]], 2017.07.31) ** (0) -EssenRev1が完成しないうちから、Rev2の構想が進んでしまいました。 ** (1) -EssenRev2では実行方式がJITコンパイル方式になります。 -EssenRev1では「速度はどうでもいい、速さがほしければインラインC言語で書けばいい」という立場をとっていましたが、JITコンパイル方式にするだけで性能が100倍くらい変わりそうで、やっぱりそんなに差が出るのならJITコンパイル方式を採用すべきかもなあ、と考え方が変わったのです。 --10倍未満なら、まあそんなもんだよなーと思えたのですが・・・。 -JITコンパイル方式だと、変換速度は実行速度にほとんど影響しないので、アルゴリズムをあまりがんばらなくてもよくなります。それは気楽なので、メリットの一つです。 --もちろん、ダメダメなコードを生成してはいけませんが。 ** (2) -JIT00 : 仮想アセンブラ(JIT00) → 機械語 --CPUに依存する最下層のレイヤ -JIT01 : Essen → JIT00 --EssenからJIT00へ変換するレイヤ -それぞれのレイヤは、C言語のライブラリ関数として実装されます。別々の実行ファイルになるわけではありません。実行したいプログラムを文字列として読み込んで、それをJIT01にかけて、その結果をJIT00にかけて、出てきたバイナリをC言語の関数呼び出しで呼び出せば、それで実行できるという仕組みです。 ** (3) 主な仕様 -真偽値はintだが、最下位ビットのみで真偽をあらわす。他のビットはごみ。C言語のように0かそれ以外かという基準ではない。 --そもそも0かそれ以外かという基準だと、すべてのビットを見なければいけないということであり、ハードウェア的にやさしくない。 --しかもどのビットが化けても偽が真に化ける。EssenRev2ならビット化けのリスクは1ビット分しかない。 --なお、真偽値を0か-1かであらわすことにすれば、ビット化けのリスクはもっと減らせるが(ビット化けがあっても多数決で修正できる)、それはそれでコストが増すのでやらないことにする。 -C言語ではintは16ビット以上、longはint以上、long longはlong以上というだけで、それ以上の規定がない。これはよくないと[[K]]は思っている。だからEssenRev2ではこうする。 --intは32ビット以上。longは64ビット以上。 --Essenでは上記さえ満たしていれば、intのビット幅とlongのビット幅が逆転していても問題はない。さらに「intがそのマシンにとって自然なビット幅」というルールはない。 --同様にfloatは32ビット以上。doubleは64ビット以上。 --intとfloatを基本型として、それ以外は拡張型とする。 -こう書けば機種異存のないコードが作りうるという仕様になっているだけで、仕様の範囲で書きさえすれば自動的に機種依存しなくなるというレベルは目指さない(それをやると遅くなるなどの弊害があるので)。 -&&や||の演算子は作らずに、&や|で代用する。&&や||には最初の項で真偽値が確定したら次の項は評価しないというルールがあるけど、EssenRev2ではどんな場合でも両方評価する。 --ヌルポインタを使うif文が一行で書けないという心配があるかもしれないが、そもそもEssenは不正なポインタで読み込んでもヌルが返ってくるだけで落ちたりはしないので、その心配は杞憂である。書いても何も起きないだけ。 --どうしても&&や||的な挙動がほしい場合は、ifを二回使えばよい。それで十分だろう。
テキスト整形のルールを表示する