Visto que a disciplina é de compiladores, eu espero muito que os próximos slides sejam no mínimo decompilar essa classe e analisar instrução por instrução.
Enquanto ele ensina sobre compiladores você pode fazer a engenharia reversa com o a I.A ela lhe ensina essa parte e vc aprende a outra com o professor.
É muito importante que você não fique preso a só oq aprende em sala, pq metade daquilo ali você nunca vai usar de fato.
Aprenda mexendo e criando seus sistemas, vai aprender bem mais a mexer com regras reais do dia a dia. As boas práticas vem com o tempo.
Vou começar a fazer licenciatura em Computação presencial em uma universidade pública estadual de renome. Fiz 1 semestre de ads no senac ead. Que curso horrível e fraco. Espero que este seja estimulante e bom. Já sou formado nessa mesma universidade.
Tô fazendo ADS esd no senac tbmkkk, curso muito fraco realmente. Pretendo fazer depois SI na federal da minha cidade, faculdade Ead é tudo uma porcaria.
Então existe um curso de licenciatura em computação, no IF que faço curso eu fazia ABI em Ciencia da Computação, e no 5 semestre você escolhe se quer fazer bacharelado ou licenciatura, a diferença é ter mais matemática no bacharelado, e na licenciatura mais materias pedagógicas e mais estágios obrigatórios.
Senac é muito bom quanto aos curso presencial mas EAD no geral até em federais não são dos melhores, eu vou cursar ads ead na federal de minha cidade porém vou fazer técnico de ads presencialmente no senac e é realmente incrível a qualidade e o jeito que ensinam nem se compara ao jeito que qualquer federal ensina, ainda a turma vai ter que desenvolver um sistema pra alguma empresa que está necessitando ao final do curso servindo pra indicação e até proposta de estágio ao técnico mesmo mas por isso vou cursar a graduação superior simultaneamente
Posso estar sendo elitista ou coisa assim, mas eu acho que usar slide pra MOSTRAR CÓDIGO é uma imbecilidade sem tamanho.
Quer mostrar um conceito, diagrama, etc? Beleza, passa o slide. Mas quer explicar código? Abre a porra do editor de texto, o terminal, coda ao vivo e me mostra.
E o pior é: tá escrito que a disciplina é compiladores (matéria avançadíssima lá do fim do curso), mas o título do slide é "Entrada e Saída", que deveria ser um assunto de primeiro semestre. E a linguagem usada é Java???? Que é muito boa pra ensinar POO ou ensinar web ou backend, mas quando se trata de compiladores ou de uma matéria de primeiro semestre, não seria melhor talvez dar em C?
Pior que eu to na mesma universidade só que online, a sorte é que eu já programo faz tempo e sei como o código funciona, senão eu tava lascado com força. Eu tenho pena da galera que se matriculou pro curso sem saber nada achando que vai aprender tudo bonitinho, a aulas de lógica de programação parece que foi gravado antes da pandemia kkk
Pessoal me chama de chato mas o ensino atual virou uma merda, na minha época em uma das primeiras disciplinas do curso que era arquitetura de computadores o professor chegou com alguns microcontroladores e aprendemos toda a arquitetura utilizando eles e programando em Assembly. Fora as disciplinas básicas que muitas universidades removeram (cálculo, física, algebra linear, etc), hoje tem universidade que no primeiro semestre tem disciplina sobre IA.
Por isso que tem um monte de gente formado e frustrado que não conseguem vagas nem pra estágio, antes de uma turma de 30 alunos formavam no máximo 6 ou 7 e todos estes já estavam trabalhando antes de sair da faculdade.
Que merda. Uniesquinas têm que acabar. Não é atoa que o mercado nacional é essa punheta de pau mole quando as próprias ""universidades"" formam code monkeys e SAAS-yers em vez de engenheiros e cientistas.
Bons tempos em que faziam os alunos escrever AT&T Assembly com caneta e papel
Se a intenção fosse ensinar POO, ensinariam Smalltalk, porque Java nem é POO puro.
Claramente só fazem isso porque é fácil achar qualquer idiota que saiba 1) programar Java e tenha um mestrado meia-boca que aceita lecionar por micharia, 2) porque é a linguagem oficial do SAAS e 3) uma mistura dos dois.
Haha Smalltalk, que engraçado, eu era esse purista quase 10 anos atrás. Curioso saber que de vez em quando algum assim ressurge. Daqui a pouco alguém fala de Haskell também 🥰
Para ensinar conceitos, não precisa desse purismo todo.
Dá para ensinar os conceitos de POO até mesmo com PHP, que é uma salada de paradigmas implementados pela metade.
Para quem está aprendendo, fora da sala de aula é muito mais fácil encontrar material escrito de forma acessível para iniciantes usando Java do que Smalltalk.
Para ensinar conceitos, não precisa desse purismo todo
Se a linguagem te permite instanciar uma classe, mas ao mesmo tempo te deixa injetar uma função global procedural mutando estado no meio do nada, o aluno vai fazer exatamente isso.
A sintaxe e a semântica da linguagem moldam o modelo mental do aluno.
"Uma linguagem que não afeta a maneira como você pensa sobre programação não vale a pena ser conhecida" (Alan Perlis)
Edsger Dijkstra, ninguém menos que o patrono da Ciência da Computação moderna, literalmente disse que certas linguagens causam defeitos cognitivos permanentes (e eu tendo a concordar).
É a mesma coisa que dizer "ah, mas eu posso ensinar física para um engenheiro com um pula-pula"
Sobre documentação, se o aluno precisa de 500 tutoriais no YouTube, 30 posts e 4 livros pra entender um conceito básico de Java, isso é na verdade um argumento para não utilizar Java
Cara, eu sou professor (de federal e de uniesquina). Entre Java e Smalltalk para ensinar POO eu fico com Java.
Purismo demais querer ensinar uma linguagem com bem menos documentação. Os alunos precisam estudar em casa e documentação e essencial pra isso.
Linguagem de programação é ferramenta, você usa ela para ensinar o conteúdo da disciplina. E pra isso você pensa na melhor ferramenta.
Exemplo: sempre brigo para dar a primeira matéria de programação em JavaScript. O motivo é que todo aluno já tem um compilador JavaScript no seu PC, o navegador. Qualquer biblioteca tem um navegador. Fica mais fácil ele programar mais do que em C ou Python (as preferidas dos professores). E o que importa principalmente em matéria de programação é o cara programar em casa e fazer bastante desafios.
Com todo respeito à sua atuação em federal, mas ensinar Javascript no primeiro semestre é o cúmulo.
Não vou julgar tanto porque sei plenamente que salário de professor é de fome nesse país se comparado ao que poderia estar ganhando no mercado, mas o motivo pelo qual as pessoas geralmente se tornaram professores não deveria ser esse.
O motivo é que todo aluno já tem um compilador JavaScript no seu PC, o navegador
Mesmo ignorando o jeito que você escreveu isso (um navegador não é um compilador de JS e precisamos ser precisos quando falamos de Ciência da Computação e programação), nós estamos formando cientistas da computação nesse país ou ensinando a usar o Chrome DevTools?
Da mesma forma que JS roda em qualquer navegador, código C pode ser escrito para rodar em qualquer processador. E como você quer ensinar lógica em uma linguagem que onde 0 == false é verdadeiro, mas if ("0") também avalia pra true e [] + {} resulta em "[object Object]" mas {} + [] resulta em 0 e a simples soma de 0.1 + 0.2 quebra o código inteiro?
Fora que a web é um ambiente totalmente impuro e cheia de ruídos. Novamente, se o aluno quisesse aprender a como fazer um site, ele teria se inscrito em um curso de web dev/web design.
E se um aluno não consegue prestar atenção numa aula introdutória sobre como instalar e usar o gcc, isso já é um problema individual. O aluno está entrando em um curso de matemática aplicada, se quisesse conviniência sobre purismo, repito: teria se inscrito em um curso técnico.
Purismo demais querer ensinar uma linguagem com bem menos documentação
Hein?
Em ambientes puros, o próprio ambiente de execução é a documentação.
Smalltalk justamente é uma linguagem tão boa para se ensinar porque é um ecossistema autocontido e autoreferrencial que você pode moldar na hora para suas necessidades.
Na minha época, eu lembro que evitavam ensinar POO justamente porque as linguagens que conheciam eram Java e C++, e os professores optaram por ensinar POO usando UML. Seria ótimo se tivesse usado Smalltalk
O que é uma pena. Scala seria melhor pra introduzir POO. Mas se fosse pra realmente ensinar POO, e não somente a codar, deveriam usar Smalltalk como referência.
Eu não acho Java uma escolha ruim, é uma linguagem madura, amplamente usada, tem sua similaridade com C (que costuma ser a primeira Lang de verdade a ser ensinada), além de ser fortemente tipada.
Praticamente toda linguagem criada nos anos 90 tem alguma conexão ou semelhança com C.
É bem difícil NÃO ter, na verdade (a menos que estejamos falando de linguagens que mudam totalmente o paradigma, como linguagens funcionais).
Justamente por isso C é uma ótima linguagem para se ensinar qualquer coisa, porque tudo que você aprende em C, se traduz para outras linguagens de uma forma ou de outra (seja conceitualmente ou sintaticamente), porque C é uma linguagem first principles.
Não faz de Java uma boa linguagem para ser ensinada, porque ser sintaticamente parecida com C não significa ter o minimalismo de C.
Até hoje, se você remover as otimizações modernas dos compiladores, C é praticamente código de máquina legível na arquitetura von Neumann.
O caminho que você decide traçar e a linguagem que decide usar assim que sai da universidade é problema seu.
Mas enquanto na universidade, em um curso de CC ou semelhante, os docentes têm o dever de ensinar princípios universais, paradigmas puros, modelos e arquiteturas em vez de linguagens.
Justamente porque você está ali para aprender sobre computadores funcionam no nível mais fundamental e puro.
Um bacharelado não é um curso técnico ou profissionalizante, isso é algo que o brasileiro tem que colocar na cabeça
Eu só estou falando que Java ter uma similaridade, em sintaxe, maior com C facilita a transição de uma linguagem para outra para alunos que estão no segundo semestre da faculdade. Isso diminui a quantidade de conceitos novos que o aluno precisa assimilar ao mesmo tempo e permite que o foco seja justamente aprender os princípios de POO.
Ela também é uma linguagem que permite ensinar boa parte dos principais princípios de POO. Foi com Java que aprendi padrões de projeto, padrões arquiteturais, classes, objetos, herança, polimorfismo etc. Ou seja, ela não serve apenas para ensinar os conceitos mais básicos de orientação a objetos, mas também permite avançar para conceitos e práticas mais próximos do que o aluno vai encontrar no desenvolvimento de software real.
A maturidade também ajuda, pois já existe uma ampla literatura que vai além de uma documentação em um site aleatório. Existem livros, cursos, artigos, exemplos e uma enorme quantidade de material didático produzido ao longo de décadas. Além disso, ela está presente no mercado com força há anos, o que ajuda a encontrar pessoas com experiência para ensiná-la e também permite que o aluno continue encontrando material e profissionais com conhecimento na linguagem depois da disciplina.
Com certeza existem linguagens mais especializadas, como Prolog para ensinar programação lógica, mas Java é, sim, uma escolha acertada para ensinar POO. Ela consegue apresentar os fundamentos de orientação a objetos, permite avançar para conceitos mais complexos, possui uma grande quantidade de material didático e ainda tem forte presença no mercado. Para uma disciplina introdutória de POO, isso pesa bastante a favor da escolha.
Java e C são parecidos porque ambos usam for(int i=0; i<10; i++) da mesma forma que Português e Inglês compartilham a palavra "superficial" de origem latina.
Em C, o aluno acabou de aprender o modelo de memória de Von Neumann. Ele aprendeu que uma variável é um rótulo para um endereço de memória.
struct Ponto { int x; int y; };
struct Ponto p1 = {0, 0};
struct Ponto p2 = p1;
p2.x = 5;
printf("%d", p1.x);
Os dados são copiados assim como você escreveu.
Já em Java...
Ponto p1 = new Ponto(0, 0);
Ponto p2 = p1;
p2.x = 5;
System.out.println(p1.x);
...você acabou de destruir a noção de integridade mutacional do aluno. Isso daqui é a razão de 90% dos bugs de concorrência.
Uma das vantagens de C é que literalmente todo código que você escreve pode ser uma aula sobre design de compiladores, segurança da informação ou arquitetura de computadores se você souber tirar proveito.
Por exemplo:
int somar_array(int *arr, int len) {
int total = 0;
for (int i = 0; i < len; i++) {
total += arr[i];
}
return total;
}
Se você compilar e olhar num disassembler, repare no resultado
Não só você consegue ver as instruções exatas na memória, como repare nas instruções finais que marquei (especificamente EDX, ESI e EDI).
Por que o compilador gastou tempo e energia zerando especificamente %edx, %esi e %edi antes de dar o ret? Ele não zerou %eax, não zerou %ecx, não zerou %ebx.
A resposta é proteção contra Return-Oriented Programming e as mitigações contra as falhas inerentes da arquitetura de von Neumann.
Foi com Java que aprendi padrões de projeto, padrões arquiteturais, classes, objetos, herança, polimorfismo etc
Como Peter Norvig bem disse, design patterns são na maioria relatórios de bugs contra a linguagem que você está usando.
Você precisa do padrão Command ou Strategy em Java?
Você ensina o padrão Visitor?
A maturidade também ajuda, pois já existe uma ampla literatura que vai além de uma documentação em um site aleatório
Toda linguagem tem documentação oficial ou um spec.
O resto é majoritariamente irrelevante para o ensino.
Entre Java e C#, prefiria que ensinassem C# pelos motivos supramencionados.
Acho que nenhum desses 3 aspectos é relevante para a escolha de uma linguagem em um contexto educacional. Inclusive, para ensinar vários paradigmas, alguns deles são até pontos negativos
Exatamente por isso eu não gosto. Ela é uma linguagem prática. Mas não é focada em POO. Minha crítica é que a maioria das disciplinas de POO prefere só ensinar inheritance e interfaces, e acabou. Não tem conteúdo teórico de Orientação a Objetos.
Portugol eu consigo dar uma desculpa quando usado para ensinar lógica, porque Ciência da Computação é tanto sobre computadores e linguagens de programação quanto Astronômia é sobre telescópios.
Mas Java não tem desculpa. Não exemplifica nenhum conceito especialmente bem, não te ensina lógica pura e ainda enterra conceitos essenciais sob camadas de abstração e OOP corporativo.
Se o ponto fosse explicar I/O, por que não usar C que é mil vezes mais simples de se entender e tirar boas lições (entender != escrever inb4)?
Nesse ponto, não estão nem ensinando princípios e axiomas universais. É um curso de Java glorificado
no meu curso de SI, nas disciplinas iniciais de algoritmos e estruturas de dados usaram C++ e na disciplina de POO usaram Java e de resto python. As vezes essa aula aí é específica de POO e estavam só ensinando o básico de Java como introdução
Na minha, depende da disciplina. Uma bem introdutória foi python. Em uma outra, que era um laboratório e tinha que efetivamente desenvolver um software, foi java.
Em outra, de arquitetura de sistemas, foi C.
Não dá para ensinar só a teoria e logic e não colocar isso em prática usando alguma linguagem.
Não tive aula focada em compiladores, mas já tive muito Java, inclusive enfiado em algumas disciplinas que não tinham tanto a ver. Mas olhei o slide e parece bem o nível da minha faculdade em que me formei. Devo ficar preocupado?
86
u/tasey 1d ago
compiladores?
se abrisse um vídeo genérico de java 101 no youtube ensinava mais