docs: add description of internal datatypes
Этот коммит содержится в:
		
							родитель
							
								
									06b8afab2e
								
							
						
					
					
						коммит
						85d5fe7643
					
				
					 1 изменённых файлов: 70 добавлений и 0 удалений
				
			
		| 
						 | 
					@ -1,8 +1,10 @@
 | 
				
			||||||
.. _internals:
 | 
					.. _internals:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Compiler internals
 | 
					Compiler internals
 | 
				
			||||||
==================
 | 
					==================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Differences from ``go``
 | 
					Differences from ``go``
 | 
				
			||||||
-----------------------
 | 
					-----------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,6 +33,74 @@ Differences from ``go``
 | 
				
			||||||
      * Global constants are useful for constant propagation and thus for dead
 | 
					      * Global constants are useful for constant propagation and thus for dead
 | 
				
			||||||
        code elimination (like an ``if`` that depends on a global variable).
 | 
					        code elimination (like an ``if`` that depends on a global variable).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Datatypes
 | 
				
			||||||
 | 
					---------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TinyGo uses a different representation for some data types than standard Go.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					string
 | 
				
			||||||
 | 
					    A string is encoded as a ``{ptr, len}`` tuple. The type is actually defined
 | 
				
			||||||
 | 
					    in the runtime as ``runtime._string``, in `src/runtime/string.go
 | 
				
			||||||
 | 
					    <https://github.com/aykevl/tinygo/blob/master/src/runtime/string.go>`_. That
 | 
				
			||||||
 | 
					    file also contains some compiler intrinsics for dealing with strings and
 | 
				
			||||||
 | 
					    UTF-8.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					slice
 | 
				
			||||||
 | 
					    A slice is encoded as a ``{ptr, len, cap}`` tuple. There is no runtime
 | 
				
			||||||
 | 
					    definition of it as slices are a generic type and the pointer type is
 | 
				
			||||||
 | 
					    different for each slice. That said, the bit layout is exactly the same for
 | 
				
			||||||
 | 
					    every slice and generic ``copy`` and ``append`` functions are implemented in
 | 
				
			||||||
 | 
					    `src/runtime/slice.go
 | 
				
			||||||
 | 
					    <https://github.com/aykevl/tinygo/blob/master/src/runtime/slice.go>`_.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					array
 | 
				
			||||||
 | 
					    Arrays are simple: they are simply lowered to a LLVM array type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					complex
 | 
				
			||||||
 | 
					    Complex numbers are implemented in the most obvious way: as a vector of
 | 
				
			||||||
 | 
					    floating point numbers with length 2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					map
 | 
				
			||||||
 | 
					    The map type is a very complex type and is implemented as an (incomplete)
 | 
				
			||||||
 | 
					    hashmap. It is defined as ``runtime.hashmap`` in `src/runtime/hashmap.go
 | 
				
			||||||
 | 
					    <https://github.com/aykevl/tinygo/blob/master/src/runtime/hashmap.go>`_. As
 | 
				
			||||||
 | 
					    maps are reference types, they are lowered to a pointer to the
 | 
				
			||||||
 | 
					    aforementioned struct. See for example ``runtime.hashmapMake`` that is the
 | 
				
			||||||
 | 
					    compiler intrinsic to create a new hashmap.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface
 | 
				
			||||||
 | 
					    An interface is a ``{typecode, value}`` tuple and is defined as
 | 
				
			||||||
 | 
					    ``runtime._interface`` in `src/runtime/interface.go
 | 
				
			||||||
 | 
					    <https://github.com/aykevl/tinygo/blob/master/src/runtime/interface.go>`_.
 | 
				
			||||||
 | 
					    The typecode is a small integer unique to the type of the value. See
 | 
				
			||||||
 | 
					    interface.go for a detailed description of how typeasserts and interface
 | 
				
			||||||
 | 
					    calls are implemented.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function pointer
 | 
				
			||||||
 | 
					    A function pointer has two representations: a literal function pointer and a
 | 
				
			||||||
 | 
					    tuple of ``{context, function pointer}``. Which representation is chosen
 | 
				
			||||||
 | 
					    depends on the AnalyseFunctionPointers pass in `ir/passes.go
 | 
				
			||||||
 | 
					    <https://github.com/aykevl/tinygo/blob/master/ir/passes.go>`_: it tries to
 | 
				
			||||||
 | 
					    use a raw function pointer but will use a function pointer with context if
 | 
				
			||||||
 | 
					    there is a closure or bound method somewhere in the program with the exact
 | 
				
			||||||
 | 
					    same signature.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					goroutine
 | 
				
			||||||
 | 
					    A goroutine is a linked list of `LLVM coroutines
 | 
				
			||||||
 | 
					    <https://llvm.org/docs/Coroutines.html>`_. Every blocking call will create a
 | 
				
			||||||
 | 
					    new coroutine, pass the resulting coroutine to the scheduler, and will mark
 | 
				
			||||||
 | 
					    itself as waiting for a return. Once the called blocking function returns,
 | 
				
			||||||
 | 
					    it re-activates its parent coroutine. Non-blocking calls are normal calls,
 | 
				
			||||||
 | 
					    unaware of the fact that they're running on a particular goroutine. For
 | 
				
			||||||
 | 
					    details, see `src/runtime/scheduler.go
 | 
				
			||||||
 | 
					    <https://github.com/aykevl/tinygo/blob/master/src/runtime/scheduler.go>`_.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This is rather expensive and should be optimized in the future. But the way
 | 
				
			||||||
 | 
					    it works now, a single stack can be used for all goroutines lowering memory
 | 
				
			||||||
 | 
					    consumption.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Pipeline
 | 
					Pipeline
 | 
				
			||||||
--------
 | 
					--------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче