Một kiến ​​thức sâu sắc về C ++ sẽ giúp bạn học các ngôn ngữ khác nhanh hơn / dễ dàng hơn? [đóng cửa]


9

Có khả năng ai đó đã học tất cả các khía cạnh chính của C ++ và biết rất rõ các nguyên tắc cơ bản của ngôn ngữ, sẽ học các ngôn ngữ khác (như Python, Perl, Java) nhanh hơn và dễ dàng hơn không?


9
Tôi cho rằng C ++ đủ khác biệt so với hầu hết các ngôn ngữ khác để khiến việc lấy thứ khác trở nên khó hiểu hơn (nếu đó là ngôn ngữ duy nhất bạn biết). Nhiều ngôn ngữ chia sẻ cú pháp của C ++, nhưng một số ngôn ngữ đã phát triển theo cùng một hướng. C ++ có rất nhiều hành trình lịch sử chỉ dành riêng cho C ++. Đặt cược tốt nhất của bạn để nhanh chóng chọn ngôn ngữ mới là chỉ tập trung vào việc học các ngôn ngữ khác nhau từ các mô hình khác nhau. Bạn càng trở nên quen thuộc với các mô hình, bạn sẽ càng nhanh chóng nhận được những thứ khác từ các mô hình đó.
KChaloux

3
Tôi không nghĩ rằng việc biết C ++ mang lại cho bạn một lợi thế để học các ngôn ngữ khác nói chung. Nó thực sự phụ thuộc vào những ngôn ngữ khác mà bạn sẽ học. Giáo sư ngôn ngữ lập trình của tôi từng nói rằng chúng ta nên tập trung vào việc hiểu các khái niệm chung: điều này chắc chắn sẽ giúp việc học ngôn ngữ cá nhân dễ dàng hơn nhiều.
Giorgio

9
Học một ngôn ngữ chuyên sâu là một khởi đầu tốt cho việc học lập trình nói chung, ngoại trừ việc bạn có thể nhầm lẫn giữa bí quyết cụ thể về ngôn ngữ với kiến ​​thức chung. Modern C ++ là một ngôn ngữ tuyệt vời, nhưng một khi bạn đã đạt đến trình độ trung cấp, bạn sẽ kiếm được lợi nhuận lớn từ việc tìm hiểu các quan điểm khác - có thể xem OCaml và Ruby ngay cả khi bạn sẽ không bao giờ sử dụng chúng một cách nghiêm túc. Khi bạn là một lập trình viên ổn định và có thể phân biệt giữa những thứ cụ thể và ngôn ngữ chung, việc làm việc hiệu quả trong các ngôn ngữ mới trở nên khá dễ dàng, mặc dù việc thành thạo luôn cần có thời gian.
amon

1
So với cái gì? Học một ngôn ngữ khác tốt, biết C ++ tốt nhưng không sâu sắc, không biết gì cả?
Telastyn

2
Có, nhưng cũng có cách khác. Biết Ocaml hoặc Scheme làm cho nhiều tính năng mới của C ++ 11 dễ hiểu hơn
Basile Starynkevitch

Câu trả lời:


12

Trong các điều khoản chung

Kiến thức sâu sắc về bất kỳ ngôn ngữ lập trình nào có khả năng giúp bạn tiếp thu các ngôn ngữ khác nhanh hơn. Điều đó là một phần bởi vì lập trình là một cách suy nghĩ nhiều hơn là học cú pháp. Hầu hết các thực hành lập trình sẽ đúng với hầu hết các ngôn ngữ lập trình khác. Đó là lý do tại sao mọi người nói rằng bạn luôn học ngôn ngữ lập trình thứ hai nhanh hơn ngôn ngữ thứ nhất.

Trong điều khoản cụ thể

C ++ là ngôn ngữ cho phép 'kiểm soát' lớn hơn nhiều so với các ngôn ngữ khác. Điều này có thể là tốt và xấu. Ví dụ, một khẩu súng thật tốt hơn súng hơi khi bạn đi trong rừng (vì bạn thực sự có thể bắn hạ một thứ gì đó với nó), nhưng nó cũng nguy hiểm hơn cho bạn và những người xung quanh. C ++ có các khái niệm như quản lý bộ nhớ mà bạn không cần phải lo lắng trong hầu hết các ngôn ngữ khác. Tuy nhiên, việc nắm vững các khái niệm này là rất xa vời ngay cả khi làm việc với các ngôn ngữ quản lý bộ nhớ tự động. Bạn cũng có thể thực hiện các thao tác theo bit và đi xuống thấp hơn nhiều so với 'kim loại' với ngôn ngữ như C ++. Ngay cả một sự hiểu biết cơ bản trong các lĩnh vực đó có thể giúp bạn rất nhiều với tư cách là một lập trình viên trong bất kỳ ngôn ngữ nào.

Ý kiến ​​cá nhân

Cá nhân tôi đã học Java đầu tiên trong gần 3 năm trước khi học C ++ và tôi nên nói rằng tôi rất tiếc về điều đó (khóa học uni ...). Điều này làm cho việc học C ++ (tôi vẫn đang học - xa kiến ​​thức 'sâu sắc': D) không đơn giản như tôi muốn. Nếu tôi đã làm nó theo cách khác xung quanh tôi sẽ nói rằng nó sẽ dễ dàng hơn nhiều đối với tôi. Đặc biệt là khi bạn biết TẠI SAO một cái gì đó được thực hiện theo một cách cụ thể, và không chỉ yên tâm về tính tự động của ngôn ngữ. Nếu tôi được phép đưa ra ý kiến, tôi sẽ đề xuất: C (cho các mô hình lập trình cơ bản và phổ quát) -> C ++ (để hiểu cơ bản về OOP cùng với quản lý bộ nhớ) -> Sau đó, bạn có thể đi vào bất kỳ ngôn ngữ OOP 'thực' nào với a nền tảng tốt hoặc bạn có thể tiếp tục với các chủ đề nâng cao hơn trong C ++, tất cả tùy thuộc vào những gì bạn '


3
Tôi rất vui vì trường đại học của tôi đã bắt đầu với pascal. Sau đó, chúng tôi đã chuyển sang C (cho phần quản lý bộ nhớ và hoạt động bit) và cuối cùng đã chuyển sang java cho oop (mặc dù điều này tất nhiên có thể là bất kỳ ngôn ngữ oo nào khác). Thành thật mà nói, tôi thấy khá đáng lo ngại khi có bao nhiêu trường đại học bắt đầu với java. Bạn chắc chắn sẽ học java (và quan trọng hơn là OOP), vì OOP thực sự quá phức tạp đối với những người mới bắt đầu vẫn đang vật lộn với sự khác biệt giữa ORAND
Lovis

2
@Doval: Bộ sưu tập rác cho bạn ảo tưởng về việc không phải lo lắng về việc quản lý bộ nhớ. Chỉ cần nhìn vào các chương trình mã được quản lý thường xuyên bị rò rỉ bộ nhớ vì một số tham chiếu vẫn còn hiệu lực ở một nơi không mong muốn (các bộ sưu tập là một người phạm tội lâu năm) để thấy điều này thực sự ảo tưởng như thế nào.
Mason Wheeler

1
@Doval: Kích thước sai, vị trí, căn chỉnh: chính xác làm thế nào để thực hiện bất kỳ điều nào trong những điều này trong ngôn ngữ hướng đối tượng khi trình biên dịch biết kích thước phù hợp và trình phân bổ xử lý vị trí và căn chỉnh? Giải phóng sớm: đây chính xác là những gì mà GC cần phải ngăn chặn, vì vậy việc nói rằng nó không liên quan đến cuộc thảo luận này chỉ là sự thật. Nhưng nó làm như vậy với chi phí biến mọi phân bổ thành rò rỉ bộ nhớ. Và không dậm chân dữ liệu của các đối tượng khác là vấn đề kiểm tra giới hạn , không phải là vấn đề thu gom rác.
Mason Wheeler

2
C ++ đòi hỏi rất nhiều học tập, đó là việc triển khai C ++ cụ thể nhưng sẽ không bao giờ được sử dụng bên ngoài C ++ vì các tiện ích vô tận của nó, đó là các thư viện và các hệ thống khác nhau. Theo kinh nghiệm của tôi, tất cả những người viết C ++ về cơ bản đều đồng ý rằng tất cả C ++ đều được viết kém và đầy những điều kỳ quặc và kỳ quặc mà chủ yếu là cụ thể về C ++. Học theo cách của bạn xung quanh mỏ đó sẽ không tạo ra bất cứ điều gì hữu ích trong các ngôn ngữ khác khi hầu hết các ngôn ngữ đều thiếu hầu hết các vấn đề mà C ++ gặp phải.
Jimmy Hoffa

2
@Doval: Vâng, đó là toàn bộ quan điểm của tôi: những điều này là không thể giải quyết được trong trường hợp chung , đó là lý do tại sao chúng cần được xử lý bởi một người thông minh, không phải là thuật toán, để được xử lý chính xác. Và nói rằng "đó không phải là một sự rò rỉ, đó là một chương trình không hiệu quả" chỉ là cắt tóc theo ngữ nghĩa; Đối với người quan sát bên ngoài, hành vi của chương trình giống như chương trình bị rò rỉ bộ nhớ, đặc biệt là trong bối cảnh các hệ thống đa nhiệm trong đó bộ nhớ bị nén khi tải có thể gây ra sự cố nghiêm trọng.
Mason Wheeler

9

Tiếc là không có. Đây thực sự là một vấn đề lớn khi dạy C ++ trong các lớp lập trình, đặc biệt là các lớp cấp độ mới bắt đầu: bạn có thể học các nguyên tắc lập trình hoặc bạn có thể học ngôn ngữ C ++, nhưng ngôn ngữ C ++ có quá nhiều cạm bẫy và các vấn đề nhỏ ngu ngốc để học cả hiệu quả trong phạm vi của một lớp học một học kỳ!

Có nhiều điều đã được thử trong C ++ và cuối cùng trở thành thành ngữ trong ngôn ngữ thông qua quán tính, đó là hầu hết mọi ngôn ngữ khác đã xem xét và từ chối vì hóa ra đó là một sai lầm rất lớn. Những cái chính là Mẫu của C ++ và mô hình đối tượng của C ++ (các đối tượng là loại giá trị không bao giờ là một điều tốt, bởi vì nó phá vỡ sự thay thế Liskov và chính bản thân OOP.)

Vì vậy, nếu bạn có kiến ​​thức sâu về C ++ trước tiên và sau đó bạn muốn học các ngôn ngữ lập trình khác, sẽ có rất nhiều mâu thuẫn có hại và phản tác dụng mà bạn sẽ phải học để có hiệu quả với các ngôn ngữ lập trình khác.


4
Có nhiều lý do Java và C # có hệ thống khuôn mẫu yếu hơn hoàn toàn, nhưng đó là vì họ cần dữ liệu meta đầy đủ về mọi thứ. Và tôi sẽ quan tâm đến một lời giải thích làm thế nào các đối tượng như các giá trị phá vỡ mọi thứ. Đặc biệt là xem xét rằng có tài liệu tham khảo ...
Ded repeatator

3
@Ded repeatator: Java và C # có một hệ thống chung hoàn toàn khác nhau , bởi vì kinh nghiệm cho thấy các mẫu gây ra tất cả các vấn đề nghiêm trọng, nhiều trong số đó phát sinh do hệ thống Mẫu không được lên kế hoạch tốt ngay từ đầu. (Hoàn thành ngẫu nhiên , để đưa ra một ví dụ rõ ràng!) Và các đối tượng làm giá trị phá vỡ sự thay thế Liskov bởi vì nếu bạn có một lớp Derogen có cha mẹ là Base và nó sẽ ghi đè một phương thức ảo trên Base và bạn mặc định chuyển nó sang phương thức ảo một hàm lấy Base và gọi phương thức ảo, nó sẽ không gọi phiên bản Derogen.
Mason Wheeler

2
@MasonWheeler: Ah, bạn đang đề cập đến việc cắt lát .
Fred Larson

2
@FredLarson: Tôi nên đoán một vấn đề phổ biến, nguy hiểm như vậy sẽ có một tên cụ thể cho nó. (Và, đây là C ++, một tên ngớ ngẩn ở đó Khi một lập trình viên bên ngoài C ++ nghe thế giới "cắt", ông có khả năng để nghĩ đến. Mảng cắt : P
Mason Wheeler

4
Mặc dù tôi đồng ý với nhiều điều bạn đã viết, tôi nghĩ rằng bạn có quan điểm rất thiên vị ;-) IMHO học C ++ không khiến mọi người trở nên ngu ngốc.
Doc Brown

8

Không biết rõ về C ++ sẽ giúp bạn dễ dàng học các ngôn ngữ khác giống như C ++. Nhưng điều đó sẽ nhàm chán. Tại sao bạn muốn biết hai ngôn ngữ giống nhau? Điều đó không mua cho bạn bất cứ thứ gì. (Lưu ý rằng điều này không dành riêng cho C ++. Nó áp dụng cho bất kỳ ngôn ngữ nào. So sánh với các ngôn ngữ tự nhiên: học tiếng Ý sẽ không giúp việc học các ngôn ngữ khác dễ dàng hơn. Nó sẽ giúp học tiếng Tây Ban Nha, tiếng Pháp hoặc tiếng Bồ Đào Nha dễ dàng hơn và học ba ngôn ngữ trong số đó sẽ giúp việc học thứ tư dễ dàng hơn, nhưng thậm chí học tất cả các ngôn ngữ Lãng mạn sẽ không giúp bạn học được tiếng Phần Lan, tiếng Trung, tiếng Hindi, tiếng Do Thái, tiếng Ả Rập, tiếng Pashtu, tiếng Hy Lạp, v.v.)

Ngôn ngữ lập trình thực hiện mô hình. Peter van Roy đã thu thập một poster của 34 mô hình lập trình chính .

Các mô hình, lần lượt, bao gồm các khái niệm. Áp phích đó liệt kê khoảng 18 khái niệm.

Tất cả các mô hình (hoặc ít nhất là những người trong poster) được sáng tác từ những khái niệm đó. Tất cả các ngôn ngữ thực hiện một hoặc nhiều mô hình bao gồm các khái niệm đó. Vì vậy, nếu bạn học những khái niệm đó, bạn sẽ (trong một nghĩa nào đó) học mọi ngôn ngữ lập trình cùng một lúc.

Tất nhiên vẫn còn rất nhiều quirks ngôn ngữ cụ thể (cú pháp trong số chúng). Ngoài ra, áp phích đó hoàn toàn bỏ qua việc gõ và tất nhiên có một sự khác biệt đáng kể giữa hệ thống kiểu Kiểu F < :, hệ thống kiểu Scala hoặc hệ thống kiểu gõ vịt động, chứ đừng nói đến hệ thống kiểu phụ thuộc à la Idris, Agda, Coq, Guru hoặc ATS.


Tiếng Hindi , không phải Ấn Độ giáo . Không có gì giúp bạn trong việc "học tiếng Hindu", chứ đừng nói đến tiếng Ý hoặc C ++ ;-) +1.
PKG

Trên thực tế, học các ngôn ngữ khác nhau, mặc dù thực sự giống nhau, nhưng vẫn mở rộng tâm trí của bạn và do đó giúp bạn một chút cho các ngôn ngữ xa hơn.
thuốc nhuộm

Tôi không đồng ý với việc so sánh với các ngôn ngữ tự nhiên vì C ++ là ngôn ngữ đa mô hình không giống như ngôn ngữ tự nhiên. Ngoài ra, học một tính năng ngôn ngữ một cách chi tiết, bạn sẽ biết các quyết định thiết kế cho tính năng đó và rất có thể hiểu được những ưu và nhược điểm của việc triển khai khác. Ví dụ: hãy thử học các mẫu c ++ một cách sâu sắc mà không học các lợi ích và nhược điểm của chúng so với các tổng quát động. Ngay cả khi bạn không vấp phải bất kỳ đề cập nào về C # (ngày nay khó khăn), bạn vẫn sẽ biết thế nào là chung chung năng động và ngay lập tức biết giới hạn chung của C # khi tìm hiểu về chúng sau đó
Rado

5

Tôi muốn nói rằng việc biết bất kỳ ngôn ngữ lập trình sâu sắc nào cũng sẽ giúp ích cho việc học hỏi người khác, ít nhất là các ngôn ngữ khác trong cùng một gia đình. Ví dụ, kiến ​​thức về C ++ sẽ không giúp ích nhiều cho LISP hoặc Haskell, nhưng đối với các ngôn ngữ thủ tục hướng đối tượng, nó sẽ như vậy. Cách tiếp cận của tôi là thử và học một ngôn ngữ từ mỗi gia đình khác nhau (theo thủ tục, chức năng, hướng đối tượng, v.v.) của ngôn ngữ, sau đó kiến ​​thức đó có thể chuyển sang các ngôn ngữ khác trong gia đình đó. Mặt khác, kiến ​​thức sâu rộng về APL sẽ không giúp được gì khác ...


3
Tôi đã thấy mã Self hoặc Smalltalk hoặc Ruby được viết bởi một người đã học C ++ như một ngôn ngữ đầu tiên trông như thế nào. Tôi thực sự sẽ nói, biết C ++ khá có hại khi học OO. Tôi nghĩ Self hoặc Drameak sẽ phù hợp hơn nhiều cho điều đó. BTW, một kiến ​​thức sâu rộng về APL ít nhất sẽ giúp ích cho các ngôn ngữ như J và K. Nó cũng sẽ giúp suy nghĩ về các khái niệm trừu tượng và thang máy cấp cao hơn, có thể sẽ giúp lập trình theo kiểu MapReduce hoặc Hadoop, và cũng nghĩ về Functor , Ứng dụng, Monads và Thể loại.
Jörg W Mittag

1
@ JörgWMittag: Một người nổi tiếng có thể viết COBOL bằng bất kỳ ngôn ngữ nào ... vấn đề là gì?
Ded

@Ded repeatator Nếu ngôn ngữ đầu tiên của bạn là COBOL, bạn có nhiều khả năng viết COBOL bằng các ngôn ngữ khác.
Doval

Thật ra, tôi phải đồng ý với điều COBOL. Tôi đã có một anh chàng làm việc cho tôi nhiều năm trước đó đã viết COBOL bằng Pascal ...
Jim Nutt

5

Tôi sẽ có một cách giải thích khác ở đây.

C ++ là một ngôn ngữ tốt để tìm hiểu về cấu trúc dữ liệu và bộ nhớ, vì nó buộc bạn phải suy nghĩ cẩn thận về các khái niệm như quyền sở hữu đối tượng và tuổi thọ. Và học về bộ nhớ và cấu trúc dữ liệu là một trong những phần thiết yếu của bất kỳ chương trình giảng dạy kỹ thuật phần mềm nào.

Nhưng bạn phải học về cấu trúc dữ liệu. Nếu bạn chỉ "học C ++", bạn sẽ không thực sự đạt được nhiều và điều đó có thể làm chậm quá trình học các ngôn ngữ khác trong thời gian ngắn.

Khi tôi học đại học, Cấu trúc dữ liệu là khóa học dành cho sinh viên năm nhất bắt buộc, được thực hiện sau CS1 (mà ít nhất một nửa lớp đã bỏ học). Nó thật khó. Định dạng của khóa học về cơ bản là "Đây là một cấu trúc dữ liệu mà bạn chưa từng thấy trước đây [ví dụ như một đống bên trái ]. Thực hiện nó trong C ++ trong một tuần và làm cho đầu ra của bạn khớp chính xác với đầu ra dự kiến ​​của chúng tôi, theo từng byte, vì vậy chúng tôi có thể chấm điểm tự động. " Sau đó, tuần tới bạn sẽ nhận được cấu trúc dữ liệu mới và bài tập mới. Tôi có lẽ đã học được nhiều hơn trong một khóa học so với tất cả các khóa học khác của tôi cộng lại.

Đó là cách học mà bạn cần phải làm cho C ++ để có giá trị.


2

Mỗi ngôn ngữ bạn học làm cho ngôn ngữ tiếp theo dễ học hơn, đặc biệt là trong cùng một mô hình. Họ vay mượn lẫn nhau rất nhiều, và sau một thời gian bạn đến điểm mà một ngôn ngữ mới trông giống như một bộ sưu tập các tính năng từ các ngôn ngữ khác, với một vài vòng xoắn độc đáo.

Tôi không nghĩ C ++ tốt hơn hay tệ hơn bất kỳ ngôn ngữ nào khác trong vấn đề đó. Đó là một trong những ngôn ngữ dài dòng hơn mà tôi biết, và làm cho một số điều khó trở nên dễ dàng trong hầu hết các ngôn ngữ khác, nhưng điều đó không nhất thiết phải chuyển thành ngôn ngữ tiếp theo dễ học hơn . Nó thường làm cho ngôn ngữ tiếp theo cảm thấy dễ sử dụng hơn , mặc dù. Có một sự khác biệt.


0

Không. Một kiến ​​thức sâu sắc về C , hoặc tập hợp con của C ++ là "về cơ bản là C", sẽ giúp ích khi học các ngôn ngữ khác, ít nhất là khi hình dung những gì việc triển khai của chúng phải làm. Một kiến ​​thức sâu sắc về C ++ , mặt khác, chủ yếu sẽ là thông tin gây nhầm lẫn hoặc không liên quan khi học các ngôn ngữ khác; ví dụ, nếu bạn học định hướng đối tượng của C ++ ở mức cao hơn bề mặt, khi bạn chuyển sang Perl / Python / Ruby, bạn sẽ mất nhiều thời gian hơn để không học những gì bạn biết hơn là sử dụng nó, vì các đối tượng trong các ngôn ngữ đó được triển khai trong một cách hoàn toàn kháchơn trong C ++. Điều tương tự cũng đúng với mức độ lớn hơn hoặc thấp hơn đối với hầu hết các ngôn ngữ khác và đối với các tính năng ngôn ngữ khác (ví dụ, các mẫu C ++ và đa hình Haskell về cơ bản là cùng một tính năng, với các triển khai hoàn toàn khác nhau). Vì vậy, kiến ​​thức sâu về C ++ chủ yếu sẽ là C ++ - cụ thể.


bài này khá khó đọc (tường văn bản). Bạn có phiền chỉnh sửa ing nó thành một hình dạng tốt hơn?
gnat
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.