Vai ensinar aos alunos do nível de graduação um curso intitulado Introdução à Programação de Computadores. Estou um pouco confuso. Em Física Computacional, os cientistas usam C / C ++ ou Python ou Fortran, CUDA etc ..... é hora de construir sua base. O que devo usar? Eu sei que você pode aprender uma nova linguagem de programação a qualquer momento da sua vida, mas que é uma escolha mais sábia para eu elaborá-los todos os conceitos básicos de programação e OOP posteriormente.
python
c++
computational-physics
languages
Afnan Bashir
fonte
fonte
Respostas:
Primeiro, se seus alunos de graduação são como os nossos e não tiveram introdução prévia aos computadores, espere gastar algum tempo ensinando-os a usar coisas básicas, como usar um editor adequado (por exemplo, não o MS Word), a linha de comando etc.
Eu acho que a resposta depende um pouco de onde você define o foco do seu curso (ou o que você é obrigado a ensinar). Por exemplo: Qual a relevância do funcionamento interno do computador? Você precisa de classes e outras estruturas avançadas de POO? Deseja ensiná-los a produzir programas eficientes ou fica feliz se eles produzem algum programa de trabalho? Além disso, não esqueça que você provavelmente precisará de tutores capazes.
Mas agora tenho algumas vantagens e desvantagens das linguagens, estou familiarizado. Observe que isso se deve principalmente à minha experiência como físico computacional e parte disso pode depender do campo, grupo de trabalho, universidade, etc.
Python
Geralmente recomendo usar o Numpy quase desde o início e suponho que seja usado a seguir.
Vantagens:
print
Numpysavetxt
eloadtxt
, e talvezsys.argv
. Pode ser introduzido em tempo real e não consome muito tempo de programação.Desvantagens:
C / C ++
Vantagens:
Desvantagens:
As principais vantagens do C ++ sobre o C (classes, modelos) não devem ser relevantes para o seu curso e estão se tornando relevantes apenas para projetos maiores. Portanto, eu escolheria C dos dois, pois é mais conciso.
Outras
Alguns comentários nos outros idiomas:
¹ Qual é o fluxo de trabalho padrão, pelo menos em nosso grupo.
fonte
Em 2014, eu teria dito Python. Em 2017, acredito sinceramente que o idioma para ensinar alunos de graduação é Julia.
Ensinar é sempre uma troca. Por um lado, você deseja escolher algo que seja simples o suficiente para ser fácil de entender. Mas, em segundo lugar, você quer ensinar algo que tem poder de permanência, isto é, algo que pode crescer com você. As linguagens dinâmicas comuns (Python / MATLAB / R) se enquadram facilmente na categoria 1 devido ao código clichê inexistente e à facilidade de abrir um intérprete e cuspir código, enquanto o C / C ++ / Fortran se enquadra na segunda categoria como as linguagens com as quais foram escritos os principais softwares de alto desempenho do mundo de hoje.
Mas há problemas com o uso de um idioma que não captura completamente a outra categoria. Ao usar uma linguagem como Python, ela abstrai coisas como tipos e excesso de números inteiros. Isso é bom para ensinar computação no primeiro semestre, mas, como você quer se aprofundar cada vez mais em como as coisas estão realmente funcionando, a linguagem do Python está muito abstrata do metal subjacente para ser uma boa ferramenta de ensino. Mas C / C ++ / Fortran (ou Java ... eu aprendi Java primeiro ...) todos têm um custo de inicialização tão grande que a coisa mais difícil de aprender é apenas como configurar e
main
compilar os cabeçalhos , o que impede que você realmente aprenda a programar .Digite Julia. Quando você usa Julia pela primeira vez, pode abstrair toda a ideia de tipos e usá-la como MATLAB ou Python. Mas, como você deseja aprender mais, há uma "toca de coelho" de profundidade no idioma. Como é realmente uma camada de abstração baseada em um sistema de tipos + despacho múltiplo sobre o LLVM, é essencialmente "uma maneira fácil de escrever código compilado estaticamente" (e funções estáveis ao tipo podem realmente ser compiladas estaticamente). O que isso significa é que os detalhes do C / C ++ também estão acessíveis. Você pode aprender a escrever loops e funções simples sem o código padrão e, em seguida, pesquisar os ponteiros de função. Os recursos de metaprogramação de Julia permitem acessar diretamente o AST, e existem macros que mostram todas as partes da cadeia de compilação. Além disso, como um Lisp, é passível de estilos de programação funcionais. E possui muitos recursos de computação paralela. Ideias como tipografia paramétrica e estabilidade de tipo são bastante únicas e profundas em Julia.
Se você quiser estudar as linguagens de programação, poderá aprender as etapas de como a compilação funciona usando
@code_lowered
para ver o que é a redução, consulte o AST digitado com@code_typed
, consulte LLVM IR com@code_llvm
e, finalmente, o código de montagem nativo com@code_native
. Isso pode ser usado para mostrar qual é o custo das variáveis dinâmicas e exatamente como o "boxe variável" funciona, e este post do blog mostra como essas ferramentas de introspecção podem ser usadas para ensinar como as otimizações do compilador podem / não podem ocorrer.Não há apenas idéias de ciência da computação e engenharia de software a serem exploradas, mas também idéias matemáticas ricas. Como as principais bibliotecas de Julia são escritas com a digitação genérica, é trivial criar operadores sem matriz e usar o IterativeSolvers.jl para executar o GMRES usando-os. Você pode usar ferramentas de introspecção como
@which
para mostrar exatamente como tudo foi implementado. Por exemplo, como\
funciona?Isso me aponta diretamente para a definição de \ . Ele é implementado em Julia, para que alguém que conheça Julia possa aprender o algoritmo e como ele funciona através da identificação de subtipos de matriz e especialização quando possível (voltando à eliminação gaussiana). Como o código de Julia é licenciado pelo MIT (e quase todos os pacotes são licenciados pelo MIT), os alunos são livres para usar essas idéias em seu próprio código (com atribuição) (quando o código é licenciado pela GPL, como é o caso da maioria dos pacotes MATLAB e R, eles precisam ter cuidado com os problemas de licenciamento!).
Como o núcleo da linguagem é construído com uma comunidade de código aberto muito ativa, também há um recurso rico na história do desenvolvimento da linguagem: seus problemas no Github . Entendendo questões de linguagem, como o que realmente é uma transposição de matriz? pode ser muito esclarecedor para entender esses objetos matemáticos com mais detalhes.
Mas, finalmente, no final, você quer ensinar seus alunos a criar. Infelizmente, aprender Python ou R não significa necessariamente que você tem o que é necessário para "desenvolver Python / R", já que a maioria dos pacotes amplamente utilizados e otimizados possui uma quantidade substancial de código C / C ++ / Fortran neles, para para obter desempenho. Assim, para que esses alunos possam contribuir com os ecossistemas científicos dessas línguas, eles terão que aprender outra língua em algum momento. Embora isso não seja totalmente horrível, é subótimo agora que Julia existe. Como Julia estável ao tipo é capaz de atingir a velocidade do C / Fortran, a maioria dos pacotes no ecossistema Julia é puro código Julia. Aprender Julia significa que aprendemos a desenvolver Julia. E como o Base Julia também é principalmente o código de Julia (apenas algumas primitivas e o analisador não),
Dito isto, existem algumas desvantagens na escolha de Julia. Por um lado, é muito mais recente que esses outros idiomas e, portanto, é um pouco mais escasso em recursos. Você terá que criar muitas ferramentas de ensino por conta própria ou obter recursos da Web listados no site da Julia . Além disso, os detalhes do idioma não estão completamente definidos, embora a versão 1.0 seja lançada em breve (até o final de 2017). E também é bem provável que você, o potencial professor de um curso em Julia, não tenha muita experiência com o idioma. No entanto, esses são os tipos de problemas que desaparecem com o tempo, enquanto os benefícios de Julia que mencionei acima são muito mais essenciais para os próprios idiomas.
fonte
Falando como um graduado não muito distante, e supondo que você não esteja ensinando no departamento de CS, acho que seria um desastre apresentar aos alunos a programação de computadores com algo como C, C ++ ou Fortran (ou Deus não permita) CUDA), embora outros tenham apontado que provavelmente são o status quo da computação científica.
Se você espera ensinar aos alunos computação científica e apresentá-los à programação no mesmo curso, aposto que isso é demais para cobrir em um semestre, a menos que você se atenha a uma linguagem interpretada como matlab ou python. Na minha experiência, a maioria das aulas de computação científica no nível de graduação é ministrada em uma dessas duas formas, e o python está se tornando cada vez mais útil como uma linguagem de nível de produção todos os dias, por isso ainda tem alguma utilidade como habilidade prática ( além de apenas ensinar noções básicas de programação, quero dizer).
Apenas meus dois centavos.
fonte
C, C ++ e Fortran (listados em nenhuma ordem específica) são as três principais linguagens de programação usadas para matemática / física computacional, se você deseja resolver grandes problemas em supercomputadores. Acho que o CUDA é considerado uma biblioteca usada em conjunto com outros idiomas para a computação acelerada da GPU. É ótimo aprender Matlab e python para executar diagnósticos de saída e criar modelos de protótipo. Eles também são mais fáceis de aprender e podem ser melhores para um curso em que você deseja conhecer os versículos de algoritmos que aprendem a programar.
Portanto, se seu curso é puramente sobre programação, eu escolheria C ++ ou, se essa for a primeira vez que os alunos programarem, Python. Ambas as línguas têm alta utilidade fora do mundo da computação científica. Se o curso é centrado no aprendizado de algoritmos para resolver problemas baseados na física, acho que o Matlab é sem dúvida o vencedor.
fonte
resumido: leve em consideração que a computação científica é complicada por si só. Você realmente quer que a linguagem de programação entre em jogo?
A matemática usa a abstração para resolver problemas que não podem ser resolvidos pela intuição. Portanto, os conceitos tendem a ser abstratos. É por isso que não é trivial entender quais conceitos encapsular. Na computação científica, os exemplos usuais para aulas como "Animal" "Veículo" são bastante inúteis. Isso é verdade para a programação orientada a objetos, mas acredito que reproduzir conceitos abstratos em um computador também não é trivial na programação imperativa.
É por isso que acredito que aqui estamos lidando com dois esforços diferentes: programação, por um lado, e computação científica, por outro. No nível de graduação, onde os alunos são de origens heterogêneas, você pode acabar ensinando duas coisas diferentes ao mesmo tempo.
Se seu objetivo é ensinar computação científica, acho que isso já é bastante difícil. Ter uma barreira adicional como a linguagem de programação (todos concordamos que o C ++ requer treinamento) desmotivaria uma boa parte dos alunos; é por isso que sugiro usar o python.
Se o seu curso for "Introdução ao SC", acredito que o python tenha a melhor relação resultado / esforço.
PS: agora temos computadores bastante bons, não precisamos realmente procurar eficácia em nível de graduação.
fonte