2010-01-27 42 views
15

Có vẻ như tôi phải đồng ý với post này khi nó khẳng định rằngđộng Hầu hết các ngôn ngữ lập trình năng động

[...] mã trong ngôn ngữ tạo kiểu động sau ước tĩnh-gõ

Nhiều mã ngôn ngữ động tôi gặp phải thực sự có vẻ là khá static (suy nghĩ của PHP) trong khi các phương pháp tiếp cận động nhìn hơi vụng về hoặc không cần thiết để thay thế.

Phần lớn thời gian, nó chỉ là bỏ qua các chữ ký loại, trong đó, trong bối cảnh gõ/suy luận/gõ cấu trúc, thậm chí không phải ngụ ý nhập động.

Vì vậy, câu hỏi của tôi (và nó không có nghĩa là quá chủ quan), trong đó động ngôn ngữ hoặc lĩnh vực ứng dụng là tất cả những tính năng ngôn ngữ năng động tiên tiến hơn (couln't đó được nhân rộng trong tĩnh/biên soạn ngôn ngữ dễ dàng) thực sự và được sử dụng một cách tự nhiên.

Ví dụ:

  • Reflection
  • continuations First-class
  • Runtime đối tượng thay đổi/thế hệ
  • Metaprogramming
  • Runtime đánh giá đang
  • không tồn tại hành vi thành viên

Ứng dụng hữu ích cho các kỹ thuật như vậy là gì?

+0

Tôi không muốn trở thành người theo dõi, nhưng tôi nghĩ chúng tôi cần xác định "ngôn ngữ động" tốt hơn một chút, ít nhất là ngoài các tính năng này. Ví dụ, Haskell thường được coi là paragon của một ngôn ngữ tĩnh, nhưng nó có sự phản chiếu, tiếp tục, lập trình meta (xem mẫu Haskell) và đánh giá mã thời gian chạy. Chúng ta đang nói về gõ động hay tĩnh? Gửi động? "Năng động" là gì? – Chuck

+0

@Chuck: Vâng, bạn nói đúng và, thành thật mà nói, nó không phải là dễ dàng.Tôi chỉ cần gắn vào các tính năng mà tôi đề xuất, bao gồm tất cả ngôn ngữ kịch bản/ngôn ngữ được nhập động và làm phần còn lại cũ negativo (Không ai coi C++ là ngôn ngữ động);) – Dario

Trả lời

2

Tất cả các tính năng bạn liệt kê cũng có sẵn bằng các ngôn ngữ được nhập tĩnh một số có ràng buộc.

  • Phản ánh: Hiện tại trong Java, C# (không an toàn).
  • Tiếp tục hạng nhất: hỗ trợ bị hạn chế ở Scala (có thể là những người khác)
  • Thay đổi đối tượng thời gian chạy: Thay đổi loại đối tượng được hỗ trợ dưới dạng hạn chế trong C# với phương thức mở rộng (sẽ là Java 7) và loại ngầm chuyển đổi ở Scala. Mặc dù lớp mở không được hỗ trợ nhưng hầu hết các trường hợp sử dụng đều được bao phủ bởi các loại chuyển đổi.
  • Metaprogramming: Tôi sẽ nói Metaprogramming là tiêu đề cho rất nhiều tính năng liên quan như phản ánh, loại thay đổi trong thời gian chạy, AOP, vv

Vì vậy, không có nhiều trái mà chỉ được hỗ trợ bởi các ngôn ngữ động để bàn luận. Hỗ trợ ví dụ cho Reflection circumvents hệ thống kiểu nhưng nó rất hữu ích trong một số tình huống mà loại linh hoạt này là cần thiết. Điều này cũng đúng trong ngôn ngữ động.

Tính năng lớp mở được hỗ trợ bởi Ruby là thứ biên dịch ngôn ngữ sẽ không bao giờ hỗ trợ. Đó là dạng linh hoạt nhất của Metaprogramming (với tất cả các hàm ý: bảo mật, hiệu suất, bảo trì.) Bạn có thể thay đổi các lớp của nền tảng. Nó được Ruby on Rails sử dụng để tạo các phương thức của các đối tượng miền từ siêu dữ liệu khi đang di chuyển. Trong một ngôn ngữ gõ tĩnh bạn có ít nhất để tạo (hoặc tạo mã của) giao diện của đối tượng miền của bạn.

Nếu bạn đang tìm kiếm "hầu hết các ngôn ngữ dyman", tất cả homoiconic languages như LISP và Prolog là những ứng viên tốt. Điều thú vị là, C# hơi đồng điệu với các cây biểu thức trong LINQ.

+0

Cả hai phương pháp mở rộng cũng như implicits đều không làm thay đổi hoặc thậm chí mở rộng kiểu ** khi chạy ** - Do đó, 100% tĩnh. Hơn nữa câu hỏi này không phải là về những tính năng gì * độc quyền năng động * nhưng chúng được sử dụng ở đâu. Tôi không nghĩ rằng một trong những idiomatically sẽ sử dụng thế hệ đối tượng thời gian chạy trong. – Dario

+0

+1 cho phần còn lại mặc dù – Dario

+0

@Dario Có. Cả hai đều được gõ hoàn toàn tĩnh. Câu trả lời của tôi là nhiều hơn về vấn đề bạn cố gắng giải quyết với các tính năng ngôn ngữ khác nhau. Các ngôn ngữ được đánh máy tĩnh tìm các giải pháp khác với ngôn ngữ động cho cùng các vấn đề (như các ngôn ngữ chức năng tìm giải pháp khác với các ngôn ngữ bắt buộc). –

8

Một số ví dụ về ứng dụng rộng rãi trong những kỹ thuật trên là:

  • continuations làm cho sự xuất hiện của họ trong khuôn khổ web như Rails hoặc Seaside. Chúng có thể được sử dụng để cho phép API giả mạo ngữ cảnh cục bộ. Trong Seaside hoặc Rails điều này làm cho API hoạt động giống như một trình xử lý biểu mẫu GUI cục bộ hơn là một trình xử lý yêu cầu HTTP, nó phục vụ để đơn giản hóa nhiệm vụ mã hóa các phần tử giao diện người dùng của ứng dụng. Tuy nhiên, mặc dù nhiều ngôn ngữ động có hỗ trợ mạnh mẽ cho việc tiếp tục nhưng chúng không phải là duy nhất đối với loại ngôn ngữ này.

  • Phản ánh được sử dụng khá rộng rãi cho các trình lập bản đồ O/R và tuần tự hóa, nhưng nhiều ngôn ngữ tĩnh cũng hỗ trợ sự phản chiếu. Trên các ngôn ngữ gõ vịt, nó có thể được sử dụng để tìm hiểu tại thời gian chạy nếu một cơ sở được thực hiện bằng cách nhìn vào siêu dữ liệu của đối tượng. Một số trình soạn thảo O/R (và các công cụ tương tự) hoạt động bằng cách thực hiện truy cập vào các biến mẫu và chuyển hướng các bản cập nhật tới bản ghi được lưu trong bộ nhớ cache trong lớp truy cập dữ liệu. Điều này giúp làm cho sự bền bỉ tương đối minh bạch đối với nhà phát triển khi các trường truy cập trông giống như các biến cục bộ.

  • Thay đổi đối tượng thời gian chạy hơi hữu ích (nghĩ khỉ vá) nhưng chủ yếu là mánh lới quảng cáo. Không có nhiều việc sử dụng sát thủ thực sự cho nó đến với tâm trí ngay lập tức, nhưng mọi người chắc chắn sử dụng nó. Một cách sử dụng có thể cho nó là sửa chữa hành vi bị hỏng một chút khi subclassing không phải là một tùy chọn vì một lý do nào đó.

  • Lập trình meta là một định nghĩa khá mờ cho một thuật ngữ, nhưng được cho là generics và C++ templates là một ví dụ về metaprogramming - diễn ra trên các ngôn ngữ được gõ tĩnh. Trên các ngôn ngữ có hỗ trợ metaclass, metaclasses tùy chỉnh có thể được sử dụng để thực hiện các hành vi cụ thể như singletons hoặc đăng ký đối tượng.

    Một ví dụ về lập trình meta khác là phương thức #notImplemented: của Smalltalk, được gọi trên các lần thử để gọi các phương thức không tồn tại. Tên phương thức và tham số được cung cấp cho người triển khai #notImplemented: và sau đó có thể được sử dụng để xây dựng một lời gọi phương thức một cách phản ánh. Việc bẫy này có thể được sử dụng (ví dụ) để thực hiện các cơ chế proxy chung.

LISP lập trình viên sẽ cho rằng LISP là ngôn ngữ năng động nhất do hỗ trợ lớp học đầu tiên của nó trực tiếp với phân tích cú pháp của mã (được gọi là 'macro'). Cơ sở này làm cho việc triển khai DSLs tầm thường trong LISP - và tích hợp chúng một cách minh bạch vào cơ sở mã của bạn.

0

Cuối cùng nó không phải là ngôn ngữ viết mã động, đó là lập trình viên; và sẽ có một đường cong học tập để điều chỉnh các mẫu của bạn thành các kiểu bạn không quen. Vậy loại công việc nào có thể tận dụng tốt nhất khả năng năng động? Cái đầu tiên xuất hiện trong đầu tôi là middleware; giao diện giữa các hệ thống không đồng nhất; đặc biệt là những API hoặc API được tài liệu không hoàn hảo thay đổi rất nhiều và việc tuần tự hóa dữ liệu là động.

Tôi muốn nói bất cứ nơi nào bạn thấy REST và jason đang được áp dụng, ví dụ, bạn có thể tìm thấy mã động, ví dụ: javascript, php, perl, ruby, ... được phổ biến một phần vì chúng có khả năng thích ứng động.

Ngoài ra, có rất nhiều mã trình duyệt javascript đề cập đến phiên bản trình duyệt và tính không tương thích thương hiệu bằng kỹ thuật động.

+0

JSON có thể được phân tích cú pháp khá tĩnh và không thực sự yêu cầu đánh giá năng động mặc dù nó có thể sử dụng khá ngắn gọn trong ngữ cảnh này. – Dario

+0

Bạn nói đúng, tất nhiên. Bất kỳ điều này có thể được thực hiện tĩnh, bằng cách nào đó. Câu hỏi đặt ra là về kiểu mã và quan điểm. Đối với tôi, jason là dữ liệu được nhập từ vịt và phù hợp tốt với ngôn ngữ gõ vịt. Hãy nhớ rằng, json là gì, được khai báo tuần tự hóa đối tượng javascript - tự động định nghĩa, dữ liệu chưa được phân loại (bao gồm các đối tượng). – dkretz

2

Bạn nên truy cập Douglas Crockford's Wrrrld Wide Web và xem trình hướng dẫn của mình trên Javascript. Javascript thường được viết theo cách khá đơn giản và đơn giản, giống như hơi đơn giản C. Nhưng nó chỉ là bề mặt. Các từ khóa không thay đổi là một phần nhỏ của sức mạnh ngôn ngữ. Hầu hết nó nằm trong các đối tượng và các phương thức được xuất bởi hệ thống, và chúng hoàn toàn có thể thay đổi được. Bạn có thể thay thế/mở rộng các phương thức khi đang di chuyển, bạn có thể thay thế các phương thức hệ thống bắt nguồn từ khá sâu, làm tổ eval(), tải được tạo ra <SCRIPT> khi đang di chuyển, v.v. Điều này có thể sử dụng trong việc viết tất cả các loại tiện ích mở rộng ngôn ngữ, khung công tác, hộp công cụ và các loại ngôn ngữ như vậy. Thay vì 200 dòng mã chương trình của bạn bằng Javascript đơn giản, bạn viết 50 dòng để sửa đổi cách Javascript hoạt động và 50 dòng khác sử dụng cú pháp mới để hoàn thành công việc. Bạn có thể tạo toàn bộ các trang một cách nhanh chóng, bao gồm cả JS được nhúng trong chúng. Bạn chuyển cấu trúc trang web thành lưu trữ dữ liệu. Bạn thay thế phương pháp thường xuyên sử dụng của các đối tượng phổ biến, và của riêng bạn, để thay đổi hành vi của họ trên bay, thay đổi không chỉ trông mà còn chức năng của một trang web trong một cú nhấp chuột. Nó thực sự cảm thấy như Javascript trở thành một ngôn ngữ kim loại để sửa đổi các công cụ Javascript, và làm cho Javascript chức năng giống như một ngôn ngữ khác nhau, sau đó bạn sửa đổi nó bằng cách sử dụng đã được sửa đổi, và thực tế, ứng dụng cuối cùng của bạn mất hàng chục dòng cực kỳ trực quan nhận được ngôn ngữ làm chính xác những gì nó cần. Oh, và vá lỗi vô số lỗi và thiếu sót của việc thực hiện Javascript trên MSIE trong quá trình này.

1

tôi sẽ không yêu cầu bồi thường Lisp là "năng động nhất" (Tôi thậm chí không chắc chắn điều đó có nghĩa), nhưng lập trình Lisp thường xuyên làm những việc mà khó đến không thể bằng các ngôn ngữ khác:

  • tạo cấu trúc điều khiển mới
  • tạo cú pháp mới cho các cấu trúc hiện có (Tôi nghĩ mọi metaclass mà tôi từng thấy đều có dạng mặc định riêng)
  • mở rộng thời gian chạy (mỗi .emacs là phần mở rộng thời gian chạy, ví dụ: mất để viết lịch-chế độ cho trình soạn thảo khác?)

Yegge talks about it some here w.r.t. Emacs, ví dụ: phân tích cú pháp XML bằng cách chuyển đổi nó thành biểu thức s, viết hàm cho các thẻ bạn muốn xử lý và thực sự chạy nó.

0

Có, tôi cảm thấy JavaScript là tốt nhất.
JavaScript linh hoạt đến nỗi mọi người làm việc trên các ngôn ngữ khác nhau có các biến thể khác nhau của ngôn ngữ đó cho họ. Giống như Microsoft có thư viện Ajax có cú pháp kiểu .NET/C# điển hình. Ngoài ra còn có một số thư viện JavaScript sử dụng $ trông giống như cú pháp PHP. Tất cả của nó ở đó bởi vì JavaScript là sự bẻ khóa Làm thế nào nhiều ngôn ngữ khác mà người ta có thể nói mà có thể tạo điều kiện cho một cái gì đó như thế này?
Và người ta nên biết về tính năng đóng JavaScript là trạng thái của nghệ thuật và giúp tạo ra các thuật toán tuyệt vời với kết quả tuyệt vời.

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