Phần mềm

Phần mềm máy tính (), hay còn gọi đơn giản là phần mềm, là tập hợp dữ liệu hoặc các câu lệnh hướng dẫn máy tính cho máy tính biết cách làm việc. Điều này trái ngược với phần cứng vật lý, từ đó hệ thống được xây dựng và thực sự thực hiện công việc. Trong khoa học máy tính và kỹ thuật phần mềm, phần mềm máy tính là tất cả thông tin được xử lý bởi hệ thống máy tính, chương trình và dữ liệu. Phần mềm máy tính bao gồm các chương trình máy tính, thư viện và dữ liệu không thể thực thi liên quan, chẳng hạn như tài liệu trực tuyến hoặc phương tiện kỹ thuật số. Phần cứng và phần mềm máy tính yêu cầu lẫn nhau và không thể tự sử dụng một cách thực tế.
Ở cấp độ lập trình thấp nhất, mã thực thi bao gồm các hướng dẫn ngôn ngữ máy được hỗ trợ bởi một bộ xử lý riêng lẻ, có thể là bộ xử lý trung tâm (CPU) hoặc đơn vị xử lý đồ họa (GPU). Một ngôn ngữ máy bao gồm các nhóm giá trị nhị phân biểu thị các lệnh hướng dẫn cách thực hiện của bộ xử lý thay đổi trạng thái của máy tính từ trạng thái trước đó. Ví dụ: một lệnh có thể thay đổi giá trị được lưu trữ ở một vị trí lưu trữ cụ thể trong máy tính, một hiệu ứng mà người dùng không thể quan sát trực tiếp. Một lệnh cũng có thể gọi một trong nhiều thao tác nhập hoặc xuất dữ liệu, ví dụ hiển thị một số văn bản trên màn hình máy tính; gây ra những thay đổi trạng thái được hiển thị cho người dùng. Bộ xử lý thực hiện các lệnh theo thứ tự chúng được cung cấp, trừ khi nó được hướng dẫn "nhảy" sang một lệnh khác hoặc bị hệ điều hành làm gián đoạn. , hầu hết các máy tính cá nhân, thiết bị điện thoại thông minh và máy chủ đều có bộ xử lý với nhiều đơn vị thực thi hoặc nhiều bộ xử lý thực hiện tính toán cùng nhau và điện toán đã trở thành một hoạt động đồng thời hơn nhiều so với trước đây.
Phần lớn phần mềm được viết bằng các ngôn ngữ lập trình cấp cao. Chúng dễ dàng và hiệu quả hơn cho các lập trình viên vì chúng gần với ngôn ngữ tự nhiên hơn ngôn ngữ máy. Các ngôn ngữ cấp cao được dịch sang ngôn ngữ máy bằng trình biên dịch hoặc trình thông dịch hoặc kết hợp cả hai. Phần mềm cũng có thể được viết bằng một hợp ngữ mức thấp, trong đó có các lệnh mạnh để hướng dẫn ngôn ngữ máy của máy tính và được dịch sang ngôn ngữ máy bằng cách dùng phần mềm lắp ráp.
Lịch sử.
Một phác thảo (thuật toán) cho những gì sẽ là phần mềm đầu tiên đã được Ada Lovelace viết vào thế kỷ 19, cho Công cụ phân tích theo kế hoạch. Bà đã chứng minh cho thấy động cơ sẽ tính toán số Bernoulli như thế nào. Vì các chứng minh và thuật toán này, Ada Lovelace được coi là lập trình viên máy tính đầu tiên mặc dù bà chưa chạy chương trình bao giờ do công cụ mà bà viết chương trình không được tạo ra lúc đó.
Lý thuyết đầu tiên về phần mềm, trước khi tạo ra máy tính như chúng ta biết ngày nay, đã được Alan Turing đề xuất trong bài tiểu luận năm 1935, "On Computable Numbers, with an Application to the Entscheidungsproblem" (vấn đề quyết định). Ông đã tạo ra cái gọi là máy Turing, một mô hình toán học của một cỗ máy trừu tượng có khả năng thực hiện chuỗi các phép toán thô sơ để di chuyển một cỗ máy từ trạng thái cố định này sang trạng thái cố định khác. Ý tưởng chính là để chứng minh về mặt toán học thực tế rằng bất kỳ trạng thái xác định trước của hệ thống luôn có thể đạt được bằng cách thực hiện tuần tự một tập hợp hữu hạn các lệnh cơ bản (chương trình) từ một tập hợp lệnh cố định.
Điều này cuối cùng đã dẫn đến việc tạo ra các lĩnh vực học thuật về khoa học máy tính và công nghệ phần mềm; Cả hai lĩnh vực nghiên cứu phần mềm và sáng tạo của nó. Khoa học máy tính là nghiên cứu lý thuyết về máy tính và phần mềm (tiểu luận của Turing là một ví dụ về khoa học máy tính), trong khi kỹ thuật phần mềm là ứng dụng của kỹ thuật và phát triển phần mềm.
Tuy nhiên, trước năm 1946, phần mềm chưa phải là chương trình được lưu trữ trong bộ nhớ của các máy tính kỹ thuật số chương trình được lưu trữ, như chúng ta đã hiểu. Thay vào đó, các thiết bị máy tính điện tử đầu tiên được thay thế để "lập trình lại" chúng sau mỗi lần máy tính hoạt động. Máy tính điện tử đầu tiên của những năm 1940 và 1950 được lập trình lại bằng cách chuyển đổi công tắc bật tắt và kết nối lại dây cáp, đòi hỏi sự hiểu biết sâu sắc về cấu trúc bên trong của chúng. Đặc biệt, những chiếc máy như vậy thuộc về ENIAC (tuy nhiên, sau đó đã được sửa đổi để nó có thể, ít nhất một phần, được lập trình bằng cách sử dụng các thẻ đục lỗ).
Một bước quan trọng trong định hướng của máy tính hiện đại là sự chuyển đổi sang kiến trúc của John von Neumann, lần đầu tiên được thực hiện ở Vương quốc Anh, được phát triển dưới sự lãnh đạo của John R. Womersley và với sự tham gia của máy tính của Alan Turing, được gọi là Mark I. Chương trình đầu tiên được lưu trữ trong bộ nhớ của máy tính được đưa ra vào ngày 21 tháng 6 năm 1941. Để tạo điều kiện thuận lợi cho việc lập trình chiếc máy này, Turing đã phát minh ra một hệ thống mã hóa viết tắt, trong đó một chuỗi các ký tự teletype in trên băng đục lỗ được sử dụng để biểu diễn mã máy nhị phân.
Một trong những đồng nghiệp của Turing, John Mauchly, người sau này trở thành (cùng với John Presper Eckert) người đứng đầu và là người sáng lập của Eckert - Mauchly Computer Corporation, công ty phát triển các máy tính như BINAC và UNIVAC, đã giao cho nhân viên của mình tạo ra một trình dịch các công thức đại số. Mặc dù mục tiêu đầy tham vọng này đã không đạt được vào những năm 1940, nhưng dưới sự lãnh đạo của Mauchly, cái gọi là Mã ngắn đã được phát triển, trong đó các phép toán và biến được mã hóa bằng tổ hợp hai ký tự. Mã ngắn được thực hiện bằng trình thông dịch . Grace Hopper, làm việc từ đầu những năm 1950 về một tập hợp các quy trình toán học cho UNIVAC I, đã phát minh ra chương trình liên kết " A-0", được cung cấp một số nhận dạng, tìm nạp quy trình mong muốn từ một thư viện được lưu trữ trên băng từ và viết nó ra. trong không gian bộ nhớ được phân bổ.
Phân loại.
Trên hầu hết tất cả các nền tảng máy tính, phần mềm có thể được nhóm thành một vài loại lớn.
Mục đích hoặc lĩnh vực sử dụng.
Dựa trên mục tiêu, phần mềm máy tính có thể được chia thành:
Công cụ lập trình.
Các công cụ lập trình cũng là phần mềm dưới dạng chương trình hoặc ứng dụng mà các nhà phát triển phần mềm (còn được gọi là "lập trình viên, lập trình viên, tin tặc" hoặc "kỹ sư phần mềm") sử dụng để tạo, gỡ lỗi, bảo trì (tức là cải thiện hoặc sửa chữa) hoặc nói cách khác là hỗ trợ phần mềm.
Phần mềm được viết bằng một hoặc nhiều ngôn ngữ lập trình; có nhiều ngôn ngữ lập trình tồn tại và mỗi ngôn ngữ có ít nhất một triển khai, mỗi ngôn ngữ bao gồm một bộ công cụ lập trình riêng đi kèm. Các công cụ này có thể là các chương trình tương đối khép kín như trình biên dịch, trình gỡ lỗi, trình thông dịch, trình liên kết và trình soạn thảo văn bản, có thể được kết hợp với nhau để hoàn thành một nhiệm vụ; hoặc chúng có thể tạo thành một môi trường phát triển tích hợp (IDE), kết hợp nhiều hoặc tất cả các chức năng của các công cụ độc lập đó. IDE có thể làm điều này bằng cách gọi các công cụ riêng lẻ có liên quan hoặc bằng cách thực hiện lại chức năng của chúng theo một cách mới. Một IDE có thể giúp thực hiện các tác vụ cụ thể dễ dàng hơn, chẳng hạn như tìm kiếm trong các tệp trong một dự án cụ thể. Nhiều triển khai ngôn ngữ lập trình cung cấp tùy chọn sử dụng cả hai công cụ riêng lẻ hoặc IDE.
Chủ đề.
Kiến trúc.
Người dùng thường thấy mọi thứ khác với lập trình viên. Những người sử dụng máy tính đa năng hiện đại (trái ngược với hệ thống nhúng, máy tính tương tự và siêu máy tính) thường thấy ba lớp phần mềm thực hiện nhiều nhiệm vụ khác nhau: nền tảng, ứng dụng và phần mềm người dùng.
Thực hiện - chạy - thực thi.
Phần mềm máy tính phải được "tải" vào bộ lưu trữ của máy tính (như ổ cứng hoặc bộ nhớ). Khi phần mềm đã được tải, máy tính có thể "thực thi" phần mềm. Điều này liên quan đến việc chuyển các hướng dẫn từ phần mềm ứng dụng, thông qua phần mềm hệ thống, đến phần cứng cuối cùng nhận được lệnh dưới dạng mã máy. Mỗi lệnh làm cho máy tính thực hiện thao tác dữ liệu di chuyển, thực hiện tính toán hoặc thay đổi luồng điều khiển của lệnh.
Việc di chuyển dữ liệu thường từ nơi này trong bộ nhớ sang nơi khác. Đôi khi nó liên quan đến việc di chuyển dữ liệu giữa bộ nhớ và các thanh ghi, điều này cho phép truy cập dữ liệu tốc độ cao trong CPU. Di chuyển dữ liệu, đặc biệt là khi di chuyển số lượng lớn dữ liệu, có thể khá mất thời gian. Vì vậy, điều này đôi khi được tránh bằng cách sử dụng "con trỏ" để thay thế cho dữ liệu thực sự. Việc tính toán bao gồm các hoạt động đơn giản như tăng giá trị của một yếu tố dữ liệu biến. Các tính toán phức tạp hơn có thể liên quan đến nhiều phép toán và các yếu tố dữ liệu khác nhau.
Chất lượng và độ tin cậy.
Chất lượng phần mềm rất quan trọng, đặc biệt đối với các phần mềm thương mại và hệ thống như Microsoft Office, Microsoft Windows và Linux. Nếu phần mềm bị lỗi (lỗi), nó có thể xóa công việc của một người, làm hỏng máy tính và làm những việc không mong muốn khác. Lỗi và lỗi được gọi là "lỗi" thường được phát hiện trong quá trình thử nghiệm alpha và beta. Phần mềm cũng thường là nạn nhân của sự lão hóa phần mềm, sự suy giảm hiệu suất lũy tiến do sự kết hợp của các lỗi không nhìn thấy được.
Nhiều lỗi được phát hiện và loại bỏ (gỡ lỗi) thông qua kiểm tra phần mềm. Tuy nhiên, việc kiểm thử phần mềm hiếm khi được xử lý nếu có thể loại bỏ mọi lỗi; Một số lập trình viên nói rằng "mọi chương trình đều có ít nhất một lỗi nữa" (Luật của Lubarsky). Trong thác phương pháp phát triển phần mềm, các đội kiểm tra riêng biệt thường được sử dụng, nhưng trong cách tiếp cận mới hơn, gọi chung là lập trình linh hoạt, các nhà phát triển thường làm tất cả những thử nghiệm riêng của họ, và chứng minh phần mềm cho người dùng / khách hàng thường xuyên để có được thông tin phản hồi. Phần mềm có thể được kiểm tra thông qua kiểm tra đơn vị, kiểm tra hồi quy và các phương pháp khác, được thực hiện thủ công hoặc phổ biến nhất, vì số lượng mã được kiểm tra có thể khá lớn. Chẳng hạn, NASA có quy trình kiểm thử phần mềm cực kỳ nghiêm ngặt đối với nhiều hệ điều hành và chức năng giao tiếp. Nhiều hoạt động dựa trên NASA tương tác và xác định lẫn nhau thông qua các chương trình chỉ huy. Điều này cho phép nhiều người làm việc tại NASA kiểm tra và đánh giá tổng thể các hệ thống chức năng. Các chương trình chứa phần mềm chỉ huy cho phép kỹ thuật phần cứng và vận hành hệ thống hoạt động dễ dàng hơn nhiều.
Giấy phép.
Giấy phép của phần mềm cung cấp cho người dùng quyền sử dụng phần mềm trong môi trường được cấp phép và trong trường hợp giấy phép phần mềm miễn phí, cũng cấp các quyền khác như quyền sao chép.
Phần mềm độc quyền có thể được chia thành hai loại:
Mặt khác, phần mềm nguồn mở đi kèm với giấy phép phần mềm miễn phí, cấp cho người nhận quyền sửa đổi và phân phối lại phần mềm.
Bằng sáng chế.
Bằng sáng chế phần mềm, giống như các loại bằng sáng chế khác, về mặt lý thuyết được cho là cung cấp cho nhà phát minh một giấy phép độc quyền, có giới hạn thời gian cho một "ý tưởng chi tiết (ví dụ: thuật toán) về cách triển khai" một phần mềm hoặc một thành phần của một phần mềm. Các ý tưởng cho những điều hữu ích mà phần mềm có thể "làm" và các "yêu cầu của" người dùng, không được coi là có thể được cấp bằng sáng chế và việc triển khai cụ thể (nghĩa là các gói phần mềm thực tế thực hiện bằng sáng chế) thường không được cấp bằng sáng chế. tự động. Vì vậy, bằng sáng chế phần mềm được cho là bao gồm khu vực giữa, giữa các yêu cầu và thực hiện cụ thể. Ở một số quốc gia, yêu cầu phát minh được tuyên bố là có ảnh hưởng đến thế giới vật lý cũng có thể là một phần trong các yêu cầu đối với bằng sáng chế phần mềm phải có hiệu lực, mặc dù "tất cả các" phần mềm hữu ích đều có tác dụng đối với thế giới vật lý, yêu cầu này có thể là mở để tranh luận. Trong khi đó, luật bản quyền của Mỹ đã được áp dụng cho các khía cạnh khác nhau của việc viết mã phần mềm.
Bằng sáng chế phần mềm đang gây tranh cãi trong ngành công nghiệp phần mềm với nhiều người giữ các quan điểm khác nhau về chúng. Một trong những nguồn gây tranh cãi là sự phân chia nói trên giữa các ý tưởng ban đầu và bằng sáng chế dường như không được tôn vinh trong thực tế bởi các luật sư sáng chế, ví dụ như bằng sáng chế cho Lập trình hướng đối tượng (AOP), có ý định đòi quyền đối với "bất kỳ" công cụ lập trình "nào" thực hiện ý tưởng về AOP, dù thực hiện thế nào. Một nguồn tranh cãi khác là ảnh hưởng đến sự đổi mới, với nhiều chuyên gia và công ty nổi tiếng cho rằng phần mềm là một lĩnh vực chuyển động nhanh đến mức các bằng sáng chế phần mềm chỉ tạo ra chi phí và rủi ro kiện tụng lớn, và thực sự làm chậm sự đổi mới. Trong trường hợp tranh luận về bằng sáng chế phần mềm bên ngoài Hoa Kỳ, người ta đã đưa ra lập luận rằng các tập đoàn lớn và luật sư sáng chế của Mỹ có thể là người hưởng lợi chính trong việc cho phép hoặc tiếp tục cho phép bằng sáng chế phần mềm.
Thiết kế và thực hiện.
Thiết kế và triển khai phần mềm khác nhau tùy thuộc vào độ phức tạp của phần mềm. Chẳng hạn, việc thiết kế và tạo Microsoft Word mất nhiều thời gian hơn so với thiết kế và phát triển Microsoft Notepad vì phần mềm sau có chức năng cơ bản hơn nhiều.
Phần mềm thường được thiết kế và tạo (còn được mã hóa / viết / lập trình) trong các môi trường phát triển tích hợp (IDE) như Eclipse, IntelliJ và Microsoft Visual Studio có thể đơn giản hóa quy trình và biên dịch phần mềm (nếu có). Như đã lưu ý trong một phần khác, phần mềm thường được tạo trên đầu phần mềm hiện có và giao diện lập trình ứng dụng (API) mà phần mềm bên dưới cung cấp như GTK +, JavaBeans hoặc Swing. Thư viện (API) có thể được phân loại theo mục đích của họ. Chẳng hạn, Spring Framework được sử dụng để triển khai các ứng dụng doanh nghiệp, thư viện Windows Forms được sử dụng để thiết kế các ứng dụng giao diện người dùng đồ họa (GUI) như Microsoft Word và Windows Communication Foundation được sử dụng để thiết kế các dịch vụ web. Khi một chương trình được thiết kế, nó phụ thuộc vào API. Chẳng hạn, một ứng dụng Microsoft Windows dành cho máy tính để bàn có thể gọi các hàm API trong . Thư viện NET Forms Forms như "Form1.Close()" và "Form1.Show()" để đóng hoặc mở ứng dụng. Không có các API này, lập trình viên sẽ cần phải tự viết các chức năng này. Các công ty như Oracle và Microsoft cung cấp API riêng của họ để nhiều ứng dụng được viết bằng thư viện phần mềm của họ thường có nhiều API trong đó.
Các cấu trúc dữ liệu như bảng băm, mảng và cây nhị phân và các thuật toán như quicksort, có thể hữu ích cho việc tạo phần mềm.
Phần mềm máy tính có các đặc tính kinh tế đặc biệt làm cho thiết kế, sáng tạo và phân phối của nó khác với hầu hết các hàng hóa kinh tế khác.   
Một người tạo ra phần mềm được gọi là lập trình viên, kỹ sư phần mềm hoặc nhà phát triển phần mềm, các thuật ngữ mà tất cả đều có ý nghĩa tương tự nhau. Nhiều thuật ngữ không chính thức cho lập trình viên cũng tồn tại như "coder" và "hacker" mặc dù việc sử dụng từ hacker có thể gây nhầm lẫn, bởi vì nó thường được sử dụng để chỉ người nào đó xâm nhập trái phép vào hệ thống máy tính.
Công nghiệp và tổ chức.
Một số lượng lớn các công ty phần mềm và lập trình viên trên thế giới bao gồm một ngành công nghiệp phần mềm. Phần mềm có thể là một ngành có lợi nhuận cao: Bill Gates, người đồng sáng lập Microsoft là người giàu nhất thế giới năm 2009, phần lớn là do ông sở hữu một số lượng cổ phần đáng kể trong Microsoft, công ty sản xuất ra các phần mềm Microsoft Windows và Microsoft Office - cả hai đều thống trị thị trường thế giới trong các loại sản phẩm tương ứng của chúng.
Các tổ chức phần mềm phi lợi nhuận bao gồm Quỹ Phần mềm Tự do, Dự án GNU và Quỹ Mozilla. Các tổ chức tiêu chuẩn phần mềm như W3C, IETF phát triển các tiêu chuẩn phần mềm được đề xuất như XML, HTTP và HTML, để phần mềm có thể tương tác thông qua các tiêu chuẩn này.
Các công ty phần mềm nổi tiếng khác bao gồm Google, IBM, TCS, Infosys, Wipro, HCL Technologies, Oracle, Novell, SAP, Symantec, Adobe Systems, Sidetrade và Corel, trong khi các công ty nhỏ thường cung cấp sự đổi mới về nội dung phần mềm.