2009-08-15 29 views
5

Tôi đã làm việc trên một chương trình C thực hiện khá nhiều thao tác chuỗi và thường cần được chỉnh sửa và biên dịch lại cho một số trường hợp xử lý đặc biệt. Tôi đã nghĩ rằng việc nhúng một số ngôn ngữ kịch bản với sự hỗ trợ thao tác chuỗi tốt có thể có ý nghĩa đối với dự án.Ngôn ngữ có thể nhúng với sự hỗ trợ thao tác chuỗi tốt

Ngôn ngữ nào sẽ cung cấp hỗ trợ thao tác chuỗi tốt nhất trong khi dễ dàng nhúng vào chương trình C?

Đối với một số nền thêm ...

  • Hiệu suất là khá quan trọng (thời gian đặc biệt là khi khởi động)
  • nhu cầu một cách dễ dàng được biên dịch trên nhiều nền tảng (Linux, Solaris, Win32 (lý tưởng với MinGW), Darwin)
  • nhu cầu trở thành một ngôn ngữ mà vẫn sẽ được xung quanh trong thời gian 5 năm

tôi đã nhìn một chút tại Python (có lẽ trọng lượng quá nặng?) và Lua (có lẽ không tập trung vào strin g thao tác?) nhưng không thực sự biết đủ về họ hoặc những lựa chọn khác có thể được ra khỏi đó.

Trả lời

0

Perl. Lý do (nguyên bản) của nó là thao tác chuỗi.

+0

Nhưng hoàn toàn không dễ dàng nhúng trong chương trình C từ những gì tôi hiểu. Bạn có biết khác nhau không? –

+0

Không bao giờ cố gắng, cá nhân tôi đã không sử dụng C/C++ nhiều hơn "Hello World". Tôi biết ít nhất một (C + + tôi nghĩ) dự án mã nguồn mở mà không nhúng nó mặc dù, nếu bạn muốn poke xung quanh và xem làm thế nào nó được thực hiện. –

+0

Vâng, nó được gọi là gì? –

3

Mọi người đã nhúng tcl vào các dự án lớn hơn cho những gì có vẻ như độ tuổi. Đã một thời gian kể từ khi tôi phải sử dụng tcl cho bất kỳ điều gì ...

Một trong những điều đặt ra ngoài các ngôn ngữ lập trình khác là mọi thứ là một chuỗi.

Và để bạn tham khảo, dưới đây là tcl documentation on string functions.

tcl có thể dễ nhúng hơn perl, nhưng tôi phải đồng ý với lý do @Matthew Scharley. Ngoài ra, tcl không được biết chính xác về hiệu suất của nó, nhưng có lẽ điều đó đã thay đổi trong những năm gần đây.

Dù sao, here is the tcl wiki link on embedding tcl in C applications, và một trích dẫn có liên quan từ trang: "Làm thế nào để nhúng một thông dịch Tcl trong C hiện tại của tôi (hoặc C++) ứng dụng"

là một câu hỏi rất thường xuyên. Nó đơn giản, chắc chắn dễ dàng hơn nhiều so với thực hiện tương tự với Perl hoặc, nói chung, Python; hơn nữa, loại "khả năng nhúng" này là một trong những mục tiêu ban đầu cho Tcl, và nhiều, nhiều dự án làm điều đó. Không có thảo luận đầy đủ về chủ đề có sẵn, nhưng chúng tôi có thể cung cấp tổng quan ở đây. (RWT 14-Oct-2002)


Một lựa chọn khác có thể là để đi với Lua, như bạn đã đề cập, trong khi mở rộng nó với một thư viện chuỗi C của sự lựa chọn của bạn (Google lần lượt lên The Better String Library, ví dụ) .

Khi bạn đã biên soạn Lua vào ứng dụng của mình, you can "extend" C functions to Lua's interpreter. Hoặc có thể the built-in string functions phù hợp với bạn.

Bạn chắc chắn có một vài tùy chọn.

10

Tôi chưa bao giờ hối hận khi sử dụng Lua.

Rất dễ dàng nhúng vào ứng dụng của bạn. Trong thực tế, bây giờ tôi thường không viết các ứng dụng C, tôi chỉ viết thư viện C và kiểm soát chúng từ Lua.

Thao tác văn bản không phải là tính năng tốt nhất của nó, nhưng nó chắc chắn tốt hơn nhiều so với C một mình. Và thư viện LPEG làm cho việc xây dựng các trình phân tích cú pháp gần như dễ dàng, đặt bất kỳ regex nào đáng xấu hổ (nhưng vẫn có một vài cú pháp giống như regex nếu bạn thích chúng).

+3

Trong ngôn ngữ nhúng, Lua chỉ đơn giản là hoàn hảo - nhỏ gọn, tính di động hoàn hảo (C++ - compilable ANSI C subset), cú pháp gọn gàng và đơn giản, thư viện chuẩn tối thiểu nhưng tiện lợi, dễ mở rộng (tôi dám nói nó đánh bại Python ở đó), và tài liệu rất tốt. Kinh nghiệm quá khứ của tôi với Lua chẳng là gì ngoài tích cực. Nó có thể thiếu khả năng thao tác chuỗi ra khỏi hộp, nhưng bạn có thể dễ dàng cung cấp tất cả các chức năng tùy chỉnh có thể cần thiết cho mục đích đó (regex, v.v.). –

+2

+1 để viết thư viện C được kiểm soát từ Lua. Điều đó ngày càng trở nên phổ biến đối với tôi. – RBerteig

+0

Đừng quên rằng Lua thắng khá một vài cuộc thi chuẩn, và đó là trước khi đưa vào một trình biên dịch JIT cho bytecode của nó. Và, một JIT cũng có sẵn, xem http://luajit.org/ để biết chi tiết đẫm máu. – RBerteig

3

Chúng tôi đã xem xét cả Python và Lua để tạo kịch bản cho một sản phẩm .NET. Mục tiêu là cung cấp một số khả năng đọc cho người dùng cuối. Quyết định được đưa ra cho Python bởi vì các quyền hạn được ưu tiên mà Microsoft hỗ trợ cho mọi thứ khác. Sự lựa chọn của tôi là cho Lua.

1

Một số người có thể không đồng ý nhưng Sara Goleman đã xuất bản a great book về việc mở rộng và nhúng PHP. Mà là trở thành một trong những ngôn ngữ được sử dụng rộng rãi nhất xung quanh ... :)

Hỗ trợ chuỗi PHP không phải là tuyệt vời như Perl nói, nhưng nó rất hữu dụng.

Tôi đã đề cập đến nó được viết bằng C? </my2cents >

+0

Ưu điểm của việc sử dụng PHP như một ngôn ngữ được nhúng là gì? Bất kỳ điều gì như vậy thường là miền cụ thể, do đó, phổ biến ở nơi khác không phải là một yếu tố lớn. Và PHP có rất nhiều kẻ gây khó chịu như một ngôn ngữ của riêng nó. –

1

Python không nặng gì cả! Nó khá đơn giản để nhúng (đây là official guide, nhưng bạn cũng có thể tìm thấy nhiều hướng dẫn), rất mạnh mẽ, tuyệt vời để xử lý chuỗi, và một ngôn ngữ dễ chịu và dễ sử dụng tổng thể. Nó có một cộng đồng người dùng lớn và cơ sở hỗ trợ, đó là một tiền thưởng.

Python cũng đã được nhúng vào một số lượng lớn các ứng dụng thực tế. Một ví dụ tuyệt vời tôi có thể nghĩ ngay lập tức là trò chơi Civilization IV, hầu hết trong số đó chạy trên các kịch bản Python trên đầu trang của API C++.

3

Có một giấy khảo sát tốt trên những giá trị tương đối của các API nhúng của ngôn ngữ kịch bản khác nhau:

H. Muhammad and R. Ierusalimschy. C APIs in extension 
and extensible languages. Journal of Universal Computer 
Science, 13(6):839–853, 2007. 

Nhìn vào kết hợp cả hai thao tác chuỗi tuyệt vời và một nhúng API tuyệt vời, tôi sẽ đề nghị, theo thứ tự:

  • Ruby: Hỗ trợ chuỗi tuyệt vời, bao gồm hỗ trợ cú pháp cho regex. API nhúng được thiết kế tốt, rất dễ sử dụng.
  • Lua: Tôi không chắc chắn hỗ trợ chuỗi của nó như thế nào, nhưng nó được cho là một ngôn ngữ tuyệt vời để nhúng.
  • Python: Ít dễ nhúng hơn, hơi khó sử dụng các tính năng chuỗi hơn Ruby. Nhưng nó có Pyrex, vì vậy mà có thể là một cách dễ dàng hơn để nhúng nó.
  • PHP: API khó chịu, ngôn ngữ khó chịu. SAPI nhúng thực sự là một công dân hạng hai, nhưng nó hoạt động. Có rất nhiều chức năng thao tác chuỗi. Tuy nhiên, tôi sẽ không giới thiệu nó.
  • Perl: Khó nhúng (theo như tôi đã nghe), hỗ trợ chuỗi có thể tốt hơn.

Tôi không thể nhận xét về TCL, nhưng tôi nghe được thiết kế để nhúng.

4

Lua đứng đầu và vai phía trên các lựa chọn khác.

... hỗ trợ thao tác chuỗi tốt nhất khi dễ dàng nhúng?

Lua được được thiết kế để được nhúng vào C; API rõ ràng và dễ sử dụng; tài liệu là tuyệt vời.

Một số phản hồi khác đã loại bỏ khả năng chuỗi của Lua. Tôi nghĩ rằng họ đang đánh giá thấp Lua. Khả năng chuỗi của Lua thực sự tìm thấy một điểm ngọt giữa "chỉ ghép nối" và sự phức tạp đầy đủ của các biểu thức thông thường. Khả năng định dạng chuỗi rất mạnh và tích lũy chuỗi thông qua "bộ đệm" hoặc bảng đơn giản và hiệu quả.

Quét theo chuỗi, theo ý kiến ​​của tôi, một trong những phần hay nhất của thiết kế. Nó không có các mẫu "hoặc" nhưng nếu không bạn sẽ nhận được một phần lớn những gì bạn nhận được từ các cụm từ thông dụng, bao gồm cả chức năng "chụp" rất mạnh mẽ và thanh lịch. Ví dụ, tôi có thể chuyển đổi một chuỗi hex bằng cách bắt tất cả các ký tự đơn và áp dụng một hàm với nó:

s:gsub('.', function(c) return string.format("%02x", string.byte(c)) end) 

Hoặc tôi có thể thoát ra ngoài tự chữ và số, ký tự không gian vào bát phân:

s:gsub('[^%w%s]', function(c) return string.format([[\%03o]], string.byte(c)) end) 

Một số các tính năng trên màn hình ở đây:

  • tự thoát để quét chuỗi là %, đó là khác nhau từ ký tự thoát cho trích dẫn chuỗi, là \. Quyết định này là tuyệt vời và nên giành một giải thưởng của chính nó :-)

  • Có nhiều cơ chế để trích dẫn chuỗi ký tự, bao gồm [[...]]. Nếu bạn muốn tạo hoặc kết hợp các chuỗi với dấu gạch chéo ngược trong chúng (ví dụ như LaTeX), đây là một ơn trời.

Nếu bạn muốn toàn bộ phân tích cú pháp không có ngữ cảnh, bạn luôn có thể sử dụng LPEG, thư viện được viết bởi một trong những nhà thiết kế của Lua.

Hiệu suất là khá quan trọng (thời gian đặc biệt là khi khởi động)

Lua luôn thắng giải thưởng hiệu suất. Khởi động nhanh như chớp: toàn bộ hệ thống (bao gồm trình biên dịch, thư viện, bộ thu gom rác và hệ thống thời gian chạy) phù hợp với 150KB. Để tránh thời gian tạm dừng, Lua cung cấp bộ sưu tập rác gia tăng. Xem thêm SO câu hỏi Why is Lua faster than other scripting languages?

Bạn có thể thực hiện khởi động nhanh hơn bằng cách precompiling kịch bản của bạn, nhưng tôi đã không bao giờ tìm thấy nó cần thiết để làm mã — và vì biên soạn này (như trái ngược với mã nguồn) không phải là di động, tiền biên dịch thường gây đau đầu hơn là giải quyết.

nhu cầu một cách dễ dàng được biên dịch trên nhiều nền tảng

Lua biên dịch sử dụng tinh khiết ANSI C và thậm chí không cần POSIX. Tôi có một phiên bản chạy trên PalmOS PDA của tôi.

Cần phải là ngôn ngữ sẽ vẫn còn trong khoảng thời gian 5 năm.

Lua đã có từ năm 1993. Hơn nữa, hai thành viên của nhóm cung cấp hỗ trợ nhiều nhất là các giáo sư được thuê tại PUC-Rio. Lúa là sinh kế của họ. Cuối cùng, toàn bộ hệ thống chỉ có 17.000 dòng mã. Nếu Rio rơi khỏi bản đồ vào ngày mai, bất kỳ ai có khóa học trình độ đại học tốt đều có thể chọn hệ thống và duy trì nó. Sẽ có rất nhiều tình nguyện viên.

Tôi đã nhìn một chút tại Python và Lua nhưng không thực sự biết đủ về họ

thấy rất thắc mắc Which game scripting language is better to use: Lua or Python?.

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