Trong thế giới công nghệ hiện đại, ngôn ngữ lập trình đóng vai trò cực kỳ quan trọng trong việc xây dựng và phát triển các ứng dụng, trang web, và phần mềm. Với hàng trăm ngôn ngữ lập trình khác nhau, lựa chọn một ngôn ngữ phù hợp là điều quan trọng đối với các nhà phát triển. Trong bài viết này, Stringee sẽ cùng bạn khám phá một số ngôn ngữ lập trình cơ bản và tìm hiểu về đặc điểm và ứng dụng của chúng.
Trong thế giới công nghệ hiện đại, ngôn ngữ lập trình đóng vai trò cực kỳ quan trọng trong việc xây dựng và phát triển các ứng dụng, trang web, và phần mềm. Với hàng trăm ngôn ngữ lập trình khác nhau, lựa chọn một ngôn ngữ phù hợp là điều quan trọng đối với các nhà phát triển. Trong bài viết này, Stringee sẽ cùng bạn khám phá một số ngôn ngữ lập trình cơ bản và tìm hiểu về đặc điểm và ứng dụng của chúng.
Nhiều ngôn ngữ lập trình hiện đại, nhất là các ngôn ngữ viết cho Windows, thường có cung cấp thêm một số lượng rất lớn các thư viện bao gồm nhiều hàm để hỗ trợ giao diện người dùng và các thiết bị đầu cuối.
Các ngôn ngữ chuẩn thường không đề cập tới sự cung cấp thư viện giúp cho việc thiết lập giao diện đồ họa (graphic interface). Nhưng hầu hết trong các ngôn ngữ hiện đại mà nhà sản xuất cung cấp cho các hệ điều hành đều có thêm thư viện các hàm và các biến toàn cục có thể dùng để nhanh chóng viết mã có giao diện phù hợp.
Tương tự trên, triết lý đằng sau của việc điều khiển theo sự kiện là để hỗ trợ cho việc đồng bộ sử dụng cùng lúc nhiều thiết bị đầu cuối như là chuột, bàn phím, máy in,... Việc nhận một mệnh lệnh từ chuột hay từ bàn phím phải được lập tức đồng bộ và thay đổi giao diện tức thời để cập nhật hoá.
Bản thân một ngôn ngữ sẽ không nói rõ là có hỗ trợ cho tính năng này hay không. Phản ứng và cập nhật dữ liệu theo thời gian thực là một hướng phát triển nhằm đáp ứng các nhu cầu đồng bộ hoá nhanh dữ liệu mà chúng có thể chia sẻ cho nhiều nơi hay là để thỏa mãn nhu cầu cần thiết đồng bộ hóa dữ liệu của các dịch vụ (ngân hàng, hàng không và quân sự chẳng hạn).
Ngoài các hỗ trợ cho các giao diện thì ngày nay hầu hết các hệ điều hành (Linux/UNIX, Netware và Windows) đều có khả năng đa luồng (multithreading) hay đa nhiệm (multitasking). Những khả năng này nâng cao hiệu quả của máy tính. Các ngôn ngữ, do đó thường có thêm các hàm, thủ tục hay các biến cho phép người lập trình tận dụng chúng. Việc viết mã cho kiến trúc đa luồng và đa nhiệm không đơn giản như viết mã cho các hệ thống thông thường. Người lập trình ngoài kỹ năng viết mã, còn phải luyện tập cách xử lý và đồng bộ nhiều thao tác được thi hành đồng thời trong một chương trình mà không gây ra ách tắc hay vi phạm các nguyên tắc quản lý bộ nhớ hay các quy tắc lập trình theo đa luồng hay đa nhiệm.
Lưu ý: Hầu hết các hệ điều hành hỗ trợ kiến trúc đa luồng hay đa nhiệm đều có khả năng thực thi những chương trình được tạo ra từ mã viết theo kiểu thông thường mà không đá động tới các chức năng đa luồng hay đa nhiệm. Điểm khác nhau là khi không dùng tới các ưu điểm đa luồng hay đa nhiệm thì chương trình đó sẽ không tận dụng được ưu thế phần cứng và phần mềm hỗ trợ (thường thì chương trình đó chạy chậm hơn).
Một phương ngữ (tiếng Anh: dialect) của một ngôn ngữ lập trình hay ngôn ngữ trao đổi dữ liệu là một biến thể (tương đổi nhỏ) hay phần mở rộng của ngôn ngữ đó mà không làm thay đổi bản chất bên trong của nó.
Trên thực tế, ngôn ngữ lập trình có hàng nghìn loại khác nhau.Tùy theo nguyên tắc của từng loại, ngôn ngữ được viết dưới dạng mệnh lệnh hoặc khai báo. Dưới đây là top 9 loại ngôn ngữ lập trình phổ biến nhất hiện nay:
Đây là một loại ngôn ngữ lập trình đa năng được ứng dụng trong nhiều lĩnh vực từ thiết bị điện tử đến phát triển web. Đối với nhiều lập trình viên, Python được đánh giá là ngôn ngữ lập trình dễ sử dụng. Cú pháp của Python khá đơn giản, dễ hiểu. Bên cạnh đó, Python còn được tích hợp thêm một số ngôn ngữ phổ biến khác là C và C ++.
Python là ngôn ngữ của nền tảng của nhiều ứng dụng nổi tiếng như Instagram và Pinterest. Tuy nhiên, Python lại không không phù hợp cho việc xây dựng các ứng dụng trên di động. Đây được xem là nhược điểm lớn của Python.
Java là ngôn ngữ lập trình quen thuộc trên các ứng dụng, thiết bị có dạng máy chủ và máy khách. Do đó, ngôn ngữ lập trình Java luôn là sự lựa chọn cho hệ thống thiết bị của các các doanh nghiệp lớn trên thế giới.
Tính chất của ngôn ngữ lập trình Java có thiết kế “hợp lỏng lẻo”. Điều này cho phép bất kỳ chương trình nào được lập trình bằng ngôn ngữ Java đều có thể chạy trên nền tảng có hỗ trợ Java. Do đó, Java được gọi là “ngôn ngữ viết một lần chạy mọi nơi”.
Thực tế, ngôn ngữ lập trình Java được ứng dụng khá nhiều trong phát triển hệ thống, phát triển phần mềm, ứng dụng di động. Java còn trở thành ngôn ngữ được giảng dạy trong lĩnh vực khoa học máy tính AP. Đặc biệt nhất, Java chính là ngôn ngữ được sử dụng rộng rãi trong hệ điều hành di động Android.
Nhược điểm của ngôn ngữ Java là không phù hợp với các chương trình chạy chạy trên đám mây. Thêm vào đó, công ty sở hữu Java là công ty phần mềm Oracle còn thực hiện tính phí cấp phép. Theo đó, bất kỳ đơn vị nào muốn sử dụng Bộ công cụ phát triển Java đều phải trả phí cho Oracle.
PHP là một ngôn ngữ lập trình phía máy chủ (server-side) mạnh mẽ và phổ biến được sử dụng rộng rãi trong lĩnh vực phát triển web. Ngôn ngữ này đã trở thành một công nghệ quan trọng cho việc xây dựng các trang web động và ứng dụng web.
Với cú pháp dễ hiểu và gần giống với các ngôn ngữ lập trình khác như C và Java, PHP rất dễ học và sử dụng. Nó cung cấp các tính năng mạnh mẽ để xử lý biểu mẫu, tương tác với cơ sở dữ liệu, và tạo ra nội dung động trên trang web. PHP hỗ trợ các thư viện và framework phổ biến như Laravel, Symfony và CodeIgniter, giúp tăng tốc quá trình phát triển và cung cấp kiến trúc tốt cho các dự án web lớn.
Một ưu điểm quan trọng của PHP là tính tương thích và khả năng chạy trên hầu hết các hệ điều hành và máy chủ web phổ biến, bao gồm Windows, Linux, macOS và Apache, Nginx. Điều này mang lại sự linh hoạt và khả năng triển khai dễ dàng cho các ứng dụng PHP.
PHP cũng có một cộng đồng lớn và tích cực, cung cấp nhiều tài liệu, tài nguyên và hỗ trợ từ các lập trình viên khác. Sự phát triển liên tục của PHP và cộng đồng đảm bảo rằng ngôn ngữ này không ngừng cải thiện và đáp ứng được nhu cầu ngày càng cao của phát triển web.
JavaScript là một ngôn ngữ lập trình phía máy khách (client-side) mạnh mẽ và phổ biến được sử dụng rộng rãi trong lĩnh vực phát triển web. Được tạo ra vào những năm 1990, JavaScript đã trở thành một công nghệ quan trọng cho việc tạo ra các trang web tương tác, ứng dụng web và các ứng dụng di động.
Ngôn ngữ này hỗ trợ các tính năng như xử lý sự kiện, thay đổi nội dung trang web, tương tác với các yêu cầu từ máy chủ và tạo ra hiệu ứng đồ họa và hoạt hình.
JavaScript cung cấp các thư viện và framework mạnh mẽ như jQuery, React, Angular và Vue.js, giúp tăng tốc quá trình phát triển và cung cấp kiến trúc tốt cho các ứng dụng web phức tạp. Ngoài ra, JavaScript cũng có khả năng tích hợp với các công nghệ khác như HTML và CSS để tạo ra trang web đa phương tiện và ứng dụng web đa nền tảng.
Một điểm mạnh của JavaScript là khả năng chạy trên mọi trình duyệt web hiện đại, bao gồm Chrome, Firefox, Safari và Edge. Điều này đảm bảo rằng các ứng dụng JavaScript có thể hoạt động trên nhiều nền tảng và thiết bị khác nhau mà không cần thay đổi mã nguồn.
Ngôn ngữ lập trình C là một ngôn ngữ lập trình mạnh mẽ và phổ biến đã xuất hiện từ những năm 1970. Được phát triển bởi Dennis Ritchie tại Bell Laboratories, C đã trở thành một trong những ngôn ngữ lập trình quan trọng nhất trong lịch sử công nghệ thông tin.
C được thiết kế với mục đích chính là viết các ứng dụng hệ thống và phần mềm nền tảng. Với cú pháp đơn giản và rõ ràng, C dễ học và hiểu, giúp lập trình viên nắm bắt nhanh chóng cách thức hoạt động của ngôn ngữ. Điều này cũng tạo điều kiện thuận lợi cho việc phát triển ứng dụng có hiệu suất cao và quản lý tài nguyên hiệu quả.
Cung cấp các tính năng mạnh mẽ như con trỏ, cấu trúc dữ liệu và hàm thư viện tiêu chuẩn, C cho phép lập trình viên có sự kiểm soát cao đối với chương trình. Một trong những đặc điểm nổi bật của C là khả năng tương thích đa nền tảng. Có thể sử dụng C trên nhiều hệ điều hành như Windows, Linux, macOS và nhiều kiến trúc phổ biến khác nhau. Điều này cho phép lập trình viên phát triển ứng dụng đa nền tảng và tái sử dụng mã nguồn trên các môi trường khác nhau.
Các ngôn ngữ lập trình cơ bản đang đóng một vai trò quan trọng trong việc xây dựng và phát triển các hệ thống thông tin hiện đại.
Mỗi ngôn ngữ mang đến những đặc điểm và ưu điểm riêng, phù hợp với nhu cầu và mục tiêu của từng dự án. Hiểu và sử dụng thành thạo một hoặc nhiều ngôn ngữ lập trình cơ bản sẽ giúp bạn trở thành một developer giỏi trong tương lai. Vậy hãy bắt đầu hành trình khám phá và chinh phục thế giới của các ngôn ngữ lập trình cơ bản.
Tại Việt Nam hiện nay, Stringee là đơn vị tiên phong cung cấp các API và SDK cho các lập trình viên để tích hợp các tính năng liên lạc trực tiếp như cuộc gọi điện thoại (voice call), tin nhắn, video call, tính năng chat, contact center vào ứng dụng/website của mình. Các SDK được Stringee cung cấp có thể kể đến như Web SDK (Javascript); Mobile SDK bao gồm iOS, Android, Flutter, React Native, Phonegap; và Rest API cho phần backend.. Nhờ đó, việc tích hợp các tính năng liên lạc trực tiếp vào ứng dụng trở nên dễ dàng và thuận tiện hơn.
Quý bạn đọc có nhu cầu tìm hiểu xin mời đăng ký dùng thử miễn phí bộ thư viện Stringee Communication APIs trong 30 ngày tại đây:
Ngôn ngữ lập trình (tiếng Anh: programming language) là ngôn ngữ hình thức bao gồm một tập hợp các lệnh tạo ra nhiều loại đầu ra khác nhau. Ngôn ngữ lập trình được sử dụng trong lập trình máy tính để thực hiện các thuật toán.
Hầu hết các ngôn ngữ lập trình bao gồm các lệnh cho máy tính. Có những máy lập trình sử dụng một tập hợp các lệnh cụ thể, thay vì các ngôn ngữ lập trình chung chung. Kể từ đầu những năm 1800, các chương trình đã được sử dụng để định hướng hoạt động của máy móc như khung dệt Jacquard, hộp nhạc và đàn piano cơ.[1] Các chương trình cho những máy này (chẳng hạn như cuộn giấy của đàn piano) không tạo ra các hành vi khác nhau để đáp ứng với các đầu vào hoặc điều kiện khác nhau.
Hàng nghìn ngôn ngữ lập trình khác nhau đã được tạo ra và nhiều ngôn ngữ lập trình khác đang được tạo ra hàng năm. Nhiều ngôn ngữ lập trình được viết dưới dạng mệnh lệnh (tức là một chuỗi các thao tác phải thực hiện) trong khi các ngôn ngữ khác sử dụng dạng khai báo (tức là kết quả mong muốn được chỉ định chứ không phải cách thức làm ra nó).
Mô tả của một ngôn ngữ lập trình thường được chia thành hai thành phần cú pháp (hình thức) và ngữ nghĩa (ý nghĩa). Một số ngôn ngữ được xác định bởi tài liệu đặc tả (ví dụ: ngôn ngữ lập trình C được chỉ định bởi Tiêu chuẩn ISO) trong khi các ngôn ngữ khác (chẳng hạn như Perl) có cách triển khai chi phối được coi là tham chiếu. Một số ngôn ngữ có cả hai, với ngôn ngữ cơ bản được xác định bởi một tiêu chuẩn và các phần mở rộng được lấy từ việc triển khai chi phối là phổ biến.
Lý thuyết ngôn ngữ lập trình là một lĩnh vực con của khoa học máy tính nghiên cứu về thiết kế, sự thực hiện, phân tích, đặc điểm và phân loại của các ngôn ngữ lập trình.
Ngôn ngữ lập trình là một ký hiệu để viết chương trình, là các đặc tả của một phép tính hoặc thuật toán.[2] Một số tác giả hạn chế thuật ngữ "ngôn ngữ lập trình" đối với những ngôn ngữ có thể thể hiện tất cả các thuật toán có thể.[2][3] Các đặc điểm thường được coi là quan trọng đối với những gì cấu thành một ngôn ngữ lập trình bao gồm:
Các ngôn ngữ đánh dấu như XML, HTML hoặc troff, xác định dữ liệu có cấu trúc, thường không được coi là ngôn ngữ lập trình.[12][13][14] Tuy nhiên, ngôn ngữ lập trình có thể chia sẻ cú pháp với các ngôn ngữ đánh dấu nếu ngữ nghĩa tính toán được xác định. Ví dụ, XSLT là một ngôn ngữ hoàn chỉnh Turing hoàn toàn sử dụng cú pháp XML.[15][16][17] Hơn nữa, LaTeX, phần lớn được sử dụng để cấu trúc tài liệu, cũng chứa một tập con hoàn chỉnh Turing.[18][19]
Thuật ngữ ngôn ngữ máy tính đôi khi được sử dụng thay thế cho ngôn ngữ lập trình.[20] Tuy nhiên, cách sử dụng của cả hai thuật ngữ khác nhau giữa các tác giả, bao gồm cả phạm vi chính xác của mỗi thuật ngữ. Một cách sử dụng mô tả các ngôn ngữ lập trình như một tập hợp con của các ngôn ngữ máy tính.[21] Tương tự như vậy, các ngôn ngữ được sử dụng trong máy tính có mục tiêu khác với mục đích thể hiện các chương trình máy tính là các ngôn ngữ máy tính được chỉ định chung. Ví dụ, các ngôn ngữ đánh dấu đôi khi được gọi là ngôn ngữ máy tính để nhấn mạnh rằng chúng không được sử dụng để lập trình.[22]
Một cách sử dụng khác coi ngôn ngữ lập trình là cấu trúc lý thuyết để lập trình máy trừu tượng và ngôn ngữ máy tính là tập hợp con của chúng chạy trên máy tính vật lý có tài nguyên phần cứng hữu hạn.[23] John C. Reynolds nhấn mạnh rằng các ngôn ngữ đặc tả hình thức cũng giống như các ngôn ngữ lập trình giống như các ngôn ngữ dùng để thực thi. Ông cũng lập luận rằng các định dạng đầu vào văn bản và thậm chí đồ họa ảnh hưởng đến hoạt động của máy tính là ngôn ngữ lập trình, mặc dù thực tế là chúng thường không hoàn chỉnh và nhận xét rằng sự thiếu hiểu biết về các khái niệm ngôn ngữ lập trình là lý do dẫn đến nhiều sai sót trong các định dạng đầu vào.[24]
Các máy tính rất sơ khai, chẳng hạn như Colossus, được lập trình mà không cần sự trợ giúp của chương trình được lưu trữ, bằng cách sửa đổi mạch điện của chúng hoặc thiết lập các kho các rơ le điều khiển vật lý.
Sau đó một chút, các chương trình có thể được viết bằng ngôn ngữ máy, trong đó lập trình viên viết từng lệnh dưới dạng số mà phần cứng có thể thực thi trực tiếp. Ví dụ: lệnh thêm giá trị vào hai vị trí bộ nhớ có thể bao gồm 3 số: một "mã opcode" chọn thao tác "cộng" và hai vị trí bộ nhớ. Các chương trình, ở dạng thập phân hoặc nhị phân, được đọc từ thẻ đục lỗ, băng giấy, băng từ hoặc được chuyển vào trên các công tắc trên bảng điều khiển phía trước của máy tính. Ngôn ngữ máy sau này được gọi là ngôn ngữ lập trình thế hệ thứ nhất (1GL).
Bước tiếp theo là sự phát triển của cái gọi là ngôn ngữ lập trình thế hệ thứ hai (2GL) hoặc hợp ngữ, những ngôn ngữ này vẫn được gắn chặt với kiến trúc tập lệnh của máy tính cụ thể. Những điều này phục vụ cho việc làm cho chương trình dễ đọc hơn nhiều và giúp người lập trình giảm bớt các tính toán địa chỉ tẻ nhạt và dễ xảy ra lỗi.
Các ngôn ngữ lập trình cấp cao đầu tiên, hoặc ngôn ngữ lập trình thế hệ thứ ba (3GL), được viết vào những năm 1950. Một ngôn ngữ lập trình cấp cao ban đầu được thiết kế cho máy tính là Plankalkül, được phát triển cho Z3 của Đức bởi Konrad Zuse từ năm 1943 đến năm 1945. Tuy nhiên, nó đã không được thực hiện cho đến năm 1998 và 2000.[25]
Mã ngắn của John Mauchly, được đề xuất vào năm 1949, là một trong những ngôn ngữ cấp cao đầu tiên từng được phát triển cho máy tính điện tử.[26] Không giống như mã máy, các câu lệnh mã ngắn biểu diễn các biểu thức toán học ở dạng dễ hiểu. Tuy nhiên, chương trình phải được dịch sang mã máy mỗi khi nó chạy, làm cho quá trình chạy chậm hơn nhiều so với chạy mã máy tương đương.
Tại Đại học Manchester, Alick Glennie đã phát triển Autocode vào đầu những năm 1950. Là một ngôn ngữ lập trình, nó sử dụng một trình biên dịch để tự động chuyển đổi ngôn ngữ thành mã máy. Mã và trình biên dịch đầu tiên được phát triển vào năm 1952 cho máy tính Mark 1 tại Đại học Manchester và được coi là ngôn ngữ lập trình cấp cao được biên dịch đầu tiên.[27][28]
Mã tự động thứ hai được RA Brooker phát triển cho Mark 1 vào năm 1954 và được gọi là "Mã tự động Mark 1". Brooker cũng đã phát triển một mã tự động cho Ferranti Mercury vào những năm 1950 cùng với Đại học Manchester. Phiên bản cho EDSAC 2 được phát minh bởi DF Hartley của Phòng thí nghiệm Toán học Đại học Cambridge vào năm 1961. Được gọi là Mã tự động EDSAC 2, nó là sự phát triển trực tiếp từ Mã tự động của Mercury được điều chỉnh cho phù hợp với hoàn cảnh địa phương và được chú ý vì khả năng tối ưu hóa mã đối tượng và chẩn đoán ngôn ngữ nguồn đã được cải tiến vào thời điểm đó. Là một chuỗi phát triển hiện đại nhưng riêng biệt, Atlas Autocode được phát triển cho máy Atlas 1 của Đại học Manchester.
Năm 1954, FORTRAN được John Backus phát minh ra tại IBM. Nó là ngôn ngữ lập trình mục đích chung cấp cao đầu tiên được sử dụng rộng rãi để có một triển khai chức năng, thay vì chỉ là một thiết kế trên giấy.[29][30] Nó vẫn là một ngôn ngữ phổ biến cho tính toán hiệu suất cao[31] và được sử dụng cho các chương trình đánh giá và xếp hạng các siêu máy tính nhanh nhất thế giới.[32]
Một ngôn ngữ lập trình ban đầu khác được phát minh bởi Grace Hopper ở Mỹ, được gọi là FLOW-MATIC. Nó được phát triển cho UNIVAC I tại Remington Rand trong thời gian từ năm 1955 đến năm 1959. Hopper nhận thấy rằng khách hàng xử lý dữ liệu kinh doanh không thoải mái với ký hiệu toán học, và vào đầu năm 1955, bà và nhóm của mình đã viết một đặc tả cho một ngôn ngữ lập trình tiếng Anh và thực hiện một nguyên mẫu.[33] Trình biên dịch FLOW-MATIC được công bố rộng rãi vào đầu năm 1958 và về cơ bản hoàn thành vào năm 1959.[34] FLOW-MATIC có ảnh hưởng lớn trong việc thiết kế COBOL, vì chỉ có nó và hậu duệ trực tiếp của nó là AIMACO được sử dụng thực tế vào thời điểm đó.[35]
Mỗi ngôn ngữ lập trình có thể được xem như là một tập hợp của các chi tiết kỹ thuật chú trọng đến cú pháp, từ vựng, và ý nghĩa của ngôn ngữ.
Những chi tiết kỹ thuật này thường bao gồm:
Đối với các ngôn ngữ phổ biến hoặc có lịch sử lâu dài, người ta thường tổ chức các hội thảo chuẩn hoá nhằm tạo ra và công bố các tiêu chuẩn chính thức cho ngôn ngữ đó, cũng như thảo luận về việc mở rộng, bổ sung cho các tiêu chuẩn trước đó. Ví dụ: Với ngôn ngữ C++, hội đồng tiêu chuẩn ANSI C++ và ISO C++ đã tổ chức đến 13 cuộc hội thảo để điều chỉnh và nâng cấp ngôn ngữ này. (Xem thêm Comeau.Computing. Đối với các ngôn ngữ lập trình web như JavaScript, ta có chuẩn ECMA, W3C.
Một hệ thống đặc thù mà theo đó các dữ liệu được tổ chức sắp xếp trong một chương trình gọi là hệ thống kiểu của ngôn ngữ lập trình. Việc thiết kế và nghiên cứu các hệ thống kiểu được biết như là lý thuyết kiểu.
Nhiều ngôn ngữ định nghĩa sẵn các kiểu dữ liệu thông dụng như:
Ví dụ: trong C/C++, kiểu số nguyên thông dụng có tên là int và chiếm 4 byte trong hầu hết trình dịch 32-bit; kiểu chuỗi là một dãy các char, với ký tự NULL (hay '\0') ở vị trí chuỗi kết thúc – dãy có thể dài hơn chuỗi nó lưu trữ.
là ngôn ngữ xác định trước kiểu cho tất cả dữ liệu được khai báo trong
tại thời điểm dịch. Các giá trị của biến chỉ có thể ở một/một số kiểu cụ thể nào đó và ta chỉ có thể thực hiện một số thao tác nhất định trên chúng.
Ví dụ: trong C, ta không thể dùng phép tính + trên kiểu dữ liệu string (tức là char * hay char []). Hầu hết các ngôn ngữ có kiểu tĩnh thông dụng như C, C++, Java, D, Delphi, và C# đều đòi hỏi người lập trình kê khai rõ ràng kiểu của dữ liệu. Những người ủng hộ việc này cho rằng nó sẽ giúp ngôn ngữ rõ ràng hơn.
Các ngôn ngữ có kiểu tĩnh lại được chia ra thành hai loại:
là ngôn ngữ mà các kiểu chỉ được gán lên các dữ liệu trong thời gian chương trình được thực thi. Điều này có mặt lợi là người lập trình không cần phải xác định kiểu đữ liệu nào hết, đồng thời có thêm lợi thế là có thể gán nhiều hơn một kiểu dữ liệu lên các biến. Tuy nhiên, vì ngôn ngữ có kiểu động xem tất cả các vai trò của dữ liệu trong chương trình là có thể chuyển hóa được, do vậy các phép toán không đúng (như là cộng các tên, hay là xếp thứ tự các số theo thứ tự đánh vần) sẽ không tạo ra các lỗi cho đến lúc nó được thi hành—mặc dù vẫn có một số cài đặt cung cấp vài dạng kiểm soát tĩnh cho các lỗi hiển nhiên.
không cho phép dùng các giá trị của kiểu này như là một kiểu khác. Chúng rất chặt chẽ trong việc phát hiện sự dùng sai kiểu. Việc phát hiện này sẽ xảy ra ở thời gian thi hành (
) đối với các ngôn ngữ có kiểu động và xảy ra ở thời gian dịch đối với các ngôn ngữ có kiểu tĩnh.
là các ví dụ của ngôn ngữ có kiểu mạnh.
không quá khắt khe trong các quy tắc về kiểu hoặc cho phép một cơ chế tường minh để xử lý các vi phạm. Thường nó cho phép hành xử các biểu hiện chưa được định nghĩa trước, các vi phạm về sự phân đoạn (
), hay là các biểu hiện không an toàn khác khi mà các kiểu bị gán giá trị một cách không đúng.
là các ví dụ của ngôn ngữ có kiểu yếu.
Hầu hết các ngôn ngữ đều cung cấp các cách thức để lắp ráp các cấu trúc dữ liệu phức tạp từ các kiểu sẵn có và để liên kết các tên với các kiểu mới kết hợp (dùng các kiểu mảng, danh sách, hàng đợi, ngăn xếp hay tập tin).
Các ngôn ngữ hướng đối tượng cho phép lập trình viên định nghĩa các kiểu dữ liệu mới gọi là đối tượng. trong nội bộ các đối tượng đó có riêng các hàm và các biến (và thường được gọi theo thứ tự là các phương thức và các thuộc tính). Một chương trình có định nghĩa các đối tượng sẽ cho phép các đối tượng đó thực thi như là các chương trình con độc lập nhưng lại tương tác nhau. Các tương tác này có thể được thiết kế trong lúc viết mã để mô hình hóa và mô phỏng theo đời sống thật của các đối tượng. Nói một cách đơn giản, các ngôn ngữ hướng đối tượng đã được cho thêm sức sống để có riêng những tính năng hoạt động và tương tác với thế giới bên ngoài. Ngoài ra, các đối tượng còn có thêm các đặc tính như là thừa kế và đa hình. Điều này là một ưu thế trong việc dùng ngôn ngữ loại này để mô tả các đối tượng của thế giới thực.
Khi dữ liệu đã được định rõ, máy tính phải được chỉ thị làm thế nào để tiến hành các phép toán trên dữ liệu đó. Những mệnh đề cơ bản có thể được cấu trúc thông qua việc sử dụng các từ khóa (đã được định nghĩa bởi ngôn ngữ lập trình) hoặc là có thể tạo thành từ việc dùng và kết hợp các cấu trúc ngữ pháp hay cú pháp đã được định nghĩa. Những mệnh đề cơ bản này gọi là các câu lệnh.
Tùy theo ngôn ngữ, các câu lệnh có thể được kết hợp với nhau theo trật tự nào đó. Điều này cho phép thiết lập được các chương trình thực hiện được nhiều chức năng. Xa hơn, ngoài các câu lệnh để thay đổi và điều chỉnh dữ liệu, còn có những kiểu câu lệnh dùng để điều khiển dòng xử lý của máy tính như là phân nhánh, định nghĩa bởi nhiều trường hợp, vòng lặp, hay kết hợp các chức năng. Đây là các thành tố không thể thiếu của một ngôn ngữ lập trình.
Muốn cho chương trình thi hành được thì phải có phương pháp xác định được các vùng trống của bộ nhớ để làm kho chứa dữ liệu. Phương pháp được biết nhiều nhất là thông qua tên của các biến. Tùy theo ngôn ngữ, các vùng trống gián tiếp có thể bao gồm các tham chiếu, mà thật ra, chúng là các con trỏ (pointer) chỉ đến những vùng chứa khác của bộ nhớ, được cài đặt trong các biến hay nhóm các biến. Phương pháp này gọi là đặt tên kho nhớ. Tương tự với phương pháp đặt tên kho nhớ, là phương pháp đặt tên những nhóm của các chỉ thị. Trong hầu hết các ngôn ngữ lập trình, đều có cho phép gọi đến các macro hay các chương trình con như là các câu lệnh để thi hành nội dung mô tả trong các macro hay chương trình con này thông qua tên. Việc dùng tên như thế này cho phép các chương trình đạt tới một sự linh hoạt cao và có giá trị lớn trong việc tái sử dụng mã nguồn (vì người viết mã không cần phải lặp lại những đoạn mã giống nhau mà chỉ việc định nghĩa các macro hay các chương trình con.)
Các tham chiếu gián tiếp đến các chương trình khả dụng hay các bộ phận dữ liệu đã được xác định từ trước cho phép nhiều ngôn ngữ định hướng ứng dụng tích hợp được các thao tác khác nhau.
Mỗi ngôn ngữ lập trình đều có một bộ các cú pháp quy định việc lập trình sao cho mã nguồn được thực thi. Theo đó, mỗi nhà sản xuất ngôn ngữ lập trình sẽ cung cấp một bộ các cấu trúc ngữ pháp cho các câu lệnh, một khối lượng lớn các từ vựng quy ước được định nghĩa từ trước, và một số lượng các thủ tục hay hàm cơ bản. Ngoài ra, để giúp lập trình viên dễ dàng sử dụng, nhà sản xuất còn phải cung cấp các tài liệu tra cứu về đặc tính của ngôn ngữ mà họ phát hành. Những tài liệu tra cứu này bao gồm hầu hết các đặc tả, tính chất, các tên (hay từ khoá) mặc định, phương pháp sử dụng, và nhiều khi là các mã nguồn để làm ví dụ. Do sự không thống nhất trong các ý kiến về việc thiết kế và sử dụng từng ngôn ngữ nên có thể xảy ra trường hợp mã nguồn của cùng một ngôn ngữ chạy được cho phần mềm dịch này nhưng không tương thích được với phần mềm dịch khác. Ví dụ là các mã nguồn C viết cho Microsoft C (phiên bản 6.0) có thể không chạy được khi dùng trình dịch Borland (phiên bản 4.5) nếu không biết cách thức điều chỉnh. Đây cũng là nguyên do của các kỳ hội nghị chuẩn hóa ngôn ngữ lập trình. Ngoài công việc chính là phát triển ngôn ngữ đặc thù, hội nghị còn tìm cách thống nhất hóa ngôn ngữ bằng cách đưa ra các tiêu chuẩn, các khuyến cáo thay đổi về ngôn ngữ trong tương lai hay các đổi mới về cú pháp của ngôn ngữ.
Những đổi mới về tiêu chuẩn của một ngôn ngữ mặt khác lại có thể gây ra các hiệu ứng phụ. Đó là việc mã nguồn của một ngôn ngữ dùng trong phiên bản cũ không tương thích được với phần mềm dịch dùng tiêu chuẩn mới hơn. Đây cũng là một việc cần lưu tâm cho những người lập trình. Trường hợp điển hình nhất là việc thay đổi phiên bản về ngôn ngữ Visual Basic của Microsoft. Các mã nguồn của phiên bản 6.0 có thể sẽ không dịch được nếu dùng phiên bản mới hơn. Lý do là nhà thiết kế đã thay đổi kiến trúc của VisualBasic để nâng cao và cung cấp thêm các chức năng mới về lập trình theo định hướng đối tượng cho ngôn ngữ này.
Thay vào việc tái sử dụng mã nguồn thì cũng có các hướng phát triển khác nhằm tiết kiệm công sức cho người lập trình mà hai hướng chính là:
Tùy theo mục đích của ngôn ngữ mà chúng được thiết kế để tạo điều kiện giải quyết những vấn đề mà ngôn ngữ đó hướng tới. Những chức năng này làm cho một ngôn ngữ có thể tiện lợi để dùng phát triển loại phần mềm này nhưng có thể khó để phát triển loại phần mềm khác.
Hầu hết các ngôn ngữ đòi hỏi sự chính xác cao về mặt cú pháp. Các ngôn ngữ không cho phép có lỗi. Mặc dù vậy, một số ít ngôn ngữ cũng cho phép tự điều chỉnh trong một mức độ khá cao, khi đó chương trình tự viết lại để xử lý những trường hợp mới. Các ngôn ngữ như Prolog, PostScript và các thành viên trong họ ngôn ngữ Lisp có khả năng này. Trong ngôn ngữ MUMPS, kỹ thuật này gọi là tái biên dịch động. Các phần mềm mô phỏng và nhiều máy ảo (virtual machine) khai thác kỹ thuật này để có hiệu suất cao.
Một yếu tố liên quan đến triết lý thiết kế là có một số ngôn ngữ vì muốn tạo sự dễ dàng cho người mới dùng, đã không phân biệt việc viết chữ hoa hay không. Pascal và Basic là hai ngôn ngữ không phân biệt việc một ký tự có viết hoa hay không, trái lại trong C/C++, Java, PHP, Perl, BASH đều bắt buộc phải bảo đảm việc viết đúng y hệt như lúc khai báo cho các tên.
Câu lệnh là một thành tố quan trọng nhất của mọi ngôn ngữ lập trình. Tùy theo ngôn ngữ các câu lệnh đều phải tuân theo các trật tự sắp xếp của các từ khóa, tham số, biến và các định danh khác như các macro, hàm, thủ tục cũng như các quy ước khác. Tập hợp trật tự và quy tắc đó tạo thành cú pháp của ngôn ngữ lập trình. Các dạng câu lệnh bao gồm
: Dạng câu lệnh này cho phép xác định một kiểu dữ liệu mới hay một
thì mỗi lớp đều có thể là một kiểu dữ liệu mới do đó việc tạo ra một lớp mới tức là đã dùng câu lệnh kiểu định nghĩa.
Khai báo: Cũng gần giống như dạng định nghĩa, dạng khai báo cho phép người lập trình chính thức thông báo về sự ra đời của một biến, hay một tên (tên hàm chẳng hạn). Thông thường, đối với ngôn ngữ tĩnh, tên hàm hay biến mới đều phải có phần cho biết kiểu dữ liệu của biến hay hàm. Tuy nhiên, điều này không bắt buộc với ngôn ngữ động. Ngoài ra, các khai báo đôi khi còn cho phép các biến gán một giá trị ban đầu nhưng thường thì việc này cũng không bắt buộc. (Xem thêm loại câu lệnh gán giá trị). Đối với nhiều ngôn ngữ thì việc khai báo có thể cho phép chương trình đó được cấp thêm một phần bộ nhớ dự trữ riêng cho các biến (hay các đối tượng) đăng ký tên trong câu lệnh khai báo.
Điều kiện: Loại câu lệnh này dùng để chẻ nhánh dòng điều khiển của ngôn ngữ. Thường từ khóa hay được dùng nhất là "if", "else", và "else if". Ngoài ra, một số ngôn ngữ có thể dùng thêm dạng câu lệnh phân nhánh đặc biệt cho trường hợp có nhiều phân nhánh (thường từ khóa bắt đầu câu lệnh điều kiện kiểu này có thể là "switch" hay là "case".)
loại lệnh này dùng để thực thi các hàm, các thủ tục, hay các
đã được định nghĩa sẵn bởi các thư viện hay bởi người lập trình.
: Ngoài các thành tố trên, các nhà sản xuất các phần mềm dịch (đặc biệt là các trình dịch) còn có thể cung cấp thêm các dạng câu lệnh không trực tiếp tham gia vào việc tính toán trên các dữ liệu của chương trình nhưng lại trực tiếp điều khiển các dòng chuyển
ở thời điểm dịch cũng như là hướng dẫn các trình dịch cách xử lý, tìm nguồn mã bổ sung, cách dùng thư viện, hay các cài đặt đặc biệt cho một loại hệ điều hành hay cho một loại phần cứng nào đó. Các câu lệnh này có thể tùy thuộc vào nhà sản xuất phần mềm chuyển dịch cung cấp.
Lưu ý: để hiểu rõ hơn và sử dụng thuần thục các dạng câu lệnh thì người lập trình nên tham khảo các tài liệu giảng giải riêng về từng ngôn ngữ.
Trong một số ngôn ngữ, người ta lại phân biệt thành 2 kiểu chương trình con:
nào có giá trị trả về (trong một kiểu dữ liệu nào đó) thông qua tên của hàm.
được thi hành và không có giá trị trả về.
Tuy nhiên, trong nhiều ngôn ngữ khác như C chẳng hạn thì không có sự phân biệt này và chỉ có một khái niệm hàm. Để mô tả các hàm không trả về giá trị (tương đương với khái niệm thủ tục) thì người ta có thể gán cho kiểu dữ liệu của hàm đó là void.
Lưu ý: trong các ngôn ngữ hướng đối tượng, mỗi một đối tượng hay một thực thể (instance), tùy theo quan điểm, có thể được xem là một chương trình con hay một biến vì bản thân nội tại của thực thể đó có chứa các phương thức và cả các dữ liệu có thể trả lời cho các lệnh gọi từ bên ngoài.
Các điểm khác nhau quan trọng giữa một chương trình con và một macro bao gồm:
Các tham số giống biến ở chỗ chúng thường có kiểu xác định. Bên trong chương trình con, hay macro, các tham số thường đóng vai trò của hằng nhưng trong nhiều trường hợp khác chúng vẫn có thể hoạt động như các biến và điều này cũng phụ thuộc vào các đặc tính của mỗi ngôn ngữ.
Nếu nhìn toàn bộ chương trình như một hàm lớn thì tham số của hàm này gọi là tham số của chương trình và các tham số của chương trình này có thể tương tác với các chương trình khác và ngược lại. Một cách đơn giản thì tham số là các dữ liệu truyền đi giữa các chương trình hay các hàm, thủ tục hay macro.
Từ vựng quy ước là những dãy các ký tự hay ký hiệu (thường tạo thành các chữ có ý nghĩa) nối nhau và được một ngôn ngữ cho sử dụng như là tên, giá trị hay một luật nào đó. Người viết mã nên tránh sử dụng các từ quy ước này vào việc đặt tên (cho các biến, hàm, hay các đối tượng khác) để tránh không gây ra các lỗi dạng ambiguity (nghĩa là từ dùng có nhiều nghĩa khiến cho phần mềm dịch không biết phải chọn cách nào). Tuy nhiên, tuỳ theo từng trường hợp mà một tên mới đặt ra trùng với các tên đã quy định có được chấp nhận hay không và việc chấp nhận này sẽ có hiệu ứng phụ gì. Thí dụ
Từ khóa trong ngôn ngữ lập trình là các từ hay ký hiệu mà đã được ngôn ngữ đó gán cho một ý nghĩa xác định. Người lập trình sẽ không được phép dùng lại các từ khóa này dưới một ý nghĩa khác. Thường các từ khóa này được ngôn ngữ xác định dùng trong các kiểu dữ liệu cơ bản hay trong các dòng điều khiển. Ví dụ một số từ khóa trong C và C++: auto, float, return, char, if else, static, void...
Ngoài các từ khóa, một ngôn ngữ lập trình còn có khối lượng khá lớn các tên đã được định nghĩa hay được gán cho các ý nghĩa chuyên biệt gọi là các tên chuẩn. Các tên này có thể được dùng lại cho một ý nghĩa khác tùy theo người viết mã. Trong nhiều trường hợp sẽ phải có một cơ chế gọi để phân biệt là người lập trình muốn ám chỉ các tên đã bị tái dụng này dưới ý nghĩa nguyên thủy hay dưới ý nghĩa mới. Thường các tên được phép định nghĩa lại nằm trong hai loại chính là:
Trong mỗi ngôn ngữ đều cung cấp một hệ thống ký hiệu hay ký tự có ý nghĩa riêng. Tùy theo ngôn ngữ mà các ký hiệu này được phép định nghĩa lại hay không. Những ký hiệu được dùng trong hai trường hợp thường thấy nhất là
Mỗi ngôn ngữ, do hạn chế của môi trường và bản thân ngôn ngữ cũng như do mục tiêu sử dụng, có thể có một số luật cấm mà người lập trình không thể vi phạm. Những luật cấm này có thể có những cách xử lý khác nhau như là:
Các loại lỗi về ngôn ngữ khi lập trình thường xảy ra là
OOP là chữ viết tắt của Object Oriented Programming có nghĩa là Lập trình hướng đối tượng được phát minh năm 1965 bởi Ole-Johan Dahl và Kristen Nygaard trong ngôn ngữ Simula. So với phương pháp lập trình cổ điển, thì triết lý chính bên trong loại ngôn ngữ loại này là để tái dụng các khối mã nguồn và cung ứng cho các khối này một khả năng mới: chúng có thể có các hàm (gọi là các phương thức) và các dữ liệu (gọi là thuộc tính) nội tại. Khối mã như vậy được gọi là đối tượng. Các đối tượng thì độc lập với môi trường và có khả năng trả lời với yêu cầu bên ngoài tùy theo thiết kế của người lập trình. Với cách xây dựng này, mỗi đối tượng sẽ tương đương với một chương trình riêng có nhiều đặc tính mới mà quan trọng nhất là tính đa hình, tính đóng, tính trừu tượng và tính thừa kế.
Đây là đặc tính cho phép tạo các đối tượng mới từ đối tượng ban đầu và lại có thể có thêm những đặc tính riêng mà đối tượng ban đầu không có. Cơ chế này cho phép người lập trình có thể tái sử dụng mã nguồn cũ và phát triển mã nguồn mới bằng cách tạo ra các đối tượng mới thừa kế đối tượng ban đầu.
Tính đa hình được thể hiện trong lập trình hướng đối tượng rất đặc biệt. Người lập trình có thể định nghĩa một thuộc tính (chẳng hạn thông qua tên của các phương thức) cho một loạt các đối tượng gần nhau nhưng khi thi hành thì dùng cùng một tên gọi mà sự thi hành của mỗi đối tượng sẽ tự động xảy ra tương ứng theo từng đối tượng không bị nhầm lẫn.
Đặc tính này cho phép xác định một đối tượng trừu tượng, nghĩa là đối tượng đó có thể có một số đặc điểm chung cho nhiều đối tượng nhưng bản thân đối tượng này có thể không có các biện pháp thi hành.
Tính đóng gói ở đây dược hiểu là các dữ liệu (thuộc tính) và các hàm (phương thức) bên trong của mỗi đối tượng sẽ không cho phép người gọi dùng hay thay đổi một cách tự do mà chỉ có thể tương tác với đối tượng đó qua các phương thức được người lập trình cho phép. Tính đóng gói ở đây có thể so sánh với khái niệm "hộp đen", nghĩa là người ta có thể thấy các hành vi của đối tượng tùy theo yêu cầu của môi trường nhưng lại không thể biết được bộ máy bên trong thi hành ra sao.