Punkt wejścia - Entry point

Przykład funkcji main w języku C#.
Jak może wyglądać w kodzie źródłowym C # . Różne części są oznaczone w celach informacyjnych.Main()

W programowaniu komputerowym , punktem wyjścia jest punktem w programie, w którym rozpoczyna się realizacja programu telewizyjnego, w którym program ma dostęp do wiersza poleceń argumenty.

Aby uruchomić program za wykonanie tego, ładowarka lub system operacyjny przekazuje kontrolę do punktu wejścia. (Podczas uruchamiania sam system operacyjny jest programem). Oznacza to przejście od czasu ładowania (i czasu połączenia dynamicznego , jeśli jest obecny) do czasu wykonywania .

W przypadku niektórych systemów operacyjnych i języków programowania punkt wejścia znajduje się w bibliotece wykonawczej , czyli zestawie funkcji obsługi języka. Kod biblioteki inicjuje program, a następnie przekazuje sterowanie do właściwego programu. W innych przypadkach program może zainicjować samą bibliotekę uruchomieniową.

W prostych systemach wykonanie rozpoczyna się od pierwszej instrukcji, która jest powszechna w językach interpretowanych , prostych formatach wykonywalnych i programach ładujących . W innych przypadkach punkt wejścia znajduje się pod innym znanym adresem pamięci, który może być adresem bezwzględnym lub adresem względnym ( offset ).

Alternatywnie, wykonanie programu może rozpocząć się w nazwanym punkcie, albo z konwencjonalną nazwą zdefiniowaną przez język programowania lub system operacyjny, albo pod nazwą określoną przez wywołującego. W wielu językach z rodziny C jest to funkcja o nazwie main; w rezultacie punkt wejścia jest często nazywany główną funkcją .

W językach JVM, takich jak Java, punktem wejścia jest metoda statyczna o nazwie main; w językach CLI, takich jak C #, punktem wejścia jest metoda statyczna o nazwie Main.

Stosowanie

Punkty wejścia dotyczą zarówno kodu źródłowego, jak i plików wykonywalnych . Jednak w codziennym tworzeniu oprogramowania programiści określają punkty wejścia tylko w kodzie źródłowym, co czyni je znacznie bardziej znanymi. Punkty wejścia w plikach wykonywalnych zależą od interfejsu binarnego aplikacji (ABI) rzeczywistego systemu operacyjnego i są generowane przez kompilator lub konsolidator (jeśli nie zostały naprawione przez ABI). Inne połączone pliki obiektowe mogą również mieć punkty wejścia, które są później używane przez konsolidator podczas generowania punktów wejścia pliku wykonywalnego.

Punkty wejścia mogą przekazywać argumenty poleceń, zmienne lub inne informacje jako zmienną lokalną używaną przez Main()metodę. W ten sposób określone opcje mogą być ustawiane podczas wykonywania programu, a następnie interpretowane przez program. Wiele programów używa tego jako alternatywnego sposobu konfigurowania różnych ustawień lub wykonywania szeregu różnych działań przy użyciu jednego programu.

Współczesny

W większości współczesnych popularnych języków programowania i systemów operacyjnych program komputerowy ma zwykle tylko jeden punkt wejścia .

W programach C , C++ , D , Zig , Rust i Kotlin jest to funkcja o nazwie main; w Javie jest to statyczna metoda o nazwie main(chociaż klasa musi być określona w momencie wywołania), a w C# jest to statyczna metoda o nazwie Main.

W wielu głównych systemach operacyjnych standardowy format wykonywalny ma jeden punkt wejścia. W Executable and Linkable Format (ELF), używanym w systemach uniksowych i uniksopodobnych , takich jak Linux , punkt wejścia jest określony w e_entrypolu nagłówka ELF. W GNU Compiler Collection (gcc) punktem wejścia używanym przez linker jest _startsymbol. Podobnie w formacie Portable Executable , używanym w Microsoft Windows , punkt wejścia jest określony przez AddressOfEntryPointpole, które jest dziedziczone z COFF . W plikach COM punkt wejścia ma stałe przesunięcie 0100h.

Jedynym wyjątkiem od paradygmatu z jednym punktem wejścia jest Android . Aplikacje na Androida nie mają jednego punktu wejścia – nie ma specjalnej mainfunkcji. Zamiast tego mają istotne komponenty (czynności i usługi), które system może ładować i uruchamiać w razie potrzeby.

Sporadycznie używaną techniką jest fat binarny , który składa się z kilku plików wykonywalnych dla różnych celów spakowanych w jednym pliku. Najczęściej jest to realizowane przez jeden ogólny punkt wejścia, który jest kompatybilny ze wszystkimi celami i gałęziami do punktu wejścia specyficznego dla celu. Alternatywne techniki obejmują przechowywanie oddzielnych plików wykonywalnych w oddzielnych forkach , każdy z własnym punktem wejścia, który jest następnie wybierany przez system operacyjny.

Historyczny

Historycznie iw niektórych współczesnych starszych systemach , takich jak VMS i OS/400 , programy komputerowe mają wiele punktów wejścia , z których każdy odpowiada różnym funkcjom programu. Zwykłym sposobem oznaczania punktów wejścia, stosowanych w całym systemie w VMS oraz w programach PL/I i MACRO , jest dołączenie ich na końcu nazwy obrazu wykonywalnego , oddzielonego znakiem dolara ($), np directory.exe$make. .

Komputer Apple I również wykorzystał to w pewnym stopniu. Na przykład alternatywny punkt wejścia w BASIC firmy Apple I utrzymałby program BASIC przydatny, gdy przycisk resetowania zostałby przypadkowo naciśnięty.

Punkt wyjścia

Ogólnie rzecz biorąc, programy mogą zostać zamknięte w dowolnym momencie po powrocie do systemu operacyjnego lub awarii . Programy w językach interpretowanych zwracają kontrolę do interpretera, ale programy w językach skompilowanych muszą powrócić do systemu operacyjnego, w przeciwnym razie procesor będzie po prostu kontynuował wykonywanie programu po zakończeniu programu, co spowoduje niezdefiniowane zachowanie .

Zwykle w programie nie ma określonego punktu wyjścia. Jednak w innych przypadkach środowiska wykonawcze zapewniają, że programy zawsze kończą się w ustrukturyzowany sposób przez pojedynczy punkt wyjścia, co jest gwarantowane, chyba że samo środowisko wykonawcze ulegnie awarii; pozwala to na uruchomienie kodu czyszczącego, takiego jak atexitprogramy obsługi. Można to zrobić, wymagając, aby programy zakończyły się poprzez powrót z funkcji main, przez wywołanie określonej funkcji wyjścia lub przez wyjątki przechwytujące w czasie wykonywania lub sygnały systemu operacyjnego.

Języki programowania

W wielu językach programowania mainfunkcja jest miejscem, w którym program rozpoczyna swoje wykonanie. Umożliwia wysokopoziomową organizację funkcjonalności programu i zazwyczaj ma dostęp do argumentów poleceń przekazanych programowi podczas jego wykonywania.

Funkcja main jest zazwyczaj pierwszą funkcją napisaną przez programistę, która działa podczas uruchamiania programu i jest wywoływana bezpośrednio z inicjalizacji specyficznej dla systemu zawartej w środowisku wykonawczym ( crt0 lub odpowiednik). Jednak niektóre języki mogą wykonywać funkcje napisane przez użytkownika przed głównymi uruchomieniami, takie jak konstruktory globalnych obiektów C++ .

W innych językach, zwłaszcza w wielu językach interpretowanych , wykonanie rozpoczyna się od pierwszej instrukcji w programie.

Poniżej znajduje się niewyczerpująca lista języków programowania, opisująca sposób zdefiniowania głównego punktu wejścia:

APL

W APL , gdy obszar roboczy jest ładowany, zawartość zmiennej "quad LX" (wyrażenie latentne) jest interpretowana jako wyrażenie APL i wykonywana.

C i C++

W C i C ++ , w prototypie funkcji głównych funkcji wygląda jak jedna z poniższych sytuacji:

int main(void);
int main();

int main(int argc, char **argv);
int main(int argc, char *argv[]);
int main(int argc, char **argv, char **env);

// more specifically in C
// NOT according to the ISO C standard 5.1.2.2.1
// BUT in embedded programming depending on the µC, this form is also used
void main (void);

Funkcja główna wygląda jak punkt wejścia dla programistów aplikacji (punkt wejścia aplikacji lub główny punkt wejścia). Programowanie systemowe ujawnia więcej informacji o programie i określa punkt wejścia w innym miejscu (w procedurze inicjalizacji lub w wektorze przerwań resetowania dla programów samodzielnych).

Te parametry argc , liczba argumentów , a argv, wektor argumentem odpowiednio podać liczbę i wartości programu argumentów wiersza poleceń . Nazwy argci argvmogą być dowolnym poprawnym identyfikatorem w C, ale powszechną konwencją jest używanie tych nazw. W C++ nazwy należy traktować dosłownie, a "unieważnienie" na liście parametrów należy pominąć, jeśli wymagana jest ścisła zgodność. Inne formaty zależne od platformy są również dozwolone przez standardy C i C++, z wyjątkiem tego, że w C++ typem zwracanym musi być zawsze int; na przykład, Unix (choć nie POSIX.1 ) i system Windows ma trzeci argument podając programu środowisko , w przeciwnym razie dostępne za pośrednictwem getenvw stdlib.h:

int main(int argc, char **argv, char **envp);

Systemy operacyjne oparte na Darwin , takie jak macOS , mają czwarty parametr zawierający dowolne informacje dostarczane przez system operacyjny, takie jak ścieżka do wykonywanego pliku binarnego:

int main(int argc, char **argv, char **envp, char **apple);

Wartość zwrócona z funkcji głównej staje się kodem zakończenia procesu, chociaż standard C przypisuje określone znaczenie tylko dwóm wartościom: EXIT_SUCCESS(tradycyjnie 0) i EXIT_FAILURE. Znaczenie innych możliwych zwracanych wartości jest zdefiniowane przez implementację. W przypadku, gdy wartość zwracana nie jest zdefiniowana przez programistę, niejawny return 0;koniec main()funkcji jest wstawiany przez kompilator; to zachowanie jest wymagane przez standard C++.

Gwarantuje się, że argcjest nieujemna i argv[argc]jest to wskaźnik o wartości null . Zgodnie z konwencją argumenty wiersza polecenia określone przez argci argvzawierają nazwę programu jako pierwszy element, jeśli argcjest większe od 0; jeśli użytkownik wpisze polecenie " rm file", powłoka zainicjuje rmproces za pomocą argc = 2i argv = {"rm", "file", NULL}. Jak argv[0]to nazwa, która pojawi się pod procesy w ps, topitd., Niektóre programy, takie jak demony lub te uruchomione w ramach tłumacza lub maszynie wirtualnej (gdzie argv[0]byłaby nazwa pliku wykonywalnego hosta), może zdecydować się na zmianę ich argv uzyskując więcej opisowy argv[0], zwykle za pomocą execwywołania systemowego.

main()Funkcja jest wyjątkowy; normalnie każdy program C i C++ musi to zdefiniować dokładnie raz.

Jeśli zadeklarowany, main()musi być zadeklarowany tak, jakby miał połączenie zewnętrzne; nie można go zadeklarować staticani inline.

W C++ main()musi znajdować się w globalnej przestrzeni nazw (tj. ::main), nie może być przeciążona i nie może być funkcją składową , chociaż nazwa nie jest w inny sposób zarezerwowana i może być używana dla funkcji składowych, klas, wyliczeń lub funkcji niebędących członkami w inne przestrzenie nazw. W C++ (w przeciwieństwie do C) main()nie można wywoływać rekursywnie i nie można pobrać jego adresu.

DO#

Podczas wykonywania programu napisanego w C# , CLR wyszukuje metodę statyczną oznaczoną .entrypointdyrektywą IL, która nie przyjmuje żadnych argumentów lub pojedynczy argument typu string[]i ma zwracany typ voidlub inti wykonuje go.

static void Main();
static void Main(string[] args);
static int Main();
static int Main(string[] args);

Argumenty wiersza poleceń są przekazywane w programie args, podobnie jak w Javie. W przypadku wersji Main()zwracających liczbę całkowitą, podobnie jak w C i C ++, jest ona przekazywana z powrotem do środowiska jako kod zakończenia procesu.

Od C#7.1 istnieją jeszcze cztery możliwe sygnatury punktu wejścia, które umożliwiają wykonanie asynchroniczne w Main()Metodzie.

static Task Main()
static Task<int> Main()
static Task Main(string[])
static Task<int> Main(string[])

TaskI Task<int>typy asynchroniczna równoważników voidi int.

Czysty

Clean to funkcjonalny język programowania oparty na przepisaniu grafów. Początkowy węzeł jest nazwany Starti jest typu, *World -> *Worldjeśli zmienia świat lub jakiś ustalony typ, jeśli program wypisuje wynik tylko po zmniejszeniu Start .

Start :: *World -> *World
Start world = startIO ...

Albo jeszcze prostsze

Start :: String
Start = "Hello, world!"

Jeden mówi kompilatorowi, której opcji użyć do wygenerowania pliku wykonywalnego.

Wspólne seplenienie

ANSI Common Lisp nie definiuje funkcji main; zamiast tego kod jest odczytywany i oceniany od góry do dołu w pliku źródłowym. Jednak poniższy kod emuluje funkcję main.

(defun hello-main ()
  (format t "Hello World!~%"))

(hello-main)

re

W D The prototyp funkcji z głównych funkcji wygląda jak jedna z poniższych sytuacji:

void main();
void main(string[] args);
int main();
int main(string[] args);

Argumenty wiersza polecenia są przekazywane w programie args, podobnie jak w języku C# lub Java. W przypadku wersji main()zwracających liczbę całkowitą, podobnie jak w C i C ++, jest ona przekazywana z powrotem do środowiska jako kod zakończenia procesu.

FORTRAN

FORTRAN nie ma głównego podprogramu ani funkcji. Zamiast tego można użyć PROGRAMinstrukcji jako pierwszego wiersza do określenia, że ​​jednostka programu jest programem głównym, jak pokazano poniżej. PROGRAMOświadczenie nie może być używany do rozmów rekurencyjnych.

      PROGRAM HELLO
      PRINT *, "Cint!"
      END PROGRAM HELLO

Niektóre wersje Fortran, takie jak te w IBM System/360 i kolejnych komputerach mainframe, nie obsługują instrukcji PROGRAM. Wiele kompilatorów innych producentów oprogramowania pozwala na kompilację programu fortran bez instrukcji PROGRAM. W takich przypadkach każdy moduł, który zawiera jakiekolwiek instrukcje bez komentarzy, w których nie występuje instrukcja SUBROUTINE, FUNCTION lub BLOCK DATA, jest uważany za program główny.

KOMAR

Używając GNAT , programista nie musi pisać funkcji o nazwie main; plik źródłowy zawierający pojedynczy podprogram można skompilować do pliku wykonywalnego. Segregator utworzy jednak pakiet ada_main, który będzie zawierał i eksportował główną funkcję w stylu C.

Udać się

W języku programowania Go wykonanie programu rozpoczyna się od mainfunkcjipackage main

package main

import "fmt"

func main() {
 fmt.Println("Hello, World!")
}

Nie ma możliwości uzyskania dostępu do argumentów lub kodu powrotu poza standardową biblioteką w Go. Dostęp do nich można uzyskać odpowiednio za pośrednictwem os.Argsi os.Exit, które są zawarte w "os"pakiecie.

Haskell

Program Haskell musi zawierać nazwę mainpowiązaną z wartością typu IO t, dla pewnego typu t; co jest zwykle IO (). IOto monada , która porządkuje efekty uboczne pod kątem czysto funkcjonalnego kodu. mainWartość przedstawia obliczenia skutków ubocznych-ful wykonanej przez program. Wynik obliczenia reprezentowany przez mainjest odrzucany; dlatego mainzwykle typ IO (), który wskazuje, że typ wyniku obliczeń jest ()The typ jednostki , która nie zawiera żadnych informacji.

main :: IO ()
main = putStrLn "Hello, World!"

Argumenty wiersza poleceń nie są przekazywane do main; muszą zostać pobrane przy użyciu innej akcji we/wy, takiej jak System.Environment.getArgs.

Jawa

Programy Java rozpoczynają wykonywanie od głównej metody klasy, która ma jeden z następujących nagłówków metod :

public static void main(String[] args)
public static void main(String... args)
public static void main(String args[])

Argumenty wiersza poleceń są przekazywane w args. Podobnie jak w C i C ++, nazwa „ main()” jest wyjątkowa. Główne metody Javy nie zwracają wartości bezpośrednio, ale można ją przekazać za pomocą System.exit()metody.

W przeciwieństwie do C, nazwa programu nie jest zawarta w args, ponieważ jest to nazwa klasy zawierającej główną metodę, więc jest już znana. Również w przeciwieństwie do C, liczba argumentów nie musi być uwzględniana, ponieważ tablice w Javie mają pole, które śledzi liczbę elementów.

Główna funkcja musi być zawarta w klasie. Dzieje się tak, ponieważ w Javie wszystko musi być zawarte w klasie. Na przykład program hello world w Javie może wyglądać tak:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

Aby uruchomić ten program, należy zadzwonić java HelloWorlddo katalogu, w którym istnieje skompilowany plik klasy HelloWorld.class ). Alternatywnie pliki wykonywalne JAR używają pliku manifestu do określenia punktu wejścia w sposób niezależny od systemu plików z perspektywy użytkownika.

W FMSLogo procedury po załadowaniu nie są wykonywane. Aby je wykonać, konieczne jest użycie tego kodu:

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

Zmienna startupjest używana dla początkowej listy akcji, ale konwencja jest taka, że ​​wywołuje to inną procedurę, która uruchamia akcje. Procedura ta może mieć dowolną nazwę.

OCaml

OCaml nie ma mainfunkcji. Programy są oceniane od góry do dołu.

Argumenty wiersza polecenia są dostępne w tablicy o nazwie, Sys.argva kod zakończenia domyślnie wynosi 0.

Przykład:

print_endline "Hello World"

Pascal

W Pascalu główna procedura jest jedynym nienazwanym blokiem w programie. Ponieważ programy w języku Pascal definiują procedury i funkcje w bardziej rygorystycznej kolejności od dołu do góry niż programy C, C ++ lub Java, główna procedura jest zwykle ostatnim blokiem w programie. Pascal nie ma specjalnego znaczenia dla nazwy „ main” ani żadnej podobnej nazwy.

program Hello(Output);
begin
  writeln('Hello, world!');
end.

Argumenty wiersza poleceń są liczone w ParamCounti dostępne jako ciągi znaków przez ParamStr(n), gdzie n zawiera się między 0 a ParamCount.

Wersje Pascala obsługujące jednostki lub moduły mogą również zawierać nienazwany blok w każdym, który jest używany do inicjalizacji modułu. Bloki te są wykonywane przed wywołaniem głównego punktu wejścia programu.

Perl

W Perlu nie ma głównej funkcji. Instrukcje są wykonywane od góry do dołu.

Argumenty wiersza poleceń są dostępne w specjalnej tablicy @ARGV. W przeciwieństwie do C, @ARGVnie zawiera nazwy programu, którą jest $0.

PHP

PHP nie posiada funkcji "main". Zaczynając od pierwszego wiersza skryptu PHP, każdy kod, który nie jest hermetyzowany przez nagłówek funkcji, jest wykonywany tak szybko, jak jest widziany.

Szczupak

W Pike składnia jest podobna do składni C i C++. Egzekucja rozpoczyna się o godz main. argcZmienna " " przechowuje liczbę argumentów przekazanych do programu. argvZmienna " " przechowuje wartość związaną z argumentami przekazanymi do programu.

Przykład:

 int main(int argc, array(string) argv)

Pyton

Programy Pythona są oceniane od góry do dołu, jak to zwykle bywa w językach skryptowych: punktem wejścia jest początek kodu źródłowego. Ponieważ definicje muszą poprzedzać użycie, programy mają zazwyczaj strukturę z definicjami na górze i kodem do wykonania na dole (bez wcięcia), podobnie jak kod dla kompilatora jednoprzebiegowego , takiego jak w Pascalu.

Alternatywnie program może mieć strukturę z jawną mainfunkcją zawierającą kod do wykonania, gdy program jest wykonywany bezpośrednio, ale który można również wywołać, importując program jako moduł i wywołując funkcję. Można to zrobić za pomocą następującego idiomu, która opiera się na zmiennej wewnętrznej __name__jest ustawiony __main__, gdy program jest wykonywany, ale nie wtedy, gdy jest importowany jako moduł (w tym przypadku jest ona zamiast ustawiona na nazwę modułu); istnieje wiele wariantów tej konstrukcji:

import sys

def main(argv):
    n = int(argv[1])
    print(n + 1)

if __name__ == '__main__':
    sys.exit(main(sys.argv))

W tym idiomie wywołanie nazwanego punktu wejścia mainjest jawne, a interakcja z systemem operacyjnym (odbieranie argumentów, wywoływanie wyjścia systemu) odbywa się jawnie przez wywołania biblioteki, które są ostatecznie obsługiwane przez środowisko wykonawcze Pythona. Kontrastuje to z C, gdzie są one wykonywane niejawnie przez środowisko wykonawcze, w oparciu o konwencję.

QB64

Język QB64 nie ma głównej funkcji, kod, który nie znajduje się w funkcji lub podprogramie, jest wykonywany jako pierwszy, od góry do dołu:

print "Hello World! a =";
a = getInteger(1.8d): print a

function getInteger(n as double)
    getInteger = int(n)
end function

Argumenty wiersza poleceń (jeśli istnieją) można odczytać za pomocą funkcji COMMAND$:

dim shared commandline as string
commandline = COMMAND$

'Several space-separated command line arguments can be read using COMMAND$(n)
commandline1 = COMMAND$(2)

Rubin

W Ruby nie ma odrębnej funkcji głównej. Zamiast tego kod napisany poza dowolnym class .. endlub module .. endzakresem jest wykonywany w kontekście specjalnego mainobiektu „ ”. Dostęp do tego obiektu można uzyskać za pomocą self:

irb(main):001:0> self
=> main

Posiada następujące właściwości:

irb(main):002:0> self.class
=> Object
irb(main):003:0> self.class.ancestors
=> [Object, Kernel, BasicObject]

Metody zdefiniowane poza zakresem classlub modulesą zdefiniowane jako metody prywatne obiektu " main". Ponieważ klasa " main" is Object, takie metody stają się prywatnymi metodami prawie każdego obiektu:

irb(main):004:0> def foo
irb(main):005:1>   42
irb(main):006:1> end
=> nil
irb(main):007:0> foo
=> 42
irb(main):008:0> [].foo
NoMethodError: private method `foo' called for []:Array
	from (irb):8
	from /usr/bin/irb:12:in `<main>'
irb(main):009:0> false.foo
NoMethodError: private method `foo' called for false:FalseClass
	from (irb):9
	from /usr/bin/irb:12:in `<main>'

Liczbę i wartości argumentów wiersza poleceń można określić za pomocą ARGVtablicy stałych:

$ irb /dev/tty foo bar

tty(main):001:0> ARGV
ARGV
=> ["foo", "bar"]
tty(main):002:0> ARGV.size
ARGV.size
=> 2

Pierwszy element ARGV, ARGV[0]zawiera pierwszy argument wiersza polecenia, a nie nazwy programu realizowane, jak w C. Nazwa programu jest dostępna za pomocą $0lub $PROGRAM_NAME.

Podobnie jak w Pythonie, można by użyć:

if __FILE__ == $PROGRAM_NAME
  # Put "main" code here
end

wykonać jakiś kod tylko wtedy, gdy jego plik został określony w rubywywołaniu.

Rdza

W Ruście punktem wejścia programu jest funkcja o nazwie main. Zazwyczaj ta funkcja znajduje się w pliku o nazwie main.rslub lib.rs.

// In `main.rs`
fn main() {
    println!("Hello, World!");
}

Dodatkowo, od wersji Rust 1.26.0, funkcja main może zwrócić Result:

fn main() -> Result<(), std::io::Error> {
    println!("Hello, World!");

    Ok(())  // Return a type `Result` of value `Ok` with the content `()`, i.e. an empty tuple.
}

Szybki

Po uruchomieniu w Xcode Playground, Swift zachowuje się jak język skryptowy, wykonując instrukcje od góry do dołu; kod najwyższego poziomu jest dozwolony.

// HelloWorld.playground

let hello = "hello"
let world = "world"

let helloWorld = hello + " " + world

print(helloWorld) // hello world

Kakao - i Cocoa Touch -na aplikacje napisane w Swift zazwyczaj inicjowany z @NSApplicationMaini @UIApplicationMainatrybutów, odpowiednio. Te atrybuty są równoważne pod względem celu z main.mplikiem w projektach Objective-C : niejawnie deklarują mainfunkcję, która wywołuje, UIApplicationMain(_:_:_:_:)która tworzy instancję UIApplication. Poniższy kod jest domyślnym sposobem zainicjowania aplikacji systemu iOS opartej na technologii Cocoa Touch i zadeklarowania jej delegata aplikacji.

// AppDelegate.swift

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        return true
    }
    
}

Visual Basic

W Visual Basic , gdy projekt nie zawiera formularzy, obiekt startowy może być Main()procedurą. Command$Funkcja może być ewentualnie stosowany w celu uzyskania dostępu do części argumentu linii sterowania stosowanego do uruchomienia programu:

Sub Main()
    Debug.Print "Hello World!"
    MsgBox "Arguments if any are: " & Command$
End Sub

Xojo

W Xojo istnieją dwa różne typy projektów, każdy z innym głównym punktem wejścia. Aplikacje desktopowe (GUI) rozpoczynają się od App.Openzdarzenia obiektu projektu Application. Aplikacje konsolowe rozpoczynają się od App.Runzdarzenia obiektu projektu ConsoleApplication. W obu przypadkach główna funkcja jest generowana automatycznie i nie można jej usunąć z projektu.

Zobacz też

Bibliografia

Linki zewnętrzne