{"id":17,"date":"2010-03-16T12:25:47","date_gmt":"2010-03-16T15:25:47","guid":{"rendered":"http:\/\/www.javaframework.org\/portal\/2010\/03\/16\/entendendo-a-plataforma-java-para-leigos\/"},"modified":"2010-03-16T12:40:25","modified_gmt":"2010-03-16T15:40:25","slug":"entendendo-a-plataforma-java-para-leigos","status":"publish","type":"post","link":"https:\/\/www.javaframework.org\/portal\/2010\/03\/16\/entendendo-a-plataforma-java-para-leigos\/","title":{"rendered":"Entendendo a plataforma Java, para leigos"},"content":{"rendered":"<p>Quando falamos em programa\u00e7\u00e3o Java, muitas pessoas pensam estamos nos referindo a uma linguagem de programa\u00e7\u00e3o. Mas Java al\u00e9m de uma linguagem de programa\u00e7\u00e3o, \u00e9 tamb\u00e9m uma m\u00e1quina virtual, APIs e especifica\u00e7\u00f5es. Nesse tutorial iremos organizar o pensamento para entender o que \u00e9 cada parte da plataforma Java e tamb\u00e9m o que s\u00e3o todas aquelas siglas.<\/p>\n<p> <!--more-->  <\/p>\n<p>&#160;<\/p>\n<h3>1. Um pouco de hist\u00f3ria<\/h3>\n<p>Voltando um pouco no tempo, no in\u00edcio da programa\u00e7\u00e3o, n\u00f3s tinhamos a linguagem Assemby. A linguagem assembly nada mais \u00e9 do que instru\u00e7\u00f5es diretas para o processador. Cada comando nessa linguagem equivale a um comando para o processador executar. Dizemos que esses comandos s\u00e3o instru\u00e7\u00f5es de m\u00e1quina. <\/p>\n<p>Com a evolu\u00e7\u00e3o da computa\u00e7\u00e3o come\u00e7amos a ter linguagens mais robustas de mais alto n\u00edvel como a linguagem C. Numa linguagem de programa\u00e7\u00e3o dessas, um comando no c\u00f3digo fonte equivale a v\u00e1rias instru\u00e7\u00f5es de m\u00e1quina. A rela\u00e7\u00e3o n\u00e3o \u00e9 um para um, como era no assembly. Ent\u00e3o um novo componente da programa\u00e7\u00e3o entrou em quest\u00e3o: o compilador. O compilador \u00e9 o respons\u00e1vel em traduzir o programa em linguagem C para um programa em linguagem de m\u00e1quina. Essa linguagem de m\u00e1quina, serve para um processador espec\u00edfico, ou seja, um programa compilado para um processador n\u00e3o serve para um processador diferente. <\/p>\n<p>Os sistemas operacionais tamb\u00e9m possuem seu conjunto de instru\u00e7\u00f5es e a forma como deve ser montado o execut\u00e1vel \u00e9 diferente. Ent\u00e3o, al\u00e9m da compila\u00e7\u00e3o ser feita especificamente para determinado processador, ela deve ser feita para determinado sistema operacional tamb\u00e9m. Por isso um programa compilado para Windows n\u00e3o roda no Linux, e vice versa. Vamos chamar essas instru\u00e7\u00f5es para o sistema operacional de c\u00f3digo nativo.<\/p>\n<h3>2. .java .class e bytecodes<\/h3>\n<p>Em Java, as coisas mudam novamente. Um programa Java n\u00e3o \u00e9 compilado para um c\u00f3digo nativo como \u00e9 feito em um programa C. Quando compilamos um arquivo <strong>.java<\/strong> (que \u00e9 a extens\u00e3o de um programa Java, assim como .c \u00e9 a extens\u00e3o de um programa C) geramos um c\u00f3digo intermedi\u00e1rio, chamado <strong>bytecode<\/strong> que fica em um aquivo <strong>.class<\/strong>.<\/p>\n<p>Um arquivo <strong>.java<\/strong> cont\u00e9m o c\u00f3digo fonte, que depois de compilado vira um arquivo <strong>.class<\/strong>. Esse arquivo <strong>.class<\/strong> cont\u00e9m instru\u00e7\u00f5es chamadas de <strong>bytecodes<\/strong>. Esses <strong>bytecodes<\/strong> s\u00e3o um c\u00f3digo intermedi\u00e1rio e n\u00e3o servem para ser executados por nenhum sistema operacional, n\u00e3o \u00e9 um c\u00f3digo nativo.<\/p>\n<h3>3. A m\u00e1quina virtual<\/h3>\n<p>Os bytecodes n\u00e3o servem para ser executados por nenhum sistema operacional. Ao inv\u00e9s de executar os bytecodes diretamente, precisaremos de um programa, que leia cada bytecode e traduza para um c\u00f3digo nativo. Assim podemos executar nosso programa Java. Esse programa que faz a tradu\u00e7\u00e3o dos bytecodes e envia c\u00f3digo nativo para o sistema executar \u00e9 a <strong>m\u00e1quina virtual<\/strong>, conhecida tamb\u00e9m como <strong>JVM<\/strong> (<strong>Java Virtual Machine<\/strong>). A <strong>m\u00e1quina virtual<\/strong> \u00e9 um programa, e vimos que um programa \u00e9 especifico para determinado sistema operacional. Logo, existe uma <strong>m\u00e1quina virtual<\/strong> para o windows que traduzir\u00e1 os <strong>bytecodes<\/strong> para c\u00f3digos nativos de windows, outra m\u00e1quina virtual para linux que traduzir\u00e1 os <strong>bytecodes<\/strong> para c\u00f3digo nativo de linux, e assim por diante. No windows o programa da m\u00e1quina virtual \u00e9 o <strong>java.exe<\/strong>, e ele recebe como par\u00e2metro quais arquivos <strong>.class<\/strong> devem ser executados. Lembrando que dentro dos arquivos <strong>.class<\/strong> existem os <strong>bytecodes<\/strong>.<\/p>\n<h3>4. Linguagem Orientada a Objetos<\/h3>\n<p>A linguagem Java \u00e9 orientada a objetos. Cada classe Java est\u00e1 em um arquivo <strong>.java<\/strong> (geralmente) e cada arquivo<strong> .java<\/strong> \u00e9 compilado e vira um <strong>.class<\/strong>. Para cada classe temos um <strong>.class<\/strong> ent\u00e3o. Numa aplica\u00e7\u00e3o teremos centenas de arquivos <strong>.java<\/strong> e <strong>.class<\/strong>. Podemos agrupar um conjunto de arquivos <strong>.class<\/strong> em um arquivo <strong>.jar<\/strong>, um arquivo <strong>JAR (Java Archive)<\/strong> nada mais \u00e9 um arquivo no formato zip com v\u00e1rios arquivos <strong>.class<\/strong> dentro (pode ser incluido opcionalmente os arquivos <strong>.java<\/strong> se desejar levar o c\u00f3digo fonte junto). Os arquivos <strong>JAR<\/strong> as vezes podem ser refer\u00eanciados como bibliotecas.<\/p>\n<p>Um grupo de classes que servem para resolver determinado problema, como leitura e escrita em arquivos, n\u00f3s chamamos de <strong>API (Application Program Interface)<\/strong>. Inclusive, a <strong>API<\/strong> utilizada para manipula\u00e7\u00e3o de arquivos chama-se Java IO. As <strong>APIs<\/strong> s\u00e3o distribuidas em arquivos <strong>JAR<\/strong>, mas um arquivo <strong>JAR<\/strong> pode ter mais de uma <strong>API<\/strong>. O conceito de <strong>API<\/strong> \u00e9 apenas para n\u00f3s humanos, para a m\u00e1quina virtual isso n\u00e3o faz diferen\u00e7a, o que importa s\u00e3o as classes.<\/p>\n<p>A plataforma Java al\u00e9m da <strong>m\u00e1quina virtual<\/strong> e da <strong>linguagem de programa\u00e7\u00e3o<\/strong> \u00e9 constituida tamb\u00e9m de uma s\u00e9rie de <strong>APIs<\/strong>. Todo programa Java necessita de um conjunto b\u00e1sico de classes para funcionar, esse conjunto b\u00e1sico voc\u00ea consegue quando baixa a plataforma.<\/p>\n<h3>5. Ambiente de execu\u00e7\u00e3o<\/h3>\n<p>Vimos que para executar um programa Java, precisamos de uma m\u00e1quina virtual e as APIs do Java no m\u00ednimo. Onde conseguimos isso? A m\u00e1quina virtual e as APIs s\u00e3o distribuidas num pacote chamado <strong>JRE (Java Runtime Environment)<\/strong>. Esse pacote pode ser baixado no site da SUN <a href=\"http:\/\/java.sun.com\/javase\/downloads\/index.jsp\">http:\/\/java.sun.com\/javase\/downloads\/index.jsp<\/a>, a SUN \u00e9 a mantenedora da plataforma Java. Voce j\u00e1 deve ter acessado algum site de banco que necessitou que voc\u00ea tivesse o Java instalado, esse Java a que o site se refere \u00e9 o <strong>JRE<\/strong>. \u00c9 no <strong>JRE<\/strong> que est\u00e1 o <strong>java.exe<\/strong>, que \u00e9 a m\u00e1quina virtual.<\/p>\n<h3>6. Java para desenvolvedores<\/h3>\n<p>Se voc\u00ea \u00e9 um programador, necessitar\u00e1 algo mais do que o JRE. Precisar\u00e1 tamb\u00e9m do compilador da linguagem e seria interessante ter os c\u00f3digos fonte das APIs (isso facilita muito o desenvolvimento). Esse conjunto destinado ao programador \u00e9 o <strong>JDK (Java Development Kit)<\/strong>. Dentro do <strong>JDK<\/strong> est\u00e1 tamb\u00e9m o JRE, ent\u00e3o, n\u00e3o ser\u00e1 necess\u00e1rio baixar os dois. O <strong>JDK<\/strong> tamb\u00e9m est\u00e1 dispon\u00edvel no site da Sun. No <strong>JDK<\/strong> vem o programa compilador da linguagem Java, no windows seria o <strong>javac.exe<\/strong>.<\/p>\n<h3>7. As diversas plataformas Java<\/h3>\n<p>Existem tr\u00eas conjuntos b\u00e1sicos de APIs em Java, que se diferem pela API utilizada principalmente, s\u00e3o eles:<\/p>\n<p><strong>Java ME (Micro Edition):<\/strong>&#160; Java para celulares e palm, tem uma m\u00e1quina virtual que j\u00e1 vem com os equipamentos e possui uma API mais restrita j\u00e1 que os recursos computacionais desses equipamentos s\u00e3o mais limitados.<\/p>\n<p><strong>Java SE (Standard Edition):<\/strong> Java para desktop, cont\u00e9m a m\u00e1quina virtual e APIs para programa\u00e7\u00e3o em Java. Se for aprender Java come\u00e7e por essa plataforma.<\/p>\n<p><strong>Java EE (Enterprise Edition):<\/strong> Java para web, cont\u00e9m tudo da plataforma SE e mais um pouco. Utiliza a mesma m\u00e1quina virtual do SE.<\/p>\n<p>Quando voc\u00ea for fazer download, com exce\u00e7\u00e3o do Java ME, n\u00e3o existir\u00e1 distin\u00e7\u00e3o entre qual plataforma voc\u00ea precisar\u00e1. Independente se \u00e9 SE ou EE, voc\u00ea precisar\u00e1 do JRE ou JDK (que s\u00e3o o Java SE). <\/p>\n<p>As APIs do Java EE geralmente vem em plugins para o ambiente de desenvolvimento ou no servidor de aplica\u00e7\u00f5es que for utilizar. H\u00e1 sim, em JEE voc\u00ea precisar\u00e1 de um servidor de aplica\u00e7\u00f5es que roda na JVM.<\/p>\n<h3>8. Ambiente de desenvolvimento<\/h3>\n<p>Ao inv\u00e9s de ficar programando em bloco de notas e utilizando o javac em linha de comando, \u00e9 mais interessante utilizar um ambiente de desenvolviemnto, chamdo <strong>IDE (Integrated Development Environment)<\/strong>. Os ambientes mais comuns em Java s\u00e3o o <a href=\"http:\/\/www.eclipse.org\/\" target=\"_blank\">Eclipse<\/a> e o <a href=\"http:\/\/netbeans.org\/\" target=\"_blank\">NetBeans<\/a>.<\/p>\n<h3>9. Considera\u00e7\u00f5es finais<\/h3>\n<p>Apesar de muitos conceitos e siglas, a plataforma Java \u00e9 muito poderosa e est\u00e1 presente em grande parte dos parques de programa\u00e7\u00e3o do mundo. Agora que voc\u00ea j\u00e1 sabe quem \u00e9 quem, est\u00e1 apto a come\u00e7ar seus estudos, \u00e9 recomend\u00e1vel come\u00e7ar com o SE (Java para desktop) e quando tiver mais maturidade, entre no mundo web com o EE. Espero que tenha sido \u00fatil a explica\u00e7\u00e3o, at\u00e9 mais.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando falamos em programa\u00e7\u00e3o Java, muitas pessoas pensam estamos nos referindo a uma linguagem de programa\u00e7\u00e3o. Mas Java al\u00e9m de uma linguagem de programa\u00e7\u00e3o, \u00e9 tamb\u00e9m uma m\u00e1quina virtual, APIs e especifica\u00e7\u00f5es. Nesse tutorial iremos organizar o pensamento para entender o que \u00e9 cada parte da plataforma Java e tamb\u00e9m o que s\u00e3o todas aquelas [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[23,21,17,24,26,22,14,15,6,20,16,19,18,25],"class_list":["post-17","post","type-post","status-publish","format-standard","hentry","category-artigos","tag-api","tag-bytecode","tag-compilador","tag-eclipse","tag-ide","tag-jar","tag-java","tag-jdk","tag-jee","tag-jme","tag-jre","tag-jse","tag-maquina-virtual","tag-netbeans"],"_links":{"self":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/17","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/comments?post=17"}],"version-history":[{"count":5,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/17\/revisions"}],"predecessor-version":[{"id":22,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/17\/revisions\/22"}],"wp:attachment":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/media?parent=17"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/categories?post=17"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/tags?post=17"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}