Mercurial > pub > dyncall > dyncall
diff doc/manual/manual_motivation.tex @ 0:3e629dc19168
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:24:28 +0100 |
parents | |
children | b47168dacba6 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/manual/manual_motivation.tex Thu Mar 19 22:24:28 2015 +0100 @@ -0,0 +1,135 @@ +%////////////////////////////////////////////////////////////////////////////// +% +% Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>, +% Tassilo Philipp <tphilipp@potion-studios.com> +% +% Permission to use, copy, modify, and distribute this software for any +% purpose with or without fee is hereby granted, provided that the above +% copyright notice and this permission notice appear in all copies. +% +% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +% +%////////////////////////////////////////////////////////////////////////////// + +\newpage +\section{Motivation} + +Interoperability between programming languages is a desirable feature +in complex software systems. While functions in scripting languages and virtual machine +languages can be called in a dynamic manner, statically compiled programming +languages such as C, C++ and Objective-C lack this ability.\\ +The majority of systems use C function interfaces as their system-level +interface. Calling these (foreign) functions from within a dynamic environment +often involves the development of so called "glue code" on both sides, +the use of external tools generating communication code, or integration +of other middleware fulfilling that purpose. However, even inside a completely +static environment, without having to bridge multiple languages, it +can be very useful to call functions dynamically. Consider, for example, message +systems, dynamic function call dispatch mechanisms, without even knowing about the +target.\\ + +The \product{dyncall} library project provides a clean and portable C interface +to dynamically issue calls to foreign code using small call kernels written in +assembly. Instead of providing code for every bridged function call, which +unnecessarily results in code bloat, only a modest number of instructions are used +to invoke all the calls.\\ + +\subsection{Static function calls in C} + +The C programming language and its direct derivatives are limited in the way +function calls are handled. A C compiler regards a function call as a +fully qualified atomic operation. In such a statically typed environment, this +includes the function call's argument arity and type, as well as the +return type.\\ + + +\subsection{Anatomy of machine-level calls} + +The process of calling a function on the machine level yields a common pattern: + +\begin{enumerate} +\item The target function's calling convention dictates how the stack is +prepared, arguments are passed, results are returned and how to clean up +afterwards. +\item Function call arguments are loaded in registers and on the stack according +to the calling convention that take alignment constraints into account. +\item Control flow transfer from caller to callee. +\item Process return value, if any. Some calling conventions specify that +the caller is responsible for cleaning up the argument stack. +\end{enumerate} + + +\newpage + +%\paragraph{Example} +The following example depicts a C source and the corresponding assembly for the X86 32-bit processor architecture. + + +\begin{lstlisting}[label=cfuncall,caption=C function call,language=C] +extern void f(int x, double y,float z); +void caller() +{ + f(1,2.0,3.0f); +} +\end{lstlisting} + + +\begin{lstlisting}[label=x86asm,caption=Assembly X86 32-bit function call,language={[x86masm]Assembler}] +.global f ; external symbol 'f' +caller: + push 40400000H ; 3.0f (32 bit float) + ; 2.0 (64 bit float) + push 40000000H ; low DWORD + push 0H ; high DWORD + push 1H ; 1 (32 bit integer) + call f ; call 'f' + add esp, 16 ; cleanup stack +\end{lstlisting} + + +\begin{comment} + +Due to the statically compiled nature of the +language itself, the abstraction to the underlying hardware machine +These languages make an abstraction to the machine in a way, where a function +call is an atomic operation that has to be fully qualified at compilation time. + +This library follows the approach to abstract the construction of a function call +and provides a small and clean implementation that is extendable by ports to +compilers, operating-systems and processor architectures. +The library solely uses a small kernel function to perform the actual call and +does not require just-in-time code generation. + +General-purpose programming languages such as C\footnote{and derived programming +languages such as C++ and Objective-C} are powerful statically compiled +programming languages that allow to implement low-level tasks. They abstract +the underlying hardware to a degree where one is allowed to write functions +that implement algorithms. At the same time, this + +Although C is very powerful and a portable language to implement time-critical +and performance greedy application - it is limited in the way it handles calls +to functions. + +General-purpose programming languages such as C and C++ are limited in the way +function calls are handled. These languages make an abstraction to the +underlying hardware architecture, so that writing algorithms can be done in a +portable way. While C is quite flexible in case of pointer arithmetics and +I/O in main memory, the flexibility ends at the function call. + +In contrast to implementing algorithms, the function call in C is something +that is black-box to the language. + +One can either fully bind and call a function at once or none at all. + + construct a half-baked function-call without providing C code that performs a particular desired function call +in regard to arity, argument type list, return type and calling convention. +The compiler requires exact information about the desired calling convention, +arity, argument- and return types. +\end{comment} +