6

Là một lập trình viên, tôi thường xem xét một số tính năng của ngôn ngữ mà tôi hiện đang sử dụng và tự nghĩ "Đây là một việc khó làm cho một lập trình viên, và có thể được máy tự động chăm sóc".Bạn mong muốn điều gì là tự động trong ngôn ngữ lập trình yêu thích của mình?

Một ví dụ về tính năng như vậy là quản lý bộ nhớ, đã được tự động trong một thời gian bằng nhiều ngôn ngữ. Trong khi quản lý bộ nhớ không phải là khó để làm bằng tay hầu hết thời gian, làm nó hoàn toàn tất cả các cách thức thông qua ứng dụng của bạn mà không bị rò rỉ bộ nhớ là vô cùng khó khăn. Tự động hóa đã làm cho nó dễ dàng một lần nữa để chúng tôi lập trình có thể tập trung vào các câu hỏi quan trọng hơn.

Có bất kỳ tính năng nào mà bạn cho rằng ngôn ngữ lập trình phải tự động hóa vì tỷ lệ phần thưởng/độ khó quá thấp (ví dụ: ví dụ: đồng thời) không?

Câu hỏi này được dự định là động não về tương lai của chương trình và ngôn ngữ có thể làm gì để chúng tôi tập trung vào các nhiệm vụ quan trọng hơn, vì vậy hãy đăng mong muốn của bạn ngay cả khi bạn không nghĩ tự động hóa là thực tế/khả thi. Câu trả lời hay sẽ chỉ ra những thứ thực sự khó làm bằng nhiều ngôn ngữ, trái với ngôn ngữ đơn thuần.

Trả lời

9

Bất kể ngôn ngữ nào có thể tự động làm cho tôi, tôi sẽ muốn có cách làm cho bản thân mình.

+12

Tôi đoán bạn mã trong hội? Nếu không, bạn nên từ bỏ Java, Python, C# hoặc bất kỳ thứ gì bạn sử dụng, vì chúng tự động thực hiện 99,99% nhiệm vụ cho bạn. – Seb

+2

+1, bất kỳ thứ gì mà máy tính làm cho bạn sẽ chỉ là đúng .. hầu hết thời gian. Không bao giờ * tất cả * của thời gian. – gbjbaanb

+5

Không, tôi sử dụng C++ cho hầu hết những gì tôi làm. Nhưng tôi đã sử dụng các ngôn ngữ như PHP, VB vv nhân dịp và tôi nghĩ rằng tất cả họ có thể được cải thiện bằng cách cho phép truy cập vào các cơ chế cấp thấp hơn mà họ phải và thực hiện. Tôi chưa bao giờ hiểu tại sao các ngôn ngữ GC không thể hỗ trợ RAII (ví dụ: destructors) _and_ GC, chẳng hạn. –

5
exec("Build a system to keep the customer happy, based on requirements.txt"); 
+0

Rõ ràng tinh thần của câu hỏi là hỏi tính năng lập trình nào có thể được tự động hóa để bạn có thể dành nhiều thời gian hơn để tập trung vào việc xây dựng hệ thống đó để giữ cho khách hàng hài lòng ... – LordOfThePigs

+2

Tôi hy vọng rằng hệ thống cũng có thể viết requirements.txt (và ofcourse tiếp tục cập nhật nó 100 lần.) – Naveen

+0

@ Lord, tất nhiên; nhưng một chút hài hước không làm tổn thương ai, phải không? :) – Seb

5

Trong Java Tôi muốn một từ khóa làm cho toàn bộ lớp không thay đổi được.

Ví dụ:

public immutable class Xyz { 
} 

Và trình biên dịch sẽ cảnh báo tôi nếu có bất kỳ điều kiện bất biến nào bị hỏng.

+4

Bạn sẽ không muốn đó là một lỗi, không phải là một cảnh báo? – Zifre

+2

Điều này có thể hữu ích trong nhiều ngôn ngữ, không chỉ Java, và cũng có thể được sử dụng để giúp tự động hóa đồng thời. – LordOfThePigs

+3

Tính bất biến là một điều kiện rất nghiêm ngặt. Một đối tượng không thể "hơi" bất biến. Từ khóa 'bất biến' là một phần của hợp đồng giữa người dùng và tác giả của lớp. Nếu tác giả hứa hẹn bất biến, trình biên dịch phải thực thi nó. –

2

Trong C++, suy luận kiểu cho khai báo biến, vì vậy mà tôi không cần phải viết

for (vector<some_longwinded_type>::const_iterator i = v.begin(); i != v.end(); ++i) { 
    ... 
} 

May mắn này đang đến trong C++ 1x theo hình thức auto:

for (auto i = v.begin(); i != v.end(); ++i) { 
    ... 
} 
+1

Làm thế nào nó sẽ làm việc ra bạn muốn có một iterator const? –

+0

Đây là nỗi lo của tôi quá Neil. Tôi không mong đợi rằng việc thực hiện sẽ làm quá tải ngữ nghĩa một cách chính xác. Đây chắc chắn sẽ là một bổ sung thú vị cho ngôn ngữ này. –

+2

Câu hỏi của tôi hơi phức tạp - tôi hy vọng câu hỏi này sẽ cung cấp cho bạn một trình lặp dựa trên const'ness của 'v'. Nhưng nếu tôi thực sự muốn một trình biến đổi const thành một đối tượng không phải const, tôi sẽ phải yêu cầu nó, như bây giờ. Tôi không ở giữa ý tưởng 'tự động', nhưng chỉ vì tôi có thể ghi đè nó. –

0

Đối với các ngôn ngữ cung cấp quá tải của nhà điều hành, cung cấp quá tải được tạo tự động cho các hoạt động đối xứng khi chỉ xác định được một thao tác. Ví dụ, nếu lập trình viên cung cấp toán tử bình đẳng nhưng không phải là toán tử bất bình đẳng, ngôn ngữ có thể dễ dàng tạo ra một toán tử. Trong C++, điều tương tự cũng có thể được thực hiện đối với các nhà xây dựng bản sao và các toán tử gán.

Tôi nghĩ rằng việc tự động tạo một mặt của một phép toán đối xứng sẽ tốt đẹp. Tất nhiên, tôi chắc chắn sẽ muốn có thể nói rõ ràng không làm điều đó khi cần thiết. Tôi đoán cung cấp việc thực hiện cả hai bên với một trong số họ là riêng tư và trống rỗng có thể thực hiện công việc.

+0

FWIW, Haskell thực hiện việc này. –

+0

Yup ... luôn có một ngôn ngữ khác hoạt động tốt hơn. Eiffel có một số tính năng mà tôi thực sự thích cũng như đổi tên và khả năng xác định chính xác hoạt động bạn muốn kế thừa. Cuối cùng, tôi sẽ vẫn gắn bó với C++ cho các nhiệm vụ lập trình chung của tôi. –

+0

Các hợp đồng mã của Yea của Eiffel cũng rất tuyệt, nhưng theo ý kiến ​​của tôi thì có nhiều hơn là các “lời khẳng định”. Tuy nhiên, các hợp đồng mã, trở nên rất thú vị trong bối cảnh xác minh tĩnh. –

7

Concurrent programming/parallelism đó là (bán) tự động, trái ngược với việc phải gây rối với chủ đề, gọi lại và đồng bộ hóa. Có thể song song cho các vòng lặp, chẳng hạn như:

Parallel.ForEach(fooList, item => 
{ 
    item.PerformLongTask(); 
} 

chỉ được thực hiện bằng chiến thắng.

Một số ngôn ngữ nhất định đã hỗ trợ chức năng như vậy ở một mức độ. Đáng chú ý, F # có quy trình công việc không đồng bộ. Đến với việc phát hành .NET 4.0, thư viện ParallelExtensions sẽ làm cho đồng thời nhiều hơn dễ dàng hơn trong C# và VB.NET. Tôi tin rằng Python cũng có một số loại thư viện tương tranh, mặc dù cá nhân tôi đã không sử dụng nó.

Điều gì cũng sẽ mát mẻ là song song hoàn toàn tự động trong các ngôn ngữ purely functional, tức là không phải thay đổi mã của bạn thậm chí một chút và tự động chạy mã này gần tối ưu trên nhiều lõi. Lưu ý rằng điều này chỉ có thể được thực hiện với hoàn toàn là ngôn ngữ chức năng (chẳng hạn như Haskell, nhưng không phải CAML/F #). Tuy nhiên, các cấu trúc như ví dụ ở trên sẽ rất tiện dụng để tự động hóa song song trong các ngôn ngữ hướng đối tượng và các ngôn ngữ khác. Tôi có thể tưởng tượng rằng thư viện, mẫu thiết kế và thậm chí toàn bộ ngôn ngữ lập trình hướng tới hỗ trợ đơn giản và cao cấp cho song song sẽ ngày càng phổ biến trong tương lai gần, khi máy tính để bàn bắt đầu di chuyển từ 2 đến 4 và sau đó 8 lõi và lợi thế của sự tương tranh tự động trở nên rõ ràng hơn nhiều.

+0

Các phiên bản gần đây của MATLAB bắt đầu thêm các tùy chọn song song, và một trong số chúng là chính xác hơn hoặc ít hơn giống như ví dụ bạn đã cung cấp: PARFOR, một song song cho vòng lặp. Nó có vẻ dễ sử dụng và có thể tăng tốc đáng kể. – gnovice

+0

@gnovice: Vâng, nó sẽ có ý nghĩa đối với MATLAB để có một cái gì đó như thế. Không quen thuộc với gói bản thân mình, nhưng nó là tốt để thấy rằng nó di chuyển với xu hướng. – Noldorin

+0

Như tôi đã hiểu, toàn bộ đối số "lập trình phù hợp với lập trình chức năng" được thiết lập trên khái niệm rằng các đối số cho một hàm có thể được đánh giá theo thứ tự bất kỳ (và do đó song song) mà không ảnh hưởng đến tính chính xác của kết quả. Điều đó chắc chắn đúng đối với các ngôn ngữ đánh giá mong muốn như C và Perl. Nhưng (tôi nghĩ) Haskell xử lý nội bộ mọi chức năng như một chức năng của một đối số, sử dụng currying để xây dựng các hàm đa đối số - không có nghĩa là thứ tự đánh giá đối số chức năng thực sự * là * quan trọng đối với Haskell và các ngôn ngữ được đánh giá lười biếng khác ? –

4

Đồng thời. Đó là ý tưởng chính của tôi khi hỏi câu hỏi này. Điều này sẽ ngày càng quan trọng hơn với thời gian, vì các CPU hiện tại đã có tới 8 lõi logic (4 lõi + siêu phân luồng) và 12 lõi logic sẽ xuất hiện sau vài tháng. Trong tương lai, chúng ta sẽ có rất nhiều lõi theo ý của chúng tôi, nhưng hầu hết các ngôn ngữ lập trình chỉ giúp chúng ta dễ dàng sử dụng từng cái một.

Mô hình Chủ đề + Đồng bộ hóa được hiển thị bởi hầu hết các ngôn ngữ lập trình là cực kỳ thấp và rất gần với những gì CPU làm. Đối với tôi, mức hỗ trợ ngôn ngữ tương đương hiện tại tương đương với hỗ trợ quản lý bộ nhớ trong C: Không được tích hợp, nhưng một số thứ có thể được ủy nhiệm cho hệ điều hành (không phải là malloc).

Tôi muốn một số ngôn ngữ sẽ đưa ra một sự trừu tượng phù hợp làm cho mô hình Threads + Synchronization dễ dàng hơn, hoặc đơn giản là ẩn nó hoàn toàn cho chúng ta (giống như quản lý bộ nhớ tự động làm cho cũ/miễn phí cũ lỗi thời trong Java).

Một số ngôn ngữ chức năng như Erlang có danh tiếng có hỗ trợ đa luồng tốt, nhưng bộ chuyển đổi não cần thiết để lập trình chức năng không thực sự làm cho toàn bộ thử thách dễ dàng hơn nhiều.

+0

Hãy xem nội dung OpenMP. Nó có thể làm cong bộ não của bạn một chút với một cách tiếp cận khác để song song mà không bao gồm một số sự nhấn mạnh về luồng. Nó đã thay đổi quan điểm của tôi về chủ đề này. Erlang thu được rất nhiều sức mạnh từ việc không phải đối phó với việc đồng bộ hóa dữ liệu được chia sẻ không phải cho sự hỗ trợ đa luồng của nó. –

+0

Có, đồng bộ hóa âm thanh như nội dung nào đó phải tự động. Ý tôi là, thông thường không ai muốn dữ liệu của họ bị hỏng. Nó chỉ là tẻ nhạt để cố gắng tránh nó bằng cách mã hóa bản thân mình. – Silvercode

1

Trong C++, enum-to-string.

Trong Ada, ngôn ngữ xác định thuộc tính hình ảnh của loại được liệt kê là hàm trả về một chuỗi tương ứng với biểu diễn văn bản của giá trị điều tra.

C++ không cung cấp cơ sở sạch như vậy. Phải mất một vài dòng ma thuật vĩ mô tiền xử lý rất phức tạp để có được một tương đương thô.

+0

Java enums thực sự mạnh mẽ và cung cấp chức năng đó (mỗi thành viên của Enum có lớp riêng của nó, để cho phép các hàm enum rộng có thể được thực hiện khác nhau cho mỗi thành viên. Thật thú vị!) – LordOfThePigs

+0

+1. Thật đáng ngạc nhiên là tôi thường ước gì về tính năng đơn giản này. –

+0

Vấn đề trong C++ (và C) là giá trị enums không phải là khác biệt và có thể được coi là số nguyên Mong đợi compilerv để phân biệt các giá trị không phân biệt sẽ liên quan đến chi phí lớn. –

0

Mọi thứ LINQ thực hiện. C# đã làm hỏng tôi và bây giờ tôi thấy khó làm bất cứ điều gì với các bộ sưu tập bằng bất kỳ ngôn ngữ nào khác. Trong Python tôi sử dụng danh sách comprehensions rất nhiều, nhưng họ không phải là khá mạnh mẽ như LINQ. Tôi đã không tìm thấy bất kỳ ngôn ngữ nào khác mà làm việc với các bộ sưu tập dễ dàng như trong C#.

0

Trong môi trường Visual Studio, tôi muốn "Xóa sử dụng không sử dụng" để chạy trên tất cả các tệp trong dự án. Tôi tìm thấy nó mất một thời gian đáng kể để phải tự mở mỗi tập tin cá nhân và gọi hoạt động này của một cơ sở tập tin.

+0

Thử http://code.msdn.microsoft.com/PowerCommands –

4

.Net:

Một cảnh báo khi thao tác chuỗi với các phương pháp như Replace và không trả lại giá trị (chuỗi mới) cho một biến, bởi vì nếu bạn không biết rằng một chuỗi là không thay đổi vấn đề này sẽ làm hỏng bạn.

+0

Đồng ý. Vấn đề này đã làm tôi thất vọng khi làm việc với ngày tháng cũng vậy. Có lẽ nếu bạn có thể chỉ định một lớp là không thay đổi (như Fortyrunner gợi ý cho Java nhưng cũng sẽ hữu ích cho .NET) có thể có một cảnh báo trong tình huống này. –

+0

Tôi cũng sẽ thêm nó vào Java. – Seb

+0

Thú vị. Sẽ rất khó khăn để thực hiện trong trình biên dịch ngôn ngữ. Nhưng đó sẽ là một số liệu thú vị cho profilers. –

5

Trong Java, hãy tạo hạt ít chi tiết hơn.

Ví dụ:

bean Student 
{ 
    String name; 
    int id; 
    type1 property1; 
    type2 property2; 
} 

và điều này sẽ tạo ra một bean lĩnh vực tư nhân, accessors mặc định, toString, hashCode, bằng vv

0

Từ góc độ ngôn ngữ động, tôi muốn xem hỗ trợ công cụ tốt hơn. Steve Yegge có một số great post về điều này. Ví dụ, có rất nhiều trường hợp một công cụ có thể nhìn vào bên trong các đường dẫn mã khác nhau và xác định xem các phương thức hoặc hàm đã tồn tại và cung cấp tương đương với kiểm thử khói của trình biên dịch hay chưa. Rõ ràng, nếu bạn đang sử dụng rất nhiều và rất nhiều mã thực sự năng động, điều này sẽ không hoạt động, nhưng thực tế là, bạn có thể không, vì vậy nó sẽ là khá tốt đẹp nếu Python, ví dụ, sẽ cho bạn biết rằng. ToLowerCase() không phải là một hàm hợp lệ trong thời gian biên dịch, thay vì đợi cho đến khi bạn nhấn vào mệnh đề else.

s = "a Mixed Case String" 
if True: 
    s = s.lower() 
else: 
    s = s.ToLowerCase() 
0

Dễ dàng: khởi tạo biến trong C/C++ giống như C#. Nó có thể đã lưu cho tôi nhiều phiên gỡ lỗi trong mã của người khác.

Tất nhiên sẽ có từ khóa khi bạn không muốn bắt đầu một biến thể.

noinit float myVal; // undefined 
float my2ndVal;  // 0.0f 
2

Cà phê. Tôi có nghĩa là ngôn ngữ được gọi là Java - vì vậy nó sẽ có thể làm cho cà phê của tôi! Tôi ghét đứng dậy từ lập trình, đi đến nồi cà phê, và tìm ra ai đó từ tiếp thị đã lấy cốc cuối cùng và không làm một nồi khác.

+1

LMAO. Tôi đồng ý! Họ thậm chí còn bao gồm đậu nhưng không có đường. – Peter

2

Tính kiên trì, có vẻ như với tôi, chúng tôi viết quá nhiều mã để giải quyết sự kiên trì khi điều này thực sự là vấn đề về cấu hình.

+0

Sự kiên trì phải là vấn đề về cấu hình, nhưng một số nền tảng hỗ trợ trong đó cũng rất phức tạp. Sau đó, chúng tôi sẽ cần tự động hóa cấu hình bền vững để dễ dàng hơn. – Silvercode

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