Vào năm 2014, tôi đã nói Python. Năm 2017, tôi hoàn toàn tin tưởng rằng ngôn ngữ để dạy cho sinh viên đại học là Julia.
Dạy học luôn là về một sự đánh đổi. Một mặt, bạn muốn chọn một cái gì đó đủ đơn giản để dễ nắm bắt. Nhưng thứ hai, bạn muốn dạy một thứ gì đó có sức mạnh bền bỉ, tức là thứ có thể phát triển cùng bạn. Tất cả các ngôn ngữ động phổ biến (Python / MATLAB / R) đều dễ dàng rơi vào loại 1 do mã soạn sẵn không tồn tại của chúng và dễ dàng mở trình thông dịch và nhổ mã, trong khi C / C ++ / Fortran rơi vào loại thứ hai như các ngôn ngữ mà phần mềm hiệu năng cao cốt lõi của thế giới ngày nay đã được viết.
Nhưng có một số vấn đề với việc sử dụng một ngôn ngữ không hoàn toàn nắm bắt được danh mục khác. Khi sử dụng một ngôn ngữ như Python, nó trừu tượng hóa đi những thứ như kiểu tràn và số nguyên. Điều này rất tốt cho việc dạy máy tính học kỳ đầu tiên, nhưng khi bạn muốn tìm hiểu sâu hơn về cách mọi thứ đang thực sự hoạt động, ngôn ngữ của Python quá xa khỏi kim loại cơ bản để trở thành một công cụ giảng dạy tốt. Nhưng C / C ++ / Fortran (hoặc Java ... tôi đã học Java trước ...) đều có chi phí khởi động lớn đến mức điều khó nhất để học chỉ là làm thế nào để thiết lập và main
biên dịch tiêu đề , làm sao lãng việc học lập trình .
Nhập Julia. Khi bạn lần đầu tiên sử dụng Julia, bạn có thể trừu tượng hóa toàn bộ ý tưởng về các loại và sử dụng nó giống như MATLAB hoặc Python. Nhưng khi bạn muốn tìm hiểu thêm, có một "lỗ thỏ" chuyên sâu về ngôn ngữ. Vì đây thực sự là một lớp trừu tượng dựa trên một hệ thống loại + nhiều lần gửi qua LLVM, nên về cơ bản là "một cách dễ dàng để viết mã được biên dịch tĩnh" (và các hàm ổn định kiểu thực sự có thể được biên dịch tĩnh). Điều này có nghĩa là các chi tiết của C / C ++ cũng có thể truy cập được. Bạn có thể tìm hiểu cách viết các vòng lặp và các hàm đơn giản mà không cần mã soạn sẵn, sau đó đào sâu vào các con trỏ hàm. Các tính năng siêu lập trình của Julia cho phép bạn truy cập trực tiếp vào AST và có các macro hiển thị mọi phần của chuỗi biên dịch. Ngoài ra, là một Lisp, có thể tuân theo các kiểu lập trình chức năng. Và nó có rất nhiều khả năng tính toán song song. Các ý tưởng như gõ tham số và ổn định kiểu là khá độc đáo và sâu sắc trong Julia.
Nếu bạn muốn tự học ngôn ngữ lập trình, bạn có thể tìm hiểu các bước về cách thức biên dịch hoạt động bằng cách sử dụng @code_lowered
để xem mức giảm là gì, xem AST được gõ với @code_typed
, xem LLVM IR với @code_llvm
, và cuối cùng là mã lắp ráp gốc @code_native
. Điều này có thể được sử dụng để hiển thị chi phí của các biến động là gì và chính xác cách thức "biến quyền anh" hoạt động, và bài đăng trên blog này cho thấy các công cụ hướng nội này có thể được sử dụng như thế nào để dạy cách tối ưu hóa trình biên dịch có thể / không thể xảy ra.
Không chỉ có những ý tưởng khoa học máy tính và kỹ thuật phần mềm để khám phá, mà còn có những ý tưởng toán học phong phú. Vì các thư viện chính của Julia được viết bằng cách gõ chung chung, nên việc tạo các toán tử không có ma trận và sử dụng IterativeSolvers.jl để thực hiện GMRES bằng cách sử dụng chúng là chuyện nhỏ. Bạn có thể sử dụng các công cụ hướng nội muốn @which
cho bạn thấy chính xác mọi thứ đã được thực hiện như thế nào. Ví dụ, làm thế nào để \
làm việc?
@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
Điều đó chỉ cho tôi thẳng đến định nghĩa của \ . Nó được triển khai ở Julia, vì vậy ai đó biết Julia sau đó có thể học thuật toán và cách thức hoạt động thông qua việc xác định các kiểu con ma trận và chuyên môn khi có thể (quay lại loại bỏ Gaussian). Vì mã của Julia được MIT cấp phép (và hầu hết tất cả các gói đều được MIT cấp phép), nên sinh viên được tự do sử dụng các ý tưởng này trong mã của riêng họ (có ghi công) (khi mã được cấp phép GPL, như trường hợp của hầu hết các gói MATLAB và R, họ cần cẩn thận về các vấn đề cấp phép!).
Vì lõi ngôn ngữ được xây dựng với một cộng đồng nguồn mở rất tích cực, nên cũng có một nguồn tài nguyên phong phú về lịch sử phát triển ngôn ngữ: các vấn đề Github của nó . Hiểu các câu hỏi ngôn ngữ như những gì thực sự là một ma trận chuyển vị? có thể rất giác ngộ để hiểu các đối tượng toán học này một cách chi tiết hơn.
Nhưng cuối cùng, cuối cùng, bạn muốn dạy học sinh của mình cách sáng tạo. Đáng buồn thay, học Python hoặc R không nhất thiết có nghĩa là bạn có những gì cần thiết để "phát triển Python / R" vì hầu hết các gói được sử dụng rộng rãi và được tối ưu hóa tốt đều có một lượng đáng kể mã C / C ++ / Fortran theo thứ tự để có được hiệu suất. Do đó, để những sinh viên này có thể đóng góp cho hệ sinh thái khoa học cho những ngôn ngữ này, cuối cùng họ sẽ phải học một ngôn ngữ khác vào một lúc nào đó. Mặc dù điều đó không hoàn toàn khủng khiếp, nhưng bây giờ Julia vẫn còn tối ưu. Vì Julia ổn định loại có thể đạt được tốc độ của C / Fortran, nên hầu hết các gói trong hệ sinh thái Julia đều là mã Julia thuần túy. Học Julia nghĩa là người ta đã học cách phát triển Julia. Và vì Base Julia cũng chủ yếu là mã Julia (chỉ là một vài nguyên thủy và trình phân tích cú pháp không), nên
Điều đó nói rằng, có một số nhược điểm cho sự lựa chọn của Julia. Đối với một, nó mới hơn nhiều so với các ngôn ngữ khác và vì vậy nó khan hiếm hơn về tài nguyên. Bạn sẽ phải tự mình tìm ra rất nhiều công cụ giảng dạy hoặc lấy từ các tài nguyên trên web được liệt kê trên trang web của Julia . Ngoài ra, các chi tiết ngôn ngữ không hoàn toàn ổn định, mặc dù 1.0 sẽ sớm ra mắt (vào cuối năm 2017). Và cũng có khả năng là bạn, giáo viên tiềm năng của một khóa học ở Julia, có thể không có nhiều kinh nghiệm với ngôn ngữ đó. Tuy nhiên, đây là những loại vấn đề biến mất theo thời gian, trong khi những lợi ích của Julia mà tôi đã đề cập ở trên là cốt lõi hơn nhiều đối với bản thân các ngôn ngữ.