Mô hình chính thức thực thi cho Java (hoặc ngôn ngữ mệnh lệnh chung)


7

Tôi đang cố gắng chứng minh một số tuyên bố về việc thực thi trong các chương trình Java theo một số hạn chế nặng nề (về cơ bản tôi có một phỏng đoán rằng nếu hai phương thức thỏa mãn một tập các ràng buộc cho một đầu vào đã cho thì chúng tương đương - nghĩa là giá trị trả về và trạng thái sau thực hiện giống hệt nhau). Để chứng minh điều này tôi đang tìm kiếm một loại hình thức sẽ cho phép tôi nói về điều này.

Tôi quen thuộc với ngữ nghĩa hoạt động của các ngôn ngữ chức năng và tôi có thể dịch các vòng lặp / trong khi các vòng lặp thành các hàm đệ quy ... Tôi không nên làm điều này và thật tuyệt khi có một số máy móc để tôi có thể ở trong vùng đất mệnh lệnh .

Cụ thể hơn, tôi muốn lý do về trạng thái của một phương thức ở bước thứ k thực hiện. Điều này bao gồm nhà nước toàn cầu:

  • Các cuộc gọi như this.field = 2cập nhật trạng thái lớp học của chúng tôi
  • Gọi trạng thái cập nhật thông số sửa đổi bên ngoài phương thức của chúng tôi:
    • myParam.setFoo(...)
    • myParam.x = y
  • Gọi phương thức tĩnh
    • Blah.static_side_effects()

Tôi giả định rằng tất cả những điều này là xác định . Đó là, tôi muốn chính thức hóa giả định rằng nếu bất kỳ cập nhật toàn cầu nào về trạng thái này xảy ra theo hai phương thức thì cả hai trạng thái thực thi toàn cục và cục bộ đều giống nhau, thì trạng thái mới cũng sẽ giống hệt nhau - rằng mỗi bước tính toán được xác định chính xác bởi nhà nước toàn cầu và nhà nước địa phương. Điều này rõ ràng loại trừ RNG và song song (nhưng tôi có thể giải quyết vấn đề này sau ...).

Bất kỳ ý tưởng hoặc nguồn về làm thế nào tôi có thể tiếp cận điều này? Suy nghĩ duy nhất của tôi là coi các phương thức như một danh sách các câu lệnh và cố gắng mô tả một ngữ nghĩa câu lệnh chính thức.

Nếu có thể, tôi thích làm điều này ở cấp độ ngôn ngữ Java hơn là cấp độ JVM. Điều này có thể không khả thi nhưng mục tiêu của tôi bây giờ là đưa ra một số giả định hợp lý về ngữ nghĩa hoạt động của tôi và sau đó lấy nó từ đó.

Ồ, một lưu ý cuối cùng - bất kỳ đề xuất nào về cách tôi có thể cải thiện câu hỏi này sẽ được đánh giá rất cao. Tôi loay hoay tìm cách tìm ngôn ngữ phù hợp để đặt câu hỏi và nếu tôi lạm dụng thuật ngữ (như trạng thái thực thi cục bộ / toàn cầu ...) tôi rất muốn sửa lỗi này.


3
Có lẽ các bài viết về "Feather weight Java" có liên quan. Đã được một thời gian kể từ khi tôi đọc một cái gì đó về điều đó, nhưng họ đã cố gắng xác định một tập hợp con Java nhỏ vừa phải, vẫn đủ chung chung và thừa nhận một ngữ nghĩa có kích thước vừa phải. Làm điều này cho Java đầy đủ là quá mức: đặc tả ngôn ngữ chính thức là 700 trang mô tả không chính thức, IIRC.
chi

Vâng, tôi đã nhìn vào thông số kỹ thuật và tiếp tục đi. Ngoài ra, đó chỉ là thông số kỹ thuật ngôn ngữ IIR - thông số kỹ thuật JVM có thêm 600-700 trang. Mặc dù vậy, tôi sẽ xem xét Feather Feather Java. Cảm ơn lời đề nghị
Ben Kushigian

Ôi chao, Pierce và Wadler! Tôi sẽ đọc nó bất kể khả năng ứng dụng vào công việc của tôi: D
Ben Kushigian

Câu trả lời:


7

Feather weight Java được đánh giá khá cao trong cộng đồng PL. Nhưng nếu điều đó không phù hợp với nhu cầu của bạn, thì đây là một cách tiếp cận chung để mô hình hóa:

  • Chính thức hóa AST của ngôn ngữ của bạn thành các biểu thức và tuyên bố
  • Viết một ngữ nghĩa cho các biểu thức và phát biểu. Ngữ nghĩa của bạn sẽ cần:
    • một mối quan hệ đánh giá, các cặp trạng thái biểu thức liên quan với một biểu thức được đánh giá với trạng thái được cập nhật ,(e,σ)(e',σ')
    • một mối quan hệ thực thi, các cặp trạng thái câu lệnh liên quan với các trạng thái đầu ra .(S,σ)σ
  • Chúng sẽ được đệ quy lẫn nhau, và có thể là một ngữ nghĩa bước lớn hay nhỏ, tùy thuộc vào nhu cầu cụ thể của bạn. Bước lớn đơn giản hơn, nhưng tồi tệ hơn trong việc mô hình hóa các thực thi không kết thúc.

Cấu trúc cơ bản này sẽ giúp bạn đi khá xa. Để mô hình hóa Java, có lẽ bạn muốn cấu trúc bộ trạng thái của mình theo thứ bậc, xung quanh các đối tượng cụ thể, nhưng các nguyên tắc cơ bản là như nhau. Bạn cũng sẽ muốn mô hình hóa công văn động, do đó, có thể có ý nghĩa khi chuyển đổi các phương thức lớp thành các hàm lấy một đối số "này" rõ ràng.

Một ngữ nghĩa tiên đề tức là bộ ba Hoare, xác định logic của các điều kiện trước và sau điều kiện cho các câu lệnh để mô hình hóa các chương trình mệnh lệnh. Tôi không biết những thứ này liên quan đến OOP như thế nào, nhưng tôi chắc rằng ai đó đã thử trong 50 năm họ đã tồn tại.

Bạn cũng có thể quan tâm đến Cơ sở phần mềm . Nó định hướng lý luận về các ngôn ngữ bắt buộc trong câu tục ngữ định lý Coq, nhưng nó mang lại một cái nhìn tổng quan tuyệt vời về ngữ nghĩa chính thức.


Bộ ba ngữ nghĩa / tiên đề Hoare ban đầu không xử lý các cấu trúc bậc cao hơn như hàm và đối tượng hạng nhất. Các cách tiếp cận hiện đại hơn như logic của các hàm ý bó, đặc biệt ở dạng logic tách và lý thuyết kiểu Hoare cung cấp một cách tiếp cận có thể xử lý các tính năng như vậy.
Derek Elkins rời SE

8

Có một (hoạt động) ngữ nghĩa cho Java 1.4 xây dựng trong khuôn khổ . Liên kết với khung này là một hệ thống bằng chứng được gọi là Logic Logic . Mặc dù trang đó mô tả triển khai nguyên mẫu, có vẻ như chức năng này được tích hợp vào chính các công cụ khung như . Thật không may, có vẻ như khung công tác đang được cập nhật và việc xây dựng khung để xây dựng và hoạt động phù hợp là một việc vặt, và tôi không thực sự chắc chắn về tính thực tế và / hoặc chức năngKKkproverkproverhiện tại là Tuy nhiên, bạn có thể chứng minh bằng tay những thứ tham chiếu ngữ nghĩa hoạt động (và cũng có thể sử dụng hệ thống bằng chứng Logic Logic nếu bạn muốn). Bài viết mô tả ngữ nghĩa Java, K-Java: Một ngữ nghĩa hoàn chỉnh của Java , tham chiếu một số hệ thống khác chưa hoàn thiện, nhưng có thể hoàn thành đủ cho mục đích của bạn. Điều đó nói rằng, họ có thể không hướng đến việc chứng minh các thuộc tính về các chương trình Java. Thật vậy, trong bài báo, ngữ nghĩa đang được sử dụng để kiểm tra mô hình thay vì bằng chứng chính xác.

Đây là một câu trả lời nếu bạn muốn có độ tin cậy cao rằng mã Java thực tế hoạt động như bạn dự định. Nếu mục tiêu là xác minh thuật toán nhiều hơn so với việc thực hiện cụ thể thành Java, thì điều này có khả năng là quá mức cần thiết. Điều đó nói rằng, bạn có thể dễ dàng chính thức hóa một ngôn ngữ mệnh lệnh đơn giản trongKnếu bạn chỉ cần các tính năng bắt buộc / OO cơ bản. Thật vậy, điều này được thực hiện như một bài tập trongKhướng dẫn khung. Trên thực tế, nếu bạn có thể cải tổ vấn đề của mình thành đoạn C mà nguyên mẫu Logic Logic hỗ trợ, bạn có thể sử dụng nguyên trạng đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.