Entry point



In computer programming, an entry point is the place in a program where the execution of a program begins, and where the program has access to command line arguments.

To start a program's execution, the loader or operating system passes control to its entry point. (During booting, the operating system itself is the program). This marks the transition from load time (and dynamic link time, if present) to run time.

For some operating systems and programming languages, the entry point is in a runtime library, a set of support functions for the language. The library code initializes the program and then passes control to the program proper. In other cases, the program may initialize the runtime library itself.

In simple systems, execution begins at the first statement, which is common in interpreted languages, simple executable formats, and boot loaders. In other cases, the entry point is at some other known memory address which can be an absolute address or relative address (offset).

Alternatively, execution of a program can begin at a named point, either with a conventional name defined by the programming language or operating system or at a caller-specified name. In many C-family languages, this is a function called ; as a result, the entry point is often known as the main function.

In JVM languages, such as Java, the entry point is a static method called ; in CLI languages such as C# the entry point is a static method named.

Usage
Entry points apply both to source code and to executable files. However, in day-to-day software development, programmers specify the entry points only in source code, which makes them much better known. Entry points in executable files depend on the application binary interface (ABI) of the actual operating system, and are generated by the compiler or linker (if not fixed by the ABI). Other linked object files may also have entry points, which are used later by the linker when generating entry points of an executable file.

Entry points are capable of passing on command arguments, variables, or other information as a local variable used by the  method. This way, specific options may be set upon execution of the program, and then interpreted by the program. Many programs use this as an alternative way to configure different settings, or perform a set variety of actions using a single program.

Contemporary
In most of today's popular programming languages and operating systems, a computer program usually only has a single entry point.

In C, C++, D, Zig, Rust and Kotlin programs this is a function named ; in Java it is a static method named   (although the class must be specified at the invocation time), and in C# it is a static method named.

In many major operating systems, the standard executable format has a single entry point. In the Executable and Linkable Format (ELF), used in Unix and Unix-like systems such as Linux, the entry point is specified in the  field of the ELF header. In the GNU Compiler Collection (gcc), the entry point used by the linker is the  symbol. Similarly, in the Portable Executable format, used in Microsoft Windows, the entry point is specified by the  field, which is inherited from COFF. In COM files, the entry point is at the fixed offset of 0100h.

One exception to the single-entry-point paradigm is Android. Android applications do not have a single entry point – there is no special   function. Instead, they have essential components (activities and services) which the system can load and run as needed.

An occasionally used technique is the fat binary, which consists of several executables for different targets packaged in a single file. Most commonly, this is implemented by a single overall entry point, which is compatible with all targets and branches to the target-specific entry point. Alternative techniques include storing separate executables in separate forks, each with its own entry point, which is then selected by the operating system.

Historical
Historically, and in some contemporary legacy systems, such as VMS and OS/400, computer programs have a multitude of entry points, each corresponding to the different functionalities of the program. The usual way to denote entry points, as used system-wide in VMS and in PL/I and MACRO programs, is to append them at the end of the name of the executable image, delimited by a dollar sign ($), e.g..

The Apple I computer also used this to some degree. For example, an alternative entry point in Apple I's BASIC would keep the BASIC program useful when the reset button was accidentally pushed.

Exit point
In general, programs can exit at any time by returning to the operating system or crashing. Programs in interpreted languages return control to the interpreter, but programs in compiled languages must return to the operating system, otherwise the processor will simply continue executing beyond the end of the program, resulting in undefined behavior.

Usually, there is not a single exit point specified in a program. However, in other cases runtimes ensure that programs always terminate in a structured way via a single exit point, which is guaranteed unless the runtime itself crashes; this allows cleanup code to be run, such as  handlers. This can be done by either requiring that programs terminate by returning from the main function, by calling a specific exit function, or by the runtime catching exceptions or operating system signals.

Programming languages
In many programming languages, the  function is where a program starts its execution. It enables high-level organization of the program's functionality, and typically has access to the command arguments given to the program when it was executed.

The main function is generally the first programmer-written function that runs when a program starts, and is invoked directly from the system-specific initialization contained in the runtime environment (crt0 or equivalent). However, some languages can execute user-written functions before main runs, such as the constructors of C++ global objects.

In other languages, notably many interpreted languages, execution begins at the first statement in the program.

A non-exhaustive list of programming languages follows, describing their way of defining the main entry point:

APL
In APL, when a workspace is loaded, the contents of "quad LX" (latent expression) variable is interpreted as an APL expression and executed.

C and C++
In C and C++, the function prototype of the main function must be equivalent to one of the following:

Main function looks like entry point for application programmers (the application's entry point or main entry point). System programming reveals more information about the program, and specifies the entry point elsewhere (in initialization procedure, or in reset interrupt vector for standalone programs).

The parameters, argument count, and  , argument vector, respectively give the number and values of the program's command-line arguments. The names of  and   may be any valid identifier in C, but it is common convention to use these names. In C++, the names are to be taken literally, and the "void" in the parameter list is to be omitted, if strict conformance is desired. Other platform-dependent formats are also allowed by the C and C++ standards, except that in C++ the return type must always be ; for example, Unix (though not POSIX.1) and Windows have a third argument giving the program's environment, otherwise accessible through   in  :

Darwin-based operating systems, such as macOS, have a fourth parameter containing arbitrary OS-supplied information, such as the path to the executing binary:

The value returned from the main function becomes the exit status of the process, though the C standard only ascribes specific meaning to two values:  (traditionally 0) and. The meaning of other possible return values is implementation-defined. In case a return value is not defined by the programmer, an implicit  at the end of the   function is inserted by the compiler; this behavior is required by the C++ standard.

It is guaranteed that  is non-negative and that   is a null pointer. By convention, the command-line arguments specified by  and   include the name of the program as the first element if   is greater than 0; if a user types a command of " ", the shell will initialise the   process with   and. As  is the name that processes appear under in ,   etc., some programs, such as daemons or those running within an interpreter or virtual machine (where   would be the name of the host executable), may choose to alter their argv to give a more descriptive  , usually by means of the   system call.

The  function is special; normally every C and C++ program must define it exactly once.

If declared,  must be declared as if it has external linkage; it cannot be declared   or.

In C++,  must be in the global namespace (i.e.  ), cannot be overloaded, and cannot be a member function, although the name is not otherwise reserved, and may be used for member functions, classes, enumerations, or non-member functions in other namespaces. In C++ (unlike C)  cannot be called recursively and cannot have its address taken.

C#
When executing a program written in C#, the CLR searches for a static method marked with the  IL directive, which takes either no arguments, or a single argument of type , and has a return type of   or  , and executes it.

Command-line arguments are passed in, similar to how it is done in Java. For versions of  returning an integer, similar to both C and C++, it is passed back to the environment as the exit status of the process.

Since C#7.1 there are four more possible signatures of the entry point, which allow asynchronous execution in the  Method.

The  and   types are the asynchronous equivalents of   and. is required to allow the use of asynchrony (the  keyword) inside the method.

Clean
Clean is a functional programming language based on graph rewriting. The initial node is named  and is of type   if it changes the world or some fixed type if the program only prints the result after reducing.

Or even simpler

One tells the compiler which option to use to generate the executable file.

Common Lisp
ANSI Common Lisp does not define a main function; instead, the code is read and evaluated from top to bottom in a source file. However, the following code will emulate a main function.

D
In D, the function prototype of the main function looks like one of the following:

Command-line arguments are passed in, similar to how it is done in C# or Java. For versions of  returning an integer, similar to both C and C++, it is passed back to the environment as the exit status of the process.

Dart
Dart is a general-purpose programming language that is often used for building web and mobile applications. Like many other programming languages, Dart has an entry point that serves as the starting point for a Dart program. The entry point is the first function that is executed when a program runs. In Dart, the entry point is typically a function named. When a Dart program is run, the Dart runtime looks for a function named  and executes it. Any Dart code that is intended to be executed when the program starts should be included in the  function. Here is an example of a simple  function in Dart:

In this example, the  function simply prints the text   to the console when the program is run. This code will be executed automatically when the Dart program is run.

It is important to note that while the  function is the default entry point for a Dart program, it is possible to specify a different entry point if needed. This can be done using the  annotation in Dart. However, in most cases, the  function is the entry point that should be used for Dart programs.

FORTRAN
FORTRAN does not have a main subroutine or function. Instead a  statement as the first line can be used to specify that a program unit is a main program, as shown below. The  statement cannot be used for recursive calls.

Some versions of Fortran, such as those on the IBM System/360 and successor mainframes, do not support the PROGRAM statement. Many compilers from other software manufacturers will allow a fortran program to be compiled without a PROGRAM statement. In these cases, whatever module that has any non-comment statement where no SUBROUTINE, FUNCTION or BLOCK DATA statement occurs, is considered to be the Main program.

GNAT
Using GNAT, the programmer is not required to write a function named ; a source file containing a single subprogram can be compiled to an executable. The binder will however create a package, which will contain and export a C-style main function.

Go
In Go programming language, program execution starts with the  function of the

There is no way to access arguments or a return code outside of the standard library in Go. These can be accessed via  and   respectively, both of which are included in the   package.

Haskell
A Haskell program must contain a name  bound to a value of type , for some type  ; which is usually. is a monad, which organizes side-effects in terms of purely functional code. The  value represents the side-effects-ful computation done by the program. The result of the computation represented by  is discarded; that is why   usually has type , which indicates that the type of the result of the computation is  , the unit type, which contains no information.

Command line arguments are not given to ; they must be fetched using another IO action, such as.

Java
Java programs start executing at the main method of a class,   which has one of the following method headings:

Command-line arguments are passed in. As in C and C++, the name " " is special. Java's main methods do not return a value directly, but one can be passed by using the  method.

Unlike C, the name of the program is not included in, because it is the name of the class that contains the main method, so it is already known. Also unlike C, the number of arguments need not be included, since arrays in Java have a field that keeps track of how many elements there are.

The main function must be included within a class. This is because in Java everything has to be contained within a class. For instance, a hello world program in Java may look like:

To run this program, one must call  in the directory where the compiled class file  ) exists. Alternatively, executable JAR files use a manifest file to specify the entry point in a manner that is filesystem-independent from the user's perspective.

LOGO
In FMSLogo, the procedures when loaded do not execute. To make them execute, it is necessary to use this code:

to procname ...                ; Startup commands (such as print [Welcome]) end

make "startup [procname]

The variable  is used for the startup list of actions, but the convention is that this calls a procedure that runs the actions. That procedure may be of any name.

OCaml
OCaml has no  function. Programs are evaluated from top to bottom.

Command-line arguments are available in an array named  and the exit status is 0 by default.

Example:

Pascal
In Pascal, the main procedure is the only unnamed block in the program. Because Pascal programs define procedures and functions in a more rigorous bottom-up order than C, C++ or Java programs, the main procedure is usually the last block in the program. Pascal does not have a special meaning for the name " " or any similar name.

Command-line arguments are counted in  and accessible as strings by , with n between 0 and.

Versions of Pascal that support units or modules may also contain an unnamed block in each, which is used to initialize the module. These blocks are executed before the main program entry point is called.

Perl
In Perl, there is no main function. Statements are executed from top to bottom, although statements in a  block are executed before normal statements.

Command-line arguments are available in the special array. Unlike C,  does not contain the name of the program, which is.

PHP
PHP does not have a "main" function. Starting from the first line of a PHP script, any code not encapsulated by a function header is executed as soon as it is seen.

Pike
In Pike syntax is similar to that of C and C++. The execution begins at. The " " variable keeps the number of arguments passed to the program. The " " variable holds the value associated with the arguments passed to the program.

Example:

Python
Python programs are evaluated top-to-bottom, as is usual in scripting languages: the entry point is the start of the source code. Since definitions must precede use, programs are typically structured with definitions at the top and the code to execute at the bottom (unindented), similar to code for a one-pass compiler, such as in Pascal.

Alternatively, a program can be structured with an explicit  function containing the code to be executed when a program is executed directly, but which can also be invoked by importing the program as a module and calling the function. This can be done by the following idiom, which relies on the internal variable  being set to   when a program is executed, but not when it is imported as a module (in which case it is instead set to the module name); there are many variants of this structure:

In this idiom, the call to the named entry point  is explicit, and the interaction with the operating system (receiving the arguments, calling system exit) are done explicitly by library calls, which are ultimately handled by the Python runtime. This contrast with C, where these are done implicitly by the runtime, based on convention.

QB64
The QB64 language has no main function, the code that is not within a function, or subroutine is executed first, from top to bottom: Command line arguments (if any) can be read using the COMMAND$ function:

Ruby
In Ruby, there is no distinct main function. Instead, code written outside of any  or   scope is executed in the context of a special " " object. This object can be accessed using :

It has the following properties:

Methods defined outside of a  or   scope are defined as private methods of the " " object. Since the class of " " is, such methods become private methods of almost every object:

The number and values of command-line arguments can be determined using the  constant array:

The first element of,  , contains the first command-line argument, not the name of program executed, as in C. The name of program is available using   or.

Similar to Python, one could use:

to execute some code only if its file was specified in the  invocation.

Rust
In Rust, the entry point of a program is a function named. Typically, this function is situated in a file called  or. Additionally, as of Rust 1.26.0, the main function may return a :

Swift
When run in an Xcode Playground, Swift behaves like a scripting language, executing statements from top to bottom; top-level code is allowed. Cocoa- and Cocoa Touch-based applications written in Swift are usually initialized with the  and   attributes, respectively. Those attributes are equivalent in their purpose to the  file in Objective-C projects: they implicitly declare the   function that calls  which creates an instance of.

The following code is the default way to initialize a Cocoa Touch-based iOS app and declare its application delegate.

Visual Basic
In Visual Basic, when a project contains no forms, the startup object may be the  procedure. The  function can be optionally used to access the argument portion of the command line used to launch the program:

Xojo
In Xojo, there are two different project types, each with a different main entry point. Desktop (GUI) applications start with the  event of the project's   object. Console applications start with the  event of the project's   object. In both instances, the main function is automatically generated, and cannot be removed from the project.