12

Đã 22 năm kể từ ngày phát hành công khai ban đầu của Perl 1.0 (ngày 18 tháng 12 năm 1987) và bản phát hành ổn định hiện tại 5.10.1 (2009).Một số ví dụ cụ thể về sự không tương thích ngược trong các phiên bản Perl là gì?

Trong những 22 năm các phiên bản đáng chú ý sau đây đã được thực hiện:

  • Perl 1.0 (1987 - phát hành ban đầu)
  • Perl 2 (1988 - biểu thức thông thường tốt hơn)
  • Perl 3 (1989 - hỗ trợ cho luồng dữ liệu nhị phân)
  • Perl 4 (1991 - xác định phiên bản của Perl được mô tả trong cuốn cẩm nang)
  • Perl 5 (1994 - thay đổi lớn được giới thiệu, gần viết lại đầy đủ thông dịch viên)
  • Perl 5.6 (2000 - 64 bit hỗ trợ, chuỗi unicode, hỗ trợ tập tin lớn)
  • Perl 5.8 (2002 - Cải thiện hỗ trợ unicode, mới IO thực hiện)
  • Perl 5.10 (2007 - mới tuyên bố chuyển đổi, cập nhật biểu thức chính quy , nhà điều hành khớp thông minh)

Tôi đang tìm các ví dụ cụ thể về tính không tương thích ngược trong lịch sử của Perl.

Câu hỏi:

  • Trong lịch sử 22 năm của Perl, được có bất kỳ ví dụ về Perl ngược không tương thích nơi Perl mã nguồn nhắm mục tiêu Perl phiên bản X sẽ không chạy theo phiên bản Y (trong đó Y> X) ?

Vui lòng bao gồm các tham chiếu và ví dụ mã khi có thể.

Trả lời

14

Một trong những sự không tương thích có chủ ý lớn nhất là nội suy mảng thay đổi giữa Perl 4 và Perl 5.

my @example = qw(1 2 3); 
print "[email protected]"; 

Trong Perl 4 mà sẽ là:

[email protected] 

Trong Perl 5 đó sẽ là:

foo1 2 3.com 

May mắn thay, nếu mảng không tồn tại Perl sẽ cảnh báo bạn về " nội suy không mong muốn có thể xảy ra ".

Chủ đề trải qua một thay đổi lớn từ 5,005 đến 5,6. "Chủ đề 5005" đã sử dụng mô hình luồng POSIX truyền thống, nơi tất cả dữ liệu chung được chia sẻ. Mặc dù lý thuyết này nhanh hơn, bởi vì sau đó Perl chỉ có thể sử dụng các chủ đề POSIX, đó là một cơn ác mộng đối với các lập trình viên Perl. Hầu hết các mô-đun Perl đều không an toàn. Và nó không bao giờ thực sự hiệu quả.

Trong 5.6, ActiveState và những người khác đã thực hiện fork() trên Windows. Khi bạn fork() trên Windows, Perl sẽ tạo một bản sao của đối tượng thông dịch viên và chạy các opcodes của cả hai trình thông dịch. Điều này được gọi là "đa dạng".

Trong 5.8, Arthur Bergman đã chạy với điều đó và sử dụng nó để tạo ithreads. Bởi vì đa dạng là mô phỏng một quá trình riêng biệt, không có dữ liệu được chia sẻ theo mặc định. Chỉ có dữ liệu bạn nói được chia sẻ mới được chia sẻ. Điều này làm cho chúng an toàn hơn nhiều để sử dụng, mặc dù phải mất một thời gian dài trước khi nó được ổn định. Những người như Elizabeth Mattijsen và Jerry Hedden đã làm điều đó.

5005threads cuối cùng đã bị xóa trong 5.10.0. Một lớp tương thích tồn tại, nhưng tôi nghi ngờ nó sẽ thực sự làm việc trong mã sản xuất.

Một sự không tương thích lớn khác đã tạo ra Unicode giữa 5,6 và 5,8. Unicode trong 5.6 thổi. Có hay không một chuỗi Unicode được quyết định bởi phạm vi xung quanh. Nó đã được thiết kế lại hoàn toàn trong 5.8 nên bây giờ Unicodeiness của một chuỗi được gắn với chuỗi. Mã được viết bằng mã Unicode 5.6 thường phải được viết lại trong 5.8, thường vì để có được mã Unicode của 5.6 để hoạt động ngay, bạn phải thực hiện các hacks xấu xí.

Gần đây, 5.10.1 đã thực hiện một loạt các thay đổi không tương thích với đối sánh thông minh. May mắn là họ đã được giới thiệu trong 5.10.0 vì vậy nó không phải là một việc lớn. Câu chuyện có Perl 6 đã giới thiệu khái niệm phù hợp thông minh, và nó đã được chuyển thành phiên bản phát triển của Perl 5. Thời gian trôi qua, và ý tưởng của Perl 6 về sự kết hợp thông minh đã thay đổi. Không ai nói với các chàng trai Perl 5 và nó đã đi ra trong 5.10.0 không thay đổi. Larry Wall noticed and did the equivalent of OMG YER DOIN IT WRONG!!! Phiên bản Perl 6 mới được xem là tốt hơn đáng kể và vì vậy 5.10.1 đã sửa nó.

12

Pseudo-hashes là ví dụ gần đây mà tôi nghĩ đến. Nói chung, perldelta files có tổng quan về các thay đổi không tương thích trong một phiên bản cụ thể. Những thay đổi này hầu như luôn luôn che khuất (như băm giả) hoặc nhỏ.

+0

Bạn đánh bại tôi. Tôi sắp tuyên bố băm giả. :-) –

+0

Nó chỉ nhỏ nếu bạn có thể quản lý để dạy tất cả các dev trong công ty của bạn không tham chiếu các trường pseudohash như '$ this -> [$ this -> [0] -> {fieldname}]'. Sigh ... – Ether

+6

Băm giả luôn được gắn nhãn một thử nghiệm. Không phải lỗi của tôi nếu bạn sử dụng chúng trong mã sản xuất. : P – Schwern

11

Có. Có rất nhiều, mặc dù chúng thường nhỏ. Đôi khi điều này là do chu kỳ ngừng sử dụng cuối cùng kết thúc trong việc xóa. Đôi khi đó là do thay đổi ngữ nghĩa cho các tính năng mới (và thử nghiệm). Đôi khi, sửa lỗi cho những thứ không hoạt động chính xác. Các nhà phát triển Perl mất nhiều công sức để duy trì tính tương thích ngược giữa các phiên bản bất cứ khi nào có thể. Tôi không thể nhớ bao giờ có một kịch bản đã bị hỏng bằng cách nâng cấp lên một phiên bản mới của Perl.

Thứ tự băm nội bộ đã thay đổi nhiều lần. Mặc dù đây không phải là điều bạn nên phụ thuộc, nó có thể gây ra vấn đề nếu bạn vô tình làm.

Sự không tương thích nhị phân giữa bản phát hành chính (5.x) là phổ biến, nhưng điều đó thường chỉ có nghĩa là mọi tiện ích mở rộng XS cần phải được biên dịch lại.

Danh sách hoàn chỉnh quá dài để liệt kê ở đây. Bạn có thể lấy nó bằng cách kiểm tra phần "Thay đổi không tương thích" của mỗi phiên bản history của mỗi phiên bản.

+0

"Thứ tự băm" bên trong được phân ngẫu nhiên trong các phiên bản mới hơn. –

+0

@ Brad Gilbert: Có và không. Hash ngẫu nhiên được thêm vào 5.8.1 nhưng 5.8.2 nó chỉ xảy ra nếu phân phối khóa kém. –

5

OTOH có một số tính năng hoang dã có niên đại từ Perl 1 vẫn hoạt động. Ví dụ, in này là gì?

%foo = (foo => 23); 
print values foo 

Đúng vậy, 23. Tại sao? Vì "mảng kết hợp" không phải là đối tượng hạng nhất trong Perl 1. $foo{bar} đã hoạt động nhưng không có %foo. Tôi thực sự không biết tại sao, ngay cả những trang người đàn ông Perl 1 thừa nhận điều này là warty. Vì vậy, để tương thích với Perl 1, bạn có thể truy cập băm toàn cục mà không cần sử dụng %, có thể nếu bàn phím của bạn bị hỏng hoặc Apple quyết định không ai sử dụng biểu tượng %.

chdir có một số điểm kỳ quặc. chdir() không có đối số sẽ đưa bạn đến thư mục chính của bạn, sao chép hành vi của shell cd. Thật không may như vậy sẽ chdir undefchdir "" gây khó khăn khi phát hiện lỗi xung quanh chdir. May mắn thay hành vi này không được chấp nhận. Tôi sẽ phải chắc chắn rằng nó chết trong 5,14.

$[ vẫn còn xung quanh và vẫn không được chấp nhận, nhưng "không được khuyến khích". Nó thay đổi gì chỉ số đầu tiên của một mảng, do đó, nếu bạn là một con người như tôi và đếm từ 1 bạn có thể làm:

$[ = 1; 
@foo = qw(foo bar baz); 
print $foo[2]; # prints bar 

Perl 5 thay đổi nó là tập tin chỉnh phạm vi, vì nếu không nó là một hiệu suất kéo và một nguồn tuyệt vời của CrAzY.

+2

* Hash% foo thiếu% trong đối số ... * Đó là một cảnh báo mà tôi chưa từng thấy trước đây. Tôi thích mô tả của perldiag: "Perl thực sự cũ cho phép bạn bỏ qua% trên tên băm ở một số điểm. Điều này hiện nay không được chấp nhận." Rõ ràng nó không được dùng quá nhiều để thực sự loại bỏ nó, mặc dù. –

3

Tôi đã có một số lỗi funky với Perl4 và Perl5 đánh giá tay trái và bên tay phải của một bài tập theo một thứ tự khác nhau, trích dẫn Perl traps for the unwary:

LHS vs RHS của bất kỳ nhà điều hành chuyển nhượng. LHS được đánh giá đầu tiên trong perl4, thứ hai trong perl5; điều này có thể ảnh hưởng đến mối quan hệ giữa các tác dụng phụ trong biểu thức phụ.

@arr = ('left', 'right'); 
$a{shift @arr} = shift @arr; 
print join(' ', keys %a); 
# perl4 prints: left 
# perl5 prints: right 

Đối với một số nội dung mới và có thể không tương thích, xem the FAQ giữa Perl4 và Perl5.

Các vấn đề liên quan