2011-01-11 39 views
5

Tôi đã sử dụng lập trình meta khá nhiều, nhưng đôi khi sự kết hợp của các macro và mẫu c chỉ là không đủ.Có bất kỳ lựa chọn thay thế lập trình meta C++ nào ngoài mẫu không?

Tôi cho rằng nhược điểm có khả năng sẽ thiếu khả năng tương thích đa nền tảng nếu nền tảng lập trình meta chỉ dành cho, nói, Linux, vv

Vì vậy, yeah, có điều như vậy có sẵn ngay bây giờ, bên cạnh mẫu? Google tìm kiếm siêu lập trình bị chi phối bởi lập trình meta mẫu, vì vậy thật khó để tìm thấy ngay bây giờ ..

chỉnh sửa: đây là một ví dụ về điều tôi đang làm việc.

Giả sử tôi có một lớp chung để lưu/tải tệp vào và từ bộ đệm. Hãy gọi nó là FilePack.

Tôi có một định nghĩa vĩ mô, trông giống như

defineFilePack(BaseClass, "code-a") 

Về cơ bản nó tạo ra một lớp được gọi là "BaseClassPack", được định nghĩa là một lớp con. Dưới đây là điều đó.

class FilePack{ 
    public: 
     char * thebuffer; 
     int bufsize; 
     string packcode; 

     // and constructors etc 
     FilePack(const string& thecode, int bufsize); 
     void operator=(FilePack& rhs); 
     void saveToFile(const string& filename); 
     void loadFromFile(const string& filename); 
     // .. and all the function you'd expect to see in a class like this 

}; 

// the person details 

class PersonDetails{ 
    public: 
     solidstring<64> name; 
     int age; 
     DateTime birthday; 
     // .. yada yada yada 
}; 


defineFilePack(PersonDetails, "psd") 

// the above creates the following class 

class PersonDetailsPack : public FilePack{ 
    public: 
     PersonDetailsPack(): 
     FilePack("psd", sizeof(PersonDetails)){ // etc 

     } 

     PersonDetails& get(){ 
     return *(PersonDetails*)getBuffer(); 
     } 

     // and a lot more convenience function 

}; 

Bây giờ, thực sự có một kiểm tra được xây dựng bởi nhà xây dựng của FilePack rằng mã được khai báo khớp với kích thước, sử dụng bản đồ toàn cầu.

Ngay bây giờ, tôi đã nói về cách làm điều đó bằng cách sử dụng lập trình meta mẫu, điều này thực sự phù hợp với nó vì tất cả các mã filepack này được khai báo bên trong tệp nguồn. Chắc chắn, một ai đó có thể có thể tạo FilePack của riêng họ trong thời gian chạy, nhưng đó là ngoài điểm.

Một điều khác mà lập trình meta có thể trợ giúp ở đây là hỗ trợ tải các phiên bản FilePack khác nhau. Giả sử tôi phải cập nhật lớp PersonDetails .. Tôi chỉ cần tạo một lớp mới, sử dụng một số loại siêu lập trình để khai báo thừa kế, và kỳ diệu làm cho FilePack biết để khi nó tải phiên bản cũ của PersonDetails, nó có thể gọi hàm chuyển đổi, hoặc bất cứ điều gì.

Ngoài ra, bạn có thể nhận xét về kiến ​​trúc đó và tôi muốn nghe bất kỳ nhận xét nào về kiến ​​trúc đó, nhưng nó có thể hơi thiếu chủ đề?

+0

Bạn có thể cung cấp ví dụ về điều gì đó mà các mẫu + macro không đủ? Đây sẽ là một điểm khởi đầu tốt cho cuộc thảo luận. –

+2

@David Rodriguez: Ví dụ: tạo mã nối tiếp các lớp qua kết nối mạng hoặc nói chung làm điều gì đó cho mọi thành viên. – 6502

+0

"nhưng đôi khi sự kết hợp của macro và mẫu c chỉ là không đủ" - cái gì bị thiếu/không đủ? – Naveen

Trả lời

5

Bạn cũng có thể lập trình meta bằng bộ tiền xử lý.

Bạn có thể xem xét sử dụng các bộ tiền xử lý có mục đích đặc biệt để tạo mã như "lập trình siêu lập trình". Sau đó, bạn có thể bao gồm những thứ như lex/yacc và Qt MOC.

+0

Điều MOC đó là những gì tôi đang tìm kiếm, quá tệ đó là QT:/nhưng trong khái niệm nó có vẻ là điều thực tế nhất hiện nay .. Điều đó có thể được tính là ngôn ngữ trên đầu một ngôn ngữ tôi đoán? – kamziro

+0

Tôi không thấy lý do tại sao nó "quá xấu đó là Qt". Tôi thấy Qt là tuyệt vời ở những gì nó được thực hiện cho và nhiều hơn nữa! –

1

Tôi nghĩ công việc này là hoàn hảo cho ví dụ cho Python. Cách dễ dàng là sử dụng định dạng tệp tùy chỉnh để mô tả cách các lớp được tạo và sau đó bạn có thể tạo cả triển khai và giao diện (ngay cả trong nhiều ngôn ngữ).

Phân tích cú pháp các tệp tiêu đề C++ hiện có thay vào đó là một cơn ác mộng vì cú pháp C++ phức tạp ... (và tại sao lại hạn chế chính mình trong những gì bạn muốn thể hiện?).

Python là đa nền và một ngôn ngữ rất thoải mái cho mỗi gia nhập ...

Ví dụ sau đây là một ví dụ về C "tăng cường" ++ Tôi đã từng ...

// 
// U8 -> F32 format converter 
// 
// - src(Image:U8) ............ source image 
// - dst(pImage:F32:src) ...... destination image 
// 
ImgFilter u8_to_f32(Image& src, Image& dst) 
{ 
    const double k = 1.0/255; 
    for (int y=0; y<src.h; y++) 
    { 
     unsigned char *rp = src.u8(0, y); 
     float *wp = dst.f32(0, y); 
     for (int x=0,w=src.w; x<w; x++) 
      *wp++ = *rp++ * k; 
    } 
} 

Các bình luận trên các chức năng và tên/thông số được đọc bởi một kịch bản python mà tạo ra các .h cho hàm, C++ để xử lý cấp phát bộ nhớ, kích thước và khả năng tương thích định dạng séc, lệnh đối số dòng phân tích, trợ giúp trực tuyến và ràng buộc python. Về cơ bản tôi chỉ có thể viết "thịt" và có tất cả các bản mẫu được tạo ra cho tôi. Các kịch bản python làm điều này là 200 dòng và đưa ra số lượng mã được tạo ra C++ boilerplate cho chỉ là một vài bộ lọc đã được nhiều hơn thế.

+1

+1 để truy cập vô danh ổ đĩa không rõ nguyên nhân do downvote. –

+0

Từ lâu tôi đã quyết định bỏ qua C++ templatesarethebestthingintheworld mafia mà nó không thể làm bất kỳ lý luận hợp lý nào trong việc làm tốt với các mẫu (nhiều thứ) và cái gì không (nhiều thứ khác). Đó là lứa tuổi mà mối quan tâm đầu tiên của tôi không phải là chiến đấu giữa các trình biên dịch không tương thích trong các vùng tối của cú pháp C++ và tôi thực sự không bỏ lỡ những lần đó. – 6502

+0

Bạn có thể đã bị downvoted bởi vì anh chàng đọc "công việc này là hoàn hảo cho python", ngay lập tức đọc bạn như một troll hoặc một cái gì đó. Tôi thích cách tiếp cận đó, nhưng nó thực sự có vẻ như rất nhiều công việc. Điều đó giống như làm cho một ngôn ngữ trên đầu trang của c + + mà vẫn làm việc với các công cụ hiện có .. đó sẽ là tuyệt vời. – kamziro

2

Bên trong ngôn ngữ, bạn chỉ có thể sử dụng mẫu hoặc macro để siêu lập trình. Các cơ sở lập trình meta được cung cấp bởi thư viện Preprocessor Boost, thực hiện một số điều thực sự tuyệt vời như macro, cực kỳ mạnh mẽ.

Tuy nhiên, nếu bạn muốn tận dụng nhiều hơn một chút, bạn có thể sử dụng ngôn ngữ kịch bản bạn chọn để lập trình meta.

+0

Tôi đã luôn luôn tự hỏi làm thế nào tăng cường những thứ của họ. Tôi chưa bao giờ thực sự sử dụng chúng, nhưng có vẻ như có rất nhiều thứ phức tạp bên trong chúng. – kamziro

2

Nếu bạn xác định Lập trình meta như viết mã để tạo mã, sau đó bạn có

  • Templates.
  • Bộ tiền xử lý.
  • Tiền xử lý khác (thường là tập lệnh, nhưng đôi khi mở rộng trình biên dịch)
  • Tạo nguồn C++ từ mã C++, biên dịch khi đang chạy, tải dưới dạng lib được chia sẻ.
  • Có thể, nhưng đó là kéo dài nó, cũng tạo ra mã máy, như cuống bạt lò xo.

Tôi nghĩ thú vị nhất không phải là bộ tiền xử lý mẫu hoặc C++, là phần mở rộng ngôn ngữ hỗ trợ lập trình liên quan chéo, aspect-oriented programming, như, gọi phương thức ghi hoặc tuần tự hóa.

Khi tôi gọi lại ParcPlace đã tạo công cụ cho điều đó?

Hm, điều đó nhắc tôi đừng quên kiểm tra xem nó, đôi khi. :-)

Cheers & h.,

+0

Xem câu trả lời của tôi về các hệ thống chuyển đổi chương trình, trong đó khái quát hóa lập trình hướng-khía cạnh. Các khía cạnh chỉ cung cấp những cách rất hạn chế để sửa đổi mã của bạn và ý nghĩa của chúng giống như các mẫu, cũng cung cấp một cách hạn chế (nhưng khác). Các hệ thống biến đổi chương trình có thể thực hiện các hiệu ứng tùy ý; bạn bị giới hạn bởi tham vọng và khả năng thể hiện những gì bạn muốn làm, hơn là những gì mà kỹ thuật lập trình meta cụ thể có thể làm. –

0

Nếu bạn muốn thực hiện thao tác tùy ý mã, bạn muốn có một công cụ lập trình meta mục đích chung như một hệ thống chuyển đổi chương trình. Những công cụ này chấp nhận mã nguồn và thực hiện các phân tích/sửa đổi tùy ý cho mã đó theo nhu cầu của bạn, bằng cách sử dụng công nghệ giống như trình biên dịch.

DMS Software Reengineering Toolkit chính xác của chúng tôi là một hệ thống như vậy. Nó được tham số hóa bằng một mô tả rõ ràng về ngôn ngữ lập trình sẽ được xử lý và theo tác vụ bạn muốn nó thực hiện trên mã nguồn của bạn. DMS là duy nhất trong việc chung chung như thế này (Jackpot là một hệ thống chuyển đổi chương trình chỉ có Java), và hai lần duy nhất trong việc có một mạnh mẽ C++ Front End đã được sử dụng cho các nhiệm vụ chuyển đổi quy mô lớn trên hệ thống sản xuất C++. Với một giao diện người dùng, DMS có thể phân tích mã nguồn thành các cây cú pháp trừu tượng, xây dựng các bảng biểu tượng, thực hiện các mẫu phù hợp hoặc chuyển đổi mã bằng cách sử dụng các mẫu được viết trực tiếp trong các thuật ngữ C++ và tái tạo mã nguồn có thể biên dịch được. literals (hoàn chỉnh với radix số, vv). Việc sửa đổi chương trình của bạn có thể là bất kỳ phép tính nào bạn có thể xác định trên AST. Nói tóm lại, nó có thể làm, từ bên ngoài ngôn ngữ, những tính năng lập trình meta được hỗ trợ bởi ngôn ngữ không thể làm được.

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