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?
@which rand(10,10)\rand(10)
#\(A::AbstractArray{T,2} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg\generic.jl:805
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.