2008-12-02 33 views
12

Tôi đã suy nghĩ về việc tạo ra một thứ gì đó giống như Linq cho Lua, và tôi có một ý tưởng chung về cách Linq hoạt động, nhưng đã tự hỏi liệu có một bài viết hay không hoặc liệu ai đó có thể giải thích cách C# làm cho LINQ có thể làm được không? đằng sau hậu trường, giống như cách nó tạo ra các ràng buộc mã và tất cả điều đó, chứ không phải cú pháp người dùng cuối.Linq hoạt động như thế nào (phía sau hậu trường)?

+0

Bạn có nghĩa là truy vấn được dịch sang cú pháp/cây cơ bản hoặc LINQ hoạt động như thế nào trong ý nghĩa thực thi? – JaredPar

+0

Tôi hầu như lo ngại về các hệ thống biên dịch thời gian –

Trả lời

18

Thật khó để trả lời câu hỏi vì LINQ là rất nhiều điều khác nhau. Ví dụ: gắn bó với C#, những điều sau đây có liên quan:

  • Biểu thức truy vấn được "xử lý trước" thành "C# không có biểu thức truy vấn", sau đó được biên dịch bình thường. Phần biểu thức truy vấn của spec là thực sự ngắn - về cơ bản nó là một bản dịch cơ khí mà không giả định bất cứ điều gì về ý nghĩa thực sự của truy vấn, ngoài "thứ tự bởi được dịch sang OrderBy/ThenBy/etc".
  • Đại biểu được sử dụng để đại diện cho các hành động tùy ý có chữ ký cụ thể, dưới dạng mã thực thi.
  • Cây biểu thức được sử dụng để đại diện cho cùng một điều, nhưng dưới dạng dữ liệu (có thể được kiểm tra và dịch sang dạng khác, ví dụ: SQL)
  • Biểu thức Lambda được sử dụng để chuyển đổi mã nguồn thành đại biểu hoặc cây biểu thức.
  • Phương thức mở rộng được hầu hết các nhà cung cấp LINQ sử dụng để kết hợp các cuộc gọi phương thức tĩnh với nhau. Điều này cho phép một giao diện đơn giản (ví dụ: IEnumerable<T>) để đạt được hiệu quả nhiều năng lượng hơn.
  • Các loại vô danh được sử dụng cho các phép chiếu - nơi bạn có một số tập hợp dữ liệu khác nhau và bạn muốn bit của mỗi khía cạnh của dữ liệu đó, một loại ẩn danh cho phép bạn tập hợp chúng lại với nhau.
  • Biến cục bộ được nhập hoàn toàn (var) được sử dụng chủ yếu khi làm việc với các loại ẩn danh, để duy trì ngôn ngữ được nhập tĩnh, trong đó bạn không thể "nói" tên của loại đó một cách rõ ràng.
  • Khối Iterator thường được sử dụng để triển khai truy vấn trong quá trình, ví dụ: cho LINQ to Objects.
  • Suy luận kiểu được sử dụng để làm cho toàn bộ điều mượt mà hơn rất nhiều - có rất nhiều phương pháp chung trong LINQ, và không có suy luận kiểu nó sẽ thực sự đau đớn.
  • thế hệ Mã được sử dụng để biến một mô hình (ví dụ DBML) vào mã
  • loại phần được sử dụng để cung cấp khả năng mở rộng để mã được tạo
  • Thuộc tính được sử dụng để cung cấp siêu dữ liệu để các nhà cung cấp LINQ

Rõ ràng là một rất nhiều trong số này không phải là chỉ được LINQ sử dụng, nhưng các công nghệ LINQ khác nhau sẽ phụ thuộc vào chúng.

Nếu bạn có thể cung cấp thêm chỉ dẫn về các khía cạnh bạn quan tâm, chúng tôi có thể cung cấp thêm chi tiết.

Nếu bạn quan tâm đến việc triển khai LINQ to Objects một cách hiệu quả, bạn có thể quan tâm đến một cuộc nói chuyện mà tôi đã cung cấp ở DDD trong Reading một vài tuần trước - về cơ bản triển khai càng nhiều LINQ to Objects càng tốt trong một giờ. Chúng tôi đã xa hoàn thành vào cuối của nó, nhưng nó nên cung cấp cho một ý tưởng khá tốt của loại của điều bạn cần làm (và đệm/streaming, lặp khối, dịch biểu hiện truy vấn vv). Các video chưa lên (và tôi chưa đưa mã lên để tải xuống) nhưng nếu bạn quan tâm, hãy gửi thư cho tôi theo địa chỉ [email protected] và tôi sẽ cho bạn biết khi nào họ đăng ký . (Tôi cũng có thể sẽ viết blog về nó.)

+0

Rất nhiều thứ và thậm chí bạn không thực sự đi vào bên thi hành. Thậm chí nhiều chi tiết lông sống ở đó. – JaredPar

+0

Vâng một ngày, nếu thời gian cho phép nó sẽ là tuyệt vời để có một hệ thống LINQ đầy đủ cho Lua, nhưng bạn đề cập đến toàn bộ điều rất phức tạp, cho thời điểm tôi đang nghĩ về bắt đầu với trái cây thấp và làm việc của tôi đường lên. –

+0

Tôi không quen với LUA, nó có hỗ trợ trình vòng lặp không? Đó thực sự là nền tảng mà trên đó hầu hết LINQ được xây dựng – JaredPar

3

Mono (một phần?) Triển khai LINQ và là mã nguồn mở. Có lẽ bạn có thể xem xét triển khai của họ?

+0

nghe có vẻ như một khởi đầu tốt –

2

Có lẽ LINQ for R6RS Scheme của tôi sẽ cung cấp một số thông tin chi tiết.

Nó là 100% ngữ nghĩa, và gần như 100% cú pháp giống như LINQ, với ngoại lệ được chú ý của các tham số sắp xếp bổ sung bằng cách sử dụng 'then' thay vì ','.

Một số quy tắc/giả định:

  • Chỉ đối phó với các danh sách, không có nhà cung cấp truy vấn.
  • Không lười biếng, nhưng dễ hiểu.
  • Không có loại tĩnh nào, vì Chương trình không sử dụng chúng.

thực hiện của tôi phụ thuộc vào một vài thủ tục cốt lõi:

  • bản đồ - sử dụng cho 'Chọn'
  • lọc - được sử dụng cho 'ở đâu'
  • flatten - được sử dụng cho 'SelectMany'
  • sắp xếp - quy trình sắp xếp nhiều phím
  • nhóm - để nhóm các cấu trúc

Phần còn lại của cấu trúc được xây dựng bằng macro.

Các kết buộc được lưu trữ trong danh sách được gắn thẻ với số nhận dạng bị ràng buộc để đảm bảo vệ sinh. Các ràng buộc được trích xuất và phục hồi tại địa phương mà bao giờ một biểu hiện xảy ra.

Tôi đã theo dõi tiến trình trên blog của mình, có thể cung cấp một số thông tin chi tiết về các vấn đề có thể xảy ra.

+0

Điều này thực sự hữu ích. Cảm ơn –

1

blog của Matt Warren có tất cả các câu trả lời (và một nhà cung cấp IQueryable mẫu thực hiện để cung cấp cho bạn một headstart):

http://blogs.msdn.com/mattwar/

2

Đối với ý tưởng thiết kế, hãy nhìn vào c omega, dự án nghiên cứu mà birthed LINQ . Linq là một phiên bản thực tế hơn hoặc được tưới nước của omega c, tùy thuộc vào quan điểm của bạn.

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