2009-02-16 41 views
12

Tôi sắp bắt đầu một bản phân phối Linux dựa trên LFS chỉ cho một dự án sở thích. Tôi có kế hoạch thực hiện một số nhiệm vụ rất không chuẩn, và hầu hết nó sẽ liên quan đến việc thay đổi gần như tất cả các kịch bản trong bản phân phối. (chủ yếu là init script, nhưng tôi cũng sẽ viết một tập hợp đơn giản các kịch bản quản lý gói.) Vì tôi sẽ vượt xa tiêu chuẩn này, và vì tôi chưa bao giờ là một fan của các ngôn ngữ gõ động (perl, python, bash và phần còn lại là tốt, nhưng không phải là sở trường của tôi), tôi đã tự hỏi nếu có ai biết ngôn ngữ thông dịch thực sự đã khai báo biến.Bất kỳ ai biết về bất kỳ ngôn ngữ kịch bản được nhập tĩnh nào?

+0

Python được nhập mạnh mẽ. Không năng động. Bạn không thể thêm số và chuỗi âm thầm mà không có chuyển đổi rõ ràng. – George

+2

@gdivos: Python được nhập mạnh mẽ * và * động.Đó là động vì bạn có thể thử gọi bất kỳ hàm nào với bất kỳ đối số kiểu nào và loại thông số không khớp sẽ không được phát hiện cho đến khi thời gian chạy. Một ngôn ngữ tĩnh sẽ phát hiện vấn đề đó tại thời gian biên dịch (hoặc ít nhất, trước thời gian chạy). –

+1

Không có ngôn ngữ thông dịch nào như vậy. Mọi ngôn ngữ có thể được thực hiện bởi trình biên dịch hoặc thông dịch viên. Và, trên thực tế, phần lớn các ngôn ngữ lập trình có ít nhất một triển khai của mỗi ngôn ngữ. Ngoài ra, hầu hết các triển khai ngôn ngữ hiện đại đều có cả trình biên dịch và trình thông dịch. Vì bạn đề cập đến Haskell: Hugs là một trình thông dịch Haskell. V8 là trình biên dịch JavaScript. PowerShell của Microsoft là một trình biên dịch. Một vài năm trước, các nhà phát triển Bash đã suy nghĩ về việc chuyển sang thực hiện được biên dịch. HotSpot JVM vừa là phiên dịch vừa là trình biên dịch. –

Trả lời

0

Tìm trong lệnh "sắp chữ" trong trình yêu thích của bạn. bash và ksh93 đều có thể thực thi các số nguyên và chuỗi, sử dụng tham chiếu (biến biến), v.v. Với ksh93, bạn cũng có thể thực hiện phép toán dấu chấm động và sử dụng các đối tượng với các thuộc tính. Đánh máy tĩnh không thực sự giúp bạn mua bất cứ thứ gì hữu ích trong các tập lệnh init và tương tự. Bạn chủ yếu sẽ đọc các tập tin và chạy các lệnh hệ thống - đó là những gì thực sự tốt. Hãy dành một chút thời gian với cuốn sách O'Reilly "học Korn Shell" trước khi quyết định rằng tất cả những Unixes khác được thiết kế ngu ngốc ...;)

+0

và "set -o nounset" sớm trong kịch bản ... – dannysauer

+0

Đây là một gợi ý khủng khiếp. Nếu OP không ngôn ngữ động, anh ta sẽ * ghét * shell scripting. Chúng năng động hơn bất kỳ ngôn ngữ kịch bản nào khác. –

+1

Câu trả lời này cung cấp một gợi ý để thực thi các loại trong một ngôn ngữ mà OP đã quen thuộc với một tập lệnh init có thể đã được viết. Tôi đoán tôi sẽ nhận được nhiều phiếu hơn nếu tôi vừa nói "điều này là không thể" hoặc "ở đây, sử dụng ngôn ngữ này mà ba người đã nghe nói về," :) – dannysauer

1

F# cung cấp kết hợp "loại an toàn, tính ngắn gọn, hiệu suất, expresivity và kịch bản".

+0

F # không phải là ngôn ngữ kịch bản. – shoosh

+3

Điều gì định nghĩa một ngôn ngữ kịch bản? Cú pháp nhẹ? Một REPL? F # có những ... – Brian

+0

được diễn giải thay vì được biên dịch. – shoosh

6

Thông thường, các ngôn ngữ được nhập tĩnh sẽ được biên dịch ngôn ngữ. Tôi đoán lý do là, phân tích thống kê các loại là khá tốn kém và bạn phải có một chiều sâu nhìn vào tất cả các mã bạn đang xử lý. Sau khi bạn đã làm điều đó nó cảm thấy như một sự lãng phí để không viết tất cả các thông tin đó vào một tập tin, do đó bạn không phải làm điều đó một lần nữa trong thời gian tới. Vì vậy, bạn nhanh chóng kết thúc với một ngôn ngữ biên soạn.

Mặt khác, để biến ngôn ngữ được biên dịch thành một ngôn ngữ "chưa được biên dịch" khá dễ dàng. Bạn chỉ cần không lưu trữ các kết quả của quá trình biên dịch ở bất cứ đâu nhưng thực thi chúng trực tiếp. Một trình biên dịch mà tôi biết cung cấp trình bao bọc như vậy là GHC, trình biên dịch chuẩn Haskell. Bạn có thể thêm #!/usr/bin/runhaskell vào tệp nguồn của bạn và sau đó trực tiếp thực hiện chúng. Và kể từ khi bạn đang có kế hoạch để được ra khỏi tiêu chuẩn, Haskell có vẻ như một sự phù hợp hoàn hảo;). Nhưng mong đợi một số thời gian khởi động khá lớn cho các kịch bản của bạn, bởi vì tất cả các phân tích "thời gian biên dịch" và tối ưu hóa không phải là miễn phí.

Haskell không được tạo cho shell scripting và nó là một ngôn ngữ chức năng, vì vậy nếu bạn chưa bao giờ thấy nó trước đây, có thể mất chút thời gian để làm quen. Nhưng nó có rất ít chi phí cú pháp và sức mạnh của các ngôn ngữ chức năng là trừu tượng, vì vậy tôi không thấy lý do tại sao bạn không thể tạo một thư viện mà làm cho kịch bản shell vui vẻ. Thậm chí còn có một số experimental Haskell shell, nhưng nó dường như là một bằng chứng về khái niệm hơn là một giải pháp thực sự.

Nói chung tôi sẽ nói chi phí của tất cả các phân tích kiểu là quan trọng, nhưng tôi khuyên bạn nên chọn ngôn ngữ được biên dịch tĩnh được yêu thích và tìm kiếm một trình bao bọc như runhaskell để thực thi các tập lệnh được viết trong đó.

+7

Không có ngôn ngữ * biên dịch * như vậy. Mọi ngôn ngữ có thể được thực hiện bởi trình biên dịch hoặc thông dịch viên. Và, trên thực tế, phần lớn các ngôn ngữ lập trình có ít nhất một triển khai của mỗi ngôn ngữ. Ngoài ra, hầu hết các triển khai ngôn ngữ hiện đại đều có * cả * trình biên dịch * và * một trình thông dịch. Vì bạn đề cập đến Haskell: Hugs là một trình thông dịch Haskell. V8 là trình biên dịch JavaScript. PowerShell của Microsoft là một trình biên dịch. Một vài năm trước, các nhà phát triển Bash đã suy nghĩ về việc chuyển sang thực hiện được biên dịch. HotSpot JVM vừa là phiên dịch và biên dịch –

2

google nhanh. F3, tập lệnh javaFX, Ngôn ngữ kịch bản lệnh Linden (kịch bản cho cuộc sống thứ hai), Không giống như nhận xét về câu trả lời đầu tiên F # có thể được sử dụng làm ngôn ngữ kịch bản http://blogs.msdn.com/chrsmith/archive/2008/09/12/scripting-in-f.aspx

Felix, Tuga, CFGScript, Talc, Angelscript và đoán thêm hơn tìm kiếm nhanh đó.

Douglas

1

Groovy. Theo mặc định nó là động, vịt gõ. Nhưng cũng hỗ trợ gõ tĩnh.

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