Phát hành ngôn ngữ lập trình Julia 1.8

Đã có bản phát hành ngôn ngữ lập trình Julia 1.8, kết hợp những phẩm chất như hiệu suất cao, hỗ trợ gõ động và các công cụ tích hợp để lập trình song song. Cú pháp của Julia gần giống với MATLAB, mượn một số yếu tố từ Ruby và Lisp. Phương pháp thao tác chuỗi gợi nhớ đến Perl. Mã dự án được phân phối theo giấy phép MIT.

Các tính năng chính của ngôn ngữ:

  • Hiệu suất cao: một trong những mục tiêu chính của dự án là đạt được hiệu suất gần với chương trình C. Trình biên dịch Julia dựa trên công việc của dự án LLVM và tạo mã máy gốc hiệu quả cho nhiều nền tảng mục tiêu;
  • Hỗ trợ các mô hình lập trình khác nhau, bao gồm các yếu tố của lập trình hướng đối tượng và chức năng. Thư viện tiêu chuẩn cung cấp các chức năng cho I/O không đồng bộ, kiểm soát quy trình, ghi nhật ký, lập hồ sơ và quản lý gói;
  • Kiểu gõ động: ngôn ngữ không yêu cầu định nghĩa rõ ràng về loại cho các biến, tương tự như ngôn ngữ lập trình tập lệnh. Chế độ tương tác được hỗ trợ;
  • Khả năng tùy chọn để xác định rõ ràng các loại;
  • Cú pháp lý tưởng cho tính toán số, tính toán khoa học, học máy và trực quan hóa dữ liệu. Hỗ trợ nhiều kiểu dữ liệu số và nhiều công cụ để thực hiện song song các phép tính.
  • Khả năng gọi trực tiếp các hàm từ thư viện C mà không cần thêm lớp.

Những thay đổi lớn trong Julia 1.8:

  • Tính năng ngôn ngữ mới
    • Các trường của cấu trúc có thể thay đổi hiện có thể được chú thích dưới dạng hằng số để ngăn chúng bị thay đổi và cho phép tối ưu hóa.
    • Chú thích kiểu có thể được thêm vào các biến toàn cục.
    • Mảng n chiều trống có thể được tạo bằng cách sử dụng nhiều dấu chấm phẩy bên trong dấu ngoặc vuông, ví dụ: "[;;;]" tạo mảng 0x0x0.
    • Các khối thử giờ đây có thể tùy chọn có một khối khác, khối này được thực thi ngay sau phần thân chính nếu không có lỗi nào được đưa ra.
    • @inline và @noinline có thể được đặt bên trong thân hàm, cho phép bạn chú thích một hàm ẩn danh.
    • @inline và @noinline hiện có thể được áp dụng cho một chức năng trong trang web hoặc khối cuộc gọi để buộc đưa vào (hoặc không bao gồm) các lệnh gọi hàm tương ứng.
    • ∀, ∃ và ∄ được phép làm ký tự định danh.
    • Đã thêm hỗ trợ cho đặc tả Unicode 14.0.0.
    • Phương thức Module(:name, false, false) có thể được sử dụng để tạo một mô-đun không chứa tên, không nhập Base hoặc Core và không chứa tham chiếu đến chính nó.
  • Những thay đổi về ngôn ngữ
    • Các đối tượng Tác vụ mới được tạo (@spawn, @async, v.v.) hiện có world_age cho các phương thức từ Tác vụ gốc khi được tạo, cho phép thực thi được tối ưu hóa. Tùy chọn kích hoạt trước đó có sẵn bằng phương pháp Base.invokelatest.
    • Các chỉ thị định dạng hai chiều không cân bằng Unicode hiện bị cấm trong chuỗi và nhận xét để tránh bị chèn vào.
    • Base.ifelse hiện được định nghĩa là một hàm chung chứ không phải là một hàm dựng sẵn, cho phép các gói mở rộng định nghĩa của nó.
    • Bây giờ, mọi phép gán cho một biến toàn cục trước tiên đều phải thực hiện một lệnh gọi tới Convert(Any, x) hoặc Convert(T, x) nếu biến toàn cục được khai báo là loại T. Trước khi sử dụng các biến toàn cục, hãy đảm bảo rằng bất biến Convert(Any) , x) === x luôn đúng, nếu không có thể dẫn đến hành vi không mong muốn.
    • Các hàm dựng sẵn giờ đây tương tự như các hàm chung và có thể được liệt kê theo chương trình bằng các phương thức.
  • Cải tiến trình biên dịch/thời gian chạy
    • Thời gian khởi động giảm khoảng 25%.
    • Trình biên dịch dựa trên LLVM đã được tách khỏi thư viện thời gian chạy thành một thư viện mới, libjulia-codegen. Nó được tải theo mặc định nên sẽ không có thay đổi nào trong quá trình sử dụng bình thường. Trong các triển khai không cần trình biên dịch (ví dụ: hình ảnh hệ thống trong đó tất cả mã cần thiết được biên dịch trước), thư viện này (và phần phụ thuộc LLVM của nó) có thể được bỏ qua.
    • Hiện tại có thể suy luận kiểu có điều kiện bằng cách truyền một đối số cho một phương thức. Ví dụ: đối với Base.ifelse(isa(x, Int), x, 0) trả về ::Int ngay cả khi không xác định được loại x.
    • SROA (Thay thế tổng hợp vô hướng) đã được cải thiện: loại bỏ các lệnh gọi getfield với các trường toàn cục liên tục, loại bỏ các cấu trúc có thể thay đổi với các trường chưa được khởi tạo, cải thiện hiệu suất và xử lý các lệnh gọi getfield lồng nhau.
    • Suy luận kiểu theo dõi các hiệu ứng khác nhau—tác dụng phụ và không bỏ sót. Việc truyền bá liên tục được tính đến, giúp cải thiện đáng kể hiệu suất thời gian biên dịch. Ví dụ: trong một số trường hợp, các lệnh gọi đến các hàm không thể nội tuyến nhưng không ảnh hưởng đến kết quả sẽ bị loại bỏ khi chạy. Quy tắc cho hiệu ứng có thể được ghi đè thủ công bằng macro Base.@assume_effect.
    • Biên dịch trước (với chỉ thị biên dịch trước rõ ràng hoặc khối lượng công việc được chỉ định) hiện tiết kiệm được nhiều mã được xác định theo loại hơn, dẫn đến thực thi lần đầu nhanh hơn. Bất kỳ kết hợp phương thức/loại mới nào mà gói của bạn cần, bất kể các phương thức đó được xác định ở đâu, giờ đây có thể được lưu vào bộ đệm trong tệp biên dịch trước nếu chúng được gọi bằng một phương thức thuộc gói của bạn.
  • Thay đổi tùy chọn dòng lệnh
    • Hành vi mặc định để giám sát các khai báo @inbounds hiện là tùy chọn tự động trong "--check-bounds=yes|no|auto".
    • Tùy chọn "--strip-metadata" mới để xóa chuỗi tài liệu, thông tin vị trí nguồn và tên biến cục bộ khi tạo hình ảnh hệ thống.
    • Tùy chọn mới "--strip-ir" để cho phép trình biên dịch loại bỏ biểu diễn mã nguồn trung gian khi xây dựng hình ảnh hệ thống. Hình ảnh thu được sẽ chỉ hoạt động nếu sử dụng "--compile=all" hoặc nếu tất cả mã yêu cầu được biên dịch trước.
    • Nếu ký tự "-" được chỉ định thay vì tên tệp thì mã thực thi sẽ được đọc từ luồng đầu vào tiêu chuẩn.
  • Thay đổi hỗ trợ đa luồng
    • Threads.@threads theo mặc định sử dụng tùy chọn lập lịch mới :dynamic, khác với chế độ trước đó ở chỗ các lần lặp sẽ được lên lịch động trên các luồng công việc có sẵn thay vì được gán cho từng luồng. Chế độ này cho phép phân phối tốt hơn các vòng lặp lồng nhau với @spawn và @threads.
  • Chức năng thư viện mới
    • eachsplit(str) để thực hiện chia tách(str) nhiều lần.
    • allequal(itr) để kiểm tra xem tất cả các phần tử trong một trình vòng lặp có bằng nhau hay không.
    • hardlink(src, dst) có thể được sử dụng để tạo liên kết cứng.
    • setcpuaffinity(cmd, cpus) để đặt mối quan hệ của lõi bộ xử lý với các tiến trình đã khởi chạy.
    • diskstat(path=pwd()) để lấy số liệu thống kê về đĩa.
    • Macro @showtime mới để hiển thị cả dòng đang được đánh giá và báo cáo @time.
    • LazyString và macro "str" ​​lười biếng đã được thêm vào để hỗ trợ xây dựng thông báo lỗi lười biếng trong đường dẫn lỗi.
    • Đã khắc phục sự cố tương tranh trong Dict và các đối tượng dẫn xuất khác như khóa(::Dict), giá trị(::Dict) và Set. Giờ đây, các phương thức lặp có thể được gọi trên từ điển hoặc tập hợp, miễn là không có lệnh gọi nào sửa đổi từ điển hoặc tập hợp.
    • @time và @timev hiện có mô tả tùy chọn, chẳng hạn như cho phép bạn chú thích nguồn báo cáo thời gian. @time "Đánh giá foo" foo().
    • phạm vi lấy điểm dừng hoặc độ dài làm đối số từ khóa duy nhất của nó.
    • độ chính xác và setprecision hiện chấp nhận cơ sở làm từ khóa
    • Các đối tượng ổ cắm TCP hiện cung cấp phương thức đóng và hỗ trợ sử dụng chế độ nửa mở.
    • extrema bây giờ chấp nhận một đối số init.
    • Iterators.countfrom hiện chấp nhận bất kỳ loại nào xác định phương thức +.
    • @time hiện phân bổ % thời gian dành cho việc biên dịch lại các phương thức với các loại đã thay đổi.
  • Thay đổi thư viện tiêu chuẩn
    • Các khóa có giá trị Hiện không có gì bị xóa khỏi môi trường trong addenv.
    • Iterators.reverse (và do đó cuối cùng) hỗ trợ từng dòng.
    • Hàm độ dài cho phạm vi của một số loại nhất định không còn kiểm tra tình trạng tràn số nguyên nữa. Đã có một hàm mới, check_length; hàm này chứa logic điều khiển truyền bit. Nếu cần, hãy sử dụng SaferIntegers.jl để xây dựng loại phạm vi.
    • Trình lặp Iterators.Reverse thực hiện đảo ngược từng chỉ mục nếu có thể.
  • Quản lý gói
    • Chỉ báo ⌃ và ⌅ mới bên cạnh các gói ở trạng thái “pkg>” cho biết phiên bản mới có sẵn. ⌅ cho biết không thể cài đặt phiên bản mới.
    • Đối số mới đã lỗi thời::Bool cho Pkg.status (--outdated hoặc -o ở chế độ REPL) để hiển thị thông tin về các gói từ các phiên bản trước.
    • Đối số compat::Bool mới cho Pkg.status (--compat hoặc -c ở chế độ REPL) để hiển thị mọi mục nhập [compat] trong Project.toml.
    • Chế độ "pkg>compat" (và Pkg.compat) mới để thiết lập các mục tương thích của dự án. Cung cấp trình chỉnh sửa tương tác thông qua "pkg>compat" hoặc kiểm soát bản ghi trực tiếp qua "pkg>Foo 0.4,0.5", có thể tải các bản ghi hiện tại thông qua hoàn thành tab. Nghĩa là, "pkg> compat Fo" được tự động cập nhật thành "pkg> Foo 0.4,0.5" để có thể chỉnh sửa mục nhập hiện có.
    • Pkg hiện chỉ cố gắng tải xuống các gói từ máy chủ gói nếu máy chủ đang giám sát sổ đăng ký chứa gói đó.
    • Pkg.instantiate bây giờ sẽ đưa ra cảnh báo khi Project.toml không đồng bộ với Manifest.toml. Nó thực hiện điều này dựa trên hàm băm của các bản ghi deps và compat của dự án (các trường khác bị bỏ qua) trong tệp kê khai khi giải quyết nó, để có thể phát hiện bất kỳ thay đổi nào đối với các bản ghi deps hoặc compat của Project.toml mà không cần phân giải lại.
    • Nếu "pkg>add" không thể tìm thấy gói có tên đã cho, giờ đây nó sẽ đề xuất các gói có tên tương tự có thể được thêm vào.
    • Phiên bản của Julia được lưu trữ trong tệp kê khai không còn bao gồm số bản dựng, nghĩa là bản gốc giờ đây sẽ được viết là 1.9.0-DEV.
    • Việc hủy bỏ kiểm tra "pkg>" giờ đây sẽ được phát hiện một cách nhất quán hơn và sẽ được trả về REPL một cách chính xác.
  • Tiện ích tương tác
    • Macro @time_imports mới để báo cáo thời gian nhập gói và các phần phụ thuộc của chúng, làm nổi bật thời gian biên dịch và biên dịch lại dưới dạng phần trăm nhập.
  • Đại số tuyến tính
    • Mô-đun con BLAS hiện hỗ trợ các chức năng BLAS spr! cấp 2.
    • Thư viện chuẩn LinearAlgebra.jl hiện hoàn toàn độc lập với SparseArrays.jl, cả từ góc độ mã nguồn và thử nghiệm đơn vị. Kết quả là, các mảng thưa thớt không còn được trả về (ngầm) bằng các phương thức từ LinearAlgebra áp dụng cho các đối tượng Base hoặc LinearAlgebra. Đặc biệt, điều này dẫn đến những thay đổi đột phá sau:
      • Phép nối sử dụng ma trận "thưa thớt" đặc biệt (ví dụ: đường chéo) giờ đây trả về ma trận dày đặc; Kết quả là, các trường D1 và D2 ​​của đối tượng SVD được tạo bởi lệnh gọi getproperty hiện là các ma trận dày đặc.
      • Phương thức tương tự (:: SpecialSparseMatrix, ::Type, ::Dims) trả về một ma trận 0 dày đặc. Kết quả là các tích của các ma trận tam giác hai, ba và đối xứng với nhau dẫn đến việc tạo ra một ma trận dày đặc. Ngoài ra, việc xây dựng các ma trận tương tự với ba đối số từ ma trận "thưa thớt" đặc biệt từ ma trận (không tĩnh) hiện không thành công do "zero(::Type{Matrix{T}})".
  • inf
    • %s và %c hiện sử dụng đối số chiều rộng văn bản để định dạng chiều rộng.
  • Hồ sơ
    • Cấu hình tải CPU hiện ghi lại siêu dữ liệu bao gồm các luồng và tác vụ. Profile.print() có một đối số nhóm mới cho phép bạn nhóm các luồng, tác vụ hoặc luồng con/tác vụ, tác vụ/luồng cũng như các đối số luồng và tác vụ để cung cấp tính năng lọc. Ngoài ra, tỷ lệ phần trăm sử dụng hiện được báo cáo dưới dạng tổng thể hoặc trên mỗi luồng, tùy thuộc vào việc luồng đó có ở trạng thái rảnh hay không trong mỗi mẫu. Profile.fetch() bao gồm siêu dữ liệu mới theo mặc định. Để tương thích ngược với những người sử dụng dữ liệu lược tả bên ngoài, nó có thể được loại trừ bằng cách chuyển include_meta=false.
    • Mô-đun Profile.Allocs mới cho phép bạn lập hồ sơ phân bổ bộ nhớ. Dấu vết ngăn xếp về loại và kích thước của từng phân bổ bộ nhớ được ghi lại và đối số sample_rate cho phép bỏ qua số lượng phân bổ có thể định cấu hình, giảm chi phí hiệu năng.
    • Giờ đây, người dùng có thể chạy cấu hình CPU có thời lượng cố định trong khi các tác vụ đang chạy mà không cần tải cấu hình trước và báo cáo sẽ được hiển thị trong khi chạy. Trên MacOS và FreeBSD, nhấn ctrl-t hoặc gọi SIGINFO. Đối với các nền tảng khác, hãy kích hoạt SIGUSR1, tức là. % tiêu diệt -USR1 $julia_pid. Điều này không có sẵn trên Windows.
  • TRẢ LỜI
    • RadioMenu hiện hỗ trợ các phím tắt bổ sung để lựa chọn trực tiếp các tùy chọn.
    • Chuỗi "?(x, y" theo sau là nhấn TAB sẽ hiển thị tất cả các phương thức có thể được gọi với các đối số x, y, .... (Dấu cách ở đầu ngăn bạn vào chế độ trợ giúp.) "MyModule.?(x, y " hạn chế tìm kiếm trong "MyModule". Việc nhấn TAB yêu cầu ít nhất một đối số phải thuộc loại cụ thể hơn Bất kỳ. Hoặc sử dụng SHIFT-TAB thay vì TAB để cho phép mọi phương thức tương thích.
    • Biến toàn cục mới err cho phép bạn nhận được ngoại lệ mới nhất, tương tự như hành vi của ans với phản hồi cuối cùng. Nhập lỗi sẽ in lại thông tin ngoại lệ.
  • Mảng thưa thớt
    • Đã chuyển mã SparseArrays từ kho lưu trữ Julia sang kho lưu trữ SparseArrays.jl bên ngoài.
    • Các hàm nối mới thưa thớt_hcat, thưa thớt_vcat và thưa thớt_hvcat trả về một loại SparseMatrixCSC bất kể loại đối số đầu vào. Điều này trở nên cần thiết để thống nhất cơ chế dán ma trận sau khi tách mã LinearAlgebra.jl và SparseArrays.jl.
  • Logging
    • Các mức ghi nhật ký tiêu chuẩn Dưới đâyMinLevel, Gỡ lỗi, Thông tin, Cảnh báo, Lỗi và TrênMaxLevel hiện được xuất từ ​​thư viện Ghi nhật ký tiêu chuẩn.
  • Unicode
    • Đã thêm hàm isequal_normalized để kiểm tra tính tương đương của Unicode mà không cần xây dựng các chuỗi chuẩn hóa một cách rõ ràng.
    • Hàm Unicode.normalize hiện chấp nhận từ khóa Charttransform, từ khóa này có thể được sử dụng để cung cấp ánh xạ ký tự tùy chỉnh và hàm Unicode.julia_chartransform cũng được cung cấp để tái tạo ánh xạ được sử dụng khi trình phân tích cú pháp Julia chuẩn hóa các mã định danh.
  • Thử nghiệm
    • '@test_throws "some message" triggers_error()' hiện có thể được sử dụng để kiểm tra xem văn bản lỗi được hiển thị có chứa lỗi "some message" hay không, bất kể loại ngoại lệ cụ thể. Biểu thức chính quy, danh sách chuỗi và hàm khớp cũng được hỗ trợ.
    • @testset foo() hiện có thể được sử dụng để tạo bộ kiểm tra từ một hàm nhất định. Tên test case là tên của hàm được gọi. Hàm được gọi có thể chứa các định nghĩa @test và @testset khác, bao gồm cả các lệnh gọi đến các hàm khác, đồng thời ghi lại tất cả các kết quả kiểm tra trung gian.
    • TestLogger và LogRecord hiện được xuất từ ​​thư viện Test tiêu chuẩn.
  • Phân phối
    • SSHManager hiện hỗ trợ các luồng công việc với trình bao bọc csh/tcsh thông qua phương thức addprocs() và tham số shell=:csh.
  • Các thay đổi khác
    • GC.enable_logging(true) có thể được sử dụng để ghi nhật ký từng hoạt động thu gom rác với thời gian và dung lượng bộ nhớ được thu thập.

Nguồn: opennet.ru

Thêm một lời nhận xét