So sánh các chương trình trong các ngôn ngữ khác nhau. Phân tích so sánh các ngôn ngữ lập trình. Phát triển hệ điều hành

Có nhiều tham số để so sánh các ngôn ngữ lập trình. Chính xác là ngôn ngữ, không phải nền tảng. Mức độ phổ biến, công cụ phát triển, phạm vi, vị trí thị trường - điều này rất quan trọng, nhưng thật thú vị khi nhìn vào bản thân các ngôn ngữ.
Và tôi không quan tâm đến mô hình của họ: trong C bạn có thể viết theo kiểu OOP (ví dụ GTK+) và trong Java bạn có thể tạo các đơn nguyên.
Chính xác thì họ như thế nào trong cuộc sống?

Nếu bạn muốn biết ngôn ngữ nào phổ biến hơn, thì tôi khuyên bạn nên đọc bài viết Tìm kiếm ngôn ngữ lập trình phổ biến nhất mà tôi đã trắng trợn đánh cắp KDPV.

Tôi muốn bạn chú ý đến những thông số gần như chủ quan này:

1. Tập hợp các tiên đề cơ bản.
Có những ngôn ngữ tương tự như tiếng Trung Quốc - rất nhiều chữ tượng hình. Và có những ngôn ngữ như tiếng Anh, chỉ có 26 chữ cái, nhưng từ chúng bạn có thể kết hợp các từ và từ các từ của một câu.
Rõ ràng, càng ít ký hiệu cơ bản như vậy thì việc bắt đầu học càng dễ dàng hơn. Nhưng hóa ra nó có nhiều văn bản hơn, vâng.
Mặt khác, việc đưa tập hợp chữ cái về 1 và 0 cũng vô nghĩa. Ở đây bạn cần phải tìm một sự thỏa hiệp. Trung bình, tất cả các ngôn ngữ đều có khoảng 15 toán tử và có tới 10 loại cơ bản.
Sức mạnh tiên đề có thể được tính toán và hệ số có thể được suy ra. Tôi thậm chí còn tìm thấy một số so sánh về sức mạnh của ngôn ngữ cách đây một trăm năm.
Đây là một nhiệm vụ hoàn toàn nghiêm túc và mang tính khoa học nhẹ nhàng, phù hợp cho một luận văn. Tại đây, bạn thậm chí có thể vẽ các biểu đồ đẹp mắt trong MathCAD và thu thập các thuật ngữ sâu sắc từ Wikipedia. Ít nhất phải mất một năm để nghiêm túc tìm ra nó.
Nhưng thay vào đó, mọi người đều viết luận văn về một số loại rác, tốt nhất là về tái cấu trúc hoặc REST. Và nhân tiện, đây cũng không phải là một điều đặc biệt khó khăn đối với một luận văn: phương pháp là trích xuất hoặc Yêu cầu HTTP gửi. Hãy gợi ý nhé 😉

2. Dễ đọc.
Hầu hết các lập trình viên đều đọc mã thay vì viết mã.
Bạn bắt đầu hiểu khả năng đọc là gì khi so sánh mã Python và mã Perl.
Có một quy luật ở đây: ngôn ngữ lập trình càng cấp cao thì khả năng đọc càng tốt. SQL thường đọc giống như văn bản thuần túy.

3. Cú pháp đường
Đối với những thứ nguyên thủy thường xuyên lặp đi lặp lại. Ví dụ: trong Java, chuỗi là đối tượng và tốt nhất nên nối chúng bằng cách gọi một phương thức. Nhưng để giúp mọi người dễ dàng hơn, họ đặc biệt thêm đường cú pháp khi toán tử + thực hiện nối chuỗi.
Nhưng dấu cộng chỉ có tác dụng đối với các chuỗi như một ngoại lệ: tất cả các lớp khác không thể ghi đè các toán tử, do đó không có gì bất ngờ trong mã.
Nhưng trong C++, C#, Groovy và nhiều ngôn ngữ khác, bạn có thể ghi đè các toán tử và kết quả là bạn thường tự hỏi đoạn mã này là cái thứ vớ vẩn gì: người dùng<< new User() пока не узнаёшь что добрые молодцы добавили сахару для добавления в список.
Nói chung, ở đây một lần nữa nó giống như với các ngôn ngữ - nếu tiếng Anh có ngữ pháp và trật tự từ nghiêm ngặt, thì hãy viết bằng tiếng Nga theo ý muốn và tổng hợp các từ.
Kết quả là người nước ngoài không thể hiểu được tiếng Nga.

4. Có khả năng tự bắn vào chân mình.
Tốt nhất bạn nên tự bắn vào chân mình ở C: ở đây bạn sẽ gặp phải lỗi Phân đoạn thực sự chứ không phải một NPE buồn tẻ. Chia 1/3 và nhận được 0. Bạn viết if (x = 3) và tự hỏi tại sao mã không hoạt động. Và thông qua bộ đệm tràn, tin tặc sẽ phá hủy máy chủ của bạn.
Cũng có những câu chuyện cười trong C khi do tùy chọn tối ưu hóa trong trình biên dịch, chương trình ngừng hoạt động hoàn toàn.

5. Phép thuật.
Phép thuật là một loại tính năng cho phép bạn thực hiện tất cả các loại thủ thuật mà người sáng tạo không có ý định ban đầu.
Rất thường xuyên, chúng tôi thậm chí không nghĩ rằng chúng tôi đang sử dụng phép thuật.
Ví dụ: các lệnh và macro của trình biên dịch trước - chúng thậm chí có thể được sử dụng để dịch hoàn toàn C++ sang tiếng Albania:

#bao gồm #bao gồm #if !được xác định (_MSC_VER) || _MSC_VER< 1400 #error Wrong compiler! Use MSVS 8.0 #endif #define НАЧЕЛ { #define КОНЧЕЛ;} #define ТИПА int #define ВДРУГ if (#define ТАДА) #define НИХРИНА else #define ВЗАД return #define КАГДИЛА (#define ЙО; #define ЖЖОШ(p,n) for (; (p) <= (n); (p)++) #define БАЗАР std::cout << #define СЛЫШЬ << #define СТОЙ system ("echo. & pause"); #define БЛИН _wsetlocale (LC_ALL, L"Russian_Russia.ACP"); #define ВРОДЕ try #define ИБАНУЦЦО throw #define АПСТЕНУ catch (const char* __чё__) #define ПРЕВЕД ТИПА main КАГДИЛА ТАДА #define МЕДВЕД ВЗАД 0; КОНЧЕЛ ТИПА КРУТО КАГДИЛА ТИПА фигня ТАДА НАЧЕЛ БАЗАР "ВАЩЕ " ЙО ВДРУГ фигня == 8 ТАДА ИБАНУЦЦО "мля! " ЙО ВЗАД 0 КОНЧЕЛ ПРЕВЕД НАЧЕЛ БЛИН ВРОДЕ НАЧЕЛ ТИПА фишка = 0 ЙО ЖЖОШ (фишка, 10) НАЧЕЛ БАЗАР фишка СЛЫШЬ " "; ВДРУГ фишка >= 5 TADA COOL (thủ thuật) YO KONCHAL KONCHAL APSTENU BẮT ĐẦU CHỢ "IBANUZZO đã gọi: "HEAR __what__; CUM Ở GẤU

Bây giờ hãy so sánh các ngôn ngữ theo các tiêu chí sau:

1. Bộ tiên đề cơ bản tối thiểu: Trong C, mọi thứ đều đơn giản: đây là hàm, đây là cấu trúc, đây là con trỏ, tấn công! Những chuyên gia thực sự như Torvalds coi những người chuyên nghiệp như những kẻ tạo dáng.
2. Khả năng đọc: trong C nó thấp i++, j—, for (;;) nhưng nó giúp ích rất nhiều nếu tập hợp ở mức tối thiểu.
3. Đường cú pháp: dấu ngoặc vuông cho mảng (bạn có thể sử dụng con trỏ) và chuỗi ký tự.
4. Bạn chỉ đơn giản là tự bắn vào chân mình: bạn vượt quá bộ đệm, quên dọn dẹp bộ nhớ và kết quả là bạn mắc phải lỗi Phân đoạn thực sự.
5. Đáng ngạc nhiên là bạn không thể thực hiện một bước nào trong C mà không có phép thuật. Điều kỳ diệu trong C là các chỉ thị tiền biên dịch. Mọi thứ đều được thực hiện trên chúng: bao gồm, hằng số, DSL.

C++
1. Các đối tượng đã xuất hiện ở đây rồi, nhưng đi kèm với chúng vẫn còn rất nhiều chuông, còi và mánh khóe, số lượng có lợi thế hơn những đối tượng còn lại. Nhìn chung, có cảm giác rằng những lợi thế là nơi thử nghiệm tất cả các khái niệm lập trình.
2. Khả năng đọc gần như không tồn tại. Ở một số nơi, chỉ lưu cú pháp giống C.
3. Đường là đủ: ngay cả Hello World cũng bắt đầu bằng một toán tử bị ghi đè<< для cout.
4. Chúng tôi bắn vào chân bằng súng máy. Một tác phẩm kinh điển của thể loại: đa kế thừa.
5. Điều kỳ diệu đạt được thông qua các mẫu STL và Boost.

Java
1. Ở đây chúng ta chỉ sử dụng C++ và loại bỏ mọi thứ không cần thiết. Kết quả là, mọi thứ đều đơn giản: đây là lớp, đây là các phương thức, bạn tạo một đối tượng và chạy các phương thức đó, nếu có vấn đề gì xảy ra, bạn sẽ ném ra một ngoại lệ, “không rõ sao?”
Nhưng họ vẫn làm quá mức: các lớp lồng nhau, các phương thức tĩnh, các kiểu nguyên thủy. Khi bắt đầu chuẩn bị thi chứng chỉ OSCJP, bạn chợt nhận ra rằng mình không biết Java.
2. Cú pháp đã khá dễ đọc, nếu bạn không chú ý đến các di tích sau C. Về cơ bản là một lingva franca, đó là lý do tại sao họ thích sử dụng nó trong sách giáo khoa.
3. Nếu bạn biết tất cả những câu chuyện cười của C thì việc bắn vào chân anh ta đã khá khó khăn rồi. Trừ khi hết bộ nhớ hoặc ngoại lệ con trỏ Null. Đây thực sự là lý do tại sao rất nhiều phần mềm doanh nghiệp được viết bằng Java.
4. Phép thuật được hiểu với sự trợ giúp của các chú thích, điều này thường không ảnh hưởng đến chương trình. Nhưng trên thực tế, theo các chú thích, sau đó họ xáo trộn mã byte đến mức không thể nhận dạng được.

Biển sắc nét
1. Chúng tôi lấy dữ liệu và kéo mọi thứ chúng tôi cần và không cần cho mục đích tiếp thị. Cấu trúc khác với lớp như thế nào? Tại sao cần năng suất? Có vẻ như nó không được sử dụng thường xuyên.
3. Một lần nữa xác định lại các toán tử và vườn thú khác từ C++, nhưng với trình thu gom rác.
2. Khả năng đọc là bình thường. Chà, giống như Delphi (người sáng tạo cũng vậy).
4. Toàn bộ công nghệ luôn được phát minh ra cho phép thuật, chẳng hạn như LINQ.

Python
1. Một tập hợp lớn các nguyên tắc cơ bản được lựa chọn kém.
2. Khả năng đọc tốt - nhìn từ xa, nó thường có thể bị nhầm lẫn với các bài thơ của Mayakovsky.
4. Điều kỳ diệu đạt được bằng cách sử dụng các tập lệnh lib có thể làm mọi thứ. Đó là lý do tại sao một nửa mã trên Linux được viết bằng Python.
Nói chung, cá nhân tôi không thể nói bất cứ điều gì tốt về Python - tôi đã viết hàng tá tập lệnh trên đó và lần nào nó cũng tệ. Có lẽ có một số loại thủ thuật trong đó.

Ngọc trai
2. Pearl được tạo ra trong quá trình phát triển của trình soạn thảo văn bản. Và chắc chắn nó có cú pháp chỉ ghi khủng khiếp nhất. Biểu thức chính quy chỉ đến từ Pearl, điều này nói lên rất nhiều điều. Đối với tôi, có vẻ như những người tạo ra Brainfuck chỉ đơn giản hóa Perl một chút.
4. Điều kỳ diệu của Pearl là chỉ với một dòng bạn có thể thay đổi toàn bộ văn bản trong tài liệu.

hồng ngọc
Về cơ bản Perl hướng đối tượng.
1. Cú pháp quá ngọt ngào đến nỗi bạn có thể mắc bệnh tiểu đường.
2. Khả năng đọc giống như một viên ngọc trai, nhưng tính đồng nhất sẽ giúp ích - điều chính yếu là hiểu được khái niệm này.
4. Phép thuật đạt được thông qua siêu lập trình trên tính năng động. Ví dụ: nếu bạn lấy một phương thức không tồn tại, bạn có thể chặn nó và vẫn thực thi nó. Ví dụ, đây là những gì người tìm loa làm.
Mọi thứ được viết trong sách về Java “bạn không thể làm được điều đó”, trong Ruby họ viết “nhìn này, bạn thậm chí có thể làm được điều đó!”

Ada
Ada được tạo ra như một phần của cuộc thi dành cho Quân đội Hoa Kỳ. Những thứ kia. ban đầu yêu cầu các học giả tìm ra ngôn ngữ lập trình tuyệt vời nhất. Vì điều đó đã chiến đấu vì nó và bỏ chạy.
1. Bộ cơ bản rất lớn. Trước khi Scala xuất hiện, nó là ngôn ngữ lập trình phong phú nhất.
2. Đồng thời, cú pháp Pascal dễ đọc tuyệt vời.
3. Đủ đường.
4. Thực tế không có phép thuật nào cả - mọi thứ đều đã có sẵn trong ngôn ngữ. Mặc dù tôi không chắc chắn ở đây nhưng tôi chưa thấy nhiều mã trong Ada.

Tôi nhắc đến Ada là có lý do, đọc lời phê bình của cô ấy:

Hoar than thở rằng "chuông và còi đã được ưu tiên hơn các yêu cầu cơ bản về độ tin cậy và an toàn" và cảnh báo chống lại "một đội tên lửa đi sai hướng vì một lỗi không được phát hiện trong trình biên dịch Ada." Niklaus Wirth nói một cách kiềm chế hơn nhưng cũng đầy tiêu cực. Anh ấy nói: “Có quá nhiều thứ được ném vào người lập trình viên. Tôi không nghĩ rằng sau khi học được một phần ba Ada, bạn có thể làm việc bình thường. Nếu bạn không nắm vững tất cả các chi tiết của ngôn ngữ, bạn có thể vấp phải chúng trong tương lai và điều này sẽ dẫn đến những hậu quả khó chịu ”. Jean Ishbia, trưởng nhóm phát triển của Ada, trong khi bày tỏ sự "tôn trọng và ngưỡng mộ" đối với Wirt, lại không đồng ý rằng: "Wirth tin vào những giải pháp đơn giản cho những vấn đề phức tạp. Tôi không tin vào những điều kỳ diệu như vậy. Những vấn đề phức tạp đòi hỏi những giải pháp phức tạp.”

Không cần phải nói rằng vì Hell in the ass và phần mềm viết bằng Sishechka bay vào không gian?

Scala
Scala là một nỗ lực nhằm làm cho Java hoạt động được nhưng phải trả giá bằng lẽ thường.
Cũng giống như Ada, nó được phát minh một cách nhân tạo trong một “phòng thí nghiệm tạo ra các ngôn ngữ lập trình”, điều này đáng báo động.
Giống như bất kỳ chủ nghĩa chức năng nào, nó đưa tất cả những người thông minh có “tư duy toán học” đến cực khoái.
Các kỹ sư bình thường cảm thấy sợ hãi khi tưởng tượng ra cách hỗ trợ một dự án trên Rock. Scala tệ hơn Java. Ít nhất là đối với một nửa số dự án Java.

Điều này được mô tả rất rõ trong bài viết về việc chọn ngôn ngữ lập trình của Andrey Platov:

Scala sẽ giúp tăng năng suất rất nhiều so với Java (C->C++ cũng vậy). Điều này đúng đối với một dự án chỉ có một tác giả trong chân không. Sự phức tạp và khả năng vô hạn của ngôn ngữ sẽ được phản ánh trong bệnh trĩ, điều này sẽ không góp phần vào năng suất. Câu hỏi duy nhất là cái gì sẽ nhiều hơn. Tôi vẫn chưa biết, và nhìn chung thì chưa có dự án Scala lớn nào trên thế giới.

Phần kết luận: Tôi đã đi đến kết luận tương tự như Andrey Platov - chúng ta hiện đang trong thời kỳ phá vỡ các ngôn ngữ lập trình và thực sự không có gì để lựa chọn - tất cả các ngôn ngữ hiện tại rõ ràng đã lỗi thời.
Chúng ta cần một thế hệ ngôn ngữ lập trình hoàn toàn mới. Vâng, đến nỗi tất cả các ngôn ngữ hiện tại dường như là một ý tưởng ngu ngốc như viết trên thẻ đục lỗ.
Nhưng tôi sẽ nói về điều này sau.

Thêm về chủ đề này

tái bút

Trong bài viết này, tôi chỉ muốn thu hút sự chú ý đến một số tính năng không phải lúc nào cũng rõ ràng thường được tính đến khi chọn công nghệ chứ không phải là so sánh đầy đủ giữa chúng.
Mọi thứ khác đã được dọn sạch ở nơi cần đến

Đừng lười biếng và hãy đọc thêm một vài điều rất quan trọng của tôi.
Ngoài ra, đừng quên tham gia nhóm IT Juniors, nơi tôi đang cố gắng thu thập liên kết đến các bài viết hữu ích khác cho bạn cũng như các thông báo về các khóa học và thực tập tại các công ty.

Các chương trình máy tính thường được mô tả là “bộ hướng dẫn” và ngôn ngữ máy tính chỉ được nhiều người coi là cách từ vựng và cú pháp để cung cấp các hướng dẫn đó.

Từ quan điểm này, các ngôn ngữ lập trình khác nhau có thể có ngữ pháp hoặc từ vựng khác nhau. Mỗi ngôn ngữ có thể xử lý dấu chấm phẩy khác nhau hoặc yêu cầu chữ in hoa khi đánh vần, mặc dù nhìn chung, tất cả các ngôn ngữ đều dựa trên cùng một nguyên tắc.

Nhưng thực tế lập trình phức tạp hơn nhiều.

Lập trình ngày nay

Thật kỳ lạ, nhưng hầu hết những ý tưởng thực sự “toàn cầu” trong lập trình máy tính đều được phát triển từ những năm 1950 và 60. Kể từ đó, nhiều ngôn ngữ mới đã xuất hiện, nhưng không có ngôn ngữ nào thực hiện một cách tiếp cận thực sự mới về logic và tính toán.

Sự phát triển của các ngôn ngữ lập trình mới trong vài thập kỷ qua đều dựa trên kinh nghiệm của các nhà phát triển. Điều này có nghĩa là có mã dễ viết hơn (động lực đằng sau Ruby) và dễ đọc hơn (Python), đồng thời làm cho một số loại cấu trúc logic và kỹ thuật giải quyết vấn đề trở nên trực quan hơn.

Một số ngôn ngữ được phát triển để giải quyết các vấn đề lập trình cụ thể (chẳng hạn như PHP và SASS), để quản lý một số loại hệ thống nhất định () hoặc để hoạt động trong một môi trường hoặc nền tảng cụ thể (Java và JavaScript). Một số ngôn ngữ được thiết kế đặc biệt để giúp người mới bắt đầu học lập trình (BASIC và Scratch là những ví dụ cổ điển).

Vì các lý thuyết và thực tiễn xung quanh thiết kế ngôn ngữ đã phát triển thành (hầu hết) chính thống được chấp nhận rộng rãi, nên phần lớn công việc mới và thú vị trong việc phát triển thực hành lập trình giờ đây tập trung vào kiến ​​trúc hệ thống.

Một sự phát triển tương đối gần đây bao gồm khái niệm SOA (Kiến trúc hướng dịch vụ). kiến trúc hướng dịch vụ) và MVC (Model-View-Controller), cũng như các khung công tác như , cho phép các lập trình viên dễ dàng làm việc trong các mô hình này.

Danh sách ngôn ngữ lập trình

Danh sách ngày càng tăng các ngôn ngữ lập trình, đánh dấu và giao thức phổ biến. Liên kết đến mô tả của từng người trong số họ:

mã hóa ASCII

  • Mã hóa ký tự là một trong những khía cạnh cơ bản của máy tính và Internet. ASCII là hệ thống mã hóa ký tự được sử dụng rộng rãi đầu tiên. Nó đã được thay thế bởi UTF-8, nhưng ASCII vẫn là nền tảng cho phần lớn các ký tự trên Internet ngày nay. Hiểu được điều này là rất quan trọng đối với các lập trình viên. Đọc thêm tại đây (tiếng Anh):

ASP/ASP.NET

  • ASP là từ viết tắt của Trang máy chủ hoạt động. Đây là ngôn ngữ kịch bản phía máy chủ đầu tiên dành cho máy chủ web Microsoft IIS. ASP đã được thay thế bằng framework mã nguồn mở phía máy chủ - ASP.NET. Thêm chi tiết (tiếng Anh):

Tự độngLISP

  • AutoLISP là một ngôn ngữ lập trình đơn giản, gọn nhẹ, dễ hiểu được thiết kế đặc biệt cho thiết kế phần mềm có sự hỗ trợ của máy tính. Đọc về nó (tiếng Anh):

ôi

  • Awk là ngôn ngữ lập trình xử lý văn bản cực kỳ mạnh mẽ cho phép bạn trích xuất dữ liệu từ một tệp hoặc nguồn khác và xuất dữ liệu đó ở bất kỳ định dạng nào bạn cần. Nó là một công cụ cũ hơn nhưng vẫn hữu ích hơn bao giờ hết. Tìm hiểu thêm (tiếng Anh): .

BASH

  • Bash là giao diện dòng lệnh được sử dụng phổ biến nhất trong thế giới Unix. Đây là giao diện dựa trên văn bản mặc định cho cả Linux và Mac OS X. Đọc thêm:

Lisp thông thường

  • Lisp là một ngôn ngữ lập trình khá độc đáo, có lẽ là ngôn ngữ lâu đời nhất và vẫn được sử dụng cho đến ngày nay. Điều này đặc biệt quan trọng trong lĩnh vực trí tuệ nhân tạo. Thêm chi tiết (tiếng Anh):

C

  • Nếu chúng ta đưa vào đây hai dẫn xuất của ngôn ngữ này, thì chúng ta có thể nói một cách an toàn rằng không có ngôn ngữ nào hữu ích và có ảnh hưởng hơn C. Điều này đặc biệt quan trọng đối với sự phát triển của hệ điều hành và phần mềm khác. Nhiều trình biên dịch và thông dịch cho các ngôn ngữ khác được viết bằng C. Đọc thêm:

C++

  • Ban đầu được gọi là “C với các lớp”, C++ về nhiều mặt chỉ đơn giản là sự kế thừa nâng cao hơn của C (mặc dù tình hình tổng thể phức tạp hơn). C++ được thiết kế để nâng cao mô hình lập trình C trong khi vẫn giữ được khả năng thao tác phần cứng ở mức độ thấp. Nhiều phần bổ sung trong số này đã được thêm vào C trong nhiều năm và các ngôn ngữ này giống như hai phương ngữ của cùng một ngôn ngữ. Thêm chi tiết (tiếng Anh):

C#

  • Được sử dụng làm ngôn ngữ chính cho lập trình .NET, tương tự như C++, nó là một phần mở rộng của ngôn ngữ lập trình C, nhưng có sự bổ sung quan trọng về khả năng hướng đối tượng. Thêm chi tiết (tiếng Anh):

CSS/CSS3

  • CSS hay Cascading Style Sheets cũng không phải là ngôn ngữ lập trình mà là ngôn ngữ kiểu trang - ngôn ngữ cung cấp các quy tắc về kiểu dáng và bố cục cho tài liệu và ứng dụng. Đây là ngôn ngữ phong cách chính được sử dụng trên Internet. Thêm chi tiết:

Emacs Lisp

  • Emacs từ lâu đã được biết đến như một trình soạn thảo văn bản phổ biến và mạnh mẽ. Nhưng việc thêm Emacs Lisp vào nó sẽ biến nó thành một môi trường phát triển tích hợp cho hầu hết mọi ngôn ngữ lập trình. Thêm chi tiết (tiếng Anh): .

F#

  • F # là ngôn ngữ lập trình có mục đích chung. Được thiết kế để cực kỳ hiệu quả. Ban đầu chỉ là ngôn ngữ của Microsoft, giờ đây nó là ngôn ngữ nguồn mở và được sử dụng trên tất cả các nền tảng. Thêm chi tiết (tiếng Anh): .

FORTAN

  • Fortran xuất hiện lần đầu tiên vào năm 1957 và vẫn được sử dụng để giải một số vấn đề phức tạp nhất trong khoa học và công nghệ hiện đại. Thêm chi tiết (tiếng Anh):

NGOÀI

  • Công việc trên Forth bắt đầu vào năm 1968 và ngôn ngữ này thường được sử dụng trên phần cứng không có hệ điều hành truyền thống. Nó cũng được sử dụng rộng rãi để điều khiển máy công cụ. Thêm chi tiết (tiếng Anh):

Haskell

  • Haskell là một trong những ngôn ngữ lập trình hàm phổ biến nhất, ngoài ra còn là nguyên mẫu cho hàng tá ngôn ngữ khác. Nó được sử dụng rộng rãi trong giới kinh doanh và học thuật và là một ngôn ngữ tuyệt vời để bắt đầu khi tìm hiểu về lập trình chức năng. Thêm chi tiết (tiếng Anh):

HTML

  • HTML không phải là ngôn ngữ lập trình. Đây là ngôn ngữ đánh dấu - ngôn ngữ để thêm các chú thích ngữ nghĩa và phong cách vào nội dung. Đây là ngôn ngữ chính cho nội dung web. Kiến thức về nó là cần thiết và bắt buộc đối với tất cả các nhà thiết kế và phát triển web, cũng như tất cả mọi người (nhà văn, biên tập viên) sản xuất nội dung Internet. Thêm chi tiết (tiếng Anh): và

IDL

  • IDL, hay Ngôn ngữ dữ liệu tương tác, là ngôn ngữ lập trình chủ yếu được sử dụng để phân tích và trực quan hóa dữ liệu. Nó vẫn được sử dụng rộng rãi trong hàng không vũ trụ và thiên văn học. Thêm chi tiết (tiếng Anh):

INTERCAL

  • INTERCAL là một ngôn ngữ máy tính nhại lại được phát triển vào đầu những năm 1970. Nó được tạo ra như một trò đùa để cho thấy các ngôn ngữ phức tạp về mặt kỹ thuật và khó đọc như thế nào. Đây là ngôn ngữ thực mà bạn có thể tải xuống và thậm chí bạn có thể làm điều gì đó với nó. Người ta cho rằng bạn phải rất quen thuộc với nó để thực hiện việc này - nhưng, một lần nữa, cũng không quá rõ ràng, vì bản thân INTERCAL cũng sẽ không thích điều đó. Thêm chi tiết (tiếng Anh):

Java

  • Java là ngôn ngữ cấp cao được thiết kế để sử dụng trên Máy ảo Java. Nó có rất ít sự phụ thuộc bên ngoài và được thiết kế để chạy trên bất kỳ máy vật lý nào. Nó được sử dụng rộng rãi trong kiến ​​trúc mạng, cũng như trong các thiết bị nhúng và các ứng dụng điện toán khác. Thêm chi tiết (tiếng Anh): .

Javascript

  • JavaScript (không thực sự liên quan đến Java) là ngôn ngữ kịch bản được thiết kế ban đầu để sử dụng trong trình duyệt web. Do đó, nó có khả năng tích hợp sẵn để hoạt động với Mô hình đối tượng tài liệu (DOM), cách thể hiện nội dung trang web trong bộ nhớ. Đây là ngôn ngữ lập trình chính để phát triển web front-end. Nó chủ yếu hướng đến sự kiện và nhờ Node.JS, gần đây đã được công nhận là ngôn ngữ phía máy chủ. Thêm chi tiết (tiếng Anh): và. Và đây:

Ksh

  • Korn Shell (ksh) là giao diện dòng lệnh được sử dụng trên Unix. Đó là một shell đời đầu, tương thích với shell Bourne tiêu chuẩn nhưng có tất cả các tính năng tương tác thú vị của shell C. Chi tiết khác:

Lập trình Linux

  • Lập trình Linux bao gồm mọi thứ, từ viết kịch bản shell đến phát triển ứng dụng và phát triển kernel. Thêm chi tiết (tiếng Anh):

Logo

  • Logo là một trong những ngôn ngữ dạy lập trình sớm nhất và có lẽ vẫn là ngôn ngữ nổi tiếng nhất. Anh ấy nổi tiếng với chú rùa mà trẻ em có thể di chuyển bằng lệnh của máy tính. Một cách thú vị để dạy lập trình. Thêm chi tiết (tiếng Anh):

M.L.

  • ML ban đầu được thiết kế như một ngôn ngữ lập trình meta: ngôn ngữ để tạo các ngôn ngữ khác. Nhưng theo thời gian, nó trở thành ngôn ngữ có mục đích chung, được sử dụng rộng rãi trong giáo dục, toán học, khoa học và thậm chí cả tài chính. Thêm chi tiết (tiếng Anh): .

MPI

  • Giao diện truyền tin nhắn là một giao thức tiêu chuẩn để gửi tin nhắn giữa các tiến trình hoặc chương trình. Nó đã được triển khai bằng một số ngôn ngữ lập trình, bao gồm C, C++, Java và Python. Nhờ MPI, tính toán song song đã trở nên khả thi. Thêm chi tiết (tiếng Anh):

Lập trình mạng với ổ cắm internet

Mục tiêu-C

  • Một phiên bản khác của C, được tạo ra vào những năm 1980 để cung cấp khả năng triển khai C hoàn toàn hướng đối tượng. Ngôn ngữ này được sử dụng chính ngày nay là trên hệ điều hành Mac OSX và iOS. Cho đến gần đây, các ứng dụng iOS phải được viết bằng Objective-C, nhưng bây giờ bạn cũng có thể viết bằng Swift. Thêm chi tiết (tiếng Anh):

OCaml

  • OCaml là một ngôn ngữ máy tính chức năng hướng đối tượng. Theo truyền thống ML, nó được sử dụng rất nhiều để viết các ngôn ngữ và framework lập trình khác. Thêm chi tiết (tiếng Anh): .

Phát triển hệ điều hành

  • Đỉnh cao của công việc lập trình được coi là sự phát triển của một hệ điều hành. Nếu bạn muốn chứng tỏ với bản thân rằng bạn có thể viết bất cứ thứ gì thì không có gì tốt hơn là viết kernel hệ điều hành của riêng bạn và các công cụ liên quan của nó. Nhưng hãy cẩn thận: đây là cuộc hành trình chỉ dành cho những lập trình viên dũng cảm và chân chính! Thêm chi tiết (tiếng Anh): .

Perl

  • Một công cụ rất hữu ích cho hầu hết mọi lập trình viên. Là một ngôn ngữ thông dịch nên nó không cần phải biên dịch, đôi khi được gọi là “Con dao quân đội Thụy Sĩ” của các ngôn ngữ kịch bản. Thêm chi tiết (tiếng Anh):

KHUYẾN MÃI

  • Prolog là ngôn ngữ lập trình logic được thiết kế để xử lý ngôn ngữ tự nhiên. Thêm chi tiết (tiếng Anh):

Dữ liệu thuần túy

  • Pure Data là ngôn ngữ lập trình trực quan độc đáo. Nó được tạo ra đặc biệt để cho phép người dùng tạo các tác phẩm video, âm thanh và đồ họa. Thêm chi tiết (tiếng Anh): .

Python

  • Python là ngôn ngữ lập trình cấp cao. Một ngôn ngữ được thông dịch (không được biên dịch), còn được gọi là “ngôn ngữ kịch bản”. Chủ yếu được sử dụng như một công cụ để thực hiện các nhiệm vụ lập trình chuyên dụng như nhiệm vụ tự động hóa và phân tích dữ liệu. Nó có một bộ công cụ mạnh mẽ để tính toán toán học và khoa học và thường được các nhà nghiên cứu sử dụng. Thêm chi tiết (tiếng Anh):

Viên ngọc trên tay vịn

  • Ruby on Rails là một framework phát triển web cho ngôn ngữ lập trình Ruby. Nó cung cấp kiến ​​trúc MVC (Model View Controller), lớp trừu tượng hóa cơ sở dữ liệu và nhiều công cụ để tăng tốc quá trình lập trình ứng dụng web. Rất phổ biến để phát triển ứng dụng web nhanh chóng. Thêm chi tiết (tiếng Anh):

SAS

  • SAS là một ngôn ngữ chuyên dụng được thiết kế để phân tích dữ liệu thống kê. Được sử dụng rộng rãi trong chính phủ, học viện và doanh nghiệp. Đối với những người có nhiều dữ liệu, SAS là sự lựa chọn hiển nhiên. Thêm chi tiết (tiếng Anh): .

Scala

  • Scala là một ngôn ngữ tương đối mới - ít nhiều là Java mới hơn và tốt hơn. Đó là ngôn ngữ tuyệt vời dành cho các lập trình viên Java muốn làm việc hiệu quả hơn hoặc dành cho những người mới bắt đầu học lập trình và muốn học một ngôn ngữ mạnh mẽ sẽ không hạn chế họ trong tương lai. Thêm chi tiết (tiếng Anh): .

Cơ chế

  • Đề án là một ngôn ngữ cũ, nhưng vẫn được sử dụng để dạy lập trình và các môn khoa học máy tính nâng cao hơn. Chủ yếu dựa trên Lisp và một phần dựa trên ALGOL. Thêm chi tiết (tiếng Anh): .

Cào

  • Ngôn ngữ lập trình Scratch được tạo ra đặc biệt để dạy lập trình cho trẻ em từ 8 đến 16 tuổi. Scratch rất dễ dàng và nó cho phép trẻ học những điều cơ bản về logic lập trình một cách thú vị. Thêm chi tiết (tiếng Anh):

mô phỏng

  • Simula là một ngôn ngữ có tầm quan trọng lịch sử vì nó là ngôn ngữ đầu tiên giới thiệu các khái niệm đã trở thành nền tảng cho lập trình hướng đối tượng. Thêm chi tiết (tiếng Anh): .

CƯỜI

  • SMIL (Ngôn ngữ tích hợp đa phương tiện được đồng bộ hóa) là một công cụ dành cho những người muốn tạo và phân phối bài thuyết trình. Đặc biệt hữu ích nếu bạn muốn tạo bản trình bày cần được cập nhật theo thời gian. Thêm chi tiết (tiếng Anh):

SQL

  • SQL (Ngôn ngữ truy vấn có cấu trúc) là ngôn ngữ được sử dụng để giao tiếp với Hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS). SQL cho phép lập trình viên tạo cấu trúc dữ liệu, chèn và chỉnh sửa dữ liệu cũng như truy vấn nó. Thêm chi tiết (tiếng Anh):

Stata

  • Stata là môi trường phát triển và ngôn ngữ lập trình để giải quyết các vấn đề thống kê nghiêm trọng. Và mặc dù nó đã được tạo ra cách đây khá lâu nhưng nó vẫn được sử dụng rộng rãi. Nếu bạn tham gia vào công việc thống kê, Stata là một công cụ tuyệt vời. Thêm chi tiết (tiếng Anh):

Nhanh

  • Swift là ngôn ngữ lập trình mới được Apple phát triển cho iOS, OS X, watchOS, tvOS và Linux. Đây là ngôn ngữ tương lai dành cho các nhà phát triển chương trình và ứng dụng cho thiết bị Apple. Thêm chi tiết (tiếng Anh):

S-PLUS

  • S-PLUS là phiên bản thương mại của ngôn ngữ lập trình S mạnh mẽ được thiết kế để thực hiện phân tích thống kê. Dự án GNU có phiên bản S riêng, được gọi là R. Tất cả các tài nguyên cần thiết về S với trọng tâm là S-PLUS:

Lập trình UNIX

  • Độ rộng của lập trình trên Unix là rất lớn. Nó bao gồm phạm vi từ các tập lệnh quản trị đến mã dựa trên văn bản đến phát triển X Window. Thêm chi tiết (tiếng Anh):

XML

  • XML là ngôn ngữ đánh dấu có cấu trúc tốt được thiết kế để cả con người và máy đều có thể đọc được. Thêm chi tiết (tiếng Anh):

Bài soạn bởi: Akulov Ivan

Gửi công việc tốt của bạn trong cơ sở kiến ​​thức rất đơn giản. Sử dụng mẫu dưới đây

Các sinh viên, nghiên cứu sinh, các nhà khoa học trẻ sử dụng nền tảng kiến ​​thức trong học tập và công việc sẽ rất biết ơn các bạn.

Đăng trên http://www.allbest.ru/

Bộ Giáo dục Chuyên ngành Đại họcLiên Bang Nga

Cơ quan Giáo dục Liên bang

OGIET

TRỪU TƯỢNG

môn học: Khoa học máy tính

Về chủ đề: “Phân tích so sánh các ngôn ngữ lập trình”

Giới thiệu

Mã máy xử lý

Thuật toán và chương trình

Ngôn ngữ lập trình là gì

Trình biên dịch và trình thông dịch

Các cấp độ của ngôn ngữ lập trình

Các thế hệ ngôn ngữ lập trình

Tổng quan về ngôn ngữ lập trình cấp cao

Ngôn ngữ lập trình cơ sở dữ liệu

Ngôn ngữ lập trình cho Internet

Ngôn ngữ mô hình hóa

Các ngôn ngữ lập trình khác

Phần kết luận

Thư mục

Giới thiệu

Sự ra đời của những chiếc máy tính đầu tiên đã đưa lập trình trở thành một môn khoa học. Các lý thuyết toán học đầu tiên về xử lý thông tin, phương tiện chứng minh tính đúng đắn của chương trình, tối ưu hóa mã, tạo trình biên dịch hiệu quả, thử nghiệm chính thức, v.v. Sau đó, với sự ra đời của các ngôn ngữ lập trình phổ quát thế hệ thứ ba, các khía cạnh này trở nên ít liên quan hơn - nghiên cứu tiếp tục và tiếp tục chủ yếu trong lĩnh vực tạo văn bản nguồn tự động và nâng cao hiệu quả của trình biên dịch. Lập trình đã trở thành một nghệ thuật - hàng triệu người không được giáo dục đặc biệt đã có cơ hội sử dụng máy tính để giải quyết các vấn đề ứng dụng của riêng họ, điều này đòi hỏi họ phải thành thạo khả năng tạo ra các chương trình hoạt động chính xác. Lập trình ngày nay vẫn là một nghệ thuật dành cho các nhà phát triển chuyên nghiệp và những người nghiệp dư, những người tạo ra chương trình một mình hoặc trong các công ty nhỏ, nơi kỹ năng cá nhân quyết định mọi thứ.

Mã máy xử lý

Bộ xử lý máy tính là một mạch tích hợp lớn. Nó nhận tất cả các lệnh và dữ liệu dưới dạng tín hiệu điện. Trên thực tế, bộ xử lý có thể được coi là một tập hợp khổng lồ gồm các phần tử điện tử khá đơn giản - bóng bán dẫn. Transistor có ba cực. Hai cực được cung cấp điện áp cần thiết để tạo ra dòng điện trong bóng bán dẫn và cực giữa được cung cấp điện áp, có thể được sử dụng để điều khiển điện trở trong của bóng bán dẫn và do đó điều khiển cả dòng điện và điện áp tại thiết bị đầu cuối của nó.

Trong điện tử, bóng bán dẫn có ba công dụng: tạo ra bộ khuếch đại, trong các mạch điện tử có đặc tính tự dao động và trong các công tắc điện tử. Phương pháp thứ hai được sử dụng trong điện toán kỹ thuật số. Trong bộ xử lý máy tính, các bóng bán dẫn được nhóm thành các phần tử vi mô gọi là flip-flop và cổng. Trigger có hai trạng thái ổn định (mở - đóng) và chuyển từ trạng thái này sang trạng thái khác bằng tín hiệu điện. Các trạng thái ổn định này tương ứng với các khái niệm toán học về 0 hoặc 1. Cổng phức tạp hơn một chút - chúng có thể có một số đầu vào (điện áp đầu ra phụ thuộc vào sự kết hợp của các điện áp ở đầu vào) và được sử dụng cho các phép toán số học và logic đơn giản.

Các lệnh đi vào bộ xử lý thông qua các bus của nó thực chất là các tín hiệu điện, nhưng chúng cũng có thể được biểu diễn dưới dạng tập hợp các số 0 và số 1, tức là các số. Các đội khác nhau có số lượng khác nhau. Do đó, chương trình thực tế mà bộ xử lý làm việc là một dãy số gọi là mã máy.

Thuật toán và chương trình

Bạn cần điều khiển máy tính theo một thuật toán nhất định. Thuật toán là một mô tả được xác định chính xác về một phương pháp giải quyết vấn đề dưới dạng một chuỗi hành động hữu hạn (theo thời gian). Mô tả này còn được gọi là chính thức. Ngôn ngữ lập trình được sử dụng để trình bày thuật toán ở dạng dễ hiểu đối với máy tính. Đầu tiên, một thuật toán hành động luôn được phát triển và sau đó nó được viết ra bằng một trong những ngôn ngữ này. Kết quả là một văn bản chương trình - một mô tả đầy đủ, đầy đủ và chi tiết về thuật toán trong ngôn ngữ lập trình. Sau đó, văn bản chương trình này được dịch sang mã máy hoặc được thực thi bởi các ứng dụng tiện ích đặc biệt gọi là trình dịch.

Ngôn ngữ lập trình là gì

Rất khó để tự viết một chương trình bằng mã máy và độ phức tạp này tăng mạnh khi kích thước của chương trình tăng lên và độ phức tạp của việc giải quyết vấn đề mong muốn. Thông thường, chúng ta có thể giả định rằng mã máy có thể chấp nhận được nếu kích thước chương trình không vượt quá vài chục byte và không cần các thao tác nhập/xuất dữ liệu thủ công.

Vì vậy, ngày nay hầu như tất cả các chương trình đều được tạo ra bằng ngôn ngữ lập trình. Về mặt lý thuyết, một chương trình có thể được viết bằng ngôn ngữ thông thường (tự nhiên) của con người - đây được gọi là lập trình bằng ngôn ngữ kim loại (một cách tiếp cận tương tự thường được sử dụng ở giai đoạn biên dịch thuật toán), nhưng vẫn chưa thể dịch tự động một chương trình như vậy thành mã máy do tính mơ hồ cao của ngôn ngữ tự nhiên.

Ngôn ngữ lập trình là ngôn ngữ nhân tạo. Chúng khác với những từ tự nhiên ở một số lượng “từ” hạn chế, ý nghĩa của nó rất rõ ràng đối với người dịch và ở những quy tắc rất nghiêm ngặt để viết lệnh (toán tử). Tổng thể các yêu cầu như vậy tạo thành cú pháp của ngôn ngữ lập trình và ý nghĩa của từng lệnh cũng như các cấu trúc ngôn ngữ khác tạo thành ngữ nghĩa của nó. Vi phạm hình thức viết chương trình dẫn đến việc người dịch không hiểu được mục đích của người vận hành và hiển thị thông báo về lỗi cú pháp, sử dụng các lệnh ngôn ngữ viết đúng nhưng không tương ứng với thuật toán, dẫn đến lỗi ngữ nghĩa (còn gọi là lỗi logic hoặc lỗi thời gian chạy).

Quá trình tìm lỗi trong chương trình được gọi là kiểm tra, quá trình loại bỏ lỗi được gọi là gỡ lỗi.

Trình biên dịch và trình thông dịch

trình biên dịch ngôn ngữ lập trình

Bằng cách sử dụng ngôn ngữ lập trình, nó không phải là một chương trình hoàn chỉnh được tạo ra mà chỉ có văn bản của nó mô tả một thuật toán được phát triển trước đó. Để có một chương trình hoạt động, bạn cần tự động dịch văn bản này sang mã máy (các chương trình biên dịch được sử dụng cho việc này) và sau đó sử dụng nó riêng biệt với văn bản nguồn hoặc thực hiện ngay các lệnh ngôn ngữ được chỉ định trong văn bản chương trình (các chương trình thông dịch làm cái này).

Trình thông dịch lấy câu lệnh ngôn ngữ tiếp theo từ văn bản chương trình, phân tích cấu trúc của nó và sau đó thực thi nó ngay lập tức (thông thường, sau khi phân tích, câu lệnh được dịch sang một số biểu diễn trung gian hoặc thậm chí là mã máy để thực thi tiếp theo hiệu quả hơn). Chỉ sau khi câu lệnh hiện tại hoàn thành thành công thì trình thông dịch mới chuyển sang câu lệnh tiếp theo. Hơn nữa, nếu cùng một toán tử phải được thực thi nhiều lần trong một chương trình, trình thông dịch sẽ thực thi nó mỗi lần như thể nó được thực hiện lần đầu tiên. Do đó, các chương trình yêu cầu số lượng lớn phép tính lặp đi lặp lại có thể chạy chậm. Ngoài ra, để chạy một chương trình như vậy trên một máy tính khác, một trình thông dịch cũng phải được cài đặt ở đó - xét cho cùng, nếu không có nó, văn bản chương trình chỉ là một tập hợp các ký tự.

Theo một cách khác, chúng ta có thể nói rằng trình thông dịch mô hình hóa một máy tính ảo nhất định, trong đó các lệnh cơ bản không phải là các lệnh của bộ xử lý cơ bản mà là các toán tử ngôn ngữ lập trình.

Trình biên dịch xử lý toàn bộ văn bản của chương trình (đôi khi được gọi là mã nguồn). Họ quét nó để tìm lỗi cú pháp (đôi khi vài lần), thực hiện một số phân tích ngữ nghĩa và sau đó tự động dịch (dịch) nó sang ngôn ngữ máy—tạo mã máy. Thông thường, tối ưu hóa được thực hiện bằng cách sử dụng một tập hợp các phương pháp cải thiện hiệu suất của chương trình (ví dụ: sử dụng các hướng dẫn nhắm vào một bộ xử lý cụ thể, bằng cách loại bỏ các hướng dẫn không cần thiết, các phép tính trung gian, v.v.). Chương trình hoàn chỉnh thu được rất nhỏ gọn và hiệu quả, chạy nhanh hơn hàng trăm lần so với chương trình được thực thi bằng trình thông dịch và có thể được chuyển sang các máy tính khác bằng bộ xử lý hỗ trợ mã máy thích hợp.

Nhược điểm chính của trình biên dịch là tốn nhiều công sức khi dịch các ngôn ngữ lập trình tập trung vào việc xử lý dữ liệu có cấu trúc phức tạp, thường không được biết trước hoặc thay đổi linh hoạt trong quá trình vận hành chương trình. Sau đó, bạn phải chèn nhiều kiểm tra bổ sung vào mã máy, phân tích tính khả dụng của tài nguyên hệ điều hành, nắm bắt và giải phóng chúng một cách linh hoạt, hình thành và xử lý các đối tượng phức tạp trong bộ nhớ máy tính, điều này khá khó thực hiện ở mức độ khó. -hướng dẫn máy được mã hóa và đối với một số nhiệm vụ gần như không thể thực hiện được.

Ngược lại, với sự trợ giúp của trình thông dịch, có thể dừng chương trình bất cứ lúc nào, kiểm tra nội dung bộ nhớ, tổ chức đối thoại với người dùng, thực hiện các phép biến đổi dữ liệu phức tạp tùy ý, đồng thời liên tục theo dõi trạng thái của môi trường phần mềm và phần cứng xung quanh, nhờ đó đạt được độ tin cậy vận hành cao. Khi thực thi từng câu lệnh, trình thông dịch sẽ kiểm tra nhiều đặc điểm của hệ điều hành và nếu cần, sẽ thông báo cho nhà phát triển càng chi tiết càng tốt về các vấn đề mới phát sinh. Ngoài ra, trình thông dịch rất thuận tiện khi sử dụng như một công cụ để học lập trình, vì nó cho phép bạn hiểu nguyên tắc hoạt động của bất kỳ toán tử riêng lẻ nào trong ngôn ngữ.

Trong các hệ thống lập trình thực tế, cả công nghệ biên dịch và giải thích đều được trộn lẫn. Trong quá trình gỡ lỗi, chương trình có thể được thực thi từng bước và mã kết quả không nhất thiết phải là mã máy - nó thậm chí có thể là mã nguồn được viết bằng ngôn ngữ lập trình khác (điều này giúp đơn giản hóa đáng kể quá trình dịch thuật, nhưng yêu cầu trình biên dịch cho bản cuối cùng). ngôn ngữ) hoặc mã trung gian độc lập với máy, một bộ xử lý trừu tượng, trong các kiến ​​trúc máy tính khác nhau, sẽ được thực thi bằng trình thông dịch hoặc được biên dịch thành mã máy tương ứng.

Các cấp độ của ngôn ngữ lập trình

Các loại bộ xử lý khác nhau có các tập lệnh khác nhau. Nếu một ngôn ngữ lập trình tập trung vào một loại bộ xử lý cụ thể và tính đến các tính năng của nó thì nó được gọi là ngôn ngữ lập trình cấp thấp. Trong trường hợp này, “mức độ thấp” không có nghĩa là “xấu”. Điều này có nghĩa là các toán tử ngôn ngữ gần với mã máy và tập trung vào các lệnh xử lý cụ thể.

Ngôn ngữ cấp thấp nhất là hợp ngữ, nó biểu diễn đơn giản từng lệnh mã máy, không phải dưới dạng số mà sử dụng các quy ước ký hiệu được gọi là ghi nhớ. Việc chuyển đổi rõ ràng một lệnh máy thành một lệnh lắp ráp được gọi là phiên âm. Vì các tập lệnh cho mỗi kiểu bộ xử lý là khác nhau nên một kiến ​​trúc máy tính cụ thể có ngôn ngữ hợp ngữ riêng và chương trình được viết trong đó chỉ có thể được sử dụng trong môi trường đó.

Các ngôn ngữ cấp thấp tạo ra các chương trình rất hiệu quả và nhỏ gọn vì nhà phát triển có quyền truy cập vào tất cả các khả năng của bộ xử lý. Mặt khác, nó đòi hỏi sự hiểu biết rất tốt về máy tính, việc gỡ lỗi các ứng dụng lớn rất khó và chương trình thu được không thể chuyển sang máy tính có loại bộ xử lý khác. Những ngôn ngữ như vậy thường được sử dụng để viết các ứng dụng hệ thống nhỏ, trình điều khiển thiết bị và mô-đun giao diện với thiết bị không chuẩn, khi tính nhỏ gọn, hiệu suất và khả năng truy cập trực tiếp tài nguyên phần cứng trở thành yêu cầu quan trọng nhất. Trong một số lĩnh vực, chẳng hạn như đồ họa máy tính, các thư viện được viết bằng hợp ngữ để triển khai hiệu quả các thuật toán xử lý hình ảnh chuyên sâu về mặt tính toán.

Ngôn ngữ lập trình cấp cao gần gũi và dễ hiểu hơn với con người so với máy tính. Chúng không tính đến các tính năng của kiến ​​​​trúc máy tính cụ thể, do đó, các chương trình được tạo ở cấp độ văn bản nguồn có thể dễ dàng di chuyển sang các nền tảng khác mà trình dịch ngôn ngữ này đã được tạo. Việc phát triển chương trình bằng ngôn ngữ cấp cao sẽ dễ dàng hơn nhiều bằng cách sử dụng các lệnh rõ ràng và mạnh mẽ, đồng thời ít mắc lỗi hơn khi tạo chương trình.

Các thế hệ ngôn ngữ lập trình

Ngôn ngữ lập trình thường được chia thành năm thế hệ. Thế hệ đầu tiên bao gồm các ngôn ngữ được tạo ra vào đầu những năm 50, khi những chiếc máy tính đầu tiên mới ra đời. Đó là ngôn ngữ hợp ngữ đầu tiên được tạo ra theo nguyên tắc “một lệnh - một dòng”.

Thời kỳ hoàng kim của thế hệ ngôn ngữ lập trình thứ hai diễn ra vào cuối những năm 50, đầu những năm 60. Sau đó, một trình biên dịch ký hiệu đã được phát triển, trong đó khái niệm về biến xuất hiện. Nó trở thành ngôn ngữ lập trình chính thức đầu tiên. Nhờ sự xuất hiện của nó, tốc độ phát triển và độ tin cậy của các chương trình đã tăng lên rõ rệt.

Sự xuất hiện của thế hệ ngôn ngữ lập trình thứ ba thường được cho là vào những năm 60. Vào thời điểm này, các ngôn ngữ cấp cao phổ quát đã ra đời, với sự trợ giúp của chúng, bạn có thể giải quyết các vấn đề từ bất kỳ lĩnh vực nào. Những phẩm chất như vậy của các ngôn ngữ mới như tính đơn giản tương đối, tính độc lập với một máy tính cụ thể và khả năng sử dụng các cấu trúc cú pháp mạnh mẽ đã giúp tăng đáng kể năng suất của các lập trình viên. Cấu trúc của những ngôn ngữ này, dễ hiểu đối với hầu hết người dùng, đã thu hút một số lượng đáng kể các chuyên gia từ các lĩnh vực không phải máy tính đến viết các chương trình nhỏ (thường có tính chất kỹ thuật hoặc kinh tế). Phần lớn các ngôn ngữ thuộc thế hệ này vẫn được sử dụng thành công cho đến ngày nay.

Từ đầu những năm 70 đến nay, thời kỳ ngôn ngữ thế hệ thứ tư vẫn tiếp tục. Những ngôn ngữ này được thiết kế để thực hiện các dự án lớn, tăng độ tin cậy và tốc độ tạo của chúng. Chúng thường tập trung vào các lĩnh vực ứng dụng chuyên biệt, nơi có thể đạt được kết quả tốt bằng cách sử dụng các ngôn ngữ không phổ biến mà hướng đến vấn đề hoạt động với các khái niệm cụ thể về một lĩnh vực chủ đề hẹp. Theo quy định, các toán tử mạnh mẽ được tích hợp vào các ngôn ngữ này, cho phép một dòng mô tả chức năng cần hàng nghìn dòng mã nguồn để triển khai bằng các ngôn ngữ mới hơn.

Sự ra đời của ngôn ngữ thế hệ thứ năm xảy ra vào giữa những năm 90. Chúng cũng bao gồm các hệ thống tự động tạo các chương trình ứng dụng bằng các công cụ phát triển trực quan mà không cần kiến ​​thức lập trình. Ý tưởng chính đằng sau những ngôn ngữ này là khả năng tự động tạo văn bản kết quả bằng các ngôn ngữ lập trình phổ quát (sau đó cần được biên dịch). Các hướng dẫn được nhập vào máy tính ở dạng trực quan nhất bằng các phương pháp thuận tiện nhất cho người không quen với lập trình.

Tổng quan về ngôn ngữ lập trình cấp cao

FORTRAN(Fortran). Đây là ngôn ngữ được biên dịch đầu tiên, được tạo bởi Jim Backus vào những năm 50. Các lập trình viên phát triển chương trình độc quyền bằng hợp ngữ bày tỏ sự nghi ngờ nghiêm trọng về khả năng của ngôn ngữ cấp cao hiệu suất cao, vì vậy tiêu chí chính khi phát triển trình biên dịch Fortran là hiệu quả của mã thực thi. Mặc dù Fortran đi tiên phong trong một số khái niệm lập trình quan trọng, nhưng việc viết chương trình dễ dàng đã bị hy sinh để có được khả năng tạo ra mã máy hiệu quả. Tuy nhiên, một số lượng lớn thư viện đã được tạo cho ngôn ngữ này, từ các tổ hợp thống kê đến các gói điều khiển vệ tinh, vì vậy Fortran tiếp tục được sử dụng tích cực trong nhiều tổ chức và hiện công việc đang được tiến hành trên tiêu chuẩn Fortran P2k tiếp theo, sẽ xuất hiện trong 2000. Có một phiên bản tiêu chuẩn của Fortran được gọi là HPF (Fortran hiệu suất cao) dành cho các siêu máy tính song song có nhiều bộ xử lý.

SOVOL(Cobol). Nó là một ngôn ngữ được biên dịch để sử dụng trong các vấn đề kinh tế và kinh doanh, được phát triển vào đầu những năm 60. Nó được đặc trưng bởi tính "dài dòng" - các câu phát biểu của nó đôi khi trông giống như các cụm từ tiếng Anh thông thường. Cobol cung cấp các công cụ rất mạnh mẽ để làm việc với lượng lớn dữ liệu được lưu trữ trên nhiều phương tiện bên ngoài khác nhau. Rất nhiều ứng dụng đã được tạo bằng ngôn ngữ này và vẫn được sử dụng tích cực cho đến ngày nay. Chỉ cần nói rằng các lập trình viên COBOL nhận được mức lương cao nhất ở Hoa Kỳ.

Algol(ALGOL). Một ngôn ngữ được biên dịch được tạo ra vào năm 1960. Nó được dự định thay thế Fortran, nhưng do cấu trúc phức tạp hơn nên nó không được sử dụng rộng rãi. Vào năm 1968, một phiên bản của Algol 68 đã được tạo ra, phiên bản này vẫn vượt trội về khả năng của nó so với nhiều ngôn ngữ lập trình ngày nay, nhưng do thiếu máy tính đủ hiệu quả cho nó nên không thể tạo ra các trình biên dịch tốt cho nó một cách dễ dàng. kịp thời.

Paskal(Pascal). Ngôn ngữ Pascal, được tạo ra vào cuối những năm 70 bởi người sáng lập nhiều ý tưởng lập trình hiện đại, Niklaus Wirth, về nhiều mặt gợi nhớ đến Algol, nhưng nó đã thắt chặt một số yêu cầu đối với cấu trúc chương trình và có các khả năng cho phép nó hoạt động thành công. được sử dụng khi tạo các dự án lớn.

Nền tảng(NỀN TẢNG). Có cả trình biên dịch và trình thông dịch cho ngôn ngữ này và về mức độ phổ biến, nó đứng đầu thế giới. Nó được tạo ra vào những năm 60 như một ngôn ngữ giáo dục và rất dễ học.

C (Si). Ngôn ngữ này được tạo ra tại Phòng thí nghiệm Bell và ban đầu không được coi là ngôn ngữ đại chúng. Nó đã được lên kế hoạch thay thế ngôn ngữ trình biên dịch mã để có thể tạo ra các chương trình nhỏ gọn và hiệu quả tương đương, đồng thời không phụ thuộc vào một loại bộ xử lý cụ thể.

C tương tự như Pascal về nhiều mặt và có thêm phương tiện để làm việc trực tiếp với bộ nhớ (con trỏ). Vào những năm 70, nhiều chương trình ứng dụng, hệ thống và một số hệ điều hành nổi tiếng (11pgx) đã được viết bằng ngôn ngữ này.

C++(C++). C++ là phần mở rộng hướng đối tượng của ngôn ngữ C được tạo bởi Bjarne Stroustrup vào năm 1980. Một loạt các tính năng mới mạnh mẽ giúp tăng đáng kể năng suất của lập trình viên kết hợp với tính chất cấp thấp nhất định được kế thừa từ ngôn ngữ C, dẫn đến việc tạo ra các chương trình phức tạp và đáng tin cậy đòi hỏi các nhà phát triển phải đào tạo chuyên nghiệp ở mức độ cao.

Java(Java, Java). Ngôn ngữ này được 5ip tạo ra vào đầu những năm 90 dựa trên C++. Nó được thiết kế để đơn giản hóa việc phát triển các ứng dụng dựa trên C++ bằng cách loại bỏ tất cả các tính năng cấp thấp khỏi nó. Nhưng tính năng chính của ngôn ngữ này là việc biên dịch không thành mã máy mà thành mã byte độc ​​lập với nền tảng (mỗi lệnh chiếm một byte). Mã byte này có thể được thực thi bằng trình thông dịch - JVM (Máy ảo Java), các phiên bản của chúng ngày nay được tạo cho mọi nền tảng. Nhờ có sẵn nhiều máy Java, các chương trình Java có thể di động không chỉ ở cấp độ văn bản nguồn mà còn ở cấp độ mã byte nhị phân, vì vậy ngôn ngữ Java ngày nay đứng thứ hai về mức độ phổ biến trên thế giới sau BASIC.

Sự chú ý đặc biệt trong việc phát triển ngôn ngữ này tập trung vào hai lĩnh vực: hỗ trợ tất cả các loại thiết bị di động và máy vi tính được tích hợp trong thiết bị gia dụng (công nghệ Jini) và tạo ra các mô-đun phần mềm độc lập với nền tảng có khả năng chạy trên các máy chủ trong mạng toàn cầu và địa phương với nhiều hệ điều hành khác nhau (công nghệ Java Beans). Cho đến nay, nhược điểm chính của ngôn ngữ này là hiệu suất thấp, vì Java là ngôn ngữ được thông dịch.

VỚI#(Biển sắc nét). Vào cuối những năm 90, ngôn ngữ C# được phát triển tại Microsoft dưới sự lãnh đạo của Anders Heilsberg. Nó thể hiện những ý tưởng hay nhất của C và C++, cũng như những ưu điểm của Java. Đúng, C#, giống như các công nghệ khác của Microsoft, tập trung vào nền tảng Windows. Tuy nhiên, về mặt hình thức, nó không khác biệt so với các ngôn ngữ phổ thông khác và tập đoàn thậm chí còn có kế hoạch tiêu chuẩn hóa nó. Ngôn ngữ C# được thiết kế để phát triển nhanh chóng. NET và triển khai nó trong Microsoft Visual Studio. NET chứa nhiều tính năng gắn kết C# với kiến ​​trúc bên trong của Windows và nền tảng .NET.

Ngôn ngữ lập trình cơ sở dữ liệu

Nhóm ngôn ngữ này khác với các ngôn ngữ thuật toán chủ yếu ở vấn đề chúng giải quyết. Cơ sở dữ liệu là một tệp (hoặc nhóm tệp) là một tập hợp các bản ghi được sắp xếp có cấu trúc thống nhất và được sắp xếp theo một mẫu duy nhất (thường ở dạng bảng). Cơ sở dữ liệu có thể bao gồm một số bảng. Thật thuận tiện để lưu trữ nhiều thông tin khác nhau từ sách tham khảo, tủ hồ sơ, nhật ký kế toán, v.v. trong cơ sở dữ liệu.

Khi làm việc với cơ sở dữ liệu, bạn thường cần thực hiện các thao tác sau:

§ tạo/sửa đổi thuộc tính/xóa bảng trong cơ sở dữ liệu;

§ tìm kiếm, lựa chọn, sắp xếp thông tin theo yêu cầu của người dùng;

§ thêm bản ghi mới;

§ sửa đổi hồ sơ hiện có;

§ xóa các bản ghi hiện có.

Cơ sở dữ liệu đầu tiên xuất hiện từ rất lâu, ngay khi có nhu cầu xử lý một lượng lớn thông tin và lựa chọn các nhóm hồ sơ dựa trên những đặc điểm nhất định. Với mục đích này, ngôn ngữ truy vấn có cấu trúc SQL (Ngôn ngữ truy vấn có cấu trúc) đã được tạo. Nó dựa trên lý thuyết toán học mạnh mẽ và cho phép xử lý cơ sở dữ liệu hiệu quả bằng cách thao tác các nhóm bản ghi thay vì các bản ghi riêng lẻ.

DBMS (Hệ thống quản lý cơ sở dữ liệu) đã được phát triển để quản lý cơ sở dữ liệu lớn và xử lý chúng một cách hiệu quả. Hầu hết mọi DBMS, ngoài việc hỗ trợ ngôn ngữ SQL, còn có ngôn ngữ riêng, tập trung vào các tính năng của DBMS này và không thể chuyển sang các hệ thống khác. Ngày nay có ba nhà sản xuất DBMS hàng đầu trên thế giới: Microsoft (SQL Server), IBM (DB2) và Office. Các sản phẩm của họ nhằm mục đích hỗ trợ công việc đồng thời của hàng nghìn người dùng trên mạng và cơ sở dữ liệu có thể được lưu trữ ở dạng phân tán trên một số máy chủ. Mỗi DBMS này triển khai phương ngữ SQL riêng, tập trung vào các đặc điểm của một máy chủ cụ thể, do đó các chương trình SQL được chuẩn bị cho các DBMS khác nhau thường không tương thích với nhau.

Với sự ra đời của máy tính cá nhân, cái gọi là DBMS trên máy tính để bàn đã được tạo ra. Tổ tiên của các ngôn ngữ lập trình cơ sở dữ liệu hiện đại cho PC được coi là DBMS dBase II, ngôn ngữ của nó được thông dịch. Sau đó, các trình biên dịch được tạo ra cho nó, các DBMS của FoxPro và Clipper xuất hiện, hỗ trợ các phương ngữ của ngôn ngữ này. Ngày nay, DBMS dành cho máy tính để bàn phổ biến nhất là Microsoft Access.

Ngôn ngữ lập trình cho Internet

Với sự phát triển tích cực của mạng toàn cầu, nhiều ngôn ngữ lập trình phổ biến, được điều chỉnh riêng cho Internet, đã được tạo ra. Tất cả chúng đều khác nhau ở những đặc điểm đặc trưng: ngôn ngữ được thông dịch, trình thông dịch cho chúng được phân phối miễn phí và bản thân các chương trình đều nằm trong mã nguồn. Những ngôn ngữ như vậy được gọi là ngôn ngữ chữ viết.

HTML. Một ngôn ngữ nổi tiếng để chuẩn bị tài liệu. Nó rất đơn giản và chứa các lệnh cơ bản để định dạng văn bản, thêm hình ảnh, đặt phông chữ và màu sắc, sắp xếp các liên kết và bảng. Tất cả các trang Web đều được viết bằng HTML hoặc sử dụng các phần mở rộng của nó.

Đăng kýtôi. Vào những năm 80, Larry Wall đã phát triển ngôn ngữ Perl. Nó được thiết kế như một phương tiện để xử lý hiệu quả các tệp văn bản lớn, tạo báo cáo văn bản và quản lý tác vụ. Perl mạnh hơn đáng kể so với ngôn ngữ C. Nó bao gồm nhiều chức năng được sử dụng thường xuyên để làm việc với chuỗi, mảng, tất cả các loại công cụ chuyển đổi dữ liệu, quản lý quy trình, làm việc với thông tin hệ thống, v.v.

RNR. Rasmus Lerdorf, người tích cực sử dụng các tập lệnh Perl, đã quyết định cải tiến ngôn ngữ này vào năm 1995 bằng cách đơn giản hóa nó và bổ sung thêm các công cụ tích hợp để truy cập cơ sở dữ liệu. Kết quả là sự phát triển của Trình thông dịch biểu mẫu/trang nội dung cá nhân (PHP/FI). Trong vòng vài năm, các chương trình dựa trên nó đã được sử dụng trên 50 nghìn trang web. Vào năm 1997, nó đã được cải tiến đáng kể bởi Andy Gutman và Ziv Surasky, và dưới cái tên PHP 3.0, ngôn ngữ này nhanh chóng trở nên phổ biến đối với những người tạo trang web năng động trên toàn thế giới.

tcl/ Tk. Vào cuối những năm 80, John Austirout đã nghĩ ra ngôn ngữ kịch bản Tcl phổ biến và thư viện Tk. Ở Tcl, anh ấy đã cố gắng hiện thực hóa tầm nhìn về một ngôn ngữ lập trình lý tưởng. Ngôn ngữ Tcl tập trung vào việc tự động hóa các quy trình thông thường và bao gồm các lệnh mạnh mẽ được thiết kế để hoạt động với các đối tượng trừu tượng chưa được gõ. Nó độc lập với loại hệ thống, đồng thời cho phép bạn tạo các chương trình có giao diện đồ họa.

VRML. Năm 1994, ngôn ngữ VRML được tạo ra để tổ chức các giao diện ảo ba chiều trên Internet. Nó cho phép bạn mô tả dưới dạng văn bản nhiều cảnh ba chiều, ánh sáng và bóng tối, kết cấu (lớp phủ của vật thể), tạo thế giới của riêng bạn, du hành qua chúng, “bay xung quanh” từ mọi phía, xoay theo bất kỳ hướng nào, chia tỷ lệ, điều chỉnh chiếu sáng, v.v.

XML. Vào tháng 8 năm 1996, tập đoàn WWW, chịu trách nhiệm về các tiêu chuẩn công nghệ Internet, đã bắt đầu chuẩn bị ngôn ngữ đánh dấu cấu trúc tài liệu phổ quát dựa trên công nghệ SGML được IBM tạo ra cách đây khá lâu. Ngôn ngữ mới được gọi là XML. Ngày nay, nó đóng vai trò là nền tảng cho nhiều ứng dụng hệ thống, mạng và ứng dụng, cho phép các khía cạnh khác nhau của cấu trúc bên trong của các tài liệu được tổ chức theo cấp bậc được trình bày dưới dạng văn bản minh bạch cho người dùng và chương trình. Trong tương lai gần nó có thể trở thành sự thay thế cho HTML.

Ngôn ngữ mô hình hóa

Khi tạo chương trình và hình thành cấu trúc cơ sở dữ liệu, các phương pháp chính thức để biểu diễn chúng thường được sử dụng - các ký hiệu chính thức, với sự trợ giúp của chúng, bạn có thể biểu diễn trực quan (mô tả bằng chuột) các bảng, trường, đối tượng chương trình của cơ sở dữ liệu và mối quan hệ giữa chúng trong một hệ thống có trình soạn thảo và trình tạo mã nguồn chuyên dụng của chương trình dựa trên mô hình đã tạo. Những hệ thống như vậy được gọi là hệ thống CASE. Họ tích cực sử dụng các ký hiệu IDEF và gần đây ngôn ngữ mô hình hóa đồ họa UML ngày càng trở nên phổ biến.

Các ngôn ngữ lập trình khác

P.L./ TÔI(PL/I). Vào giữa những năm 60, IBM quyết định tận dụng những gì tốt nhất từ ​​các ngôn ngữ Fortran, Cobol và Algol. Kết quả là vào năm 1964, một ngôn ngữ lập trình biên dịch mới đã ra đời, được gọi là Programming Language One. Ngôn ngữ này đã triển khai nhiều giải pháp độc đáo, tính hữu dụng của chúng chỉ có thể được đánh giá 33 năm sau, trong thời đại của các hệ thống phần mềm lớn. Về khả năng của nó, PL/I mạnh hơn nhiều ngôn ngữ khác (C, Pascal). Ví dụ: PL/I có một khả năng duy nhất để chỉ định độ chính xác của các phép tính - ngay cả C++ và Java cũng không có khả năng này. Ngôn ngữ này tiếp tục được IBM hỗ trợ cho đến ngày nay.

Chuyện nhỏ(Trò chuyện nhỏ). Công việc nghiên cứu ngôn ngữ này bắt đầu vào năm 1970 tại phòng thí nghiệm nghiên cứu của Tập đoàn XEROX và kết thúc 10 năm sau đó, được thể hiện trong phiên bản cuối cùng của trình thông dịch SMALLTALK-80. Ngôn ngữ này độc đáo ở chỗ cú pháp của nó rất nhỏ gọn và chỉ dựa trên khái niệm về một đối tượng. Không có toán tử hoặc dữ liệu trong ngôn ngữ này. Mọi thứ có trong Smalltalk đều là đối tượng và bản thân các đối tượng giao tiếp với nhau chỉ bằng tin nhắn (ví dụ: sự xuất hiện của biểu thức 1 + 1 khiến thông báo “+”, nghĩa là “thêm”, được gửi đến đối tượng I, với tham số 1, được coi không phải là số không đổi mà còn là một đối tượng). Không có cấu trúc điều khiển nào khác trong ngôn ngữ, ngoại trừ “toán tử” nhánh (thực ra là một hàm thuộc về một đối tượng tiêu chuẩn), mặc dù chúng có thể được mô hình hóa rất đơn giản. Ngày nay, VisualAge cho Smalltalk đang được IBM tích cực phát triển.

LISP(Lisp). Một ngôn ngữ lập trình thông dịch được tạo ra vào năm 1960 bởi John McCarthy. Nó tập trung vào cấu trúc dữ liệu dưới dạng danh sách và cho phép bạn tổ chức xử lý hiệu quả khối lượng lớn thông tin văn bản.

Prolog(Lời mở đầu). Được tạo ra vào đầu những năm 70 bởi Alan Colmeroe. Một chương trình bằng ngôn ngữ này, dựa trên mô hình toán học của lý thuyết tính toán vị từ, được xây dựng từ một chuỗi các sự kiện và quy tắc, sau đó đưa ra một tuyên bố rằng Prolog sẽ cố gắng chứng minh bằng cách sử dụng các quy tắc được giới thiệu. Một người chỉ mô tả cấu trúc của vấn đề, còn “động cơ” bên trong của Prolog sẽ tự tìm kiếm giải pháp bằng phương pháp tìm kiếm và so sánh.

Ada(Ađa). Được đặt theo tên của Lady Augusta Ada Byron, con gái của nhà thơ người Anh Byron và người họ hàng xa Annabella Milbanke. Năm 1980, hàng trăm chuyên gia của Bộ Quốc phòng Hoa Kỳ đã chọn ngôn ngữ đặc biệt này từ 17 phương án, được phát triển bởi một nhóm nhỏ do Jean Ishbia đứng đầu. Nó đáp ứng mọi yêu cầu của Lầu Năm Góc vào thời điểm đó và cho đến nay hàng chục tỷ USD đã được đầu tư vào việc phát triển nó. Cấu trúc của ngôn ngữ này tương tự như Pascal. Nó có các biện pháp hạn chế nghiêm ngặt quyền truy cập vào các cấp độ thông số kỹ thuật khác nhau và sức mạnh của các cấu trúc điều khiển bị đưa đến giới hạn.

NGOÀI(Pháo đài). Kết quả của nỗ lực của Charles Moore vào những năm 70 nhằm tạo ra một ngôn ngữ với các công cụ lập trình mạnh mẽ có thể được triển khai hiệu quả trên các máy tính có lượng bộ nhớ nhỏ và trình biên dịch có thể tạo ra mã rất nhanh và nhỏ gọn, nghĩa là nó đóng vai trò thay thế cho người lắp ráp. Tuy nhiên, những khó khăn trong việc nhận biết văn bản chương trình được viết ở dạng khác thường khiến việc tìm ra lỗi rất khó khăn và với sự ra đời của C, ngôn ngữ Forth đã bị lãng quên.

Phần kết luận

Các chương trình máy tính được tạo ra bởi các lập trình viên - những người được đào tạo trong quá trình viết chúng (lập trình). Chúng ta biết rằng chương trình là một chuỗi lệnh được sắp xếp hợp lý cần thiết để điều khiển máy tính (thực hiện các thao tác cụ thể), do đó, việc lập trình sẽ tạo ra một chuỗi lệnh cần thiết để giải quyết một vấn đề cụ thể.

Thư mục

1. Simonovich S.V. Khóa học cơ bản về khoa học máy tính ấn bản thứ 2 “Peter” M., St. Petersburg, Rostov-on-Don-2006

2. A. A. Tin học Stepanov Phiên bản thứ 4 “Peter” M., St. Petersburg, Rostov-on-Don, Kyiv-2005

3. B.V. Sobol, A. B. Galin Sách giáo khoa khoa học máy tính Rostov-on-Don, “Phoenix” 2005

4. I.I. Sergeeva, A.R. Tin học Muzalevskaya, M. Forum-Infa-Moscow, 2006

5. EL Zhukova, E.G. Tin học Burda, M. 2007, Nauka-Press

Đăng trên Allbest.ru

Tài liệu tương tự

    Khái niệm về lập trình có cấu trúc và thuật toán giải quyết vấn đề. Sơ lược về lịch sử phát triển của ngôn ngữ lập trình từ ngôn ngữ máy đến hợp ngữ và ngôn ngữ cấp cao. Lập trình thủ tục trong C#. Các phương pháp và chương trình mô hình hóa.

    hướng dẫn, thêm vào ngày 26/10/2010

    Bản chất và chức năng của ngôn ngữ lập trình, sự phát triển của chúng và đánh giá mức độ phổ biến của các loại ngôn ngữ khác nhau. Các tính năng của chương trình máy tính được phát triển bằng ngôn ngữ được biên dịch, giải thích hoặc hỗn hợp. Các lớp cơ bản và hệ thống phân cấp của ngôn ngữ lập trình.

    trình bày, được thêm vào ngày 23/01/2013

    Sự phát triển của ngôn ngữ lập trình từ trình độ thấp đến thời hiện đại. Ngôn ngữ lập trình thế hệ thứ hai - trình biên dịch mã. Ngôn ngữ mệnh lệnh, chức năng, logic và hướng đối tượng. Tính độc lập của máy. Các mô hình lập trình.

    trình bày, thêm vào ngày 14/10/2013

    Phân loại ngôn ngữ lập trình. Sử dụng các cấu trúc lặp và thực hiện các quá trình lặp. Cấu trúc thuật toán của vòng lặp trong ngôn ngữ C, C++, Java, C#. Đặc điểm của ngôn ngữ lập trình cấp cao hiện đại và ứng dụng của chúng.

    bài tập khóa học, được thêm vào ngày 13/11/2009

    Đặc điểm và tính chất của ngôn ngữ lập trình. Nghiên cứu sự phát triển của ngôn ngữ lập trình hướng đối tượng. Xây dựng bản đồ tiến hóa của cơ chế OOP. Phát triển mô hình khái niệm về hoạt động của giao diện người dùng.

    bài tập khóa học, được thêm vào ngày 17/11/2014

    Xem xét thông tin chung và cấp độ của ngôn ngữ lập trình. Làm quen với lịch sử phát triển và sử dụng ngôn ngữ lập trình. Review ưu nhược điểm của các ngôn ngữ như Assembly, Pascal, C, C++, Fortran, Cobol, BASIC, SQL, HTML, Java.

    bài tập khóa học, được thêm vào ngày 04/11/2014

    Các khái niệm cơ bản về ngôn ngữ lập trình, cơ chế gõ dữ liệu. Mô tả ngôn ngữ lập trình và phương pháp dịch thuật. Máy hữu hạn và bộ chuyển đổi. Các phương pháp phân tích chung. Các phương pháp hình thức để mô tả bản dịch ngôn ngữ.

    khóa học, bổ sung ngày 04/12/2013

    Nguyên tắc cơ bản của hệ thống hóa các ngôn ngữ mô phỏng, mô hình hóa hệ thống và ngôn ngữ lập trình. Các tính năng của việc sử dụng các ngôn ngữ thuật toán, cách tiếp cận sự phát triển của chúng. Phân tích đặc điểm và hiệu quả của ngôn ngữ mô phỏng.

    bài tập khóa học, được thêm vào ngày 15/03/2012

    Đánh giá hiện trạng phát triển của công nghệ máy tính. Lịch sử phát triển, phân loại, thông tin và cấp độ của ngôn ngữ lập trình. Đánh giá các ngôn ngữ lập trình hiện đại: C, các giống của nó, Pascal, Fortran, BASIC - xu hướng phát triển của chúng.

    bài tập khóa học, được thêm vào ngày 22/12/2010

    Mô tả các ngôn ngữ lập trình hiện đại (Pascal, Assembly, C++, BASIC, Logo, Fort, Prolog, Refal và Lex). Khái niệm, mục đích và các thành phần của hệ thống lập trình (hệ thống lập trình hướng máy và lập trình độc lập với máy).

Các lập trình viên và nhà khoa học có xu hướng thiên vị khi nói đến ưu và nhược điểm của các ngôn ngữ lập trình khác nhau. Bằng cách so sánh một số ngôn ngữ, tác giả đã cố gắng thu được thông tin khách quan về C, C++, Java, Perl, Python, Rexx và Tcl.

Để so sánh, một chương trình đã được sử dụng, chương trình này áp đặt cùng một bộ yêu cầu cho tất cả các ngôn ngữ. Kỹ thuật này thu hẹp phạm vi so sánh nhưng làm cho nó đồng nhất. Ngoài ra, một số chương trình triển khai riêng biệt do các lập trình viên khác nhau chuẩn bị đã được phân tích cho từng ngôn ngữ. Cách tiếp cận nhóm có hai ưu điểm. Đầu tiên, nó giảm thiểu sự khác biệt giữa các lập trình viên riêng lẻ có thể làm mất hiệu lực mọi so sánh dựa trên một “mẫu” duy nhất cho mỗi ngôn ngữ. Thứ hai, có thể so sánh sự thay đổi về đặc điểm của các chương trình được biên dịch bằng các ngôn ngữ khác nhau.

Nghiên cứu so sánh đã so sánh các khía cạnh khác nhau của từng ngôn ngữ, bao gồm độ dài chương trình, nỗ lực lập trình, thời gian thực hiện, dung lượng bộ nhớ và độ tin cậy. Các ngôn ngữ được so sánh riêng lẻ và giữa các nhóm. Các ngôn ngữ kịch bản như Perl, Python, Rexx và Tcl thường được diễn giải hơn là biên dịch (ít nhất là trong quá trình phát triển chương trình) và thường không yêu cầu định nghĩa các biến.

Các ngôn ngữ lập trình truyền thống hơn - C, C++ và Java - thường được biên dịch thay vì được giải thích và yêu cầu mô tả về các loại biến. Bởi vì nhiều người cho rằng Java là rất kém hiệu quả nên đôi khi tôi đã phân loại C và C++ vào một nhóm và Java vào một nhóm khác.

Biểu đồ và phương pháp thống kê

Bài báo sử dụng sơ đồ hộp ở Hình 1 làm công cụ đánh giá chính. 1. Mỗi dòng đại diện cho một tập hợp con của dữ liệu, có tên được chỉ định ở bên trái. Mỗi vòng tròn nhỏ đại diện cho một giá trị dữ liệu. Phần còn lại của biểu đồ giúp bạn so sánh trực quan hai hoặc nhiều tập hợp con dữ liệu. Khối bóng mờ chứa nửa giữa của các giá trị, giữa ranh giới trên của quý đầu tiên (25%) và quý thứ ba (75%). Các râu ở bên trái và bên phải của hộp lần lượt hiển thị 10% dưới cùng và trên cùng. Dấu chấm đậm bên trong khối là giới hạn trên của quý thứ hai (50%). Ký hiệu "M" và đường nét đứt xung quanh nó hiển thị giá trị trung bình số học, cộng/trừ sai số bình phương trung bình gốc.

Cơm. 1.Thời gian chạy chương trình với bộ dữ liệu z1000
Ba chương trình đã hoàn thành mà không thành công sau khoảng 21 phút. Sự chênh lệch tỷ lệ giữa “giá trị xấu và giá trị tốt” dao động từ 1,5 đối với Tcl đến 27 đối với C++. Lưu ý thang đo logarit của trục. Giải thích cho hình này cũng áp dụng cho hình. 2-7. Mô tả chi tiết hơn được đưa ra trong phần "Sơ đồ và phương pháp thống kê"

Tỷ lệ tốt/xấu được sử dụng để định lượng phạm vi giá trị trong một nhóm: hãy tưởng tượng rằng dữ liệu được phân chia giữa nửa trên và nửa dưới, và tỷ lệ xấu/tốt là thương số của giá trị trung bình của nửa trên chia cho giá trị trung bình của nửa dưới. Trong sơ đồ khối, giá trị trung bình là giá trị thu được bằng cách chia giá trị ở cạnh phải của khối cho giá trị ở cạnh trái của khối. Không giống như thước đo mức độ phân tán của các giá trị như độ lệch chuẩn, tỷ lệ “giá trị xấu và giá trị tốt” loại bỏ các giá trị ngoại lệ một cách hiệu quả.

Kết luận quan trọng nhất có thể được rút ra trực tiếp từ sơ đồ. Tuy nhiên, các bài kiểm tra thống kê đã được thực hiện để kiểm tra lại. Bài kiểm tra Mann-Whitney U một đầu (còn gọi là bài kiểm tra tổng xếp hạng Wilcoxon) được sử dụng để so sánh các phương tiện. Kết quả của mỗi phép thử là p, một giá trị đặc trưng cho xác suất mà sự khác biệt quan sát được giữa hai mẫu chỉ là do ngẫu nhiên và trên thực tế không có sự khác biệt giữa hai nhóm giá trị hoặc chúng trái ngược nhau. dấu hiệu. Thông thường, bản thân giá trị p không được đưa ra và văn bản của bài viết chỉ ra “... lớn hơn ...” nếu 0 0,10 thì “không có sự khác biệt đáng kể”.

Trong một số trường hợp, khoảng tin cậy được cung cấp cho sự khác biệt về phương tiện hoặc cho sự khác biệt về logarit của phương tiện - nghĩa là tỷ lệ của phương tiện. Mức độ tin cậy mở với giới hạn trên vô hạn được chọn. Khoảng tin cậy được tính toán bằng phương pháp bootstrap, được mô tả chi tiết trong nhiều nguồn (xem ví dụ).

Do lo ngại về tính xác thực của nghiên cứu này, các kết quả thống kê định lượng chỉ cho thấy các mô hình chung và không nên được coi là sự thật dứt khoát.

kết quả

Ba tệp đầu vào khác nhau được sử dụng để đánh giá các chương trình: z1000, chứa 1000 số điện thoại ngẫu nhiên không trống; m1000, chứa 1000 số điện thoại ngẫu nhiên ngẫu nhiên, một số số có thể trống; và z0, không chứa số điện thoại và chỉ dùng để đo thời gian tải từ điển.

Thời gian thực hiện chương trình

Tôi bắt đầu phân tích bằng cách đo thời gian thực hiện tổng thể, sau đó kiểm tra riêng các giai đoạn khởi tạo và tìm kiếm.

Hoàn thành bộ dữ liệu z1000. Như thể hiện trong hình. 1, thời gian thực thi của tất cả các chương trình ngoại trừ C++, Java và Rexx là dưới 1 phút. Bằng cách so sánh dữ liệu, một số kết luận quan trọng có thể được rút ra.

  • Thời gian thực hiện trung bình của các chương trình Tcl dài hơn một chút so với Java và thậm chí cả C++.
  • Thời gian thực hiện trung bình của cả Python và Perl đều ít hơn Rexx và Tcl.
  • Mức trung bình C++ có thể gây hiểu nhầm. Do sự phân tán khá lớn giữa các giá trị lớn hơn và nhỏ hơn lân cận nên giá trị trung bình không ổn định. Thử nghiệm Wilcoxon, xem xét toàn bộ tập dữ liệu, xác nhận rằng thời gian trung bình dành cho C++ thường nhỏ hơn thời gian trung bình dành cho Java (p = 0,18).
  • Thời gian thực thi trung bình của C ít hơn so với Java, Rexx và Tcl và thường ít hơn so với Perl và Python.
  • Thời gian thực hiện của Tcl và Perl - ngoại trừ hai chương trình rất chậm - nhìn chung ổn định hơn thời gian thực hiện của các chương trình bằng các ngôn ngữ khác.

Người ta không nên coi trọng biểu đồ của C và Rexx vì chúng chỉ dựa trên một vài điểm. Thời gian thực hiện của các chương trình Rexx có thể giảm đi khoảng bốn lần bằng cách biên dịch lại trình thông dịch Regina để sử dụng các bảng băm lớn hơn; Đồng thời, yêu cầu về bộ nhớ tăng nhẹ. Nếu chúng ta kết hợp các ngôn ngữ thành chỉ ba nhóm (một - C và SI++, nhóm thứ hai - Java, nhóm thứ ba - ngôn ngữ kịch bản), thì các chương trình trong C và C++ hoạt động nhanh hơn Java (p = 0,074) và theo quy luật , kịch bản nhanh hơn (p = 0,15).

Không có sự khác biệt đáng kể giữa thời gian thực thi trung bình của các chương trình và tập lệnh Java. Có 80% khả năng là tập lệnh sẽ mất nhiều thời gian hơn 1,29 lần để thực thi - và chương trình Java lâu hơn ít nhất 1,22 lần - so với chương trình C hoặc C++. Tỷ lệ “giá trị xấu và giá trị tốt” đối với tập lệnh (4.1) nhỏ hơn đáng kể so với Java (18) và thậm chí đối với C và C++ (35).

Chỉ giai đoạn khởi tạo, tập dữ liệu z0. Sau đó tôi đo thời gian cần thiết để đọc, xử lý trước và lưu trữ từ điển. Thời gian tương ứng được hiển thị trong Hình. 2. Kết quả cho thấy rõ ràng rằng C và C++ thực hiện giai đoạn này nhanh hơn các ngôn ngữ khác được thử nghiệm. Một lần nữa, ngôn ngữ viết kịch bản nhanh nhất là Perl và Python. Hóa ra (với xác suất là 80%) khi so sánh các nhóm lớn hơn, một chương trình Java sẽ mất nhiều thời gian hơn để thực thi ít nhất 1,3 lần so với các chương trình trong C và C++ và sẽ mất ít nhất 5,5 lần để thực thi tập lệnh nhiều hơn. thời gian. Tập lệnh sẽ chạy lâu hơn ít nhất 3,2 lần so với chương trình Java.

Cơm. 2.Thời gian chương trình chỉ dành cho việc tải và xử lý trước từ điển (tập dữ liệu z0). Lưu ý thang đo logarit của trục. Tỷ lệ “giá trị xấu và giá trị tốt” dao động từ 1,3 đối với Tcl đến 7,5 đối với Python

Chỉ có giai đoạn tìm kiếm. Cuối cùng, tôi trừ thời gian giai đoạn tải (tập dữ liệu z0) khỏi tổng thời gian thực hiện (tập dữ liệu z1000) để chỉ có thời gian cho giai đoạn tìm kiếm của chương trình. Trong bộ lễ phục. Hình 3 cho thấy thời gian tương ứng, từ đó có thể rút ra kết luận sau.

  • Các chương trình rất nhanh được viết bằng tất cả các ngôn ngữ ngoại trừ Rexx và Tcl, và các chương trình rất chậm được viết bằng tất cả các ngôn ngữ.
  • Thời gian thực hiện trung bình của các chương trình trong Tcl dài hơn các chương trình trong Python, Perl và C, nhưng ít hơn trong Rexx.
  • Thời gian thực thi trung bình của các chương trình Python ít hơn thời gian của Rexx và Tcl và thường ít hơn thời gian thực hiện của Java (p = 0,13).
  • Thời gian thực hiện trung bình của các chương trình Perl thấp hơn mức trung bình của Rexx, Tcl và Java.
  • Thời gian trung bình của C++ khác biệt đáng kể so với kết quả của bất kỳ ngôn ngữ nào khác.

Cơm. 3.Thời gian chương trình dành riêng cho việc tìm kiếm, được tính bằng chênh lệch giữa thời gian làm việc với tập dữ liệu z1000 và tập dữ liệu z0. Lưu ý thang đo logarit của trục. Tỷ lệ “giá trị xấu và giá trị tốt” dao động từ 2,9 đối với Perl đến 50 đối với C++

So sánh các nhóm lớn hơn cho thấy không có sự khác biệt đáng kể giữa bất kỳ nhóm nào. Tuy nhiên, chúng ta có thể nói với xác suất 80% rằng khoảng thời gian thực thi tập lệnh ít hơn ít nhất 2,1 lần so với Java và ít hơn ít nhất 3,4 lần so với C và C++.

Yêu cầu bộ nhớ

Trong bộ lễ phục. Hình 4 hiển thị tổng kích thước quy trình khi kết thúc quá trình xử lý tệp đầu vào z1000. Một số kết luận có thể được rút ra từ nó.

  • Rõ ràng là bộ nhớ được sử dụng hiệu quả nhất trong các chương trình thuộc nhóm C và C++ và kém hiệu quả nhất trong các chương trình thuộc nhóm Java.
  • Ngoại trừ Tcl, rất ít tập lệnh tiêu thụ nhiều bộ nhớ hơn nửa dưới của chương trình C và C++.
  • Tập lệnh Tcl yêu cầu nhiều bộ nhớ hơn các tập lệnh khác.
  • Mức độ yêu cầu bộ nhớ tương đối của các chương trình trong Python và Perl thường ít hơn so với các chương trình trong C và đặc biệt là C++.
  • Một số tập lệnh chiếm nhiều bộ nhớ.
  • Khi so sánh các nhóm lớn hơn, chúng ta có thể nói với xác suất 80% rằng trung bình các chương trình Java chiếm nhiều bộ nhớ hơn ít nhất 32 MB (297%) so với các chương trình C và C++ và nhiều hơn ít nhất 20 MB (98%) so với các tập lệnh. Các tập lệnh chiếm nhiều bộ nhớ hơn ít nhất 9 MB (85%) so với các chương trình C và C++.

Cơm. 4.Dung lượng bộ nhớ mà một chương trình yêu cầu, bao gồm trình thông dịch hoặc hệ thống thực thi, bản thân chương trình và tất cả các cấu trúc dữ liệu tĩnh và động. Tỷ lệ “giá trị xấu và giá trị tốt” dao động từ 1,2 đối với Python đến 4,9 đối với C++

Từ dữ liệu này, chúng tôi có thể kết luận rằng các yêu cầu về bộ nhớ của Java thường gấp đôi so với các tập lệnh và các tập lệnh không nhất thiết phải kém hiệu quả về bộ nhớ hơn các chương trình C và C++, mặc dù chúng có thể không hoạt động tốt hơn chương trình C hoặc C++ tiết kiệm.

Thông thường, các chương trình thuật toán có sự cân bằng giữa thời gian thực hiện và mức sử dụng bộ nhớ: để chạy nhanh hơn, bạn thường cần phân bổ nhiều không gian hơn cho chương trình. Trong tập hợp các chương trình mà chúng tôi đã kiểm tra, quy tắc này áp dụng cho cả ba ngôn ngữ không có tập lệnh, nhưng đối với các ngôn ngữ tập lệnh thì điều ngược lại là đúng: các tập lệnh sử dụng nhiều bộ nhớ hơn có xu hướng chạy chậm hơn các tập lệnh sử dụng ít bộ nhớ hơn.

Độ dài chương trình và số lượng bình luận

Trong bộ lễ phục. Hình 5 hiển thị số dòng trong tệp nguồn của mỗi chương trình chứa bất kỳ thông tin ngữ nghĩa nào về chương trình: các câu lệnh, định nghĩa hoặc ít nhất là các dấu phân cách như dấu ngoặc nhọn đóng. Các tệp không phải tập lệnh thường dài gấp đôi hoặc gấp ba lần tập lệnh. Ngay cả những tập lệnh dài nhất cũng ngắn hơn so với nguồn không phải tập lệnh trung bình. Đồng thời, mật độ nhận xét trong tập lệnh cao hơn đáng kể (p = 0,020): các chương trình không có tập lệnh chứa trung bình nhiều dòng có nhận xét hơn 22% so với các dòng có câu lệnh; đối với các kịch bản con số này là 34%.

Cơm. 5. Độ dài chương trình: số dòng văn bản nguồn không có chú thích. Tỷ lệ “giá trị xấu và giá trị tốt” dao động từ 1,3 đối với C đến 2,1 đối với Java và 3,7 đối với Rexx

Độ tin cậy của chương trình

Khi làm việc với tệp đầu vào z1000, ba chương trình - một trong C, một trong C++ và một trong Perl - không tạo ra kết quả chính xác vì chúng không thể tải một từ điển lớn hoặc do thời gian cho phép để hoàn thành giai đoạn tải đã hết. Hai chương trình Java có độ tin cậy gần như bằng 0 và bị lỗi vì những lý do khác; và một chương trình Rexx tạo ra nhiều kết quả bằng cách sử dụng tập lệnh chỉ có định dạng không chính xác - độ tin cậy của nó là 45%.

Bằng cách loại bỏ các chương trình có lỗi rõ ràng này - từ đó loại bỏ 13% chương trình C và C++, 8% chương trình Java và 5% tập lệnh - và so sánh phần còn lại theo nhóm ngôn ngữ, chúng tôi thấy rằng các chương trình C và C++ kém tin cậy hơn Java và viết kịch bản. Tuy nhiên, những khác biệt này chỉ do một số ít chương trình có khiếm khuyết gây ra và do đó không thể làm cơ sở cho kết luận chung.

Tuy nhiên, do những khác biệt này tuân theo các mô hình tương tự như tỷ lệ các chương trình hoàn toàn không hiệu quả bị loại khỏi danh sách xem xét, chúng tôi có thể kết luận rằng sự khác biệt về độ tin cậy giữa các nhóm ngôn ngữ là một thực tế có thật. Lý do cho lợi thế của tập lệnh có thể là do có sẵn dữ liệu thử nghiệm toàn diện hơn cho người lập trình, như được giải thích trong thanh bên “Tính hợp lệ so sánh”.

Sau đó, tôi so sánh hành vi khi làm việc với tệp đầu vào m1000, tệp này có thể chứa số điện thoại không có số, chỉ có dấu gạch ngang và dấu gạch chéo. Những số điện thoại như vậy nên được chuyển thành các mục trống, nhưng các lập trình viên có xu hướng quên mất những yêu cầu đó khi đọc bài tập. Vì vậy, hệ số chất lượng của chương trình được kiểm tra trên file m1000. Hầu hết các chương trình đều xử lý tình huống này thành công, nhưng một nửa số chương trình Java và bốn tập lệnh - một Tcl và ba Python - bị kẹt ở số điện thoại trống đầu tiên sau khi trả về 10% kết quả. Thông thường, lỗi là do chỉ mục hàng hoặc mảng không chính xác. Trong số các chương trình khác, 15—một chương trình viết bằng C, 5 chương trình C++, 4 chương trình Java, 2 Perl, 2 Python và 1 Rexx—không xử lý được các số điện thoại trống nhưng mặt khác lại hoạt động chính xác; độ tin cậy của họ là 98,4%.

Nói chung, độ tin cậy của các tập lệnh có vẻ tốt như các chương trình không có tập lệnh.

Giờ làm việc và năng suất

Trong bộ lễ phục. Hình 6 cho thấy tổng thời gian dành cho việc thiết kế, viết và thử nghiệm một chương trình theo báo cáo của những người viết kịch bản và được đo lường đối với những người lập trình không biết viết kịch bản.

Cơm. 6.Tổng thời gian dành cho việc thực hiện chương trình
Các lập trình viên của nhóm chữ viết đã đo và báo cáo thời gian làm việc: thời gian của các ngôn ngữ thuộc nhóm “không phải chữ viết” được người thực nghiệm đo. Tỷ lệ “giá trị xấu và giá trị tốt” dao động từ 1,5 đối với C đến 3,2 đối với Perl. Ba giá trị cho Java - giờ làm việc 40, 49 và 63 giờ - nằm ngoài ranh giới của sơ đồ và do đó không được hiển thị.

Chúng tôi nhận thấy rằng thời gian viết kịch bản, với mức trung bình tổng thể là 3,1 giờ, cao hơn một nửa so với các chương trình không có kịch bản, với mức trung bình tổng thể là 10,0 giờ, mặc dù sự khác biệt có thể bị phóng đại do sức mạnh thử nghiệm không đầy đủ.

May mắn thay, có thể kiểm tra đồng thời hai yếu tố, đó là tính chính xác của việc báo cáo thời gian dành cho lập trình và sự bình đẳng về trình độ của các lập trình viên trong nhóm tập lệnh và nhóm không tập lệnh. Cả hai yếu tố này, nếu chúng đóng một vai trò nào đó, sẽ góp phần làm giảm thời gian của nhóm tập lệnh: Tôi hy vọng rằng các báo cáo chủ quan sẽ làm giảm thời gian chương trình thay vì phóng đại và nếu có sự khác biệt, chúng tôi mong đợi tìm được những lập trình viên lành nghề hơn trong nhóm chữ viết vì vào năm 1997 và 1998, khi nghiên cứu được tiến hành, các lập trình viên Java có ít kinh nghiệm hơn các lập trình viên ở các ngôn ngữ khác. Bài kiểm tra này dựa trên nguyên tắc chung là số dòng mã nguồn mà một lập trình viên tạo ra mỗi giờ không phụ thuộc vào ngôn ngữ lập trình. Một số phương pháp ước tính nỗ lực được sử dụng rộng rãi—bao gồm bảng ngôn ngữ lập trình Cocomo của Barry Boehm và Capers Jones để ước tính các điểm chức năng—giả định rõ ràng rằng số dòng mã nguồn hàng giờ là độc lập với ngôn ngữ lập trình. Trong bộ lễ phục. Hình 7 thể hiện số giờ làm việc ước tính dựa trên quy tắc này. Dựa trên phạm vi năng suất Java nổi tiếng, tất cả các giá trị ngoại trừ ba giá trị hàng đầu cho Tcl và thời gian cao nhất cho Perl đều có vẻ hợp lý.

Cơm. 7.Số dòng văn bản nguồn được viết trong một giờ làm việc đầy đủ. Tỷ lệ “giá trị xấu và giá trị tốt” dao động từ 1,4 đối với C đến 3,1 đối với Tcl

Không có sự khác biệt trung bình nào có ý nghĩa thống kê rõ ràng, mặc dù Java khác với C, Perl, Python và Tcl (0,07

Sự so sánh này mang lại độ tin cậy bổ sung cho nghiên cứu so sánh của chúng tôi về chi phí thời gian làm việc. Thời gian do những người lập trình kịch bản báo cáo dường như chỉ bị đánh giá thấp hoặc chính xác một chút. Như vậy, lợi thế kép của ngôn ngữ script về thời gian làm việc đã được khẳng định. Cam kết về thời gian làm việc với Java có vẻ quá đáng vì các lập trình viên Java ít kinh nghiệm hơn các lập trình viên khác trong thời gian nghiên cứu.

Cấu trúc chương trình

Khi kiểm tra các phương pháp được lựa chọn bởi các lập trình viên làm việc với các ngôn ngữ khác nhau đang nghiên cứu, sẽ xuất hiện những khác biệt nổi bật. Hầu hết các lập trình viên trong nhóm tập lệnh đã sử dụng các mảng kết hợp được triển khai bằng các ngôn ngữ và lưu trữ các từ trong từ điển để đọc sau bằng mã số. Thuật toán tìm kiếm chỉ cố gắng trích xuất dữ liệu từ mảng bằng cách sử dụng các tiền tố có độ dài tăng dần làm khóa, được tạo từ phần còn lại của số điện thoại hiện tại. Mỗi kết quả khớp sẽ tạo ra một giải pháp từng phần mới, giải pháp này sẽ được xử lý sau.

Ngược lại, hầu hết tất cả các lập trình viên không viết script đều chọn một trong các giải pháp sau: trong trường hợp đơn giản nhất, họ lưu trữ toàn bộ từ điển trong một mảng, thường ở cả dạng ký hiệu ban đầu và cách biểu diễn số tương ứng. Sau đó, họ chọn và kiểm tra 1/10 toàn bộ từ điển cho từng chữ số của số điện thoại được mã hóa, chỉ sử dụng chữ số đầu tiên làm khóa để giảm không gian tìm kiếm. Thủ tục này dẫn đến một giải pháp đơn giản nhưng không hiệu quả.

Một cách tiếp cận phức tạp hơn là sử dụng cây 10-ary, với mỗi nút đại diện cho một chữ số cụ thể và các nút ở độ cao n đại diện cho ký tự thứ n của từ. Một từ được lưu trữ tại một nút nếu đường dẫn từ gốc đến nút đó biểu thị mật mã số của từ đó. Giải pháp này là hiệu quả nhất, nhưng việc xây dựng và duyệt cây đòi hỏi số lượng người vận hành tương đối lớn. Trong Java, số lượng lớn các đối tượng thu được dẫn đến mức tiêu thụ bộ nhớ lớn do nhu cầu phân bổ các vùng cực lớn để lưu trữ từng đối tượng trong quá trình triển khai thời gian chạy Java hiện tại.

Các tập lệnh chứa ít câu lệnh hơn các chương trình không có tập lệnh vì hầu hết các thao tác tìm kiếm được thực hiện bằng thuật toán băm mảng nội bộ. Ngược lại, trong các chương trình không có kịch bản, cần phải xác định rõ ràng các bước cơ bản của quá trình tìm kiếm. Những khác biệt này càng trở nên trầm trọng hơn do nỗ lực - hoặc thiếu nỗ lực - đưa vào việc xây dựng cấu trúc dữ liệu và mô tả các biến.

Mặc dù các bảng băm được triển khai trong các thư viện lớp cho cả Java và C++, nhưng không có lập trình viên nào làm việc với các ngôn ngữ không có tập lệnh sử dụng chúng mà thích xây dựng cây theo cách thủ công. Ngược lại, người viết kịch bản dễ dàng sử dụng bảng băm được tích hợp trong ngôn ngữ của họ.

Bài học chính

Một phân tích so sánh 80 lần triển khai chương trình mã hóa số điện thoại bằng bảy ngôn ngữ khác nhau đã mang lại những kết quả chính sau.

  • Việc thiết kế và viết chương trình bằng Perl, Python, Rexx và Tcl không mất quá một nửa thời gian cần thiết để lập trình bằng C, C++ và Java - và độ dài của mã nguồn chỉ bằng một nửa.
  • Không có sự khác biệt rõ ràng về độ tin cậy giữa các chương trình của các nhóm ngôn ngữ khác nhau.
  • Một tập lệnh điển hình chiếm khoảng gấp đôi bộ nhớ so với chương trình C hoặc C++. Các chương trình Java chiếm bộ nhớ nhiều hơn ba và bốn lần so với các chương trình C và C++.
  • Các chương trình C và C++ khởi tạo chương trình chuyển đổi số điện thoại, bao gồm việc đọc tệp từ điển 1 MB và xây dựng cấu trúc dữ liệu nội bộ 70 KB, nhanh hơn ba hoặc bốn lần so với các chương trình Java và nhanh hơn khoảng năm hoặc mười lần so với các tập lệnh.
  • Phần chính của chương trình chuyển đổi số điện thoại là tìm kiếm cấu trúc dữ liệu nội bộ và các chương trình C và C++ chỉ nhanh bằng một nửa so với Java. Các tập lệnh có xu hướng chạy nhanh hơn các chương trình Java.
  • Trong số các ngôn ngữ kịch bản, Perl và Python thực hiện cả hai bước nhanh hơn Tcl.
  • Sự phân tán của bất kỳ tham số chương trình được nghiên cứu nào do sự khác biệt giữa các lập trình viên làm việc trong cùng một ngôn ngữ - được phản ánh qua tỷ lệ "giá trị xấu và giá trị tốt" - trung bình bằng hoặc lớn hơn sự phân tán các đặc điểm gây ra bởi sự khác biệt trong ngôn ngữ.

Với số lượng triển khai lớn và nhiều lập trình viên, kết quả của nghiên cứu này, khi được xem xét một cách nghiêm túc, có thể khá đáng tin cậy, mặc dù có những yếu tố được lưu ý làm giảm độ tin cậy. Tuy nhiên, kết quả chỉ được coi là đúng đối với bài toán chuyển đổi số điện thoại; khái quát hóa cho các lĩnh vực ứng dụng khác nhau sẽ có rủi ro. Ví dụ, người ta nghi ngờ rằng kết quả tương đối của một nhóm ngôn ngữ kịch bản sẽ được xác nhận đầy đủ khi giải các bài toán khác.

Bất chấp những thiếu sót này, việc so sánh trực tiếp giữa các ngôn ngữ lập trình khác nhau có thể cung cấp thông tin hữu ích. Ví dụ: chúng ta có thể kết luận rằng chi phí bộ nhớ của Java vẫn còn rất lớn so với C và C++, nhưng thời gian thực hiện chương trình đã trở nên khá chấp nhận được. Ngôn ngữ kịch bản đã nổi lên như những lựa chọn thay thế thông minh cho C và C++, ngay cả đối với các tác vụ liên quan đến tính toán và xử lý rộng rãi các tập dữ liệu lớn. Thời gian thực hiện tương đối và yêu cầu bộ nhớ của chúng thường hợp lý và chúng lập trình nhanh hơn nhiều, ít nhất là đối với các chương trình nhỏ.

Tôi tin rằng cần phải tiến hành những nghiên cứu bổ sung, lớn hơn như nghiên cứu được mô tả trong bài viết này. Công việc như vậy là cần thiết để xua tan sương mù quảng cáo của nhà cung cấp và thành kiến ​​​​của các chuyên gia, để hiểu đầy đủ những ưu điểm, nhược điểm và tính năng của từng ngôn ngữ. Những kiến ​​thức như vậy sẽ giúp đưa ngành lập trình lên một tầm cao mới.

Lutz Prechelt([email được bảo vệ]) - Trưởng phòng Kiểm soát Chất lượng tại abaXX Technology (Stuttgart, Đức).

Văn học

1. E. Bradley và R. Tibishirani, “Giới thiệu về Bootstrap,” Chuyên khảo về Thống kê và Xác suất Ứng dụng 57, Chapman và Hall, New York, 1993
2. L. Prechelt, So sánh thực nghiệm về C, C++, Java, Perl, Python, Rexx và Tcl cho Chương trình Tìm kiếm/Xử lý chuỗi, Báo cáo Công nghệ 2000-5, Fakultat fur Informattik, Đại học Karlsruhe, Đức, Mar. 2000.
3. BW Boehm, Kinh tế Kỹ thuật Phần mềm, Prentice Hall, Englewood Cliffs, N.J., 1981
4. C. Jones Nghiên cứu năng suất phần mềm,Bảng ngôn ngữ lập trình, Phiên bản 7, 1996.

So sánh thực nghiệm về bảy ngôn ngữ lập trình, Lutz Prechelt, IEEE Computer, tháng 10 năm 2000, tr. 23-29. Bản quyền IEEE CS, In lại với sự cho phép. Đã đăng ký Bản quyền.

Độ tin cậy của so sánh

Bất kỳ so sánh nào về các ngôn ngữ lập trình dựa trên việc so sánh các chương trình mẫu chỉ có giá trị trong phạm vi khả năng của các lập trình viên làm việc với các ngôn ngữ này có thể được coi là giống nhau. Trong trường hợp của chúng tôi, chỉ có mức độ chung của các chương trình mới có thể so sánh được chứ không phải chất lượng riêng lẻ của chúng. Một số yếu tố có thể đã ảnh hưởng tiêu cực đến khả năng so sánh của 80 chương trình được phân tích trong nghiên cứu này.

Các chương trình đến từ hai nguồn khác nhau. Các chương trình Java, C và C++ được viết vào năm 1997 và 1998 trong một cuộc thử nghiệm có kiểm soát với sự tham gia của các sinh viên đại học ngành kỹ thuật máy tính ( L. Prechelt và B. Unger, Một thử nghiệm có kiểm soát về tác động của việc cắt tỉa PSP: Mô tả và đánh giá chi tiết, Báo cáo công nghệ 1/1999, Fakultat fur Informattik, Đại học Karlsruhe, Đức, Mar. 1999). Các chương trình trong Perl, Python, Rexx và Tcl được các tình nguyện viên biên soạn theo nhiều cách khác nhau, những người đã phản hồi lời mời được công bố trong một số hội nghị. Vì vậy, các tác giả có trình độ đào tạo và kinh nghiệm khác nhau.

Trình độ lập trình viên

Có khả năng là lời kêu gọi hợp tác của công chúng sẽ chỉ thu hút những lập trình viên rất có năng lực, vì vậy các chương trình viết kịch bản thường được viết bởi những người có trình độ hơn các chương trình bằng ngôn ngữ không có kịch bản. Tuy nhiên, có hai trường hợp cho thấy sự mâu thuẫn này không gây ra sai sót nghiêm trọng trong kết quả nghiên cứu. Đầu tiên, trừ một số trường hợp ngoại lệ, sinh viên viết các chương trình không có kịch bản đều khá kinh nghiệm và khéo léo. Thứ hai, một tỷ lệ đáng kể người viết kịch bản cho biết họ mới bắt đầu làm việc với các ngôn ngữ liên quan hoặc chưa được đào tạo kỹ lưỡng về lập trình. Trong số đó có một nhà thiết kế những con chip cực lớn, một quản trị viên hệ thống và một nhà xã hội học.

Trong nhóm không viết script, các lập trình viên Java có ít kinh nghiệm với ngôn ngữ của họ hơn các lập trình viên C và C++ vì Java vẫn là ngôn ngữ mới vào năm 1997 và 1998. Trong nhóm viết kịch bản, các lập trình viên Perl có tay nghề cao hơn những người tham gia thử nghiệm khác; Perl dường như thu hút các lập trình viên đặc biệt tài năng - ít nhất đó là ấn tượng cá nhân của tôi.

Độ chính xác đo thời gian hoạt động

Chúng tôi biết chính xác mất bao lâu để lập trình trong một thử nghiệm có kiểm soát với các ngôn ngữ không có chữ viết, nhưng không có gì có thể ngăn cản người viết kịch bản đánh giá thấp thời gian họ dành để viết chương trình. Tệ hơn nữa, một số tác giả dường như đã bắt đầu làm việc nhiều ngày sau khi họ đọc được yêu cầu của chương trình. Một lập trình viên báo cáo rằng anh ấy bắt đầu viết chương trình hai tuần sau khi đọc quảng cáo, “...tại thời điểm này, trong tiềm thức, tôi có thể đã đang nghiên cứu một giải pháp.”

Tuy nhiên, thực tế cho thấy rằng trung bình thời gian cần thiết để làm việc trên các tập lệnh cũng đúng: dữ liệu cho tất cả các ngôn ngữ khá phù hợp với sự thật kỹ thuật nổi tiếng rằng “số dòng văn bản nguồn được viết trong một giờ là không phụ thuộc vào ngôn ngữ.” Theo sự hài lòng của chúng tôi, dữ liệu tương tự xác nhận rằng người viết kịch bản không có trình độ cao hơn các lập trình viên của nhóm khác.

Sự khác biệt về nhiệm vụ và điều kiện làm việc

Yêu cầu chính đối với nhóm không viết chữ là tính đúng đắn của chương trình; kiểm soát chấp nhận ngụ ý độ tin cậy cao và ít nhất một mức độ hiệu quả.

Cùng với tiêu chí chính về tính đúng đắn, tám yêu cầu chất lượng bổ sung đã được áp đặt cho nhóm kịch bản. Thay vì nhận quyền kiểm soát từ nhóm không viết kịch bản, những người viết kịch bản được cung cấp dữ liệu đầu vào và đầu ra z1000 để thử nghiệm riêng của họ. Trong cả hai trường hợp, sự khác biệt có thể mang lại lợi thế cho nhóm thực hiện kịch bản.

kết luận

Nhìn chung, phương pháp thu thập dữ liệu trước mang lại một số lợi thế đáng kể, mặc dù khiêm tốn, cho nhóm kịch bản. Cũng có thể có sự khác biệt giữa trình độ kỹ năng trung bình của các lập trình viên làm việc ở hai ngôn ngữ bất kỳ. Để loại bỏ tác động tiêu cực của các yếu tố này đến độ tin cậy của kết quả, chúng tôi bỏ qua những khác biệt nhỏ giữa các ngôn ngữ vì chúng có thể do dữ liệu không chính xác gây ra. Tuy nhiên, sự khác biệt lớn có thể đáng tin cậy.