Concurso Analista

Pessoal, é o seguinte, participei de um concurso esse final de semana e gostaria de dividir uma dúvida com vocês. A questão esta aqui embaixo:

Marque a alternativa correta referente à linguagem
Java:
a) O pacote java.lang é importado automaticamente
b) A linguagem Java é dependente de plataforma
c) Em java, objetos são armazendos na memória de
heap e manipulados através de ponteiros
d) O Bytecode prescinde da máquina virtual java
(JVM) para executar em qualquer máquina
e) Em Java, a memória alocada é liberada pelo
programador

Sei que a primeira opção esta correta, mas fiquei na dúvida entre ela e a letra d e acabei marcando a letra d, e com a chegada do gabarito pensei em tentar entrar com um recurso para tentar anular a questão. Eis a minha dúvida: Utilizar o GCJ para compilar o código do bytecode em código de maquina pode ser considerado executar o bytecode ? Caso alguem concorde comigo que para executar o bytecode precisa da jvm, poderia me mandar uma referência sobre o assunto, pois para o recurso preciso de uma referência.

Mesmo o GCJ tem uma mini-jvm lá dentro, porque algumas partes do código Java não podem ser compilados diretamente (como código que use reflexão), sempre vai haver alguma coisa que precisa de um interpretador.

engraçado que a letra c me parece correta.

Ao que parece a letra © também está correta, mas o problema aí eu acho que é a nomenclatura usada. No caso de Java, os objetos são manipulados através de referências, que são variáveis que armazenam o endereço do objeto na memória, porém, diferentemente de C/C++ você não pode usá-las para aritmética de ponteiros. Uma thread interessante sobre o assunto: http://www.guj.com.br/posts/list/61217.java#321506

Com o bytecode dá pra executar diretamente em processadores picoJava. Com o bytecode também dá pra compilar p/ código nativo. Nenhum desses precisa de uma JVM.

eh… concordo com você. Mas não deixa de ser um ponteiro :shock:

A única coisa que me deixa meio desconfortável em relação a existir não necessitar da JVM é o fato de que a JVM tem outras funções além de executar o código como a verificação e etc, mas de qualquer forma, a parte relacionada a compilar o código em linguagem de máquina teria que implementar a especificação da JVM… O que vocês acham ?

O que eu acho é que questão de concurso é foda. Parece que tem 3 corretas aí. O que eu já vi de questão assim…

Brincadeira viu.

Parece que só a B,e a E estão erradas. Ao menos, eu to vendo assim.

Pra mim a letra “c” está correta, referencia e ponteiro é a mesma coisa… pra mim caberia recurso nessa questão, está mal formulada… a letra “a” tb está correta!! Mas na duvida eu teria marcado letra “a” que é mais obvio!!

Acho q a “d” está errada por que o byte code nao executa em qq maquina, ele executa em qq implementação de maquina virtual… pela maneira como foi escrita da a entender que o byte code eh gerado pela maquina virtual e pode ser executado em qq maquina diretamente, sem necessidade de VM!

[quote=javadust]…
d) O Bytecode prescinde da máquina virtual java
(JVM) para executar em qualquer máquina
(…)
Caso alguem concorde comigo que para executar o bytecode precisa da jvm …
[/quote]

Olá,

Na verdade a grande questão nessa alternativa é mais a língua portuguesa do que a linguagem Java. Prescindir significa “dispensar”, “não precisar”. Ou seja, a frase diz que o Bytecode NÃO REQUER a JVM para ser executado, o que é falso.
O correto seria dizer que a JVM é IMPRESCINDÍVEL para executar um bytecode.

http://www.dicionarioinformal.com.br/buscar.php?palavra=prescindir

[quote=gomesrod]Olá,

Na verdade a grande questão nessa alternativa é mais a língua portuguesa do que a linguagem Java. Prescindir significa “dispensar”, “não precisar”. Ou seja, a frase diz que o Bytecode NÃO REQUER a JVM para ser executado, o que é falso.
O correto seria dizer que a JVM é IMPRESCINDÍVEL para executar um bytecode.

http://www.dicionarioinformal.com.br/buscar.php?palavra=prescindir[/quote]

Acho que você não entendeu, é exatamente o que o pessoal está falando, que é possível não ter uma JVM para executar o bytecode, já que, teoricamente, você poderia executar o bytecode em um processador que tivesse o bytecode Java como sendo seu código nativo (que é o que “quase” acontece com os processadores PicoJava).

Tecnicamente uma máquina virtual sempre pode ser implementada em uma máquina real, então assumir que a JVM é obrigatória sempre não seria correto, mas do ponto de vista do mundo real isso ainda não existe, e como o próprio pessoal do GCJ afirma:

Eles precisam de um interpretador de bytecode pra poder executar uma aplicação Java. Tecnicamente a JVM é obrigatória, mas na teoria ela poderia não existir.

Na verdade agora eu não estou entendendo mesmo! Li e reli o post original, não entendi se ele está questionando a obrigatoriedade de se ter uma JVM ou se ele se enganou na interpretação da frase como eu tinha colocado no post anterior.

Mas enfim, se for o primeiro caso me desculpe aí javadust, foi mal! :frowning:

Agora dando meu pitaco aqui… esse não seria mais um daqueles casos de coisas possíveis tecnicamente mas que para fins didáticos ou de documentação devemos ignorar? Por exemplo, é possível modificar uma String através da manipulação de atributos private mas em qualquer livro veremos que “as strings são imutáveis”. Se alguém perguntar, diremos que “as strings são imutáveis”, e assim por diante.
Deve ser a mesma coisa, “precisamos da JVM para executar o bytecode” e ponto final, mesmo que indo um pouco além talvez existam outras possibilidades.

Não cara, isso é uma realidade que se prova em pesquisa sim. É possivel um processador com JM incorporada sim.

E se existe em alguma parte do mundo, então derruba a verdade de ser necessário JVM.

Bem, é isso.

Um exemplo; Se perguntassem se é existe algum processador cujo a tecnologia é mais rapida 1000x que o normal, quase todo mundo diria que não:

http://www.webtuga.com/Hardware/Geral/IBM-desenvolve-processador-100-vezes-mais-rapido-que-os-actuais.wtuga

Mas a questão diz claramente q pode ser rodado sem a VM em QUALQUER máquina… então está errado por causa desse “qualquer”… mesmo q fosse implementado uma maquina q rodasse byte code ela não seria qualquer maquina, e sim uma máquina especifica… eu ainda acho q ta errado a letra d.

Vamos a algumas explicações…

a) O pacote java.lang é importado automaticamente

Essa é verdadeira. Nem tem o que discutir.

b) A linguagem Java é dependente de plataforma

Claramente FALSA. A linguagem Java tem como um dos principais atrativos a PORTABILIDADE. E se seu programa é dependente de plataforma, ou foi mal projetado ou é um caso pontual em que foi realmente necessário. Mas se foi preciso ser dependente, talvez uma outra linguagem fosse melhor do que Java na resolução deste problema.

c) Em java, objetos são armazendos na memória de heap e manipulados através de ponteiros

FALSO. Os objetos são manipulados através de REFERÊNCIAS! A especificação do Java e da JVM não obrigam que os objetos sejam manipulados por ponteiros. Na verdade, nem é obrigatório que a linguagem na qual a JVM venha a ser criada tenha ponteiros. Não existe nenhuma obrigação quanto à estrutura interna de objetos. Então não se pode garantir sequer a existência de ponteiros. So existem variáveis de tipo primitivo e variáveis de referência. Só para lembrar, JAVA NÃO É C++ !

d) O Bytecode prescinde da máquina virtual java (JVM) para executar em qualquer máquina

FALSA! O bytecode precisa de uma JVM, mesmo que ela seja implementada direto em hardware. Se você consegue compilar o bytecode, então o que você tem é código NATIVO, que não é portável.

e) Em Java, a memória alocada é liberada pelo programador

JAMAIS! Quem desaloca a memória é o Garbage Collector. O máximo que se pode é sugerir ao GC para rodar, através do método System.gc(), porém a especificação não obriga que esse método seja implementado. Ou seja, ele roda quando ele bem quiser e pronto!

Só para registrar, a questão está sim correta!

Contraditório. Se for implementado em hardware, não precisa de JVM. JVM = Java Virtual Machine.

[quote=josenaldo]Vamos a algumas explicações…

a) O pacote java.lang é importado automaticamente

Essa é verdadeira. Nem tem o que discutir.

b) A linguagem Java é dependente de plataforma

Claramente FALSA. A linguagem Java tem como um dos principais atrativos a PORTABILIDADE. E se seu programa é dependente de plataforma, ou foi mal projetado ou é um caso pontual em que foi realmente necessário. Mas se foi preciso ser dependente, talvez uma outra linguagem fosse melhor do que Java na resolução deste problema.

c) Em java, objetos são armazendos na memória de heap e manipulados através de ponteiros

FALSO. Os objetos são manipulados através de REFERÊNCIAS! A especificação do Java e da JVM não obrigam que os objetos sejam manipulados por ponteiros. Na verdade, nem é obrigatório que a linguagem na qual a JVM venha a ser criada tenha ponteiros. Não existe nenhuma obrigação quanto à estrutura interna de objetos. Então não se pode garantir sequer a existência de ponteiros. So existem variáveis de tipo primitivo e variáveis de referência. Só para lembrar, JAVA NÃO É C++ !

d) O Bytecode prescinde da máquina virtual java (JVM) para executar em qualquer máquina

FALSA! O bytecode precisa de uma JVM, mesmo que ela seja implementada direto em hardware. Se você consegue compilar o bytecode, então o que você tem é código NATIVO, que não é portável.

e) Em Java, a memória alocada é liberada pelo programador

JAMAIS! Quem desaloca a memória é o Garbage Collector. O máximo que se pode é sugerir ao GC para rodar, através do método System.gc(), porém a especificação não obriga que esse método seja implementado. Ou seja, ele roda quando ele bem quiser e pronto!

Só para registrar, a questão está sim correta![/quote]

Sim, e o que é referência senão alias para diversas posições na memoria? É essa a questão. Qual a diferença básica da abordagem de ponteiros para referência?

Contraditório. Se for implementado em hardware, não precisa de JVM. JVM = Java Virtual Machine.[/quote]

Concordo plenamente. E outra coisa, é só ver que já existem processadores que rodam direto Java. E não é por JVM. Como o colega disse, JVM é Java VIRTUAL Machine.

aqui http://www.guj.com.br/posts/list/93712.java tem uma longa discussão sobre isso