Hệ thống mô-đun cho ngôn ngữ OOP


8

Tôi đang thiết kế một ngôn ngữ lập trình OO đơn giản.

Nó được gõ, biên dịch và thực thi tĩnh bởi một VM - tương tự như Java.

Sự khác biệt là tôi không muốn có sự nhấn mạnh như vậy vào OOP. Bản thân mã sẽ giống với C ++ (các lớp, hàm và các biến được phép trong phạm vi tệp).

Một trong những điều mà tôi cần phải có là một hệ thống mô-đun. Tôi có những điều sau đây đã tìm ra:

  1. Mỗi tệp là một mô-đun (một khi được biên dịch) - như Python
  2. Các lập trình viên phải nhập một mô-đun với importtừ khóa, điều này khiến trình biên dịch tìm kiếm các mô-đun trong các thư mục tiêu chuẩn và thư mục tệp (VM ​​cũng phải làm điều này khi chạy).

Và bây giờ tôi không biết làm thế nào tôi nên giới thiệu khái niệm mô hình con và phân cấp mô-đun.

Chẳng hạn, một tùy chọn là phụ thuộc vào hệ thống phân cấp thư mục, do đó import engine.graphics.renderersẽ mong muốn tìm thấy một thư mục có tên là "engine" trong thư mục làm việc và bên trong một thư mục có tên là "đồ họa", với một mô-đun gọi là "renderer".

Nhược điểm của một thiết kế như vậy là gì? Tôi có thiếu thứ gì không?


1
Chà, nó sẽ không phải là người đầu tiên. Cả Rust và OCaml đều coi mã trong một tệp là một phần của mô-đun có cùng tên với tệp. Có vẻ để làm việc đủ tốt ở đó.
KChaloux

7
Và Haskell. Tuy nhiên, nếu bạn đang thực hiện OOP, tôi khuyến khích bạn xem Scala "Mô-đun là đối tượng đặc biệt". Ngoài ra, bạn có ý định hỗ trợ các mô-đun hạng nhất? Nếu vậy thì có một sự mơ hồ giữa foo.barviệc là foo / bar.file hoặc một số mô-đun foovới thành viên (cũng là một mô-đun) bar. Cân nhắc để xem xét
Daniel Gratzer

Làm thế nào để bạn có kế hoạch để xử lý phiên bản? Rất nhiều ngôn ngữ hoàn toàn không có, nhưng bạn cũng có thể không mắc lỗi đó.
Donal Fellows

@DonalFellows Chăm sóc công phu? Làm thế nào là trách nhiệm của ngôn ngữ để xử lý các phiên bản? Nhưng dù sao, tôi có nghĩa là để giới thiệu @annotationscho nhúng thông tin như vậy.
Aber Kled

@AberKled: Tôi không nghĩ vấn đề là ngôn ngữ phải chịu trách nhiệm cho "phiên bản xử lý", vì đảm bảo rằng nếu Fred có một phiên bản mô-đun X khi anh ấy viết mô-đun Y hoạt động với nó và Joe có phiên bản X khác nhau khi anh ta viết mô-đun Z hoạt động với nó, sau đó trong trường hợp không có sự khác biệt về hành vi không thể giải quyết giữa các phiên bản X khác nhau, có thể sử dụng Y và Z cùng nhau mà không cần phải biên dịch lại.
17/03/2015

Câu trả lời:


2

Hãy xem phân cấp / tổ chức mô-đun / mô-đun của Python và đặc biệt là ở khía cạnh lịch sử, những bổ sung chính trong suốt nhiều năm, quan trọng nhất là những thứ mới nhất. Có lẽ, không có ý nghĩa trong việc phát minh ra bánh xe.

Tôi không biết bạn muốn đi bao xa với ngôn ngữ của mình, vd

  • Bạn có muốn các mô-đun mã byte được đọc từ zip?
  • Làm thế nào để bạn tách các mô-đun / thư viện cho các phiên bản thông dịch viên khác nhau?
  • Bạn có kế hoạch để làm cho nó dường như vô tận với distro?
  • Đừng quên sự dễ dàng trong phân phối riêng của ngôn ngữ (nghĩ rằng distutils / pypi - mỗi nền tảng / ngôn ngữ có một thứ riêng, không phải lúc nào cũng tốt)

Tôi đoán, Java có thể là một ví dụ thú vị khác. Mọi thứ cũng có thể được học theo cách của Erlang (ví dụ: /programming/2968914/code-hot-swicking-in-erlang ).

Có rất nhiều vấn đề thiết kế (một số chạm ở trên) nếu bạn có kế hoạch để xem ngôn ngữ lập trình của bạn một ngày nào đó. May mắn thay, có những ví dụ tuyệt vời ngoài kia.

Một số hướng ngôn ngữ lập trình mô-đun / gói / thiết kế hệ thống thư viện nên giải quyết:

  • mã trực quan cho cả viết và sử dụng mô-đun
  • các đối tượng mô-đun / gói trong mã
  • khả năng hướng nội mô-đun / gói
  • đóng gói mô-đun / gói (làm thế nào để ẩn các chi tiết không cần thiết?)
  • sử dụng giao diện / tập tin tiêu đề?
  • hệ thống điều phối hạt mịn, mà cả hai công cụ phân phối riêng của ngôn ngữ cũng như các tiện ích cấp hệ thống đều có thể sử dụng (tránh "địa ngục DLL")
  • nơi lưu trữ cho các mô-đun được biên dịch
  • hệ thống thiết lập, tự động biên dịch cả mô-đun "thuần túy" và mô-đun / phụ thuộc
  • vị trí chuẩn của mã được biên dịch, kiểm tra, tài liệu, tài sản trong mô-đun của bạn

bài này khá khó đọc (tường văn bản). Bạn có phiền chỉnh sửa ing nó thành một hình dạng tốt hơn?
gnat

1
" Có rất nhiều vấn đề về thiết kế nếu bạn dự định xem ngôn ngữ lập trình của mình một ngày nào đó. " Tôi không. Nhưng tôi vẫn đánh giá cao nếu bạn nói với tôi về các vấn đề ...
Aber Kled

1
@gnat Cảm ơn bạn đã chỉ ra. Hy vọng tốt hơn bây giờ.
Roman Susi

1
@AberKled Tôi đã cố gắng thêm một vài. Nhưng như tôi đã nói trong câu trả lời, hãy xem lịch sử phát triển của một số ngôn ngữ chính thống, tốt hơn nếu nó được thúc đẩy bởi những người lập trình cộng đồng chứ không phải những người theo chủ nghĩa thuần túy / tinh hoa, để học bài học từ những sai lầm trước khi tự mình làm. Tất nhiên, đừng quên các mục tiêu thiết kế chính cho ngôn ngữ của bạn.
Roman Susi

2

Trước hết, hãy giả sử rằng bạn ánh xạ mô hình không gian tên của mình sang một không gian tên khác, chẳng hạn như hệ thống tệp, như bạn đã đề xuất. Thứ hai, tôi giả định rằng các mô-đun có thể nhập các mô-đun khác. Nói cách khác, engine.graphics.rendererrất có thể chứa một dòng như import circle.arc. Điều đó đặt ra hai vấn đề:

  • VM sẽ tìm ở circle.arcđâu? Theo sơ đồ hệ thống tập tin mappimg đã đề cập, cần có một thư mục như /etc/mylang/modules/circle/arc ( /etc/mylang/moduleslà gốc của cấu trúc mô-đun của bạn) .

  • Làm thế nào một tài liệu tham khảo ứng dụng circle.arc: bằng cách importing circle.archoặc engine.graphics.render.circle.arc? Cái đầu tiên sẽ "làm hỏng" (nếu không phá hỏng) hệ thống phân cấp, bởi vì circle.arcrõ ràng là một mô hình con engine.graphics.renderervà thứ hai sẽ ngụ ý rằng cần phải có một /etc/mylang/modules/engine/graphics/renderer/circle/archệ thống tập tin của bạn, đặt circle.arcđồng thời hai vị trí.

Có nói rằng, và nếu bạn quyết định đi theo cách tiếp cận không gian tên, ánh xạ nó đến hệ thống tập tin có vẻ quá hạn chế đối với tôi. Tôi nghĩ rằng các mô-đun có thể cư trú ở tất cả các loại địa điểm khác nhau (ngay cả các tệp zip, như đã đề cập, thậm chí các url). VM sẽ bắt đầu bằng cách tìm kiếm một mục trong một loại chỉ mục (có thể là tệp cấu hình) để ánh xạ không gian tên đến các vị trí mô-đun thực tế.


1
Có lẽ bạn đang bị từ chối vì bạn không thực sự trả lời tốt câu hỏi cụ thể của OP. Nếu bình luận của bạn không thể truyền đạt những gì bạn muốn nói thì có lẽ bạn cần có một cuộc trò chuyện rộng hơn với OP ngoại tuyến. Phòng trò chuyện của chúng tôi là một nơi tuyệt vời để làm điều này.
maple_shaft

@maple_shaft: Ý bạn là gì? Không phải là câu hỏi "những nhược điểm của một thiết kế như vậy là gì?" Tôi có không nói rõ rằng điểm của tôi là nhược điểm tiềm năng đối với kiến ​​trúc mô-đun được đề xuất của OP không? Lý do tôi không bao giờ hỏi tại sao tôi bị từ chối là vì tôi đến từ StackOverflow, nơi mọi người làm điều đó mọi lúc mà không quan tâm để lại nhận xét về nó - điều này gây khó chịu và quan trọng hơn là không mang tính xây dựng , nhưng tôi đã quen tuy nhiên, mệt mỏi để yêu cầu một lời giải thích.
geomagas

1
Bạn thừa nhận rằng bạn không có ý định trả lời câu hỏi và bạn ít nhiều làm rõ suy nghĩ của bạn về ví dụ anh ấy đã cung cấp về những việc cần làm với mô-đun Renderer. Câu hỏi thực sự trừu tượng hơn thế và tôi cần một câu trả lời rộng hơn. Tôi đã đưa ra một lời giải thích cho lợi ích của bạn bởi vì tôi nghĩ rằng bạn nêu lên những điểm tốt và ý bạn là tốt, nhưng thực sự nó không thực sự giải quyết được những phần chính của câu hỏi.
maple_shaft

Chà, nếu câu đầu tiên là vấn đề, tôi đã loại bỏ nó, vì dù sao nó cũng không đồng ý với phần còn lại của câu trả lời - có nghĩa là, mặc dù tôi bắt đầu nó là "suy nghĩ", cuối cùng nó đã giải quyết được câu hỏi thực sự. Đối với câu hỏi trừu tượng hơn, tôi nghĩ là không, vì nó được thể hiện theo một cách rất cụ thể. Nếu tôi sai, tôi mong OP sẽ chỉ định những gì anh ta ngụ ý nhưng không nói ra. Tôi biết rằng nhận xét của bạn là để giúp đỡ, không giống như hành vi Ẩn danh của Downvoter và tôi đánh giá cao nó. Tôi thực sự làm.
geomagas
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.