2015-05-30 23 views
10

Câu hỏi này áp dụng cho bất kỳ ngôn ngữ nào được viết bằng một ngôn ngữ ("nguồn"), ví dụ: C hoặc Java và được phân phối trong một tệp khác ("nhị phân"), ví dụ: mã máy hoặc mã byte Java, sử dụng liên kết động.Phiên bản ngữ nghĩa có áp dụng cho nguồn hoặc tương thích nhị phân không?


Giả sử người dùng đang sử dụng phiên bản A của thư viện của tôi. Tôi phát hành một phiên bản mới hơn B.

Nếu ông có thể biên dịch mã của mình mà không thay đổi so với B và chính xác chạy với B, sự thay đổi từ A đến B được cho là nguồn tương thích.

Nếu anh ta có thể biên dịch mã của mình với A và chạy đúng với B, thay đổi từ A sang B được gọi là tương thích nhị phân. Tình huống này là phổ biến khi sử dụng biểu đồ phụ thuộc chuyển tiếp mà không tải mô-đun bị cô lập (ví dụ: OSGI). X được biên dịch dựa trên các phiên bản Y và Z nhất định và Y được biên dịch dựa trên phiên bản Z khác nhất định. Khi chạy, các cuộc gọi của Y thành Z có thể không chính xác và có thể bị lỗi.

Có thể các thay đổi là nguồn tương thích, nhưng nhị phân không tương thích. Cũng có thể cho những thay đổi là nguồn không tương thích và tương thích nhị phân.

Tôi nên sử dụng tính tương thích nào cho phiên bản ngữ nghĩa? Tôi có sử dụng khả năng tương thích nguồn để phân biệt giữa cập nhật lớn và nhỏ/bản vá hay tôi sử dụng khả năng tương thích nhị phân để phân biệt giữa cập nhật lớn và nhỏ/bản vá?


Động lực hiện tại của tôi là thư viện Scala. Khả năng tương thích nhị phân Scala có thể rất khó phân tích và yêu cầu hiểu rõ về các chi tiết về trình biên dịch. Nguồn tương thích và nhị phân không tương thích là rất phổ biến.

Đây không phải là trường hợp cạnh kỳ lạ; vấn đề này có thể xuất hiện trong hầu hết mọi ngôn ngữ được biên dịch, được liên kết động.

Trả lời

6

Một vài tháng sau, tôi nghĩ rằng tôi có một kết luận tốt.

Phiên bản ngữ nghĩa nên xem xét cả hai và làm theo phiên bản "được thay đổi nhiều nhất".

  • Biên dịch nguồn ngắt là sự thay đổi không tương thích với người dùng thư viện.
  • Thực thi thời gian ngắt là sự thay đổi không tương thích với người dùng thư viện.

Nếu tương thích nguồn hoặc khả năng tương thích nhị phân thay đổi, cần - theo phiên bản ngữ nghĩa - là phiên bản chính mới.

Trong trường hợp của tôi đối với Scala, khả năng tương thích nhị phân đôi khi có thể khó xác định. Có một số công cụ phân biệt API JAR, ví dụ: JDiff.

0

Để trả lời câu hỏi này, giả vờ rằng bạn là người dùng không phải là lập trình viên. Từ quan điểm của họ, mã nguồn là vô giá trị; họ không hiểu điều đó và điều đó vô nghĩa đối với họ. Mặt khác, họ có một tập tin chứa mã đối tượng và họ biết rằng nó cần phải đi đâu đó. Chỉ có phiên bản nhị phân quan trọng đối với chúng.

Tuy nhiên, đó không phải là kết thúc của câu chuyện. Câu hỏi của bạn ngầm chứa hạt nhân của một câu trả lời tốt hơn nhiều. Có hai loại khả năng tương thích và do đó sẽ có hai chuỗi phiên bản. Bản thân câu hỏi chứa một giả định rối loạn chức năng, cụ thể là, chỉ nên có một chuỗi phiên bản. Bây giờ, nếu bạn có hai chuỗi phiên bản và, ngoài ra, tạo một cách tự động trên đầu người dùng để chuyển đổi các phiên bản tương thích với nguồn thành các phiên bản tương thích với đối tượng, bạn đã giảm bớt vấn đề của mình. Việc có thể thực hiện điều này đòi hỏi phải xác định rõ ràng cách bạn thực hiện chuyển đổi, chẳng hạn như những thứ như phiên bản trình biên dịch, phiên dịch, đối số dòng lệnh, v.v.

Tóm lại, câu trả lời hay nhất cho câu hỏi đã nêu là nó áp dụng cho cả hai của họ.

+1

Khả năng tương thích nguồn có nghĩa là mã của người dùng biên dịch mà không có thay đổi, vì vậy nói về người dùng không phải là lập trình viên hoặc không biết về mã nguồn có vẻ khá vô nghĩa ở đây. Ngoài ra, việc có các lược đồ phiên bản riêng biệt sẽ đơn giản chuyển câu hỏi cho người dùng - tôi có nên sử dụng lược đồ phiên bản với nguồn hoặc với ngữ nghĩa tương thích nhị phân không? – matz

+0

Lưu ý từ "giả vờ" trong câu trả lời của tôi. Có những lúc mà các lập trình viên không quan tâm đến mã nguồn. Tôi nghi ngờ, mặc dù, đưa ra nhận xét của bạn rằng bạn có mối quan tâm không được nêu trong câu hỏi này. Có lẽ xây dựng trên vấn đề cụ thể của bạn trong một bình luận cho câu hỏi ban đầu là theo thứ tự. – eh9

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