TL; DR
Em Java, o motivo public static void main(String[] args)
é que
- Gosling queria
- o código escrito por alguém com experiência em C (não em Java)
- para ser executado por alguém acostumado a executar o PostScript no NeWS
Para C #, o raciocínio é transitivamente semelhante, por assim dizer. Os designers de linguagem mantinham a sintaxe do ponto de entrada do programa familiar para programadores vindos de Java. Como o arquiteto de C # Anders Hejlsberg coloca ,
... nossa abordagem com C # foi simplesmente oferecer uma alternativa ... aos programadores Java ...
Versão longa
expandindo acima e apoiado com referências chatas.
java Terminator Tem que ver Baby!
Especificações da VM, 2.17.1 Inicialização da máquina virtual
... A maneira como a classe inicial é especificada para a máquina virtual Java está além do escopo desta especificação, mas é típico, em ambientes host que usam linhas de comando, que o nome completo da classe seja especificado como um argumento da linha de comando e para que os argumentos subsequentes da linha de comando sejam usados como seqüências de caracteres, a serem fornecidos como o argumento para o método principal. Por exemplo, usando o Java 2 SDK da Sun para Solaris, a linha de comando
java Terminator Hasta la vista Baby!
iniciará uma máquina virtual Java chamando o método main da classe Terminator
(uma classe em um pacote sem nome) e transmitindo a ele uma matriz contendo as quatro strings "Hasta", "la", "vista" e "Baby!" ...
... veja também: Apêndice: Preciso de suas roupas, suas botas e sua motocicleta
- Minha interpretação:
execução direcionada para uso como scripts típicos na interface da linha de comandos.
passo importante
... isso ajuda a evitar alguns traços falsos em nossa investigação.
Especificações da VM, 1.2 A Java Virtual Machine
A máquina virtual Java não conhece nada da linguagem de programação Java ...
Notei acima ao estudar o capítulo anterior - 1.1 História, que pensei que poderia ser útil (mas acabou sendo inútil).
- Minha interpretação: a
execução é governada apenas pelas especificações da VM, que
declara explicitamente que não tem nada a ver com a linguagem Java
=> OK para ignorar o JLS e qualquer coisa relacionada à linguagem Java.
Gosling: um compromisso entre C e linguagem de script ...
Com base no exposto, comecei a pesquisar na web o histórico da JVM . Não ajudou, muito lixo nos resultados.
Então, lembrei de lendas sobre Gosling e reduzi minha pesquisa à história da JVM de Gosling .
Eureka! Como a especificação da JVM veio a ser
Nesta palestra do JVM Languages Summit 2008, James Gosling discute ... a criação de Java, ... um compromisso entre C e linguagem de script ...
- Minha interpretação:
declaração explícita de que, no momento da criação,
C e scripts foram considerados as influências mais importantes.
Já visto aceno para scripting em VM Spec 2.17.1,
argumentos de linha de comando suficientemente explicar String[] args
, mas static
e main
não estão lá ainda, necessidade de cavar ainda mais ...
Observe que, ao digitar isso - conectando C, scripts e VM Spec 1.2 com seu nada de Java -, sinto-me algo familiar, algo ... orientado a objetos está lentamente desaparecendo. Pegue minha mão e continue andando Não diminua a velocidade, estamos quase lá agora
Os slides do Keynote estão disponíveis on-line: 20_Gosling_keynote.pdf , bastante conveniente para copiar pontos-chave.
página 3
A pré-história do Java
* O que moldou meu pensamento
página 9
Notícia
* Sistema de janela extensível em rede
* Um sistema de janelas baseado em scripts ....
PostScript (!!)
página 16
Um objetivo grande (mas silencioso):
Quão perto eu poderia chegar de um
sensação de "script" ...
página 19
O conceito original
* Era tudo sobre construção
redes de coisas,
orquestrado por um script
língua
* (Shell Unix, AppleScript, ...)
página 20
Um lobo em pele de cordeiro
Sintaxe C para tornar os desenvolvedores
confortável
A-ha! Vamos olhar mais de perto a sintaxe C .
O exemplo "olá, mundo" ...
main()
{
printf("hello, world\n");
}
... uma função chamada main está sendo definida. A função principal serve a um propósito especial em programas C; o ambiente de tempo de execução chama a função principal para iniciar a execução do programa.
... A função principal, na verdade, tem dois argumentos int argc
e char *argv[]
, respectivamente, que podem ser usados para manipular argumentos de linha de comando ...
Estamos chegando mais perto? pode apostar. Também vale a pena seguir o link "principal" da citação acima:
a principal função é onde um programa inicia a execução. Ele é responsável pela organização de alto nível da funcionalidade do programa e geralmente tem acesso aos argumentos de comando fornecidos ao programa quando ele foi executado.
- Minha interpretação:
Para ser confortável para o desenvolvedor C, o ponto de entrada do programa deve ser main
.
Além disso, como o Java exige que qualquer método esteja na classe, Class.main
é o
mais próximo possível: invocação estática, apenas nome e ponto da classe,
sem construtores, por favor - C não sabe nada disso.
Isso também se aplica transitivamente ao C #, levando em consideração
a idéia de fácil migração para ele do Java.
Os leitores que pensam que o ponto de entrada do programa familiar não importa são convidados a pesquisar e verificar as perguntas do Stack Overflow em que pessoas do Java SE estão tentando escrever o Hello World para Java ME MIDP. Nota O ponto de entrada MIDP não possui main
nem static
.
Conclusão
Com base no exposto, eu diria isso e static
, nos momentos de criação de Java e C #, as escolhas mais razoáveis para definir o ponto de entrada do programa .main
String[] args
Apêndice: Preciso de suas roupas, suas botas e sua motocicleta
Tenho que admitir, ler o VM Spec 2.17.1 foi muito divertido.
... a linha de comando
java Terminator Hasta la vista Baby!
iniciará uma máquina virtual Java chamando o método main da classe Terminator
(uma classe em um pacote sem nome) e transmitindo a ele uma matriz contendo as quatro strings "Hasta", "la", "vista" e "Baby!".
Agora, descrevemos as etapas que a máquina virtual pode executar para executar Terminator
, como um exemplo dos processos de carregamento, vinculação e inicialização descritos mais adiante nas seções posteriores.
A tentativa inicial ... descobre que a classe Terminator
não está carregada ...
Depois de Terminator
carregado, ele deve ser inicializado antes que o main possa ser chamado e um tipo (classe ou interface) sempre deve ser vinculado antes de ser inicializado. A vinculação (§2.17.3) envolve verificação, preparação e (opcionalmente) resolução ...
A verificação (§2.17.3) verifica se a representação carregada de Terminator
está bem formada ...
A resolução (§2.17.3) é o processo de verificação de referências simbólicas da classe Terminator
...
Referências simbólicas de Terminator
oh sim.