Các ngôn ngữ gõ tĩnh và động có thể được coi là các công cụ khác nhau cho các loại công việc khác nhau không?


9

Vâng, những câu hỏi tương tự đã được đặt ra nhưng luôn luôn với mục đích tìm ra 'cái nào tốt hơn'.

Tôi đang hỏi bởi vì tôi đã trở thành một nhà phát triển chủ yếu trong JavaScript và thực sự không có bất kỳ kinh nghiệm nào khi viết bằng các ngôn ngữ được nhập tĩnh.

Mặc dù vậy, tôi chắc chắn thấy giá trị khi học C để xử lý các hoạt động đòi hỏi ở mức mã thấp hơn (mà tôi cho rằng có liên quan nhiều đến tĩnh so với động ở cấp độ trình biên dịch), nhưng những gì tôi đang cố gắng che giấu là liệu có bối cảnh dự án cụ thể (có thể là một số loại hoạt động sử dụng nhiều dữ liệu động nhất định không?) liên quan đến những thứ khác ngoài hiệu năng trong đó có ý nghĩa hơn nhiều khi đi với Java hoặc C # so với một cái gì đó như Python.


5
Câu trả lời là "Có". Mỗi loại ngôn ngữ - thực sự là mỗi ngôn ngữ - có điểm mạnh và điểm yếu riêng và do đó phù hợp hơn với một số nhiệm vụ so với các ngôn ngữ khác.
ChrisF

Thật thú vị khi bạn sử dụng C làm ví dụ, vì đó là loại ngôn ngữ được gõ yếu nhất mà bạn có thể che giấu và vẫn gọi nó là gõ tĩnh. C không nhanh vì hệ thống loại, kiểm tra loại xảy ra tại thời gian biên dịch. C nhanh vì có ít hoặc không có biện pháp bảo mật và kiểm tra để ngăn bạn tự bắn vào chân mình. và bởi vì nó biên dịch thành nhị phân riêng.
sara

Câu trả lời:


10

Vâng chắc chắn.
Gõ động có những lợi thế nhất định trong trường hợp bạn muốn có thể coi mọi thứ là một kiểu duy nhất. Tuần tự hóa / giải tuần tự hóa là một trong những ví dụ kinh điển. Đây là lý do tại sao rất nhiều chương trình Web được thực hiện bằng các ngôn ngữ kịch bản được gõ động: chúng rất phù hợp với một nhiệm vụ bao gồm rất nhiều chuyển đổi tất cả các loại dữ liệu sang và từ chuỗi.

Mặt khác, đối với lập trình ứng dụng, các ngôn ngữ tĩnh hoạt động tốt hơn nhiều vì cố gắng coi mọi thứ là một loại không thường xuyên là một yêu cầu. Bạn thường muốn có cấu trúc dữ liệu hiệu quả với dữ liệu được biểu diễn như chính nó và không được chuyển đổi sang các loại khác rất thường xuyên. Điều này làm cho các tính năng của gõ động trở thành một nhược điểm thay vì lợi ích, đó là lý do tại sao các ứng dụng hầu như chỉ được viết bằng các ngôn ngữ gõ tĩnh.


3
@Erik: Tôi không chắc là tôi thậm chí còn nói thế. Mọi thứ thay đổi trong quá trình phát triển. Yêu cầu có thể thay đổi hoặc bạn thấy rằng bạn không thực hiện đúng yêu cầu và mã cần được cập nhật. Việc có thể thay đổi một điều và sử dụng các lỗi trình biên dịch kết quả để chỉ cho bạn nơi tìm mọi thứ cần thay đổi cung cấp một sự thúc đẩy lớn cho sự thuận tiện và tốc độ phát triển mà bạn mất trong các ngôn ngữ không có kỹ thuật đó. Đó là một trong những lý do tại sao bạn không thấy các ứng dụng phức tạp được phát triển bằng ngôn ngữ động.
Mason Wheeler

9
@Mason Wheeler: Câu trả lời rất hay. + 1 Tôi sẽ thêm rằng kiểm tra kiểu tĩnh cũng giúp tìm ra lỗi sớm hơn bằng cách kiểm tra tính chính xác của loại trình biên dịch. Ví dụ, tôi đã gỡ lỗi chương trình Ruby 200 dòng ngày hôm qua và có hai lỗi liên quan đến loại mà tôi chỉ có thể phát hiện bằng cách chạy chương trình. Tôi không muốn nghĩ những gì xảy ra trong một dự án 100000 dòng. Vì vậy, gõ động giúp bạn linh hoạt hơn, điều này tốt trong bối cảnh bạn đã mô tả, với mức giá mà bạn không thể tìm thấy một số lỗi nhất định tại thời điểm biên dịch. Vì vậy, gõ tĩnh không chỉ liên quan đến hiệu quả, mà còn liên quan đến tính chính xác.
Giorgio

1
@MasonWheeler Hai năm và nhiều C # và Java hơn tôi đã mặc cả sau này bây giờ tôi sẽ không đồng ý với một vài điều. Các ứng dụng web phức tạp được thực hiện hoàn toàn với các ngôn ngữ động. Biên dịch so với thời gian chạy là vô nghĩa khi bạn có thể thực hiện các thay đổi có thể nhìn thấy ngay lập tức. Và tôi đã phát triển ý kiến ​​rằng tất cả sự ồn ào về các loại có ý nghĩa hơn trong ngôn ngữ thủ tục so với ngôn ngữ được cho là do OOP điều khiển khi dữ liệu không nên thay đổi liên tục ngay từ đầu.
Erik Reppen

1
@Erik: * wince * Trước hết, đánh giá kiểu gõ tĩnh là một khái niệm của Java giống như đánh giá xe hơi là một khái niệm của Pinto. Và thứ hai, theo định nghĩa, mọi thứ mà các thay đổi có thể "hiển thị ngay lập tức" không phải là một chương trình quá phức tạp, bởi vì ngay cả với phần cứng hiện đại, các chương trình phức tạp cũng mất một lượng thời gian hợp lý để chuẩn bị mã, cho dù đó là trình biên dịch hay trình thông dịch ( hoặc một trình biên dịch JIT) đang chuẩn bị. Ngay cả các ứng dụng web ấn tượng nhất cũng có xu hướng là các chương trình rất đơn giản được hỗ trợ bởi các cơ sở dữ liệu rất phức tạp, đây là một vấn đề hoàn toàn khác.
Mason Wheeler

1
Khả năng tạo ra sự trừu tượng phức tạp là trực giao để có một hệ thống kiểu tĩnh so với động, và cũng trực giao với tốc độ. Có những hệ thống kiểu tĩnh ngoài kia cho phép trừu tượng hóa mạnh mẽ (mặc dù đôi khi phức tạp). Có các thay đổi xuất hiện ngay lập tức cũng độc lập với hệ thống loại: bạn chắc chắn có thể xây dựng trình thông dịch cho các ngôn ngữ được nhập tĩnh.
Rufflewind

4

Cách tôi nhìn nhận là, nếu bạn có thể làm việc một cách tự nhiên trong một ngôn ngữ được gõ tĩnh, thì gõ tĩnh là cách để đi. Nói chung, mục đích của một hệ thống loại là để ngăn bạn thực hiện các hoạt động với ngữ nghĩa không xác định - như thế nào (string) "hello" + (bool) true. Có thêm mức độ an toàn ngăn bạn thực hiện các hoạt động này có thể là một cách tốt để ngăn chặn các lỗi trong mã của bạn, ngay cả khi không có các bài kiểm tra đơn vị mở rộng. Đó là, an toàn kiểu cung cấp một mức độ tin cậy khác về tính chính xác ngữ nghĩa của mã của bạn.

Nhưng hệ thống loại rất khó để có được đúng. Tôi không tin rằng có một hệ thống kiểu hoàn hảo trong tự nhiên tại thời điểm viết bài này. (Theo "hệ thống loại hoàn hảo", ý tôi là một hệ thống loại nghiêm ngặt, không yêu cầu chú thích mã dài dòng, không tạo ra lỗi loại dương tính giả và người lập trình có thể hiểu lỗi loại dễ dàng.) khó hiểu các hệ thống loại thực sự tốt tồn tại. Khi tôi đang học Haskell, tôi không thể nói cho bạn biết số lỗi loại tối nghĩa mà tôi gặp phải khi cố gắng viết những gì trông (với tôi) như mã chính xác. Thông thường mã không thực sự chính xác (đó là một điểm có lợi cho hệ thống loại), nhưng nó đã mất rất nhiềucông việc để hiểu các thông báo lỗi từ trình biên dịch, để tôi có thể sửa các vấn đề tiềm ẩn. Trong các ngôn ngữ OO, bạn cuối cùng có thể thấy mình suy nghĩ "lập luận này nên contravariant với các loại đầu vào, không hiệp biến!", Hoặc (nhiều khả năng) quay trở lại typecasts để thoát khỏi bờ cõi của các hệ thống kiểu. Loại hệ thống có thể nhận được nhiều khó khăn hơn bạn nghĩ.

Đối với những gì đáng giá, tôi hiểu rằng khó khăn trong việc đưa ra các hệ thống loại tốt là một phần trong những gì thúc đẩy Gilad Bracha đưa vào hỗ trợ hệ thống loại có thể cắm được trong Drameak.


Kiểm tra đơn vị WRT, tôi hoàn toàn đồng ý. Bạn luôn thấy mọi người nói rằng "nếu bạn có bài kiểm tra đơn vị tốt, họ có thể xác minh tính chính xác của loại cho bạn." Điều đó luôn nhắc nhở tôi về cách Paul Graham (người tin tưởng mạnh mẽ rằng gõ động luôn là một điều tốt) nói rằng một ngôn ngữ khiến bạn tự làm công việc của nhà biên dịch cho nó là một ngôn ngữ không hoàn hảo. Sorta khiến bạn dừng lại và suy nghĩ ...
Mason Wheeler

Tôi nghĩ rằng nhiều mối lo ngại về 'mối nguy hiểm' của các ngôn ngữ được gõ động không thể tính đến cách chúng ta viết nội dung này. Phần lớn Python và JS có thể được viết theo kiểu console. Vít biên dịch so với thời gian chạy, tôi có thể dùng thử ngay bây giờ và xem điều gì sẽ xảy ra. Tôi nghĩ rằng bạn đang ở một điểm rất tốt, tuy nhiên. Không có gì làm tôi điên rồ hơn trong việc phát triển web phía máy khách hơn là khi tất cả các nhà cung cấp trình duyệt tốt được cho là vượt qua khó hiểu về mã khủng khiếp trong khi IE6 hoặc 7 không thực hiện được, đó là điều tồi tệ hơn là ... mút trong một thời trang điển hình hơn.
Erik Reppen

Các loại không khớp của mason-wheeler là lỗi ba phần và không phải ngôn ngữ động không kiểm tra các loại, đó chỉ là trong thời gian chạy. Tôi là kinh nghiệm của tôi, hầu hết các ngôn ngữ tĩnh đều có cùng mức độ bao phủ của các bài kiểm tra đơn vị, chúng không bị mất bất kỳ bài kiểm tra nào khi kiểm tra trình biên dịch có các loại trước thời hạn và các ngôn ngữ động không phải thêm các bài kiểm tra cụ thể để kiểm tra các loại , hệ thống thời gian chạy kiểm tra các loại của bạn, nếu kiểm tra đơn vị của bạn bao gồm phương thức của bạn, nó sẽ bắt chúng.
jbtule

4

Chúng là những công cụ khác nhau, nhưng nó không phải bởi hiệu suất. Đó là tất cả về sự phức tạp .

Các ngôn ngữ động thường hướng đến sự linh hoạt tối đa, và nó mang lại sự thiếu xác nhận và một loại đảm bảo. Sau đó, nó rất mạnh trong các chương trình quy mô nhỏ, nhưng hầu như không thể duy trì các chương trình quy mô lớn (độ phức tạp).

Ngôn ngữ tĩnh thường nhằm xác nhận tối đa. Mục tiêu đầu tiên của họ thường là bắt lỗi (hoặc lỗi) càng sớm càng tốt. Nhiều đảm bảo được thực hiện để xác nhận. Sau đó, việc học và bắt đầu khó hơn, nhưng khi các chương trình lớn hơn, nó cung cấp xác nhận chương trình tốt hơn với chi phí thấp hơn nhiều (nỗ lực mã hóa).

Do đó, các ngôn ngữ động thường phù hợp với các chương trình nhỏ (ý tôi là rất nhỏ) như các trang web động, DSL của trình duyệt web (không dành cho các ứng dụng trình duyệt!) Hoặc shell script. Ngôn ngữ tĩnh phù hợp hơn cho các chương trình hệ thống hoặc bất kỳ nội dung nào khác.

Trên mô tả là một cái gì đó về ngôn ngữ rất thuần túy động hoặc tĩnh. Hầu hết các ngôn ngữ thực tế nằm ở giữa chúng, và cho thấy các đặc điểm khác nhau.

Xem tại đây để biết thêm chi tiết: https://softwareengineering.stackexchange.com/a/105417/17428


1
"Ngôn ngữ động thường phù hợp với các chương trình nhỏ (ý tôi là rất nhỏ)": Theo kinh nghiệm của tôi, bạn có thể sử dụng ngôn ngữ động cho các ứng dụng cỡ trung bình (và tất nhiên, có những người sử dụng chúng thành công cho các ứng dụng lớn). Tôi đồng ý rằng cơ sở mã càng lớn, bạn càng có thể kiếm lợi từ các kiểm tra tĩnh được cung cấp bởi các ngôn ngữ tĩnh.
Giorgio

2
@Giorgio Chà, có lẽ vì tôi nghiện những thứ xác nhận tĩnh. Điều đó thật ngọt ngào với tôi, và theo nghĩa đen tôi không thể sống thiếu chúng ngay cả ở quy mô nhỏ: p
Eonil

Tôi thấy những lợi thế của ngôn ngữ tĩnh (và tôi đã nâng cao câu trả lời của bạn). Gần đây tôi đã sử dụng Python và Common Lisp và tôi thừa nhận rằng trong thực tế bạn sẽ có kết quả tốt nếu bạn sử dụng một thiết kế sạch và đặc biệt là trong Python, nếu bạn viết đủ các bài kiểm tra. Các ngôn ngữ này có thể rất hiệu quả để xây dựng một nguyên mẫu mà sau đó có thể dễ dàng biến thành mã sản xuất của bạn. Nhưng, vâng, đối với các dự án phức tạp hơn, tôi muốn có nhiều sự giúp đỡ nhất có thể, vì vậy tôi thích một ngôn ngữ tĩnh.
Giorgio

1

Tôi hiện đang lập trình bằng các ngôn ngữ loại tĩnh (C # và F #), nhưng tôi thích lập trình bằng các ngôn ngữ động (Smalltalk, Ruby). Có rất nhiều ưu và nhược điểm mà mọi người liên kết với một loại so với loại khác liên quan đến ngôn ngữ hơn là khi bạn thực thi các loại. Ví dụ, các ngôn ngữ động thường có cú pháp gọn gàng hơn, ngắn gọn hơn, tuy nhiên F # và OCaml với hệ thống suy luận kiểu của chúng có cú pháp rõ ràng như bất kỳ ngôn ngữ động nào. Và với kiểu gõ tĩnh, bạn có cấu trúc lại tự động thực sự và tự động hoàn thành, nhưng Smalltalk, với toàn bộ mã nguồn trong cơ sở dữ liệu và mỗi phương thức được biên dịch riêng, là ngôn ngữ đầu tiên thực sự có cấu trúc lại tự động nghiêm trọng và nó hoạt động rất tốt. Cuối cùng, các ngôn ngữ động và tĩnh hiện đại ngày nay là loại an toàn, đó là khía cạnh quan trọng nhất trong hệ thống loại của bạn,


Đôi khi tôi đã nghi ngờ rằng việc gõ tĩnh chỉ là một phần nhỏ trong phương trình của những gì làm cho một ngôn ngữ trở nên linh hoạt hơn hoặc ít hơn. Tôi nghĩ điều mà tôi cũng bắt đầu nhận ra là rất nhiều nhà phát triển thích một bộ đường ray thoải mái để hướng dẫn họ hơn là có quyền tự do làm những việc nguy hiểm vô lý như làm quá tải các nhà khai thác. VS đôi khi khiến tôi muốn đá cún con nhưng chắc chắn tôi đã tò mò về F # và những gì bạn nói về nó khiến tôi càng tò mò hơn. Tôi cho rằng đây là một cái gì đó không chỉ là thứ C # mà bạn có thể chuyển sang một loại bao quát hơn một cách ngầm định.
Erik Reppen

@erik, Ồ vâng, nhiều hơn là bắt chước gõ và var: F # Kiểu suy luận
jbtule

-1

Bây giờ là năm 2015, có thêm một số đoạn thú vị cho cuộc trò chuyện:

  1. Các phần quan trọng của thế giới phụ trợ doanh nghiệp đang xem xét hoặc bắt đầu sử dụng Python (động) thay cho Java (tĩnh nghiêm ngặt)
  2. Thế giới lối vào doanh nghiệp đang chứng kiến ​​những thứ như AngularJS v2, dựa trên TypeScipt: một phần mở rộng được gõ của Javascript.

Vì vậy, những người phụ nữ đã mệt mỏi với chiếc áo khoác thẳng không cần thiết của việc gõ nghiêm ngặt, trong khi những người ở phía trước đã mệt mỏi với sự hỗn loạn của kiểu gõ năng động.

Khá mỉa mai: Tôi tự hỏi liệu họ sẽ gặp nhau ở giữa, hay lướt qua nhau với sự bùng nổ âm thanh của một thời hạn đi qua ...? ;)


Trừ khi bạn cung cấp bất kỳ bằng chứng nào, tôi sẽ tuyên bố rằng trong trường hợp xấu nhất thế giới phụ trợ đang chuyển sang Go, nhưng thần cấm mọi thứ linh hoạt năng động. Chuyện hoang đường rằng một ngôn ngữ lập trình tĩnh luôn có rất nhiều buổi lễ đã được trình làng từ lâu với các hệ thống suy luận mạnh mẽ hơn và triển khai REPL vững chắc
Den

Có rất nhiều đầu được gõ động được sử dụng trên quy mô lớn. Django nói riêng rất phổ biến trong ngành báo chí và đang điều hành các kết thúc cho NYT, Người bảo vệ và Bưu điện Washington. Walmart đang chạy trên Node. Huyền thoại duy nhất là ý tưởng mà bạn không thể viết theo tỷ lệ mà không có kiểu tĩnh. Và sau khi dành một chút thời gian suy nghĩ về một số thảm họa cơ sở mã di sản Java mà tôi gặp phải, tôi nghĩ rằng những người thoải mái làm việc đó sẽ tốt hơn cho dù họ đang làm việc với tĩnh hay động.
Erik Reppen

Thật vậy, tôi muốn có một nhóm Python lành nghề trong dự án doanh nghiệp lớn của mình, thay vì một người Java nghèo. Tôi phải làm rõ vị trí của mình: Tôi đã đăng câu trả lời trên như một đánh giá về
Cornel Masson

Thật vậy, tôi muốn có một nhóm Python lành nghề trong dự án doanh nghiệp lớn của tôi, hơn là một nhóm Java nghèo. Chỉ cần làm rõ: Tôi đã đăng câu trả lời ở trên như một quan sát về các xu hướng tôi đang thấy trong cơ sở khách hàng, mạng công nghiệp và nghiên cứu chung của tôi. Truyền thống phụ trợ nghiêm ngặt là chấp nhận ít nghiêm ngặt hơn, truyền thống lỏng lẻo hơn, nhiều hơn. Nó thậm chí không phải là một ý kiến ​​về "đúng" (nếu có) - không chắc tại sao tôi lại bị hạ thấp. Có lẽ trớ trêu đã mất ...
Cornel Masson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.