Pergi untuk mengajar siswa tingkat sarjana kursus berjudul Pengantar Pemrograman Komputer. Saya sedikit bingung. Dalam Ilmu Fisika Komputasi, para ilmuwan menggunakan C / C ++ atau Python atau Fortran, CUDA dll ..... inilah saatnya untuk membangun basis mereka. Apa yang harus saya gunakan? Saya tahu Anda dapat mempelajari bahasa pemrograman baru kapan saja dalam hidup Anda, tetapi merupakan pilihan yang lebih bijaksana bagi saya untuk menguraikan semua konsep pemrograman dasar dan konsep OOP nanti.
python
c++
computational-physics
languages
Afnan Bashir
sumber
sumber
Jawaban:
Pertama, jika sarjana Anda seperti kami dan tidak memiliki pengenalan sebelumnya ke komputer, berharap untuk meluangkan waktu mengajar mereka bagaimana menggunakan hal-hal dasar seperti menggunakan editor yang tepat (yaitu, bukan MS Word), baris perintah, dll.
Saya pikir jawabannya agak tergantung pada di mana Anda menetapkan fokus program studi Anda (atau apa yang harus Anda ajarkan). Sebagai contoh: Seberapa relevan kerja internal komputer? Apakah Anda memerlukan kelas dan struktur OOP canggih lainnya? Apakah Anda ingin mengajari mereka cara menghasilkan program yang efisien atau apakah Anda senang jika mereka menghasilkan program yang bekerja sama sekali? Juga, jangan lupa bahwa Anda kemungkinan besar akan membutuhkan tutor yang cakap.
Tapi sekarang sesuatu untuk kelebihan dan kekurangan bahasa, saya kenal. Perhatikan bahwa ini terutama dari pengalaman saya sebagai fisikawan komputasi dan beberapa di antaranya mungkin tergantung pada bidang tertentu, kelompok kerja, universitas, dll.
Python
Saya biasanya merekomendasikan menggunakan Numpy dari awal dan saya berasumsi untuk digunakan sebagai berikut.
Keuntungan:
print
, Numpysavetxt
danloadtxt
, dan mungkinsys.argv
. Ini dapat diperkenalkan dengan cepat dan tidak memakan banyak waktu pemrograman.Kekurangan:
C / C ++
Keuntungan:
Kekurangan:
Keuntungan utama C ++ daripada C (Kelas, templat) tidak boleh relevan untuk kursus Anda dan hanya menjadi relevan untuk proyek yang lebih besar. Karena itu saya akan memilih C dari keduanya, karena lebih ringkas.
Lainnya
Beberapa komentar tentang bahasa lain:
¹ Yang merupakan alur kerja standar setidaknya di grup kami.
sumber
Pada 2014, saya akan mengatakan Python. Pada 2017, dengan sepenuh hati saya percaya bahwa bahasa untuk mengajar sarjana adalah Julia.
Mengajar selalu tentang pengorbanan. Di satu sisi, Anda ingin memilih sesuatu yang cukup sederhana sehingga mudah dipahami. Tetapi kedua, Anda ingin mengajarkan sesuatu yang memiliki kekuatan tetap, yaitu sesuatu yang dapat tumbuh bersama Anda. Bahasa dinamis umum (Python / MATLAB / R) semuanya dengan mudah masuk ke dalam kategori 1 karena kode boilerplate yang tidak ada dan kemudahan membuka juru bahasa dan meludahkan kode, sementara C / C ++ / Fortran masuk dalam kategori kedua sebagai bahasa-bahasa yang dengannya perangkat lunak berkinerja tinggi dari dunia saat ini ditulis.
Tetapi ada masalah dengan menggunakan bahasa yang tidak sepenuhnya menangkap kategori lainnya. Saat menggunakan bahasa seperti Python, ia dengan baik mengabstraksi hal-hal seperti tipe dan integer overflow. Ini bagus untuk mengajar komputasi semester pertama, tetapi karena Anda ingin menggali lebih dalam dan lebih dalam bagaimana hal-hal benar-benar berfungsi, bahasa Python terlalu jauh disarikan dari logam yang mendasari untuk menjadi alat pengajaran yang baik. Tapi C / C ++ / Fortran (atau Java ... saya belajar Java dulu ...) semua memiliki biaya startup yang besar sehingga hal tersulit untuk dipelajari adalah bagaimana cara membuat header dan
main
dikompilasi, yang mengalihkan perhatian dari benar-benar belajar ke program .Masukkan Julia. Saat Anda pertama kali menggunakan Julia, Anda dapat mengabstraksi seluruh ide tipe dan menggunakannya seperti MATLAB atau Python. Tetapi karena Anda ingin belajar lebih banyak, ada "lubang kelinci" yang mendalam untuk bahasa tersebut. Karena ini benar-benar lapisan abstraksi yang didasarkan pada sistem tipe + beberapa pengiriman melalui LLVM, pada dasarnya "cara mudah untuk menulis kode yang dikompilasi secara statis" (dan fungsi tipe-stabil sebenarnya dapat dikompilasi secara statis). Ini artinya rincian C / C ++ juga dapat diakses. Anda dapat mempelajari cara menulis loop dan fungsi sederhana tanpa kode boilerplate, dan kemudian menggali ke dalam pointer fungsi. Fitur metaprogramming Julia memungkinkan Anda langsung mengakses AST, dan ada makro yang menunjukkan setiap bagian dari rantai kompilasi. Juga, sebagai Lisp, dapat menerima gaya pemrograman fungsional. Dan ia memiliki banyak kemampuan komputasi paralel. Gagasan seperti mengetik parametrik dan stabilitas jenis cukup unik dan mendalam di Julia.
Jika Anda ingin mempelajari sendiri bahasa pemrograman, Anda dapat mempelajari langkah-langkah bagaimana kompilasi bekerja dengan menggunakan
@code_lowered
untuk melihat apa yang menurunkan, melihat AST yang diketik dengan@code_typed
, melihat LLVM IR dengan@code_llvm
, dan akhirnya dengan kode assembly asli@code_native
. Ini dapat digunakan untuk menunjukkan berapa biaya variabel dinamis dan bagaimana "tinju variabel" bekerja, dan posting blog ini menunjukkan bagaimana alat introspeksi ini dapat digunakan untuk mengajarkan bagaimana optimasi kompiler dapat / tidak dapat terjadi.Tidak hanya ilmu komputer dan ide-ide rekayasa perangkat lunak untuk mengeksplorasi, tetapi juga ide-ide matematika yang kaya. Karena perpustakaan utama Julia ditulis dengan pengetikan generik, itu sepele untuk membuat operator bebas-matriks dan menggunakan IterativeSolvers.jl untuk melakukan GMRES menggunakan mereka. Anda dapat menggunakan alat introspeksi ingin
@which
menunjukkan dengan tepat bagaimana sesuatu diterapkan. Misalnya, bagaimana cara\
kerjanya?Itu mengarahkan saya langsung ke definisi \ . Ini diimplementasikan dalam Julia, sehingga seseorang yang mengenal Julia kemudian dapat mempelajari algoritma dan cara kerjanya melalui mengidentifikasi subtipe matriks dan mengkhususkan diri bila mungkin (kembali ke eliminasi Gaussian). Karena kode Julia dilisensikan MIT (dan hampir semua paket dilisensikan MIT), siswa kemudian bebas untuk menggunakan ide-ide ini dalam kode mereka sendiri (dengan atribusi) (ketika kode dilisensikan GPL, seperti halnya dengan sebagian besar paket MATLAB dan R, mereka harus berhati-hati tentang masalah perizinan!).
Karena inti bahasa dibangun dengan komunitas open source yang sangat aktif, ada juga sumber daya yang kaya tentang sejarah perkembangan bahasa: masalah Github-nya . Memahami pertanyaan bahasa seperti apa sebenarnya transpos matriks? bisa sangat mencerahkan untuk memahami objek matematika ini secara lebih rinci.
Tetapi terakhir, pada akhirnya, Anda ingin mengajari siswa Anda cara membuat. Sayangnya, mempelajari Python atau R tidak berarti Anda memiliki apa yang diperlukan untuk "mengembangkan Python / R" karena sebagian besar paket yang digunakan secara luas dan dioptimalkan dengan baik memiliki sejumlah besar kode C / C ++ / Fortran di dalamnya dalam rangka untuk mendapatkan kinerja. Dengan demikian, agar para siswa ini dapat berkontribusi pada ekosistem ilmiah untuk bahasa-bahasa ini, pada akhirnya mereka harus belajar bahasa lain. Meskipun itu tidak sepenuhnya mengerikan, itu tidak optimal sekarang karena Julia ada. Karena tipe-stable Julia mampu mencapai kecepatan C / Fortran, sebagian besar paket dalam ekosistem Julia adalah kode Julia murni. Mempelajari Julia berarti seseorang telah belajar mengembangkan Julia. Dan karena Pangkalan Julia juga sebagian besar kode Julia (hanya beberapa primitif dan parser tidak),
Yang mengatakan, ada beberapa kerugian untuk pilihan Julia. Untuk satu, itu jauh lebih baru daripada bahasa-bahasa lain dan jadi itu sedikit lebih langka pada sumber daya. Anda harus datang dengan banyak alat pengajaran sendiri, atau menarik dari sumber daya di web yang terdaftar di situs web Julia . Juga, detail bahasa tidak cukup diselesaikan, meskipun 1.0 akan segera keluar (pada akhir 2017). Dan sangat mungkin bahwa Anda, calon guru kursus di Julia, mungkin tidak memiliki banyak pengalaman dengan bahasa itu sendiri. Namun, ini adalah jenis masalah yang hilang seiring waktu, sedangkan manfaat Julia yang saya sebutkan di atas jauh lebih inti bagi bahasa itu sendiri.
sumber
Berbicara sebagai sarjana yang tidak terlalu jauh dihapus, dan dengan asumsi bahwa Anda tidak mengajar di departemen CS, saya pikir itu akan menjadi bencana untuk memperkenalkan siswa ke pemrograman komputer dengan sesuatu seperti C, C ++, atau Fortran (atau dewa melarang CUDA), meskipun yang lain menunjukkan bahwa mereka mungkin status quo dalam komputasi ilmiah.
Jika Anda mengharapkan untuk mengajar siswa komputasi ilmiah dan memperkenalkan mereka ke pemrograman dalam kursus yang sama, saya berani bertaruh itu terlalu banyak untuk dicakup dalam satu semester kecuali Anda tetap menggunakan bahasa yang ditafsirkan seperti matlab atau python. Dalam pengalaman saya, sebagian besar kelas dalam komputasi ilmiah di tingkat sarjana diajarkan di salah satu dari dua cara itu, dan python menjadi semakin bermanfaat sebagai bahasa tingkat produksi setiap hari, sehingga masih memiliki beberapa kegunaan sebagai keterampilan praktis ( bukan hanya mengajarkan dasar-dasar pemrograman, maksud saya).
Hanya dua sen saya.
sumber
C, C ++, & Fortran (terdaftar tanpa urutan tertentu) adalah tiga bahasa pemrograman utama yang digunakan untuk matematika / fisika komputasi jika Anda ingin menyelesaikan masalah besar pada superkomputer. Saya pikir CUDA dianggap sebagai perpustakaan yang digunakan bersama dengan bahasa lain untuk komputasi GPU yang dipercepat. Matlab dan python sangat bagus untuk dipelajari untuk menjalankan diagnostik keluaran dan membuat model prototipe. Mereka juga lebih mudah untuk dipelajari dan mungkin lebih baik untuk kursus di mana Anda ingin membahas ayat-ayat algoritma belajar cara memprogram.
Jadi, jika kursus Anda murni tentang pemrograman saya akan memilih C ++ atau, jika ini adalah pemrograman pertama kali siswa, Python. Kedua bahasa tersebut memiliki utilitas tinggi di luar dunia komputasi ilmiah. Jika kursus ini berpusat pada algoritma pembelajaran untuk memecahkan masalah berbasis fisika maka saya pikir Matlab tidak diragukan lagi pemenangnya.
sumber
singkat: Memperhatikan bahwa komputasi ilmiah itu sendiri rumit. Apakah Anda benar-benar ingin bahasa pemrograman ikut bermain?
Matematika menggunakan abstraksi untuk memecahkan masalah yang tidak dapat diselesaikan dengan intuisi. Karena itu konsep cenderung abstrak. Ini sebabnya tidak sepele untuk memahami konsep apa yang harus dienkapsulasi. Dalam perhitungan ilmiah contoh-contoh biasa untuk kelas seperti "Hewan" "Kendaraan" agak tidak berguna. Ini berlaku untuk pemrograman berorientasi Objek, tetapi saya percaya bahwa mereproduksi konsep abstrak pada komputer tidak sepele dalam pemrograman Imperatif juga.
Inilah mengapa saya percaya bahwa di sini kita berurusan dengan dua upaya berbeda: pemrograman, di satu sisi, dan komputasi ilmiah di sisi lain. Di tingkat sarjana, di mana siswa berasal dari latar belakang yang heterogen, Anda mungkin berakhir dengan mengajarkan dua hal yang berbeda secara bersamaan.
Jika tujuan Anda mengajar komputasi ilmiah, saya pikir itu cukup sulit. Memiliki penghalang tambahan sebagai bahasa pemrograman (kita semua sepakat bahwa C ++ memerlukan pelatihan) akan mendemotivasi sebagian besar siswa, inilah mengapa saya menyarankan untuk menggunakan python.
Jika kursus Anda adalah "Pengantar SC" Saya percaya bahwa python memiliki rasio hasil / usaha terbaik.
PS: sekarang kami punya komputer yang bagus, kami tidak perlu mencari efisiensi di tingkat sarjana.
sumber