Tại sao mọi người viết lại một số thư viện sang nhiều ngôn ngữ lập trình?


13

Có một số thư viện, có sẵn trong các phiên bản của họ được viết bằng nhiều ngôn ngữ lập trình khác nhau, ví dụ như Lucene , được viết bằng Java (như họ nói, Java thuần túy 100%), nhưng cũng có các phiên bản của nó bằng C ++, C, Perl , Ruby, Lisp và một số ngôn ngữ khác. Và tôi đang nói về việc triển khai trong các ngôn ngữ này, không chỉ các giao diện FFI .

Tại sao mọi người làm điều đó? Tôi có thể thấy một lý do rõ ràng: triển khai và phân phối (và có lẽ cũng phát triển) dễ dàng hơn khi một dự án có ít phụ thuộc hơn. Nhưng còn gì nữa không? Trong những tình huống là nó có giá trị nó?


4
Nó có thể rất tốn kém để giao tiếp qua biên giới tự nhiên của môi trường thực thi của bạn.

1
@Thor: Tuy nhiên, một số ngôn ngữ / môi trường tích cực khuyến khích vượt qua biên giới tự nhiên (C là một ví dụ phổ biến về điều này và đó là một chủ đề mạnh mẽ trong số các lập trình viên Tcl). Tôi nghi ngờ nó liên quan chủ yếu đến quản lý bộ nhớ (và đôi khi là tài nguyên khác); Thật không tốt khi có hai trình quản lý bộ nhớ trong cùng một quy trình, đặc biệt nếu chúng không được thiết kế để cùng tồn tại. Cuối cùng, tôi cho rằng nó thuộc về những giả định mà bạn đưa ra, và những hoạt động mà họ lần lượt làm cho không thể chấp nhận được
Donal Fellows

Câu trả lời:


16

Một số lý do tôi đã thực hiện (viết lại mã C trong Haskell, trong trường hợp của tôi):

  • triển khai dễ dàng hơn: chỉ một chuỗi xây dựng
  • ít phụ thuộc hơn (để có được nhiều con nuôi hơn)
  • dễ mang theo hơn (ví dụ với Windows) nếu mã ở ngôn ngữ cấp cao
  • để thêm hỗ trợ cho song song không dễ dàng thực hiện ở mức độ thấp C
  • để làm cho mã an toàn hơn một chút với các nguồn của nó
  • để làm cho mã dễ tin tưởng hơn
  • thành ngữ hơn (loại mạnh, API đơn giản hơn, sử dụng lại nhiều hơn)

19

Thông thường, việc thực hiện lại một thư viện là "bản địa" cho một nền tảng cụ thể cho phép:

  • Triển khai và phân phối đơn giản hơn
  • Gỡ lỗi dễ dàng hơn
  • API thành ngữ khác phù hợp với nền tảng chính xác của bạn
  • Thường thì hiệu suất tốt hơn (nền tảng interop có thể là một nỗi đau)
  • Khắc phục sự cố thiết kế vẫn còn trong bản gốc để tương thích

Ví dụ, tôi bắt đầu dự án Noda Time như một cảng của Joda Time . Đơn giản là không thực tế khi sử dụng Joda Time trực tiếp từ bên trong .NET ... bạn thực sự không muốn phải tạo ra một JVM chỉ để thực hiện các phép tính ngày và thời gian, cũng như tìm ra cách thực hiện giao thoa giữa cả hai. Một cổng tự động (a la J #) có thể khả thi, nhưng kết quả cuối cùng sẽ không phải là một API dễ chịu và thành ngữ để sử dụng từ C #.


11

Một số người làm điều đó để giúp học một ngôn ngữ mới. Họ chọn một lib mà họ quen thuộc với ngôn ngữ trước đó, thấy rằng cần phải có ngôn ngữ mới và bắt đầu chuyển nó qua.

Chuyển một cái gì đó quen thuộc là cách tốt nhất để chỉ tập trung vào các phần ngôn ngữ của một ngôn ngữ mới và không thực sự lo lắng về miền vấn đề.

Nó cũng có thêm lợi ích, một khi được thực hiện, không bị vứt bỏ mã như nhiều dự án mẫu được tìm thấy trong một cuốn sách hoặc hướng dẫn, nó thực sự có thể là thứ mà cộng đồng có thể sử dụng, thêm vào, tái cấu trúc, thảo luận, v.v.


0

Đôi khi, bạn đang phát triển cho một nền tảng nơi công cụ mà phần mềm được viết bằng (Java trong trường hợp của Lucene) không phải là một tùy chọn. Nếu bạn muốn các tính năng mà không phải kiểm tra lại mã từ đầu, bạn chuyển mã.

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.