2009-12-16 45 views

Trả lời

11

Có rất nhiều %foo đặc biệt nguyên thủy ẩn trong trình biên dịch. Tôi nghĩ rằng danh sách tốt nhất có sẵn trong bytecomp/translcore.ml, trong các nguồn trình biên dịch ocaml. Chúng ta hãy xem có bao nhiêu tôi có thể liệt kê ở đây:

  • So sánh:% tương đương,% notequal,% lessthan,% greaterthan,% lessequal,% greaterequal,% so với các phiên bản

Những so sánh này có chuyên môn cho int , float, string, nativeint, int32 và int64, và sẽ tự động chuyên nếu các kiểu được biết tại thời gian biên dịch.

  • nguyên thủy khác: %identity, %ignore, %field0, %field1, %setfield0, %makeblock, %makemutable, %raise, %incr, %decr, %seqand, %seqor, %boolnot
  • Int ops: %negint, %succint, %predint, %addint, %subint, %mulint, %divint, %modint, %andint, %orint, %xorint, %lslint, %lsrint, %asrint
  • bộ so sánh Int (??): %eq, %noteq, %ltint, %leint, %gtint, %geint
  • phao ops: %intoffloat, %floatofint, %negfloat, %absfloat, %addfloat, %subfloat, %mulfloat, %divfloat
  • bộ so sánh nổi: %eqfloat, %noteqfloat, %ltfloat, %lefloat, %gtfloat, %gefloat
  • ops String: %string_length, %string_safe_get, %string_safe_set, %string_unsafe_get, %string_unsafe_set
  • Công cụ làm mờ: %array_length, %array_safe_get, %array_safe_set, %array_unsafe_get, %array_unsafe_set
  • Object thao tác: %obj_size, %obj_field, %obj_set_field, %obj_is_int
  • Lazy: %lazy_force
  • Nativeint, int32, ops Int64: %{nativeint,int32,int64}: _of_int, _to_int, _neg, _add, _sub, _mul, _div, _mod, _and, _or, _xor, _lsl, _lsr, _asr
  • Int chuyển đổi: %nativeint_{of,to}_int32, int64_{of,to}_int32, int64_{of,to}_nativeint
  • hoạt động 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}
  • Object Oriented: %send, %sendself, %sendcache

Đó là tất cả những gì tôi có thể tìm thấy.

8

bên ngoài với% là đặc biệt bên ngoài, sẽ được xử lý đặc biệt bởi trình biên dịch. Ví dụ, với int_of_float, ocamlc sẽ biên dịch nó thành một cuộc gọi của một số hàm C, nhưng với ocamlopt, nó sẽ biên dịch nó thành một số opcode lắp ráp đặc biệt để chuyển đổi gấp đôi thành số nguyên.

+0

Tôi đã tự hỏi nếu nó có thể là một cái gì đó như thế. Bạn có biết liệu tính năng này và các tên ma thuật có sẵn được ghi lại ở bất kỳ đâu không? –

Các vấn đề liên quan