엔트리 포인트
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
엔트리 포인트는 소스 코드와 실행 파일 모두에서 프로그램 실행이 시작되는 지점을 의미한다. 대부분의 프로그래밍 언어와 운영 체제에서 컴퓨터 프로그램은 단일 엔트리 포인트를 가지며, C, C++, Java 등 다양한 언어에서 `main` 함수 또는 메서드로 지정된다. 안드로이드 애플리케이션과 같이 예외적인 경우도 있으며, 팻 바이너리와 같이 여러 엔트리 포인트를 가질 수 있는 기술도 존재한다. 프로그램은 종료 포인트를 통해 종료될 수 있으며, 언어별로 엔트리 포인트의 형태가 다르다. 과거에는 여러 엔트리 포인트를 가진 프로그램도 존재했다.
엔트리 포인트는 소스 코드부터 실행 파일까지 적용 가능하다. 그러나 일반적인 소프트웨어 개발에서 프로그래머들은 단지 소스 코드에만 엔트리 포인트를 명시한다. 실행 파일의 엔트리 포인트는 실제 운영 체제의 응용 프로그램 이진 인터페이스(ABI)에 의존하며, (ABI에 의해 고정되지 않을 시에) 컴파일러나 링커에 의해 생성된다. 실행 불가능한 목적 파일도 엔트리 포인트를 갖고 있는데, 이것은 추후에 실행 파일의 엔트리 포인트를 생성할 때 링커에 의해 사용된다.
프로그램은 일반적으로 운영체제로 반환하거나 충돌과 같은 구조화되지 않은 방식으로 언제든 종료될 수 있다. 스크립트 언어는 보통 프로그램 끝에 도달하면 종료된다. 그러나 바이너리의 경우 제어가 운영체제에 반환되거나, 프로세스 메모리에서 넘쳐 메모리 접근 위반이 발생하면 운영체제에 의해 종료된다.[1]
C, C++, D, Zig, Rust 및 Kotlin 프로그램의 엔트리 포인트는 `main`이라는 함수이다. Java에서는 `main`이라는 정적 메서드이다(클래스는 호출 시 지정해야 함). C#에서는 `Main`이라는 정적 메서드이다.[5][6]
다른 대부분의 운영체제와 달리 안드로이드는 하나의 엔트리 포인트를 갖지 않는다.(
C, C++, D, Zig, Rust 및 Kotlin 프로그램에서 엔트리 포인트는 `main`이라는 함수이다. Java에서는 `main`이라는 정적 메서드이다(클래스는 호출 시 지정해야 함). C#에서는 Main이라는 정적 메서드이다.[5][6]
일반적인 소프트웨어 개발에서 프로그래머들은 소스 코드에만 엔트리 포인트를 명시한다. 실행 파일의 엔트리 포인트는 운영 체제의 ABI에 의존하며, 컴파일러나 링커에 의해 생성된다. 실행 불가능한 목적 파일도 엔트리 포인트를 갖고 있는데, 이는 나중에 실행 파일의 엔트리 포인트를 생성할 때 링커에 의해 사용된다.
주진입점은 정보·통신 분야에서 프로그램이 호출되었을 때 제어가 옮겨지는 위치를 가리킨다. 진입점은 하나의 주진입점과 지정된 수의 부진입점으로 이루어질 수 있다. 주진입점에 제어를 넘기는 것은 프로그램이 본래 이름 또는 다른 예약된 이름으로 불릴 경우이고, 부진입점에 제어를 넘기는 것은 다른 이름으로 불릴 경우에 한한다.
[1]
웹사이트
In Computing, what is an Entry Point? (with picture)
http://www.wisegeek.[...]
2020-01-22
2. 사용
현재 사용되는 대부분의 언어와 운영 체제에서 프로그램은 오직 한 개의 엔트리 포인트를 갖는다.
C, C++은 `main`이라는 이름의 함수이며, 자바에서는 `main` 이라는 이름의 정적 메소드이다. C#도 `Main`이라는 정적 메소드를 갖는다.[30][31]
주요한 운영체제들에서 표준 실행 파일 포맷은 한 개의 엔트리 포인트를 갖는다. 유닉스와 유닉스 계열 그리고 리눅스에서 사용되는 ELF 파일 형식에서 엔트리 포인트는 ELF 헤더의 `e_entry` 필드에 명시되어 있다. GNU 컴파일러 모음(gcc)에서 링커에 의해 사용되는 엔트리 포인트는 `_start` 심볼이다. 비슷하게 마이크로소프트의 PE 포맷에서 엔트리 포인트는 `AddressOfEntryPoint` 필드에 명시된다.
주목할만한 예외로서 안드로이드가 있다. 다른 대부분의 운영체제와 달리 안드로이드는 하나의 엔트리 포인트를 갖지 않는다.(`main` 함수가 없다.) 대신에 시스템이 실체화하고 필요할 때 실행할 수 있는 필수 요소를 갖는다.[32]
3. 종료 포인트
일반적으로 프로그램에 종료 지점이 하나만 있지는 않다. 그러나 어떤 경우에는 런타임이 충돌되지 않았다는 가정 하에 단일 종료 지점을 통해 항상 구조화된 방식으로 종료되게 할 수 있다. 이는 명시된 종료 함수를 호출하거나, 런타임 예외 또는 운영체제 시그널을 통해 `main` 함수를 반환함으로써 수행된다.[1]
4. 프로그래밍 언어별 엔트리 포인트
유닉스 및 유닉스 계열 시스템(예: 리눅스)에서 사용되는 실행 가능 및 링크 가능 형식 (ELF)에서 엔트리 포인트는 ELF 헤더의 `e_entry` 필드에 지정된다. GNU 컴파일러 모음 (gcc)에서 링커가 사용하는 엔트리 포인트는 `_start` 기호이다. 마이크로소프트 윈도우에서 사용되는 이식 가능한 실행 파일 형식에서 엔트리 포인트는 COFF에서 상속된 `AddressOfEntryPoint` 필드로 지정된다. COM 파일에서 엔트리 포인트는 0100h의 고정된 오프셋에 있다.
안드로이드는 예외적으로 단일 엔트리 포인트를 갖지 않는다. 대신 필요에 따라 시스템이 로드하여 실행할 수 있는 ''필수 구성 요소''(액티비티 및 서비스)가 있다.[7]
많은 프로그래밍 언어에서 `main` 함수는 프로그램 실행 시작 지점이다. 이는 프로그램 기능의 상위 수준 구성을 가능하게 하며, 일반적으로 프로그램 실행 시 주어진 명령 인수에 접근할 수 있다.
main 함수는 보통 프로그램 시작 시 실행되는 프로그래머가 작성한 첫 함수이며, 런타임 환경(crt0 또는 그에 상응하는 것)에 포함된 시스템별 초기화에서 직접 호출된다. 그러나 일부 언어에서는 main 실행 전에 C++(C++) 전역 객체의 생성자와 같이 사용자가 작성한 함수를 실행할 수 있다.
인터프리터 언어와 같은 다른 언어에서는 프로그램의 첫 번째 구문에서 실행이 시작된다.
다음은 주요 프로그래밍 언어들의 엔트리 포인트를 정리한 표이다.프로그래밍 언어 엔트리 포인트 C, C++, Objective-C `main` 함수 C#, Visual Basic, Visual Basic .NET `Main` 메서드 Java `main` 정적 메서드 파스칼 프로그램 정의의 시작 부분 (이름은 규정되지 않음) APL "쿼드 LX" 변수의 내용 (APL 표현식으로 해석) Clean `Start` 노드 D, Zig, Rust, Kotlin `main` 함수 FORTRAN `PROGRAM` 문 (첫 번째 줄) GNAT 단일 서브프로그램 (C 스타일 `main` 함수는 `ada_main` 패키지에 생성됨) Go `package main`의 `main` 함수 하스켈 `main` (일반적으로 `IO ()` 타입) FMSLogo (로고) 로드된 프로시저는 실행되지 않음 OCaml `main` 함수 없음 (위에서 아래로 평가) Perl `main` 함수 없음 (위에서 아래로 실행, `BEGIN` 블록은 먼저 실행) PHP `main` 함수 없음 (스크립트 첫 줄부터 실행) 파이크 `main` 함수 파이썬 소스 코드 시작 부분 (위에서 아래로 평가) QB64 `main` 함수 없음 (함수/서브루틴 외부 코드가 위에서 아래로 실행) 루비 `main` 함수 없음 (`class` 또는 `module` 외부 코드는 "main" 객체 컨텍스트에서 실행) Swift (Xcode 플레이그라운드) 위에서 아래로 실행 Xojo 데스크톱: `App.Open`, 콘솔: `App.Run` (자동 생성된 `main` 함수)
4. 1. C, C++, Objective-C
C, C++, Objective-C에서 엔트리 포인트는 `main`이라는 이름의 함수이다.[30][31]
C와 C++에서, main 함수의 함수 원형은 다음과 같다.
```c
int main(void);
int main();
int main(int argc, char **argv);
int main(int argc, char *argv[]);
```
매개변수 `argc` (인자 개수)와 `argv` (인자 벡터)[33]는 각각 프로그램의 명령 줄 인자의 수와 값을 나타낸다. `argc`와 `argv`는 C에서 유효한 식별자라면 어떤 이름이든 사용할 수 있지만, 관행적으로 이 이름들을 사용한다. C++ 표준에서는 리턴 타입이 항상 `int`여야 한다.[34]
유닉스와 윈도우에서는 프로그램의 환경 변수를 받는 세 번째 인수를 추가할 수 있다.
```c
int main(int argc, char argv, char envp);
```
맥 OS X와 다윈은 실행 바이너리의 경로 등 운영체제가 제공하는 정보를 담는 네 번째 매개변수를 사용한다.[35]
```c
int main(int argc, char argv, char envp, char **apple);
```
main 함수에서 반환되는 값은 프로세스의 종료 상태가 된다. C 표준은 `EXIT_SUCCESS` (일반적으로 0)와 `EXIT_FAILURE` 두 가지 값을 정의한다. 다른 가능한 반환 값은 구현에 따라 달라진다. 프로그래머가 반환 값을 정의하지 않으면 컴파일러가 `main()` 함수 끝에 `return 0;`을 자동으로 추가한다. (C++ 표준).
`argc`는 양수이고 `argv[argc]`는 널 포인터임이 보장된다. 관행적으로 명령 줄 인자는 `argc`에 의해 지정되며, `argv`는 `argc`가 0보다 큰 경우 첫 번째 요소로 프로그램 이름을 포함한다. 예를 들어, 사용자가 "`rm file`"을 입력하면, 셸은 `rm` 프로세스를 `argc = 2`와 `argv = {"rm", "file", NULL}`로 초기화한다. `argv[0]`은 `ps`, `top` 등에서 보이는 프로그램 이름이다.
`main()` 함수는 일반적으로 모든 C와 C++ 프로그램에서 정확히 한 번 정의되어야 한다는 점에서 특별하다.
`main()`은 외부 링크를 가진 것처럼 정의되어야 하며, `static`이나 `inline`으로 정의될 수 없다.
C++에서 `main()`은 글로벌 이름공간 (즉, `::main`)에 있어야 하며, 오버로드될 수 없고, 멤버 함수일 수 없다. C와 달리 C++에서 `main()`은 재귀적으로 호출될 수 없고 자신의 주소를 가질 수 없다.
4. 2. C#, Visual Basic, Visual Basic .NET
C#로 작성된 프로그램을 실행할 때, CLR은 인수를 받지 않거나, `string[]` 형식의 단일 인수를 받으며, 반환 형식이 `void` 또는 `int`인 `.entrypoint` IL 지시자로 표시된 정적 메서드를 검색하여 실행한다.[12]
```csharp
static void Main();
static void Main(string[] args);
static int Main();
static int Main(string[] args);
```
명령줄 인수는 Java와 유사하게 `args`로 전달된다. C 및 C++ 모두와 유사하게 정수를 반환하는 `Main()` 버전의 경우, 프로세스의 종료 상태로 환경에 다시 전달된다.
C# 7.1부터는 `Main()` 메서드에서 비동기 실행을 허용하는 진입점의 함수 시그니처가 4가지 더 있다.[13]
```csharp
static async Task Main()
static async Task
static async Task Main(string[])
static async Task
```
`Task` 및 `Task
비주얼 베이직에서, 프로젝트에 폼이 없을 경우, 시작 개체는 `Main()` 프로시저일 수 있다. `Command$` 함수는 선택적으로 프로그램을 실행하는 데 사용된 명령줄의 인수 부분에 액세스하는 데 사용될 수 있다.
```vbscript
Sub Main()
Debug.Print "Hello World!"
MsgBox "Arguments if any are: " & Command$
End Sub
```4. 3. Java
자바 프로그램은 클래스의 main 메서드에서 실행을 시작하며,[17][18][19][20] 다음과 같은 메서드 헤딩 중 하나를 갖는다.
```java
public static void main(String[] args)
public static void main(String... args)
public static void main(String args[])
void main()
```
명령줄 인수는 `args`로 전달된다. C 및 C++와 마찬가지로 "`main()`"이라는 이름은 특별하다. 자바의 main 메서드는 값을 직접 반환하지 않지만 `System.exit()` 메서드를 사용하여 반환할 수 있다.
C와 달리 프로그램 이름은 `args`에 포함되지 않는데, main 메서드를 포함하는 클래스의 이름이므로 이미 알려져 있기 때문이다. 또한 C와 달리 자바의 배열에는 요소 수를 추적하는 필드가 있으므로 인수의 수를 포함할 필요가 없다.
main 함수는 클래스 내에 포함되어야 한다. 자바에서는 모든 것이 클래스 내에 포함되어야 하기 때문이다. 예를 들어 자바의 Hello, World! 프로그램은 다음과 같다.
```java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
```
이 프로그램을 실행하려면 컴파일된 클래스 파일 `HelloWorld.class`가 있는 디렉토리에서 `java HelloWorld`를 호출해야 한다. 또는 실행 가능한 JAR 파일은 매니페스트 파일을 사용하여 사용자의 관점에서 파일 시스템과 독립적인 방식으로 진입점을 지정한다.
4. 4. Pascal
파스칼에서 주(main) 프로시저는 프로그램에서 유일하게 이름이 없는 블록이다. 파스칼 프로그램은 C, C++ 또는 Java 프로그램보다 더 엄격한 상향식 순서로 프로시저와 함수를 정의하기 때문에 주 프로시저는 일반적으로 프로그램의 마지막 블록이다. 파스칼은 "`main`" 또는 이와 유사한 이름에 특별한 의미를 부여하지 않는다.[29]
```pascal
program Hello(Output);
begin
writeln('Hello, world!');
end.
```
명령줄 인수는 `ParamCount`에서 계산되며 `ParamStr(n)`을 통해 문자열로 접근할 수 있다. 여기서 n은 0과 `ParamCount` 사이의 값이다.
유닛 또는 모듈을 지원하는 파스칼 버전은 각 모듈을 초기화하는 데 사용되는 이름이 없는 블록도 포함할 수 있다. 이러한 블록은 주 프로그램 진입점이 호출되기 전에 실행된다.
4. 5. 그 외 언어
C, C++, D, Zig, Rust 및 Kotlin 프로그램에서 엔트리 포인트는 `main`이라는 함수이다. Java에서는 `main`이라는 정적 메서드이다(클래스는 호출 시 지정해야 함). C#에서는 `Main`이라는 정적 메서드이다.[5][6]
APL에서 작업 공간이 로드될 때, "쿼드 LX"(잠재 표현) 변수의 내용은 APL 표현식으로 해석되어 실행된다.
Clean은 그래프 재작성을 기반으로 하는 함수형 프로그래밍 언어이다. 초기 노드는 `Start`로 명명되며, 세계를 ''변경''하는 경우 `*World -> *World` 형식이고, 프로그램이 `Start`를 축약한 후 결과만 출력하는 경우 고정된 형식이다.
FORTRAN은 주 서브루틴이나 함수를 가지고 있지 않다. 대신, `PROGRAM` 문을 첫 번째 줄로 사용하여 프로그램 단위를 주 프로그램으로 지정할 수 있다. `PROGRAM` 문은 재귀 호출에 사용할 수 없다.[14] IBM System/360 및 후속 메인프레임과 같은 일부 버전의 Fortran은 PROGRAM 문을 지원하지 않는다. 다른 소프트웨어 제조업체의 많은 컴파일러는 PROGRAM 문 없이 포트란 프로그램을 컴파일할 수 있도록 한다. 이러한 경우, SUBROUTINE, FUNCTION 또는 BLOCK DATA 문이 없는 비 주석문이 있는 모듈을 주 프로그램으로 간주한다.
GNAT를 사용하는 프로그래머는 `main`이라는 함수를 작성할 필요가 없다. 단일 서브프로그램을 포함하는 소스 파일은 실행 파일로 컴파일될 수 있다. 그러나 바인더는 C 스타일의 main 함수를 포함하고 내보낼 `ada_main` 패키지를 생성한다.
Go 프로그래밍 언어에서 프로그램 실행은 `package main`의 `main` 함수에서 시작된다. Go의 표준 라이브러리 외부에서는 인수에 접근하거나 반환 코드를 가져올 수 없다. 이는 `os.Args` 및 `os.Exit`를 통해 각각 접근할 수 있으며, 두 기능 모두 `"os"` 패키지에 포함되어 있다.
하스켈 프로그램은 어떤 타입 `t`에 대해 `IO t` 타입의 값에 바인딩된 `main`이라는 이름을 포함해야 한다.[15] 일반적으로 `IO ()`이다. `IO`는 모나드이며, 이는 부작용을 순수 함수형 코드 측면에서 구성한다.[16] `main` 값은 프로그램에 의해 수행되는 부작용을 가진 계산을 나타낸다. `main`이 나타내는 계산의 결과는 버려진다.
FMSLogo(로고)에서 로드된 프로시저는 실행되지 않는다.
OCaml에는 `main` 함수가 없다. 프로그램은 위에서 아래로 평가된다. 명령줄 인수는 `Sys.argv`라는 배열로 제공되며 기본적으로 종료 상태는 0이다.
Perl에는 주 함수가 없다. 문은 위에서 아래로 실행되며, `BEGIN` 블록의 문은 일반 문보다 먼저 실행된다. 명령줄 인수는 특수 배열 `@ARGV`에서 사용할 수 있다. C와 달리 `@ARGV`에는 프로그램 이름인 `$0`이 포함되어 있지 않다.
PHP는 "main" 함수를 가지고 있지 않다. PHP 스크립트의 첫 번째 줄부터 시작하여 함수 헤더로 캡슐화되지 않은 모든 코드는 해당 코드를 보는 즉시 실행된다.
파이크의 구문은 C와 C++의 구문과 유사하다. 실행은 `main`에서 시작된다. "`argc`" 변수는 프로그램에 전달된 인자의 개수를 저장한다. "`argv`" 변수는 프로그램에 전달된 인자와 관련된 값을 저장한다.
파이썬 프로그램은 스크립트 언어에서 흔히 볼 수 있듯이, 위에서 아래로 평가된다. 즉, 엔트리 포인트는 소스 코드의 시작 부분이다.
QB64 언어는 메인 함수가 없으며, 함수 또는 서브루틴 내에 없는 코드가 위에서 아래로 먼저 실행된다. 명령줄 인수는 `COMMAND$` 함수를 사용하여 읽을 수 있다.
루비에는 별도의 main 함수가 없다. 대신, `class .. end` 또는 `module .. end` 범위 밖에서 작성된 코드는 특수한 "`main`" 객체의 컨텍스트에서 실행된다.
Rust에서 프로그램의 엔트리 포인트는 `main`이라는 함수이다.
Xcode 플레이그라운드에서 실행될 때,[26] Swift는 스크립트 언어처럼 동작하여 위에서 아래로 구문을 실행하며, 최상위 코드가 허용된다.
Xojo에는 서로 다른 두 가지 프로젝트 유형이 있으며, 각각 다른 주 진입점을 가지고 있다. 데스크톱(GUI) 응용 프로그램은 프로젝트의 `Application` 객체의 `App.Open` 이벤트를 시작점으로 한다. 콘솔 응용 프로그램은 프로젝트의 `ConsoleApplication` 객체의 `App.Run` 이벤트를 시작점으로 한다. 두 경우 모두, main 함수는 자동으로 생성되며, 프로젝트에서 제거할 수 없다.
5. 안드로이드
main
함수가 없다.) 대신에 시스템이 필요할 때 실체화하고 실행할 수 있는 필수 요소를 갖는다.[32]
6. 팻 바이너리 (Fat Binary)
가끔 사용되는 기술은 단일 파일에 여러 대상에 대한 여러 실행 파일을 묶는 팻 바이너리이다. 가장 일반적으로 이는 모든 대상과 호환되고 대상별 엔트리 포인트로 분기하는 단일 전체 엔트리 포인트로 구현된다. 대체 기술에는 자체 엔트리 포인트를 가진 별도의 포크에 개별 실행 파일을 저장하는 것이 포함되며, 이는 운영 체제에서 선택한다.
7. 역사적 배경 및 기타
현재 사용되는 대부분의 언어와 운영 체제에서 프로그램은 오직 한 개의 엔트리 포인트를 갖는다.
C, C++은 `main`이라는 이름의 함수이며, 자바에서는 `main` 이라는 이름의 정적 메소드이다. C#도 `Main`이라는 정적 메소드를 갖는다.[30][31]
주요한 운영체제들에서 표준 실행 파일 포맷은 한 개의 엔트리 포인트를 갖는다. 유닉스와 유닉스 계열 그리고 리눅스에서 사용되는 ELF 파일 형식에서 엔트리 포인트는 ELF 헤더의 `e_entry` 필드에 명시되어 있다. GNU 컴파일러 모음 (gcc)에서 링커에 의해 사용되는 엔트리 포인트는 `_start` 심볼이다. 비슷하게 마이크로소프트의 PE 포맷에서 엔트리 포인트는 `AddressOfEntryPoint` 필드에 명시된다.
안드로이드는 예외적으로 단일 엔트리 포인트를 갖지 않고, 대신 시스템이 필요할 때 실행할 수 있는 필수 요소를 갖는다.[32]
C, C++, D, Zig, Rust 및 Kotlin 프로그램에서 엔트리 포인트는 `main`이라는 함수이다. Java에서는 `main`이라는 정적 메서드이다(클래스는 호출 시 지정해야 함). C#에서는 Main이라는 정적 메서드이다.[5][6]
COM 파일에서 엔트리 포인트는 0100h의 고정된 오프셋에 있다.
단일 엔트리 포인트 패러다임의 한 가지 예외는 안드로이드이다. 안드로이드 애플리케이션은 단일 엔트리 포인트를 갖지 않으며, 특별한 `main` 함수가 없다. 대신 필요에 따라 시스템이 로드하여 실행할 수 있는 ''필수 구성 요소''(액티비티 및 서비스)가 있다.[7]
과거에는, 그리고 VMS와 OS/400과 같은 일부 현대 레거시 시스템에서 컴퓨터 프로그램은 프로그램의 서로 다른 기능에 해당하는 여러 개의 "엔트리 포인트"를 가졌다. VMS에서 시스템 전체에서 사용되고 PL/I 및 매크로 프로그램에서 사용되는 엔트리 포인트를 나타내는 일반적인 방법은 실행 파일 이미지 이름의 끝에 달러 기호($)로 구분하여 추가하는 것이다. 예를 들어 `directory.exe$make`와 같다.
애플 I 컴퓨터도 어느 정도 이 방식을 사용했다. 예를 들어, 애플 I의 베이직의 다른 엔트리 포인트는 리셋 버튼이 실수로 눌러졌을 때 베이직 프로그램을 유용하게 유지했다.
FORTRAN은 주 서브루틴이나 함수를 가지고 있지 않다. 대신, `PROGRAM` 문을 첫 번째 줄로 사용하여 프로그램 단위를 주 프로그램으로 지정할 수 있다. `PROGRAM` 문은 재귀 호출에 사용할 수 없다.[14]
IBM System/360 및 후속 메인프레임과 같은 일부 버전의 Fortran은 PROGRAM 문을 지원하지 않는다. 다른 소프트웨어 제조업체의 많은 컴파일러는 PROGRAM 문 없이 포트란 프로그램을 컴파일할 수 있도록 한다. 이러한 경우, SUBROUTINE, FUNCTION 또는 BLOCK DATA 문이 없는 비 주석문이 있는 모듈을 주 프로그램으로 간주한다.
8. 주진입점
엔트리 포인트는 소스 코드와 실행 파일 모두에 적용된다. 하지만, 일상적인 소프트웨어 개발에서는 프로그래머가 소스 코드에서만 엔트리 포인트를 지정하므로 엔트리 포인트에 대해 더 잘 알고 있다. 실행 파일의 엔트리 포인트는 실제 운영 체제의 애플리케이션 바이너리 인터페이스(ABI)에 따라 다르며, 컴파일러 또는 링커에 의해 생성된다(ABI에 의해 고정되지 않은 경우). 다른 연결된 오브젝트 파일도 엔트리 포인트를 가질 수 있으며, 이는 실행 파일의 엔트리 포인트를 생성할 때 링커가 나중에 사용한다.
엔트리 포인트는 `Main()` 메서드에서 사용되는 지역 변수로서 명령 인수, 변수 또는 기타 정보를 전달할 수 있다. 이러한 방식으로 프로그램 실행 시 특정 옵션을 설정한 다음 프로그램에서 해석할 수 있다. 많은 프로그램은 이를 다른 설정을 구성하거나 단일 프로그램을 사용하여 다양한 작업 집합을 수행하는 대체 방법으로 사용한다.
대부분의 오늘날 인기 있는 프로그래밍 언어와 운영 체제에서 컴퓨터 프로그램은 일반적으로 단일 ''엔트리 포인트''만 가진다.
C, C++, D, Zig, Rust 및 Kotlin 프로그램에서 이는 `main`이라는 함수이다. Java에서는 `main`이라는 정적 메서드이다(클래스는 호출 시 지정해야 함). C#에서는 Main이라는 정적 메서드이다.[5][6]
많은 주요 운영 체제에서 표준 실행 파일 형식은 단일 엔트리 포인트를 갖는다. 유닉스 및 유닉스 계열 시스템(예: 리눅스)에서 사용되는 실행 가능 및 링크 가능 형식 (ELF)에서 엔트리 포인트는 ELF 헤더의 `e_entry` 필드에 지정된다. GNU 컴파일러 모음 (gcc)에서 링커가 사용하는 엔트리 포인트는 `_start` 기호이다. 마찬가지로 마이크로소프트 윈도우에서 사용되는 이식 가능한 실행 파일 형식에서 엔트리 포인트는 COFF에서 상속된 `AddressOfEntryPoint` 필드로 지정된다. COM 파일에서 엔트리 포인트는 0100h의 고정된 오프셋에 있다.
단일 엔트리 포인트 패러다임의 한 가지 예외는 안드로이드이다. 안드로이드 애플리케이션은 단일 엔트리 포인트를 가지지 않으며 특별한 `main` 함수가 없다. 대신 필요에 따라 시스템이 로드하여 실행할 수 있는 ''필수 구성 요소''(액티비티 및 서비스)가 있다.[7]
가끔 사용되는 기술은 단일 파일에 여러 대상에 대한 여러 실행 파일을 묶는 팻 바이너리이다. 가장 일반적으로 이는 모든 대상과 호환되고 대상별 엔트리 포인트로 분기하는 단일 전체 엔트리 포인트로 구현된다. 대체 기술에는 자체 엔트리 포인트를 가진 별도의 포크에 개별 실행 파일을 저장하는 것이 포함되며, 이는 운영 체제에서 선택한다.
많은 프로그래밍 언어에서, `main` 함수는 프로그램이 실행을 시작하는 지점이다. 이는 프로그램 기능의 상위 수준 구성을 가능하게 하며, 일반적으로 프로그램 실행 시 주어진 명령 인수에 접근할 수 있다.
main 함수는 일반적으로 프로그램 시작 시 실행되는 프로그래머가 작성한 첫 번째 함수이며, 런타임 환경(crt0 또는 그에 상응하는 것)에 포함된 시스템별 초기화에서 직접 호출된다. 그러나 일부 언어에서는 main이 실행되기 전에 C++(C++) 전역 객체의 생성자와 같이 사용자가 작성한 함수를 실행할 수 있다.
다른 언어, 특히 많은 인터프리터 언어에서는 프로그램의 첫 번째 구문에서 실행이 시작된다.
참조
[2]
서적
Programming Environments for Massively Parallel Distributed Systems: Working Conference of the Ifip Wg 10.3, April 25-29, 1994
https://books.google[...]
Springer Science & Business Media
1994
[3]
웹사이트
Main Method in C#
https://www.geeksfor[...]
2020-01-22
[4]
웹사이트
Main() / Entry Points (C# Programming Guide) - Microsoft Developer Network
https://docs.microso[...]
2018-12-03
[5]
웹사이트
The main() function
https://www.ibm.com/[...]
IBM
2014-05-08
[6]
웹사이트
Main() and Command-Line Arguments (C# Programming Guide)
http://msdn.microsof[...]
Msdn.microsoft.com
2014-05-08
[7]
웹사이트
Application Fundamentals
http://www.linuxtopi[...]
linuxtopia.org
2014-02-19
[8]
문서
[9]
웹사이트
Parameter types and names of main
https://groups.googl[...]
2016-07-28
[10]
문서
[11]
웹사이트
The char *apple
Argument Vector
http://unixjunkie.bl[...]
2014-05-12
[12]
웹사이트
Console Applications in .NET, or Teaching a New Dog Old Tricks
http://msdn.microsof[...]
Msdn.microsoft.com
2013-08-19
[13]
웹사이트
The official repo for the design of the C# programming language: Dotnet/Csharplang
https://github.com/d[...]
2019-08-26
[14]
문서
[15]
웹사이트
The Haskell 98 Report: Modules
http://www.haskell.o[...]
Haskell.org
2013-08-19
[16]
웹사이트
Some Haskell Misconceptions: Idiomatic Code, Purity, Laziness, and IO
http://geekrant.word[...]
2010-07-27
[17]
웹사이트
The Java Language Environment
https://www.oracle.c[...]
2020-03-14
[18]
서적
Java : a beginner's guide
McGraw-Hill Education
[19]
웹사이트
Hello, World! - Free Interactive Java Tutorial
https://www.learnjav[...]
2020-03-14
[20]
웹사이트
Hello, World! - Free Interactive Java Tutorial
https://www.learnjav[...]
2020-03-14
[21]
웹사이트
Python main() functions
https://www.artima.c[...]
2015-06-29
[22]
웹사이트
Code Like a Pythonista: Idiomatic Python
http://python.net/~g[...]
2014-05-27
[23]
웹사이트
Python main() functions
http://nedbatchelder[...]
2015-06-29
[24]
웹사이트
Programming Ruby: The Pragmatic Programmer's Guide, Ruby and Its World
http://www.ruby-doc.[...]
2013-08-31
[25]
웹사이트
Releases.md
https://github.com/r[...]
GitHub Rust
2019-02-15
[26]
문서
[27]
웹사이트
UIApplicationMain(_:_:_:_:) — UIKit
https://developer.ap[...]
2019-01-12
[28]
웹사이트
UIApplication — UIKit
https://developer.ap[...]
2019-01-12
[29]
문서
変更可能
[30]
웹인용
The main() function
https://publib.bould[...]
IBM
2014-05-08
[31]
웹인용
Main() and Command-Line Arguments (C# Programming Guide)
http://msdn.microsof[...]
Msdn.microsoft.com
2014-05-08
[32]
웹인용
Application Fundamentals
http://www.linuxtopi[...]
linuxtopia.org
2014-02-19
[33]
문서
[34]
문서
[35]
웹인용
The char *apple
Argument Vector
http://unixjunkie.bl[...]
2015-10-28
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com