2009-12-16 46 views

回答

11

有很多%foo隱藏在編譯器中的特殊原語。我認爲在ocaml編譯器源代碼中的最佳列表可以在bytecomp/translcore.ml中找到。讓我們看看有多少可以在這裏列出:

  • 比較:%相等,%notequal,%每種不超過,%GREATERTHAN,%lessequal,%greaterequal,%比較

這些比較有專門的版本INT ,float,string,nativeint,int32和int64,並且如果類型在編譯時已知,它將自動專門化。

  • 其他原語:%identity, %ignore, %field0, %field1, %setfield0, %makeblock, %makemutable, %raise, %incr, %decr, %seqand, %seqor, %boolnot
  • 詮釋OPS:%negint, %succint, %predint, %addint, %subint, %mulint, %divint, %modint, %andint, %orint, %xorint, %lslint, %lsrint, %asrint
  • 詮釋比較(??):%eq, %noteq, %ltint, %leint, %gtint, %geint
  • 浮法OPS:%intoffloat, %floatofint, %negfloat, %absfloat, %addfloat, %subfloat, %mulfloat, %divfloat
  • 浮法比較:%eqfloat, %noteqfloat, %ltfloat, %lefloat, %gtfloat, %gefloat
  • 字符串OPS:%string_length, %string_safe_get, %string_safe_set, %string_unsafe_get, %string_unsafe_set
  • 陣列操作:%array_length, %array_safe_get, %array_safe_set, %array_unsafe_get, %array_unsafe_set
  • 對象操作:%obj_size, %obj_field, %obj_set_field, %obj_is_int
  • 懶:%lazy_force
  • Nativeint,INT32,Int64的OPS:%{nativeint,int32,int64}: _of_int, _to_int, _neg, _add, _sub, _mul, _div, _mod, _and, _or, _xor, _lsl, _lsr, _asr
  • 詮釋轉換:%nativeint_{of,to}_int32, int64_{of,to}_int32, int64_{of,to}_nativeint
  • Bigarray操作:%caml_ba_ref_{1,2,3}, %caml_ba_set_{1,2,3}, %caml_ba_unsafe_ref_{1,2,3}, %caml_ba_unsafe_set_{1,2,3}
  • 面向對象:%send, %sendself, %sendcache

這就是我能找到的。

8

外部的%是特殊的外部,這將由編譯器專門處理。例如,使用int_of_float,ocamlc會將其編譯爲某個C函數的調用,但使用ocamlopt時,它會將其編譯爲一些特殊的彙編程序操作碼,將double轉換爲整數。

+0

我想知道它是否可能是這樣的。你知道這個功能和可用的魔法名稱是否記錄在任何地方嗎? – 2009-12-16 21:26:42