Như Tomas nói, về mặt lý thuyết thì việc thêm loại đối tượng địa lý này vào bất kỳ ngôn ngữ tĩnh nào (mặc dù vẫn còn rất nhiều công việc).
Tôi không phải là chuyên gia meta-lập trình, nhưng @ SK-logic hỏi tại sao không phải là một thời gian biên dịch hệ thống meta-lập trình nói chung thay vào đó, và tôi sẽ cố gắng trả lời. Tôi không nghĩ rằng bạn có thể dễ dàng đạt được những gì bạn có thể làm với các nhà cung cấp loại F # bằng cách sử dụng lập trình meta, bởi vì các nhà cung cấp kiểu F # có thể lười biếng và tương tác động tại thời điểm thiết kế. Hãy đưa ra một ví dụ mà Don có demo-ed trong một trong các video trước đó của mình: một nhà cung cấp loại Freebase. Freebase là loại giống như một wikipedia, có thể lập trình, nó có dữ liệu về mọi thứ. Vì vậy, bạn có thể kết thúc việc viết mã dọc theo dòng của
for e in Freebase.Science.``Chemical Elements`` do
printfn "%d: %s - %s" e.``Atomic number`` e.Name e.Discoverer.Name
hoặc không có điều gì (Tôi không có mã ngay chính xác), nhưng chỉ cần một cách dễ dàng viết mã mà được thông tin về các thống kê bóng chày, hoặc khi diễn viên nổi tiếng có ở trong các cơ sở cai nghiện ma túy, hoặc một triệu loại thông tin khác có sẵn thông qua Freebase.
Từ một thực hiện point-of-view, nó là không khả thi để tạo ra một sơ đồ cho tất cả các Freebase và đưa nó vào NET một tiên nghiệm; bạn không thể chỉ thực hiện một bước biên dịch lúc bắt đầu để thiết lập tất cả điều này. Bạn có thể làm điều này cho các nguồn dữ liệu nhỏ và trên thực tế, nhiều nhà cung cấp loại khác sử dụng chiến lược này, ví dụ: một nhà cung cấp kiểu SQL được chỉ vào một cơ sở dữ liệu và tạo các kiểu .NET cho tất cả các kiểu trong cơ sở dữ liệu đó. Nhưng chiến lược này không không làm việc cho lưu trữ dữ liệu đám mây lớn như Freebase, bởi vì có quá nhiều loại liên quan đến nhau (nếu bạn đã cố gắng để tạo ra NET siêu dữ liệu cho tất cả các Freebase, bạn sẽ thấy rằng có rất nhiều triệu loại (một trong số đó là ChemicalElement
với AtomicNumber
và Discoverer
và Name
và nhiều trường khác, nhưng có nghĩa là hàng triệu loại như vậy) mà bạn cần nhiều bộ nhớ hơn khả dụng cho quy trình .NET 32 bit chỉ để đại diện cho toàn bộ lược đồ loại.
Vì vậy, chiến lược F # type-provider là một kiến trúc API cho phép các nhà cung cấp loại cung cấp thông tin theo yêu cầu, chạy vào thời gian thiết kế trong IDE. Cho đến khi bạn nhập, ví dụ: Freebase.Science.
, nhà cung cấp loại không cần phải biết về các thực thể thuộc danh mục khoa học, nhưng khi bạn nhấn .
sau Science
, thì nhà cung cấp loại có thể truy cập API để tìm hiểu thêm một cấp sơ đồ tổng thể, biết danh mục nào tồn tại trong Khoa học, một trong số đó là ChemicalElements
. Và sau đó khi bạn cố gắng "chấm vào" một trong số đó, nó sẽ khám phá ra rằng các nguyên tố có số nguyên tử và cái gì không. Vì vậy, các nhà cung cấp loại lazily lấy đủ chỉ của lược đồ tổng thể để đối phó với mã chính xác người dùng sẽ xảy ra được gõ vào trình soạn thảo tại thời điểm đó trong thời gian. Kết quả là, người dùng vẫn có quyền tự do khám phá bất kỳ phần nào của vũ trụ thông tin, nhưng bất kỳ tệp mã nguồn hoặc phiên tương tác nào sẽ chỉ khám phá một phần nhỏ của những gì có sẵn. Khi biên dịch/codegen, trình biên dịch chỉ cần tạo mã đủ để chứa chính xác các bit mà người dùng đã thực sự sử dụng trong mã của mình, thay vì các bit thời gian chạy rất lớn để có khả năng nói chuyện với toàn bộ kho dữ liệu.
(Có lẽ bạn có thể làm điều đó với một số cơ sở vật chất meta-lập trình ngày nay bây giờ, tôi không biết, nhưng những cái tôi học được về trong trường một thời gian dài lại không thể nào dễ dàng xử lý này.)
Nó sẽ là thú vị hơn để hỏi về các tính năng ngôn ngữ mà làm cho loại này dễ dàng hơn để thực hiện. Và câu trả lời là: lập trình meta thời gian biên dịch (như trong Lisp, MetaOCaml, Nemerle, Mẫu Haskell, v.v.). Tôi tự hỏi tại sao họ đã triển khai các nhà cung cấp kiểu như một nguyên thủy trong F #, thay vì cho phép một giải pháp chung chung hơn. Và điều metaprogramming này là hoàn toàn trực giao với OO, chức năng, bắt buộc, bất cứ điều gì, bạn có thể chơi trò chơi này với bất kỳ ngôn ngữ có thể. –
@ SK-logic - Tôi nghĩ rằng các nhà cung cấp loại _are_ một dạng lập trình meta thời gian biên dịch. Bên cạnh đó, các giải pháp "tổng quát hơn" mà bạn khen ngợi cũng có bộ cân bằng riêng của họ. Ví dụ, MetaOCaml làm cho hệ thống kiểu phức tạp hơn bằng cách giới thiệu ý tưởng dàn dựng (và theo như tôi biết cho phép trích dẫn/nối/chỉ chạy các biểu thức, không phải định nghĩa kiểu). – kvb
@kvb, vâng, chúng thực sự là một dạng lập trình meta thời gian biên dịch. Nhưng tôi muốn có một metaprogramming toàn diện thay vì một loạt các "hình thức" cụ thể của nó. Và, vâng, MetaOCaml không phải là lý tưởng - có nhiều cách để làm điều tương tự, dễ dàng hơn nhiều. –