Browse Source

add figures and code for java and ocaml

main
zapashcanon 11 months ago
parent
commit
da74d292f7
Signed by: zapashcanon GPG Key ID: 8981C3C62D1D28F1
  1. 11
      src/CODE.md
  2. 20
      src/article.tex
  3. 38
      src/dune
  4. 94
      src/figures.ml
  5. 5
      src/forbidden.java
  6. 10
      src/layout.java
  7. 4
      src/layout.ml

11
src/CODE.md

@ -77,10 +77,19 @@ $ gdc -c list_int.d
<!-- $MDX file=layout.py -->
```python
array1 = [1, 2, 3]
array2 = [42, 99, 500]
array2 = [42, 99, 666]
pair = (array1, array2)
x = 42
```
```sh
$ python layout.py
```
<!-- $MDX file=layout.ml -->
```ocaml
let array1 = [| 1; 2; 3 |]
let array2 = [| 42; 99; 666 |]
let pair = (array1, array2)
let x = 42
```

20
src/article.tex

@ -120,7 +120,19 @@ TODO: say that Python integers are of arbitrary size (size is stored in the bloc
TODO: say that it also wastes a lot of space (give size of a small int in Python)
TODO: say that small integers are preallocated in Python that's why x and array2\_2 are pointing to the same heap value
It is used in Java~\cite{Bra+98}. TODO: link ; TODO: explain difference with python (Java has some unboxed scalar oustide of generics)
It is used in Java~\cite{Bra+98}. The difference with Python being that only values that are used inside generics need to be boxed. Java thus have \texttt{int} values that are unboxed 32 bits integers and \texttt{Integer} values that are boxed 32 bits values. Only \texttt{Integer} can be used inside generics such as \texttt{ArrayList}. Java also have some arrays that can only contain unboxed values such as \texttt{int}.
\begin{tcolorbox}[breakable]
\input{layout.java.tex}
\end{tcolorbox}
\includegraphics[width=15em]{figure_java_layout.mps}
TODO: link ; TODO: explain difference with python (Java has some unboxed scalar oustide of generics)
\begin{tcolorbox}[breakable]
\input{forbidden.java.tex}
\end{tcolorbox}
\subsection{Advantages}
@ -144,6 +156,12 @@ It is used in Java~\cite{Bra+98}. TODO: link ; TODO: explain difference with pyt
\section{Pointer-tagging}
\begin{tcolorbox}[breakable]
\input{layout.ml.tex}
\end{tcolorbox}
\includegraphics[width=10em]{figure_ocaml_layout.mps}
\section{Tagged union}
\section{Type-passing}

38
src/dune

@ -2,7 +2,12 @@
(targets main.pdf)
(deps
article.tex
figure_java_layout.mps
figure_ocaml_layout.mps
figure_python_layout.mps
forbidden.java.tex
layout.java.tex
layout.ml.tex
layout.py.tex
list.c.tex
list.preprocessed.c.tex
@ -38,7 +43,12 @@
(targets main.bcf)
(deps
article.tex
figure_java_layout.mps
figure_ocaml_layout.mps
figure_python_layout.mps
forbidden.java.tex
layout.java.tex
layout.ml.tex
layout.py.tex
list.c.tex
list.preprocessed.c.tex
@ -127,10 +137,36 @@
(library
(name figures)
(modules figures)
(libraries mlpost))
(rule
(targets figure_python_layout.mps)
(targets
figure_java_layout.mps
figure_ocaml_layout.mps
figure_python_layout.mps)
(deps figures.ml)
(action
(run mlpost %{deps})))
(library
(name layout)
(modules layout))
(rule
(targets layout.ml.tex)
(deps styledef.tex layout.ml)
(action
(run pygmentize -O envname=BVerbatim layout.ml -o %{targets})))
(rule
(targets layout.java.tex)
(deps styledef.tex layout.java)
(action
(run pygmentize -O envname=BVerbatim layout.java -o %{targets})))
(rule
(targets forbidden.java.tex)
(deps styledef.tex forbidden.java)
(action
(run pygmentize -O envname=BVerbatim forbidden.java -o %{targets})))

94
src/figures.ml

@ -5,7 +5,10 @@ open Box
let named_ptr name = box ~name (tex " ")
(* a named box intended to be used as a block metadata which implies filled with black *)
let named_meta name = box ~name ~fill:Color.lightred (tex " ")
let named_meta name = box ~name ~fill:Color.lightred (tex "")
(* a named scalar *)
let named_scalar ~name v = box ~name (tex v)
(* a block of pointers, all elements are named, the first one is a metadata box all others are ptr boxes *)
let ptr_block name names =
@ -14,8 +17,15 @@ let ptr_block name names =
(* a block of scalars, only the metadata is named, all other have content (the scalar value) *)
let scalar_block name values = hblock @@ (named_meta name :: List.map tex values)
(* a stack ptr entry, s is the variable name and the pointer box will also be named after it *)
let stack_ptr s = hbox [ tex (Format.sprintf "\\texttt{%s}:" s); named_ptr s ]
let scalar_array name values = hblock ~name (List.map tex values)
(* a stack ptr entry, name is the variable name and the pointer box will also be named after it *)
let stack_ptr name =
hbox [ tex (Format.sprintf "\\texttt{%s}:" name); named_ptr name ]
(* a stack scalar entry, s is the variable name and the pointer box will also be named after it *)
let stack_scalar ~name v =
hbox [ tex (Format.sprintf "\\texttt{%s}:" name); named_scalar ~name v ]
(* a stack made of stack entries *)
let stack l = vbox ~padding:(Num.em 2.) [ tex "stack:"; vbox l ]
@ -65,7 +75,83 @@ let figure_python_layout =
; ptr "x" "42_meta"
]
let figure_ocaml_layout =
let stack =
stack
[ stack_ptr "array1"
; stack_ptr "array2"
; stack_ptr "pair"
; stack_scalar ~name:"x" "42"
]
in
let heap =
vbox ~padding:(Num.em 2.)
[ tex "heap:"
; scalar_block "array1_meta" [ "1"; "2"; "3" ]
; ptr_block "pair_meta" [ "pair_1"; "pair_2" ]
; scalar_block "array2_meta" [ "42"; "99"; "666" ]
]
in
let figure = hbox ~padding:(Num.em 2.) [ stack; heap ] in
let ptr a b = Helpers.box_pointer_arrow (get a figure) (get b figure) in
Command.seq
[ draw figure
; ptr "array1" "array1_meta"
; ptr "array2" "array2_meta"
; ptr "pair" "pair_meta"
; ptr "pair_1" "array1_meta"
; ptr "pair_2" "array2_meta"
]
let figure_java_layout =
let stack =
stack
[ stack_ptr "array1"
; stack_ptr "array2"
; stack_ptr "pair"
; stack_scalar ~name:"x" "42"
]
in
let heap =
vbox ~padding:(Num.em 2.)
[ tex "heap:"
; scalar_array "array1_array" [ "1"; "2"; "3" ]
; hbox ~padding:(Num.em 1.)
[ scalar_block "1_meta" [ "1" ]
; scalar_block "2_meta" [ "2" ]
; scalar_block "3_meta" [ "3" ]
]
; ptr_block "array1_meta" [ "array1_1"; "array1_2"; "array1_3" ]
; ptr_block "pair_meta" [ "pair_1"; "pair_2" ]
; ptr_block "array2_meta" [ "array2_1"; "array2_2"; "array2_3" ]
; hbox ~padding:(Num.em 1.)
[ scalar_block "42_meta" [ "42" ]
; scalar_block "99_meta" [ "99" ]
; scalar_block "666_meta" [ "666" ]
]
]
in
let figure = hbox ~padding:(Num.em 2.) [ stack; heap ] in
let ptr a b = Helpers.box_pointer_arrow (get a figure) (get b figure) in
Command.seq
[ draw figure
; ptr "array1" "array1_array"
; ptr "array1_1" "1_meta"
; ptr "array1_2" "2_meta"
; ptr "array1_3" "3_meta"
; ptr "array2" "array2_meta"
; ptr "array2_1" "42_meta"
; ptr "array2_2" "99_meta"
; ptr "array2_3" "666_meta"
; ptr "pair" "pair_meta"
; ptr "pair_1" "array1_meta"
; ptr "pair_2" "array2_meta"
]
let () =
Array.iter
(fun (name, figure) -> Metapost.emit name (Picture.scale (Num.em 1.) figure))
[| ("figure_python_layout", figure_python_layout) |]
[| ("figure_python_layout", figure_python_layout)
; ("figure_ocaml_layout", figure_ocaml_layout)
; ("figure_java_layout", figure_java_layout)
|]

5
src/forbidden.java

@ -0,0 +1,5 @@
ArrayList<int> a = new ArrayList(); // unexpected type
public <T> void foo(T v) {
T[] a = new T[3]; // error : generic array creation
}

10
src/layout.java

@ -0,0 +1,10 @@
import java.util.ArrayList;
public class main {
public static void main(String[] args) {
int[] array1 = [ 1, 2, 3 ];
ArrayList<T> array2 = new ArrayList([ 42, 99, 666 ]);
Pair<ArrayList<T>> pair = new Pair(array1, array2);
int x = 42;
}
}

4
src/layout.ml

@ -0,0 +1,4 @@
let array1 = [| 1; 2; 3 |]
let array2 = [| 42; 99; 666 |]
let pair = (array1, array2)
let x = 42
Loading…
Cancel
Save