Skip to content

Commit 12b03e5

Browse files
committed
Добавлен раздел про внутренности со статьей про встроенные примитивы
1 parent 0aabe93 commit 12b03e5

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

docs/.vitepress/config.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ export default defineConfig({
3434
{ text: "Performance", link: "/performance" },
3535
],
3636
},
37+
{
38+
text: "Внутренности",
39+
collapsed: false,
40+
base: "/internals/",
41+
items: [
42+
{ text: "Встроенные примитивы", link: "/builtin" },
43+
]
44+
},
3745
{
3846
text: "Тулчейн",
3947
collapsed: false,

docs/internals/builtin.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Встроенные примитивы
2+
3+
Вы могли видеть, что некоторые функции из стандартной библиотеки определены как-то странно, как external функция, имя которой начинается с `%` знака:
4+
5+
```ocaml
6+
external succ : int -> int = "%succint"
7+
```
8+
9+
Это, так называемые, *примитивы* или *встроенные примитивы*, реализация которых определена внутри компилятора. Так, например, определены функции по работе с числами, что делает возможным генерировать более эффективный машинный код.
10+
11+
Если брать ещё один пример, то выражения `1 + 2` и `1 |> (+) 1` в действительности преобразуются в одинаковый код, благодаря тому, что `|>` реализован *через компилятор*, а не через "настоящую" функцию.
12+
13+
Все встроенные примитивы описываются в таблице [primitives_table](https://sourcegraph.com/github.com/ocaml/ocaml@9702e43b2052af1e2324cbdd9d34dee1de28f975/-/blob/lambda/translprim.ml?L124) из файла `lambda/translprim.ml` в формате ключ-значение, где ключ это строковая метка примитива, а значение — тот код (промежуточно представления), в который она должен быть преобразована. Пример всё того же `succ`:
14+
15+
```ocaml
16+
let primitives_table =
17+
create_hashtable _ [
18+
(* ... *)
19+
"%succint", Primitive ((Poffsetint 1), 1);
20+
(* ... *)
21+
]
22+
```

0 commit comments

Comments
 (0)