Có cách nào được đề xuất để giao tiếp lập trình khoa học / kỹ thuật cho các nhà phát triển C không?


16

Tôi có rất nhiều mã MATLAB cần được chuyển sang C (tốc độ thực thi là rất quan trọng cho công việc này) như là một phần của quy trình back-end cho một ứng dụng web. Khi tôi cố gắng thuê ngoài mã này cho nhà phát triển C, tôi giả sử (sửa tôi nếu tôi sai), một số nhà phát triển C cũng hiểu mã MATLAB (những thứ như lập chỉ mục và quản lý bộ nhớ là khác nhau, v.v.). Tôi tự hỏi nếu có bất kỳ nhà phát triển C nào ngoài đó có thể đề xuất một quy trình để tôi tuân theo để truyền đạt tốt nhất những gì mã làm được?

Ví dụ: tôi có nên cung cấp mã MATLAB và giải thích những gì nó đang thực hiện theo từng dòng không? Hoặc, tôi chỉ nên cung cấp toán học / thuật toán, giải thích bằng tiếng Anh đơn giản và để nhà phát triển C thực hiện nó với cách hiểu này theo cách riêng của mình (ví dụ: tôi có thể giả sử nhà phát triển hiểu cách làm việc với toán học phức tạp (ví dụ như tưởng tượng số), làm thế nào để tạo biểu đồ, thực hiện FFT, v.v.)?

Hoặc, có một phương pháp tốt hơn? Tôi hy vọng tôi không phải là người đầu tiên cần phải làm điều này, vì vậy tôi tự hỏi liệu có nhà phát triển C nào ngoài kia gặp phải tình huống này và có thể chia sẻ bất kỳ sự khôn ngoan thông thường nào về cách họ muốn thực hiện nhiệm vụ này không?

Cảm ơn trước cho bất kỳ ý kiến.


3
Bạn đã thử sử dụng mcc để chuyển đổi mã MATLAB sang c chưa? tôi nghĩ rằng nómcc -c matlabfile.m
Sẽ Tate

4
Khi bạn thuê lập trình viên, hãy xác định rằng họ phải hiểu cả mã C và Matlab. Mặc dù nhấn mạnh vào tốc độ, có lẽ bạn nên sử dụng C ++ thay vì C (với một số lưu ý, nó không bao giờ chậm hơn và thường nhanh hơn).
Jerry Coffin

3
@willytate: Điều này đòi hỏi bạn phải có trình biên dịch Matlab, nó không tạo ra mã đặc biệt hiệu quả và có một số hạn chế về mã bạn có thể biên dịch.
Jonas

3
Nếu bạn thực hiện loại lập trình hướng đối tượng trong C, bạn không chỉ tước đi cơ hội để trình biên dịch thực hiện kiểm tra an toàn kiểu bổ sung, bạn còn tước đi trình biên dịch cơ hội để thực hiện một số loại tối ưu hóa nhất định không thể diễn đạt dễ dàng trong C. Ngoài ra, sử dụng C ++ làm tăng cơ hội bạn có thể sử dụng chức năng từ thư viện được viết bởi ai đó thông minh hơn bạn.

3
Là phần lớn thời gian dành cho thuật toán thực tế, hoặc loay hoay với các tệp, IO và phân tích cú pháp? Bộ mã hóa C trung bình sẽ không thể viết FFT và mã ma trận đến bất kỳ nơi nào gần cạnh tranh với việc triển khai MATLAB. Nếu phân tích cú pháp, IO và xử lý tệp là nơi chương trình của bạn dành thời gian, thì lập trình viên C của bạn nên tập trung vào đó và viết mã keo gọi các hàm từ các thư viện MATLAB. Nếu giải quyết FFT / ma trận / giải quyết ODE là nút cổ chai, thì bạn phải tìm một lập trình viên C có nhiều kinh nghiệm về phương pháp số.
Charles E. Grant

Câu trả lời:


15

Tôi đang ở trong một tình huống tương tự như bạn ở chỗ tôi cũng có người chuyển mã Matlab của tôi sang C ++.

Phần lớn phụ thuộc vào mức độ phức tạp của mã của bạn, cũng như mức độ kỹ năng của nhà phát triển C / C ++ và vào sự hiểu biết của họ về những gì họ phải thực hiện - họ càng hiểu rõ và hiểu rõ hơn về vấn đề của bạn, thì càng hiểu độc lập họ có thể làm việc.

Do dịch trực tiếp mã Matlab sang C / C ++ có thể không phải là cách hiệu quả nhất để xử lý sự cố, tôi đề nghị bạn nên truyền đạt tốt đầu vào là gì, mã nên làm gì và được cho là trả về làm đầu ra. Bạn cũng nên cung cấp các cách để kiểm tra mã để đảm bảo rằng nó hoạt động chính xác - vừa là trợ giúp để gỡ lỗi cũng như cung cấp phương tiện để kiểm soát chất lượng. Trên hết, bạn nên cung cấp và giải thích mã Matlab như một hướng dẫn sơ bộ về cách đạt được kết quả.

Bạn sẽ có thể giả định rằng nhà phát triển biết cách cấu trúc chương trình và cách sử dụng các công cụ gỡ lỗi. Tuy nhiên, bạn có thể không nhất thiết có thể giả định rằng nhà phát triển biết cách có kiến ​​thức cụ thể, nói thống kê hoặc tối ưu hóa (toán học). Do đó, việc gỡ lỗi các phần này sẽ nhanh hơn nhiều với đầu vào của bạn.

Nó có thể giúp lên lịch các cuộc họp thường xuyên với nhà phát triển, để "những điều nhỏ nhặt" có thể cảm thấy hơi kỳ lạ với nhà phát triển, nhưng điều đó sẽ báo hiệu những vấn đề quan trọng với bạn có thể được truyền đạt trước khi chúng leo thang thành vấn đề lớn.


+1 để có kết quả kiểm tra hợp lệ cho phần mềm. Chuyển mã từ Matlab sang C / C ++ là đủ khó mà không biết kết quả sẽ như thế nào.
rjzii

12

Tôi không nói điều này áp dụng cho bạn, nhưng: Hầu hết những người chỉ viết mã trong MATLAB đều viết mã xấu. Rất tệ, với định dạng, cấu trúc và tài liệu kém.

Khi gặp trường hợp này, cách dễ dàng duy nhất để sử dụng mã MATLAB là chạy nó để xác minh kết quả từ mã được chuyển. Cố gắng thiết kế ngược mã MATLAB mà không có tài liệu bổ sung là điều chỉ nên được thực hiện nếu tác giả ban đầu của mã MATLAB thực sự đã chết hoặc hôn mê. Mặt khác, một bài viết toán học được viết tốt về một thuật toán thường hữu ích hơn nhiều so với việc thực hiện của chính tác giả.

Để giúp người chuyển mã của bạn dễ dàng hơn:

  1. Tái cấu trúc mã của bạn để đảm bảo rằng các hoạt động được chia nhỏ thành các chức năng khác nhau. Kiểu một hàm cho mỗi tệp của MATLAB khuyến khích các hàm quá dài và bao gồm quá nhiều thao tác. Ngoài ra, hãy đảm bảo rằng mã trùng lặp được kéo ra các hàm trợ giúp, ngay cả khi điều này dẫn đến nhiều tệp hơn bạn thường muốn làm việc với dự án MATLAB.

  2. Giải thích bất kỳ số ma thuật hoặc hằng số được sử dụng trong mã của bạn và các điều kiện theo đó chúng hợp lệ.

  3. Tài liệu về cấu trúc dữ liệu của mã của bạn. Kiểu "mọi thứ là ma trận" của MATLAB rất khác so với hầu hết các ngôn ngữ và điều đó thường có nghĩa là cấu trúc dữ liệu của bạn được xác định ngầm bằng cách bạn sử dụng ma trận. Lập trình viên AC sẽ cần tìm ra cách thiết lập các cấu trúc khác nhau và phân bổ các mảng cần thiết, vì vậy hãy chắc chắn rằng rõ ràng ý nghĩa và cấu trúc bên trong của các biến của bạn là gì.

  4. Tài liệu các thuật toán được sử dụng bởi mã của bạn. Cụ thể, hãy đảm bảo rằng rõ ràng điều gì xảy ra khi bạn sử dụng các hàm và toán tử toàn mảng phức tạp và đảm bảo rằng lập trình viên C có quyền truy cập vào các tham chiếu về các thuật toán được sử dụng bởi bất kỳ hàm hộp công cụ hoặc hàm thư viện chuẩn nào phức tạp hơn Chức năng BLAS.

  5. Tài liệu bất cứ điều gì bạn đã làm để làm cho mã mạnh mẽ, chẳng hạn như xác thực đầu vào và xử lý lỗi. Cách bạn triển khai có lẽ rất khác so với cách nó sẽ phải được thực hiện trong C. Học thuật viết mã MATLAB hiếm khi bận tâm tìm hiểu về những thứ như xử lý ngoại lệ. Nếu bạn chưa làm gì để làm cho mã của mình mạnh mẽ, thì ít nhất hãy ghi lại những gì có thể được thực hiện về dữ liệu đầu vào không hợp lệ hoặc dữ liệu bị thiếu hoặc một phần.

  6. Đảm bảo rằng người chuyển mã có thể so sánh đầu ra với mã MATLAB ban đầu và nếu có thể, hãy cung cấp một bộ kiểm tra kỹ lưỡng về đầu vào và đầu ra chính xác.

  7. Nếu người thực hiện chuyển không biết phân tích số, bạn sẽ cần giám sát quá trình chuyển và đảm bảo rằng bạn xem lại và hiểu mã C. Nó sẽ rất giáo dục cho cả hai bạn.


Tôi đồng ý với đánh giá kỹ thuật của bạn và bạn đạt điểm cao (1 - 7), nhưng tôi nghĩ rằng vượn quảng cáo ở đầu về "hầu hết những người chỉ viết mã trong MATLAB" là không cần thiết và không đúng sự thật.

5
Dựa trên kinh nghiệm của tôi, hầu hết những người sử dụng MATLAB làm ngôn ngữ lập trình duy nhất của họ là những người toán học ứng dụng, đối với họ, việc lập trình nói chung không có gì khác hơn là kết thúc. Họ không có động lực để quan tâm đến việc thực hành lập trình, và họ chỉ quan tâm đến việc viết mã chính xác, mã không tốt hay đẹp. Khi họ chia sẻ mã của mình, nó thường được sử dụng, nhưng không được đọc - luôn có một bài báo để thực hiện công việc giải thích mã. Nếu bạn nghĩ rằng điều này gây khó chịu (và nó không có nghĩa là như vậy), thì bạn chỉ đơn giản là thiếu quan điểm của những người không quan tâm.

4
Theo kinh nghiệm của tôi, mã xấu chủ yếu được viết bởi những người viết mã một lần, tức là mã sẽ được sử dụng (đọc) bởi một người cho một vấn đề duy nhất. Ngôn ngữ lập trình không thành vấn đề. Và đối với tôi, với tư cách là một người chủ yếu lập trình trong Matlab, vượn quảng cáo xuất hiện gây khó chịu.
Jonas

Là một EE tôi chủ yếu dự kiến ​​sẽ viết MATLAB và tôi đồng ý với bạn. Nó khuyến khích một phong cách mã hóa rất khủng khiếp, không có phạm vi, không gian tên, sắp xếp thành các cấu trúc dữ liệu hoặc đặt tên biến tốt. Sau khi hiểu được vector hóa, người ta không thực sự bận tâm để bình luận về bất kỳ kỳ quan một dòng thông minh kết quả nào. Chỉ là một đống rác khổng lồ của mã xấu xí, kém hiệu quả.
Milind R

4

Ngôn ngữ lập trình dễ đọc hơn nhiều so với viết. Hầu hết các lập trình viên C có một chút kinh nghiệm sẽ có thể đọc mã Matlab của bạn tốt với quyền truy cập vào một tham chiếu và đặc biệt là có quyền truy cập vào một lập trình viên Matlab để trả lời câu hỏi của họ. Mã của bất kỳ loại nào là ít mơ hồ hơn nhiều so với hầu hết các yêu cầu chúng ta phải giải quyết.

Nếu họ có bằng cử nhân về khoa học máy tính hoặc kỹ thuật máy tính, họ có thể đã tính toán, lượng giác và đại số tuyến tính, nhưng nó có thể bị gỉ. Trừ khi họ làm nhiều chương trình khoa học / toán học, hầu hết các lập trình viên C sẽ biết FFT là gì, nhưng hiếm khi hoặc không bao giờ phải làm một. Ứng cử viên lý tưởng của bạn sẽ có tất cả những gì mới mẻ trong tâm trí của anh ấy, nhưng bất cứ ai có bằng cấp đều có thể xử lý toán học với một số nghiên cứu bồi dưỡng. Trong cả hai trường hợp, bạn muốn ai đó nhấn mạnh việc tìm các thư viện hiện có cho các hoạt động chung như thế bất cứ khi nào có thể thay vì tự mình thực hiện.

Tài năng để có thể tối ưu hóa thời gian thực hiện thuật toán rất khác nhau ngay cả trong số các lập trình viên có kinh nghiệm. Tôi muốn giới thiệu bạn có một vấn đề phỏng vấn để khám phá điều đó. Chỉ cho thí sinh một thuật toán đơn giản nhưng không hiệu quả và hỏi họ làm gì. Xem nếu họ tự mang lại sự không hiệu quả. Hỏi họ xem sự phức tạp tiệm cận là gì và nó nên là gì. Hỏi họ làm thế nào họ sẽ viết lại để cải thiện hiệu quả.


3

Lý do tài chính cho việc không sử dụng trình biên dịch MATLAB là điều dễ hiểu. Tuy nhiên, bạn có thể sử dụng bộ chuyển đổi scilab sang C miễn phí. Thủ tục sẽ là

  • Chuyển đổi mã của bạn từ Matlab sang Scilab bằng các công cụ M2SCI ,
  • Chuyển đổi mã Scilab thành C bằng "Scilab 2 C" ,
  • Kiểm tra chéo các mã,
  • Sử dụng một hồ sơ để tìm kiếm các nút cổ chai cần một mắt người.

Lý tưởng là không có kiến ​​thức về Scilab là cần thiết trong quá trình và thật dễ dàng để dành chút thời gian thử giải pháp này (trong thực tế, nó có thể không đơn giản ...)

Lưu ý: Tôi đã không thử điều này nhưng đó là một giải pháp tôi tự dự tính vì những lý do tương tự.


2

Phát triển một bộ kiểm tra tốt, bạn có thể chạy qua cả hai ứng dụng và sau đó xem qua các số liệu.

Điều này sẽ giúp rất nhiều cho nhà phát triển của bạn kiểm tra mã của họ và đảm bảo rằng chất lượng ở mức hợp lý.


2

Bài đăng tuyệt vời của Jonas, đặc biệt là điểm cung cấp một cách để kiểm tra mã. Dưới đây là một số gợi ý bổ sung:

  • Mã chia sẻ. Xem xét việc cung cấp nguồn MATLAB nhưng được chuẩn bị để giải thích cấu trúc của nó hoặc các chi tiết khác (từ cú pháp đến phong cách cá nhân của bạn). Nhà phát triển C hy vọng sẽ nhận ra các khái niệm, thuật toán và toán học cấp cao ( và hy vọng bạn đã nhận xét mã của mình ).

  • Tài liệu. Điều quan trọng là bạn có tài liệu rõ ràng xác định dự án; Rốt cuộc, nếu người đó không thông thạo MATLAB, mã có thể không phải là một tài liệu tham khảo rất hữu ích.

  • Luyện tập kỹ năng con người. Điều này có thể rõ ràng tuy nhiên thật tốt khi ghi nhớ khi cộng tác, đặc biệt là ở cấp độ vi mô này. Vì vậy, bạn nên cố gắng loại bỏ càng nhiều sự mơ hồ khỏi mã / tài liệu của bạn càng tốt. Tùy thuộc vào mức độ lãnh đạo của bạn trong dự án, bạn có thể thấy rằng bạn đang cân bằng giữa phát triển hướng dẫn và để người đó tự đóng góp cá nhân.


1

Trừ khi các lập trình viên C của bạn sử dụng các lib đúng, Matlab tốt hơn nhiều ở những thứ tầm thường như đảo ngược một ma trận. Một C ngây thơ. không đủ ổn định. Thuê các lập trình viên C sẽ tốn kém. Tôi sẽ thử chuyển mã Matlab sang scipy và so sánh tốc độ, thử sử dụng trình biên dịch c của Matlab hoặc ... chỉ cần ném thêm phần cứng vào nó - nó có thể rẻ hơn, đơn giản hơn và an toàn hơn và nhanh hơn.

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.