Tại sao C ++ Standard không áp dụng các mẫu biểu thức?


17

Theo hiểu biết của tôi, các mẫu biểu thức như một kỹ thuật đã được phát hiện đáng kể trước Tiêu chuẩn C ++ ban đầu vào năm 1998. Tại sao chúng không được sử dụng để cải thiện hiệu suất của một số lớp std::stringvà luồng tiêu chuẩn ?


@ChrisLively: Nếu tôi gửi đề xuất đề xuất thay đổi như vậy, thì đó hoàn toàn là một vấn đề mà tôi không biết tại sao lần đầu tiên nó không được thực hiện và nó hoàn toàn có liên quan đến lập trình và câu trả lời là rất riêng.
DeadMG

Chính xác thì bạn sẽ làm gì với các mẫu biểu thức để tăng tốc chuỗi?
jalf

5
@jalf: Nếu bạn đã áp dụng nó operator+, bạn có thể đạt được O(n)và không phân bổ dự phòng cho phân bổ lặp đi lặp lại, một cái gì đó vẫn nhanh hơn so với tham chiếu giá trị. Ngoài ra, bạn có thể tối ưu hóa các triển khai COW ví dụ bằng cách sao chép trên ghi , không chỉ "trên chỉ mục thành không phải". Cũng có những ứng dụng khác mà cả hiệu suất và ngữ nghĩa có thể được cải thiện với các mẫu biểu thức.
DeadMG

Tôi nhận ra câu hỏi này đã được hỏi cách đây một thời gian, nhưng vui lòng giải thích một số liên quan đến các mẫu biểu thức là gì và / hoặc liên kết đến tài liệu có liên quan.
einpoklum - phục hồi Monica

Câu trả lời:


17

Các mẫu biểu hiện được xuất bản lần đầu tiên bởi Todd Veldhuizen vào tháng 6 năm 1995 , trong một bài viết trên tạp chí C ++ Report . Vào thời điểm đó, ủy ban tiêu chuẩn đã tham gia rất nhiều vào việc thêm STL vào tiêu chuẩn C ++, một nhiệm vụ mà chính nó đã trì hoãn tiêu chuẩn này một hoặc hai năm. (STL đã được trình lên ủy ban vào năm 1993 và được đề xuất chính thức vào năm 1994. Phải mất bốn năm để hoàn thành tiêu chuẩn.)
Cho rằng ủy ban tiêu chuẩn hóa C ++ là một nhóm tình nguyện viên, một số trong số họ thậm chí không được hỗ trợ bởi các công ty trả tiền cho họ chi phí, tôi không nghĩ có ai có bất kỳ tài nguyên nào để sử dụng khi thêm một ý tưởng khác vào tiêu chuẩn C ++.

Ngoài ra, năm 1995 chỉ là năm bài báo của Veldhuizen được xuất bản. Để kỹ thuật được biết đến và được công nhận , phải mất vài năm nữa . (Ý tưởng về STL có từ những năm 70, một triển khai Ada đã được thực hiện vào cuối những năm 80, công việc triển khai C ++ phải bắt đầu vào khoảng năm 1990, và phải mất thêm ba năm để ý tưởng tìm được tiêu chuẩn hóa C ++ ủy ban.)
Tuy nhiên, chỉ có ba năm kể từ bài viết của Todd cho đến khi bỏ phiếu cuối cùng về tiêu chuẩn. Đó là cách quá ít thời gian để kết hợp một ý tưởng vẫn còn hoàn toàn mới và về cơ bản chưa được thử nghiệm.

Thêm vào đó là thực tế rằng Mẫu biểu thức , là một loại lập trình meta mẫu, trình biên dịch căng thẳng hơn nhiều so với STL tương đối "đơn giản". Và từ những gì tôi nhớ, ngay cả vào năm 1998, khi tiêu chuẩn được công bố, chúng tôi đã không có một trình biên dịch thậm chí có thể biên dịch tất cả STL.
Cho rằng một trong những mục tiêu chính của ủy ban tiêu chuẩn hóa là chuẩn hóa thực tiễn đã được thiết lập (không phải là họ mắc kẹt với vấn đề này một cách nghiêm ngặt), Mẫu Biểu hiện không bao giờ nên có trong chương trình nghị sự trước đó.


1
Nhưng std::stringvà iostreams không có trong STL.
R. Martinho Fernandes

@ R.MartinhoFernandes: Tuy nhiên, điều đó không có nghĩa là ủy ban có bất kỳ nguồn lực nào. (Và std::string đã được thay đổi để biến nó thành một container STL, BTW.)
sbi

2
Tôi nghĩ rằng tôi chỉ cần liên kết này: std :: chuỗi là một phần của STL?
Xèo

@sbi ah, điều đó có ý nghĩa.
R. Martinho Fernandes

10

Câu trả lời đơn giản là: bạn rõ ràng đã không vận động hành lang cho nó. Tôi cũng không vì tôi có (và có) chương trình nghị sự của riêng mình mà không bao gồm các mẫu biểu thức. Ngoài ra, giao diện đặc biệt dành cho các chuỗi đã cố gắng phục vụ quá nhiều chủ, dẫn đến một lớp được sử dụng cho mọi thứ và tốt cho việc làm dịu.

Thư viện chuẩn đã có std::valarrayvà gia đình nhằm hỗ trợ kiểu triển khai mẫu biểu thức. Theo như tôi có thể nói nó không hoàn toàn cắt nó, mặc dù. Một vấn đề gây ra điều này là những người vận động để có được phiên bản nửa nướng của nó được đưa vào tiêu chuẩn đã ngừng hoạt động trong thời điểm nó bao gồm. Đã có những nỗ lực để giải cứu nó (ví dụ David Vandevoorde, Matt Austern và tôi đã làm việc trong một ngày hoặc lâu hơn tại cuộc họp ở Stockholm) nhưng cuối cùng không ai quan tâm đủ.


8
Bạn bắt đầu hơi bất công, bởi vì DeadMG không thể vận động vì điều đó vì thực tế đơn giản là anh ta gần như không dùng được tã của mình và có lẽ đã không đạt đến mức có thể phát âm đúng "C ++". :)
sbi

7
Rất xin lỗi vì khi còn nhỏ, tôi đã không vận động hành lang: P
DeadMG

1
Tôi nhận ra rằng không phải ai cũng có cơ hội ảnh hưởng đến tiêu chuẩn. Mặc dù tôi thường xuyên tham dự các cuộc họp của ủy ban kể từ khoảng 15 năm, ảnh hưởng của tôi đối với tiêu chuẩn bị hạn chế. Tuy nhiên, quan điểm của tôi là: nếu ai đó muốn một cái gì đó trong tiêu chuẩn, họ cần phải nỗ lực! Những điều không có ở đó về cơ bản là những người có các ưu tiên khác, cho dù họ là kỹ thuật hay nói cách khác (ví dụ như hoàn toàn tập trung vào việc lớn lên).
Dietmar Kühl

Việc thực hiện libgcc của các cơ sở valarray trên các mẫu biểu thức.
phresnel

3

Kỹ thuật bây giờ được gọi là "mẫu biểu thức" đã được phát hiện (một cách độc lập) ít nhất là từ năm 1994 bởi cả Todd Veldhuizen và bản thân tôi (bài báo của Todd là từ năm 1995, nhưng phải mất một chút thời gian để công cụ được xuất bản; lần đầu tiên được hiển thị trong comp.lang.c ++).

Tôi thực sự bắt đầu tham dự các cuộc họp ủy ban C ++ chính xác vì vấn đề này. Tôi đã trình bày kỹ thuật và thiết kế lại hoàn toàn std :: valarray cho ủy ban tại cuộc họp Santa Cruz đầu tiên vào tháng 3 năm 1996. Nó được coi là quá lớn của một sự thay đổi, nhưng khi Dietmar ám chỉ, chúng tôi đã nhận được một số từ trong cuộc họp tiếp theo ở Stockholm cho phép sử dụng các mẫu biểu thức để thực hiện std :: valarrray. Thật ngạc nhiên, những từ đó vẫn còn đó: Xem đoạn 3-6 của tiểu mục [valarray.syn] 29.7.1 trong http://wg21.link/N4727 .


1
tự hỏi điểm quan trọng của việc sử dụng trình rút gọn liên kết thay vì URL thực
gnat

3
@gnat: Nếu bạn biết một số tài liệu, việc viết URL wg21.link cho nó là chuyện nhỏ. Đó là những gì tôi đã làm ở đây. Nó giúp tôi tìm kiếm thư / năm cụ thể mà tài liệu được phát hành. Ngoài ra, tôi hy vọng rằng nếu / khi WG21 quyết định di chuyển URL lưu trữ, wg21.link sẽ được cập nhật tương ứng, do đó tránh được các tham chiếu cũ. (Tức là, vấn đề không phải là rút ngắn, mà là dễ đọc.)
Daveed V.

0

Dự đoán tốt nhất của tôi là không có trình biên dịch nào có thể biên dịch các mẫu biểu thức vào năm 1998.


1
Todd Veldhuizen đã làm mẫu biểu thức của mình hoạt động trước năm 1996 bằng trình biên dịch C ++ của KAI. Lý do còn tục tĩu hơn nhiều ...

1
Một tỷ lệ lớn cộng đồng C ++ không thể sử dụng STL cho toàn bộ tiềm năng của nó cho đến năm 2003 (Tôi đang nhìn vào bạn, Microsoft!), Và điều đó đã không khiến ủy ban kết hợp STL vào tiêu chuẩn.
sbi

2
Trên thực tế, bth Todd và tôi ban đầu có kỹ thuật mẫu biểu thức để làm việc trên trình biên dịch Borland C ++ 4 (được phát hành vào năm 1993). Ngẫu nhiên, tôi tin rằng đó cũng là trình biên dịch đầu tiên mà STL được tạo ra để hoạt động hoàn toàn. Sau này tôi đã chuyển một thư viện mẫu biểu thức sang nhiều trình biên dịch khác (bao gồm cả trình biên dịch dựa trên Cfront của Sun vào thời điểm đó!). Trình biên dịch KAI C ++ cam một lát sau.
Daveed V.

@DaveedV. BCC4 là một trình biên dịch rất tốt cho thời gian của mình và nhiều hơn so với phiên bản VC của thời điểm đó! Tuy nhiên, nó có một số điểm kỳ quặc, giống như "con bọ cười" khét tiếng. :->Thêm vào đó, họ đã thất bại trong việc cải thiện nó đủ nhanh, do đó, nó nhanh chóng trở nên khó hơn và khó hơn khi sử dụng các kỹ thuật mẫu cải tiến nhanh chóng với nó. Khi VC7.1 được phát hành và tuân thủ nhiều hơn, điều đó đã giết chết Borland.
sbi
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.