Biên dịch là một quá trình tạo điều kiện giao tiếp giữa người lập trình và máy tính. Trình biên dịch - mô tả là gì

Khi các lập trình viên nói về lập trình, họ thường nói: “chương trình được biên dịch không có lỗi” hoặc khi họ nói với một lập trình viên: “biên dịch chương trình, hãy xem kết quả công việc”. Những cuộc trò chuyện như vậy sau này có thể trở thành nguồn gốc gây nhầm lẫn cho. Biên dịch và tạo một tập tin thực thi không đồng nghĩa với nhau! Tạo các tệp thực thi là một quá trình gồm nhiều bước, các thành phần chính là biên dịch và liên kết. Trên thực tế, ngay cả khi một chương trình được "biên dịch không có lỗi" thì nó vẫn có thể không hoạt động do lỗi có thể xảy ra trong giai đoạn bố trí. Toàn bộ quá trình dịch file mã nguồn sang tập tin thực thi sẽ tốt hơn nếu gọi nó là xây dựng một dự án.

Biên soạn!

Biên dịch đề cập đến việc xử lý các tệp mã nguồn (.c, .cc hoặc .cpp) và tạo các tệp đối tượng dự án. Bước này không tạo ra tệp thực thi. Thay vào đó, trình biên dịch chỉ dịch mã cấp cao sang ngôn ngữ máy. Ví dụ: nếu bạn đã tạo (nhưng không kết hợp) ba tập tin riêng biệt, bạn sẽ có ba tệp đối tượng được tạo làm đầu ra trong bước biên dịch. Phần mở rộng của các tệp như vậy sẽ phụ thuộc vào trình biên dịch của bạn, ví dụ *.obj hoặc *.o. Mỗi tệp này chứa các hướng dẫn máy tương đương với mã nguồn. Nhưng bạn không thể chạy những tập tin này! Bạn phải biến chúng thành tệp thực thi hệ điều hành, chỉ sau đó chúng mới có thể được sử dụng. Đây là lúc trình liên kết phát huy tác dụng.

Cách trình bày!

Một tệp thực thi duy nhất được tạo từ nhiều tệp đối tượng. Ở giai đoạn này, tệp kết quả là tệp duy nhất và do đó trình liên kết sẽ phàn nàn về các hàm không xác định được tìm thấy. Ở giai đoạn biên dịch, nếu trình biên dịch không thể tìm thấy định nghĩa cho một hàm thì giả định rằng hàm đó đã được định nghĩa trong một tệp khác. Nếu không, trình biên dịch sẽ không biết về nó vì nó không xem nội dung của nhiều tệp cùng một lúc. Mặt khác, trình liên kết có thể xem xét nhiều tệp và cố gắng tìm các tham chiếu đến các hàm không được đề cập.

Bạn có thể hỏi tại sao các bước biên soạn và liên kết lại tách biệt nhau. Thứ nhất, điều này giúp việc thực hiện quá trình xây dựng chương trình trở nên dễ dàng hơn. Trình biên dịch thực hiện công việc của nó và trình liên kết thực hiện công việc của nó - thông qua việc phân tách các hàm, độ phức tạp của chương trình

giảm đi. Một ưu điểm khác (rõ ràng hơn) là nó cho phép bạn tạo chương trình lớn mà không cần phải lặp lại bước biên dịch mỗi khi thay đổi một số tệp. Thay vào đó, cái gọi là "biên dịch có điều kiện" được sử dụng. Nghĩa là, các đối tượng chỉ được tạo cho những tệp nguồn đã được thay đổi; đối với những tệp còn lại, các tệp đối tượng không được tạo lại. Thực tế là mỗi tệp được biên dịch riêng biệt với thông tin có trong các tệp khác là

tồn tại do sự phân chia quá trình xây dựng dự án thành các giai đoạn biên soạn và liên kết.

Hai bước này đã được thực hiện và bạn không phải lo lắng về việc tập tin nào đã bị thay đổi. IDE quyết định khi nào nên tạo đối tượng tệp và khi nào không.

Biết được sự khác biệt giữa giai đoạn biên dịch và giai đoạn liên kết sẽ giúp bạn tìm ra lỗi trong dự án của mình dễ dàng hơn nhiều. Trình biên dịch thường phát hiện sự vắng mặt của dấu chấm phẩy hoặc dấu ngoặc đơn. Nếu bạn nhận được thông báo lỗi về nhiều định nghĩa của một hàm hoặc biến, hãy biết rằng trình liên kết đang cho bạn biết về điều đó. Lỗi này chỉ có thể có nghĩa là cùng một hàm hoặc biến được xác định trong một số tệp dự án.

Bản thân máy tính chỉ có thể làm được bấy nhiêu bộ giới hạn hoạt động được gọi là mã máy. Ngày xưa, khi những chiếc máy tính đầu tiên xuất hiện, các chương trình được viết bằng mã máy, là những chuỗi số nhị phân, được máy tính nhận biết một cách duy nhất. Vào cuối những năm 1950, các ngôn ngữ lập trình đầu tiên như hợp ngữ và Fortran xuất hiện. Để máy tính có thể hiểu được một chương trình được viết bằng ngôn ngữ lập trình thì cần có một người dịch (người dịch) chương trình đó sang mã máy. Lưu ý rằng nếu toán tử hợp ngữ xuất hiện trong quá trình dịch thường xuyên nhất 1 Một số câu lệnh hợp ngữ, chẳng hạn như câu lệnh đầu vào/đầu ra, ánh xạ tới nhiều lệnh máy. thành một hướng dẫn máy, cung cấp nhiều ngôn ngữ hơn cấp độ cao nói chung, được ánh xạ thành một số hướng dẫn máy.

Có hai loại trình dịch: trình biên dịch (compiler) và trình thông dịch (thông dịch viên). Quá trình biên soạn bao gồm hai phần: phân tích và tổng hợp. Phần phân tích của trình biên dịch chia chương trình nguồn thành các phần tử cấu thành của nó (cấu trúc ngôn ngữ) và tạo ra một biểu diễn trung gian của chương trình nguồn. Phần tổng hợp tạo ra một chương trình mới từ biểu diễn trung gian mà máy tính có thể hiểu được. Một chương trình như vậy được gọi là chương trình đối tượng. Chương trình đối tượng sau đó có thể được thực thi mà không cần dịch lại. Cây thường được sử dụng làm biểu diễn trung gian, đặc biệt là cây phân tích cú pháp. Cây phân tích là một cây, mỗi nút tương ứng với một số thao tác và các nút con của nút này tương ứng với các toán hạng.

Thông dịch viên

Không giống như trình biên dịch, trình thông dịch không tạo ra bất kỳ chương trình mới, mà chỉ đơn giản là thực thi từng câu của ngôn ngữ lập trình. Có thể nói kết quả công việc của người phiên dịch là một “con số”.

Nói chung, trình thông dịch, giống như trình biên dịch, phân tích cú pháp chương trình bằng ngôn ngữ đầu vào của nó, tạo biểu diễn trung gian và sau đó thực hiện các thao tác có trong văn bản của chương trình đó. Ví dụ: trình thông dịch có thể xây dựng một cây phân tích cú pháp và sau đó thực hiện các thao tác đánh dấu các nút của cây đó.

Trong trường hợp ngôn ngữ nguồn đủ đơn giản (ví dụ: nếu đó là ngôn ngữ hợp ngữ hoặc Cơ bản), thì không cần biểu diễn trung gian và khi đó trình thông dịch sẽ là một vòng lặp đơn giản. Nó chọn hướng dẫn ngôn ngữ tiếp theo từ luồng đầu vào, phân tích và thực thi nó. Sau đó chọn hướng dẫn tiếp theo. Quá trình này tiếp tục cho đến khi tất cả các lệnh được thực thi hoặc cho đến khi gặp một lệnh, báo hiệu sự kết thúc của quá trình diễn giải.


Trình biên dịch


Một trình biên dịch dịch các chương trình từ ngôn ngữ này sang ngôn ngữ khác. Đầu vào của trình biên dịch là chuỗi ký tự, tạo nên chương trình gốc bằng ngôn ngữ lập trình. Đầu ra của trình biên dịch ( chương trình đối tượng) cũng là một chuỗi ký tự, nhưng thuộc một ngôn ngữ khác, ví dụ như ngôn ngữ của một số máy tính. Hơn nữa, bản thân trình biên dịch được viết bằng ngôn ngữ có thể khác với hai ngôn ngữ đầu tiên. Chúng tôi sẽ gọi ngôn ngữ này là ngôn ngữ nguồn, ngôn ngữ là ngôn ngữ đích và ngôn ngữ là ngôn ngữ triển khai. Vì vậy, chúng ta có thể nói về một trình biên dịch từ Pascal đến các ngôn ngữ hướng đối tượng hiện đại như C# và Java. Hầu hết mọi người ngôn ngữ lập trình có một số đặc thù theo quan điểm của người sáng tạo ra dịch giả. Tuy nhiên, chúng ta sẽ bắt đầu bằng cách xem xét nhiều ngôn ngữ đích của trình biên dịch.

Trình biên dịch- một chương trình hoặc công cụ kỹ thuật thực hiện biên soạn.

biên soạn- dịch chương trình được biên dịch bằng ngôn ngữ nguồn cấp cao sang chương trình tương đương bằng ngôn ngữ cấp thấp gần với mã máy (mã tuyệt đối, mô-đun đối tượng, đôi khi là hợp ngữ). Thông tin đầu vào của trình biên dịch (mã nguồn) là mô tả thuật toán hoặc chương trình bằng ngôn ngữ hướng vấn đề và đầu ra của trình biên dịch là mô tả tương đương của thuật toán trong ngôn ngữ hướng máy (mã đối tượng).

Biên dịch- dịch chương trình máy từ ngôn ngữ hướng vấn đề sang ngôn ngữ hướng máy.

Các loại trình biên dịch

    Vector hóa. Dịch mã nguồn thành mã máy Mã máy tính, được trang bị bộ xử lý vector.

    Linh hoạt. Được thiết kế theo nguyên tắc mô-đun, được điều khiển bởi các bảng và được lập trình bằng ngôn ngữ cấp cao hoặc được triển khai bằng trình biên dịch các trình biên dịch.

    Hộp thoại. Xem: dịch đối thoại.

    Tăng dần. Truyền lại các đoạn chương trình và phần bổ sung vào nó mà không cần biên dịch lại toàn bộ chương trình.

    Giải thích (từng bước). Tuần tự thực hiện việc biên dịch độc lập từng câu lệnh (lệnh) riêng lẻ của chương trình nguồn.

    Trình biên dịch trình biên dịch. Trình dịch chấp nhận mô tả chính thức của ngôn ngữ lập trình và tạo trình biên dịch cho ngôn ngữ đó.

    Gỡ lỗi. Loại bỏ một số loại lỗi cú pháp.

    Người dân. Nó nằm vĩnh viễn trong RAM và có sẵn để sử dụng lại cho nhiều tác vụ.

    Tự biên dịch. Được viết bằng cùng ngôn ngữ mà chương trình phát sóng được thực hiện.

    Phổ quát. Dựa trên mô tả chính thức cú pháp và ngữ nghĩa của ngôn ngữ đầu vào. Các thành phần của trình biên dịch như vậy là: kernel, bộ tải cú pháp và ngữ nghĩa.

Các kiểu biên soạn

    Lô hàng. Biên dịch nhiều mô-đun nguồn thành một mục công việc.

    Từng dòng một. Tương tự như cách giải thích.

    có điều kiện. Biên soạn, trong đó văn bản dịch phụ thuộc vào các điều kiện quy định tại chương trình gốc chỉ thị của trình biên dịch. Vì vậy, tùy thuộc vào giá trị của một hằng số nhất định, bạn có thể bật hoặc tắt tính năng dịch một phần văn bản chương trình.

Cấu trúc trình biên dịch

Quá trình biên soạn bao gồm các bước sau:

    Phân tích từ vựng. Ở giai đoạn này, chuỗi ký tự tập tin nguồnđược chuyển đổi thành một chuỗi các mã thông báo.

    Phân tích cú pháp (ngữ pháp). Chuỗi mã thông báo được chuyển đổi thành cây phân tích cú pháp.

    Phân tích ngữ nghĩa. Cây phân tích cú pháp được xử lý để thiết lập ngữ nghĩa (ý nghĩa) của nó - ví dụ: liên kết các mã định danh với các khai báo, kiểu của chúng, kiểm tra tính tương thích, xác định loại biểu thức, v.v. Kết quả thường được gọi là "biểu diễn/mã trung gian" và có thể được mở rộng bằng cây phân tích cú pháp, cây mới, tập lệnh trừu tượng hoặc thứ gì khác thuận tiện cho việc xử lý tiếp theo.

    Tối ưu hóa. Loại bỏ các cấu trúc không cần thiết và đơn giản hóa mã trong khi vẫn duy trì ý nghĩa của nó. Việc tối ưu hóa có thể ở các cấp độ và giai đoạn khác nhau - ví dụ: trên mã trung gian hoặc mã máy cuối cùng.

    Tạo mã. Từ biểu diễn trung gian, mã bằng ngôn ngữ đích được tạo ra.

Trong các triển khai trình biên dịch cụ thể, các giai đoạn này có thể được tách ra hoặc ngược lại, được kết hợp dưới dạng này hay dạng khác.

Tạo mã

Thế hệ mã máy

Hầu hết các trình biên dịch đều dịch một chương trình từ một số ngôn ngữ lập trình cấp cao sang mã máy mà bộ xử lý có thể thực thi trực tiếp. Theo quy định, mã này cũng được định hướng để thực thi trong môi trường của một hệ điều hành cụ thể, vì nó sử dụng các khả năng mà nó cung cấp (các lệnh gọi hệ thống, thư viện hàm). Kiến trúc (bộ phần mềm và phần cứng) để thực hiện quá trình biên dịch được gọi là máy mục tiêu.

Kết quả của quá trình biên dịch - một mô-đun thực thi - có hiệu suất tối đa có thể, nhưng bị ràng buộc với một hệ điều hành và bộ xử lý cụ thể (và sẽ không hoạt động trên các hệ điều hành và bộ xử lý khác).

Mỗi máy mục tiêu (IBM, Apple, Sun, v.v.) và mỗi hệ điều hành hoặc họ hệ điều hành chạy trên máy mục tiêu đều yêu cầu phải viết trình biên dịch riêng. Cũng có cái gọi là trình biên dịch chéo, cho phép bạn tạo mã trên một máy và trong một môi trường HĐH dự định được thực thi trên một máy mục tiêu khác và/hoặc trong môi trường HĐH khác. Ngoài ra, trình biên dịch có thể tối ưu hóa mã cho mô hình khác nhau từ cùng một họ bộ xử lý (bằng cách hỗ trợ các tính năng dành riêng cho từng model hoặc phần mở rộng tập lệnh). Ví dụ: mã được biên dịch cho bộ xử lý họ Pentium có thể tính đến các tính năng song song hóa lệnh và sử dụng các phần mở rộng cụ thể của chúng - MMX, SSE, v.v.

Một số trình biên dịch dịch chương trình từ ngôn ngữ cấp cao không trực tiếp sang mã máy mà sang hợp ngữ. Điều này được thực hiện để đơn giản hóa phần trình biên dịch chịu trách nhiệm tạo mã và tăng tính di động của nó (nhiệm vụ tạo mã cuối cùng và liên kết nó với nền tảng đích cần thiết được chuyển đến trình biên dịch mã) hoặc để cho phép lập trình viên kiểm soát và sửa lỗi kết quả biên soạn.

Tạo mã byte

Kết quả công việc của trình biên dịch có thể là một chương trình bằng ngôn ngữ cấp thấp được tạo đặc biệt có thể được giải thích máy ảo. Ngôn ngữ này được gọi là mã giả hoặc mã byte. Theo quy định, nó không phải là mã máy của bất kỳ máy tính nào và các chương trình trên đó có thể được thực thi trên nhiều kiến ​​trúc khác nhau khi có một cách thích hợp. máy ảo, nhưng trong một số trường hợp, nền tảng phần cứng được tạo ra để hỗ trợ trực tiếp mã giả của ngôn ngữ. Ví dụ: mã giả Java được gọi là mã byte Java. Mã byte Java) và chạy trong Máy ảo Java, đặc tả bộ xử lý picoJava được tạo để thực thi trực tiếp. Đối với .NET Framework, mã giả được gọi là Ngôn ngữ trung gian chung (CIL) và thời gian chạy được gọi là Thời gian chạy ngôn ngữ chung (CLR).

Một số triển khai ngôn ngữ thông dịch cấp cao (chẳng hạn như Perl) sử dụng mã byte để tối ưu hóa việc thực thi: các bước phân tích cú pháp và chuyển đổi văn bản chương trình thành mã byte tốn kém được thực hiện một lần khi tải, sau đó mã tương ứng có thể được sử dụng lại mà không cần các bước trung gian.

Biên dịch động

Bài chi tiết: biên soạn JIT

Do cần phải giải thích, mã byte chạy chậm hơn nhiều so với mã máy có chức năng tương đương, nhưng nó dễ mang theo hơn (độc lập với hệ điều hành và kiểu bộ xử lý). Để tăng tốc độ thực thi mã byte, hãy sử dụng biên soạn năng động, khi một máy ảo dịch mã giả thành mã máy ngay trước khi thực hiện lần đầu tiên (và khi mã được truy cập nhiều lần, phiên bản đã biên dịch sẽ được thực thi).

Mã CIL cũng được biên dịch thành mã máy đích bằng trình biên dịch JIT và các thư viện .NET Framework được biên dịch trước.

Dịch ngược

Có những chương trình giải quyết vấn đề ngược lại - dịch một chương trình từ ngôn ngữ cấp thấp sang ngôn ngữ cấp cao. Quá trình này được gọi là dịch ngược và các chương trình như vậy được gọi là trình dịch ngược. Nhưng vì quá trình biên dịch là một quá trình mất mát nên nhìn chung không thể xây dựng lại chính xác mã nguồn của C++. Các chương trình ở dạng mã byte được dịch ngược hiệu quả hơn - ví dụ: có một trình dịch ngược khá đáng tin cậy cho Flash. Một kiểu giải mã là việc phân tách mã máy thành mã hợp ngữ, hầu như luôn thành công (khó khăn có thể là mã tự sửa đổi hoặc mã trong đó mã thực và dữ liệu không được tách rời). Điều này là do thực tế là có sự tương ứng gần như một-một giữa mã lệnh máy và lệnh của trình biên dịch mã.

Biên soạn riêng biệt

Biên soạn riêng biệt(Tiếng Anh) biên soạn riêng biệt) - dịch các phần của chương trình một cách riêng biệt, sau đó là sự kết hợp của chúng bằng trình liên kết thành một mô-đun tải duy nhất.

Về mặt lịch sử, một tính năng của trình biên dịch được phản ánh trong tên của nó (eng. biên soạn- để kết hợp với nhau, để soạn thảo), là nó thực hiện cả dịch thuật và sáng tác, trong khi trình biên dịch có thể tạo ngay mã tuyệt đối. Tuy nhiên, sau này, khi độ phức tạp và kích thước của các chương trình tăng lên (và thời gian dành cho việc biên dịch lại tăng lên), cần phải tách các chương trình thành nhiều phần và phân bổ các thư viện có thể được biên dịch độc lập với nhau. Khi dịch từng phần của chương trình, trình biên dịch sẽ tạo ra một mô-đun đối tượng chứa thông tin bổ sung, sau đó được sử dụng để liên kết và giải quyết các liên kết giữa các phần khi các phần được tập hợp thành một mô-đun thực thi.

Sự xuất hiện của việc biên dịch riêng biệt và việc tách liên kết thành một giai đoạn riêng biệt xảy ra muộn hơn nhiều so với việc tạo ra các trình biên dịch. Về vấn đề này, thay vì thuật ngữ “trình biên dịch”, thuật ngữ “người dịch” đôi khi được sử dụng như một từ đồng nghĩa: trong tài liệu cũ hoặc khi họ muốn nhấn mạnh khả năng dịch chương trình sang mã máy (và ngược lại, thuật ngữ “trình biên dịch” được dùng để nhấn mạnh khả năng tập hợp từ nhiều tệp).

Nếu bạn mới bắt đầu học lập trình hoặc quan tâm đến vấn đề này thì chắc hẳn bạn đã từng gặp một từ bí ẩn như “trình biên dịch”. Chỉ riêng khái niệm đáng sợ này thôi cũng có thể khiến người dùng sợ hãi. TRONG đánh giá này chúng tôi sẽ cố gắng tìm hiểu xem liệu mọi thứ trên thực tế có thực sự khủng khiếp như vậy hay không.

Trình biên dịch: định nghĩa và lịch sử

Nếu chúng ta nói chuyện nói một cách đơn giản, thì theo thuật ngữ trình biên dịch ngày nay chúng tôi muốn nói đến một chương trình chuyển đổi văn bản của chương trình do người dùng viết thành một dạng cụ thể phù hợp để thực thi trên máy tính. Những chương trình như vậy xuất hiện đồng thời với sự xuất hiện của các ngôn ngữ lập trình đầu tiên. Điều này đã xảy ra vào cuối những năm 50. Hóa ra lịch sử gắn liền với ngôn ngữ lập trình và trình biên dịch đã có hơn 60 năm. Hướng này khoa học máy tính, mặc dù đã trải qua một thời kỳ nghiêm trọng như vậy nhưng không thể gọi là đã lâu đời hay lỗi thời. Ngược lại, theo thời gian, sự xuất hiện của các nhiệm vụ và ngành công nghiệp mới sử dụng máy tính cá nhân, cần phải phát triển các ngôn ngữ lập trình mới, tiện lợi hơn. Những ngôn ngữ này yêu cầu trình biên dịch tương ứng. Mỗi nền tảng đều có sự phát triển riêng.

Trình biên dịch: nguyên lý hoạt động

Mã nguồn được nhà phát triển tạo bằng ngôn ngữ cấp cao phải được chuyển đổi thành chương trình viết bằng ngôn ngữ máy đặc biệt. Mã này được gọi là chương trình thực thi. Chương trình thực thi có thể được cài đặt và chạy trên bất kỳ máy tính cá nhân nào mà không thực hiện bất kỳ chuyển đổi nào.

Theo truyền thống, trình biên dịch là một trong những thứ chính trong khoa học máy tính, cùng với cơ sở dữ liệu và hệ điều hành. Trình biên dịch là gì? Theo một nghĩa nào đó, đây là nền tảng của khoa học máy tính hiện đại. Chính chủ đề tạo ra các chương trình như vậy từ một quan điểm khác ngụ ý một số lượng lớn công nghệ và khía cạnh lý thuyết liên quan đến lập trình. Như nhiều nhà phát triển tin tưởng, chủ đề này nhìn chung là hấp dẫn nhất trong khoa học máy tính. Khi phát triển một chương trình giải quyết một vấn đề cụ thể, người lập trình viết nó vào ngôn ngữ đặc biệt lập trình. Trong quá trình phát triển, anh ấy sử dụng những thuật ngữ gần đúng với lĩnh vực mà anh ấy phải giải quyết. Máy tính hoàn toàn không hiểu con người muốn gì ở nó. Anh ấy chỉ có thể tìm ra những điều đơn giản, chẳng hạn như biến, thanh ghi, ô, bộ nhớ vĩnh viễn và tạm thời. Trình biên dịch là gì? Cái này chương trình đặc biệt, nhiệm vụ chính là dịch các khái niệm gần với lĩnh vực chủ đề lập trình viên thành các khái niệm có thể được thao tác bằng máy tính cá nhân. Đây chính xác là nhiệm vụ được thực hiện bởi trình biên dịch cho bất kỳ ngôn ngữ lập trình nào. Khi một ngôn ngữ mới xuất hiện, việc dịch mã được viết bằng ngôn ngữ đó sang dạng mà máy tính có thể hiểu được là cần thiết. Nếu không, mã sẽ không được thực thi. Luôn có một khoảng cách ngữ nghĩa giữa các khái niệm về con người và máy tính cá nhân. Trình biên dịch ngôn ngữ lập trình được thiết kế để khắc phục vấn đề này.

Người tạo trình biên dịch phải đối mặt với nhiều nhiều vấn đề khác nhau. Đây cũng là những vấn đề khoa học có liên quan đến hiển thị chính xác các khái niệm trong lĩnh vực ứng dụng cũng như các vấn đề về công nghệ và kỹ thuật liên quan đến việc triển khai màn hình. Khi tạo một trình biên dịch, bạn phải thực hiện nhiều nhiệm vụ con khác nhau. Đây là một ngành rất phức tạp mà các lập trình viên phải cống hiến cả cuộc đời mình.

Trình biên dịch và lớp

Nhiều bạn có thể đã nghe nói về các ngôn ngữ lập trình như C++ và C. Đây là một số ngôn ngữ phổ biến và phổ biến nhất. Những ngôn ngữ lập trình nghiêm túc như vậy chứa đựng những khái niệm mạnh mẽ hữu ích cho việc biểu diễn các khái niệm về miền ứng dụng. Ví dụ, ở đó có những thứ như lớp và hàm. Chúng là nền tảng của nhiều ngôn ngữ lập trình, nhưng chúng đặc biệt phổ biến trong C++. Sẽ thuận tiện hơn nhiều cho lập trình viên khi tạo các mô hình sử dụng các khái niệm như vậy. Trình biên dịch C cho bất kỳ hệ điều hành nào đều có thể hiển thị những thứ cấp cao như vậy ở dạng máy tính có thể đọc được. Sau đó máy tính có thể dễ dàng thao tác chúng. Bất kỳ máy tính nào, dù phức tạp đến đâu, đều hoạt động khái niệm đơn giản. Tuy nhiên, khái niệm về một lớp có thể được gọi là khó, vì nó thuận tiện cho việc phản ánh nhiều đối tượng với sự trợ giúp của nó. đời thực. Công việc của trình biên dịch là chuyển khái niệm phức tạp thành những cái nguyên thủy.

Phát triển trình biên dịch

TRONG Gần đây một xu hướng rõ ràng có thể được theo dõi do thực tế là bất kỳ công ty lớn trên đồng ruộng công nghệ thông tin phát hành ngôn ngữ lập trình của riêng mình, sau đó được quảng bá tới đại chúng. Mỗi ngôn ngữ lập trình yêu cầu trình biên dịch riêng. Theo quy định, chúng được tạo cùng với các ngôn ngữ. Tuy nhiên, có một số lượng lớn các công ty và lập trình viên độc lập muốn có trình biên dịch riêng cho một số ngôn ngữ nhất định hoặc đang phát triển ngôn ngữ riêng lập trình và theo đó là trình biên dịch cho chúng. Chúng tôi có thể hoàn toàn tự tin nói rằng một lập trình viên quyết định cống hiến cả cuộc đời mình cho lĩnh vực này chắc chắn sẽ không bị thất nghiệp. Bây giờ bạn ít nhiều đã rõ trình biên dịch là gì. Đây là một loại chương trình dịch được sử dụng để tương tác giữa nhà phát triển và máy tính. Hôm nay trên cánh đồng Thiết bị máy tính không có của phần tử này hư không.

Những lưu ý chung về phiên dịch viên

Phát triển trình thông dịch để phiên dịch chương trình bằng ngôn ngữ nguồn nhất định là một trong những nhiệm vụ chính của khoa học máy tính. Mức độ khó khăn của vấn đề triển khai trình thông dịch phụ thuộc vào độ phức tạp của ngôn ngữ nguồn và mức độ khác biệt của nó so với ngôn ngữ cơ sở mà bản thân trình thông dịch phải được viết.

Để đảm bảo tính chính xác của trình thông dịch, khi thiết kế nó, chúng ta phải tiến hành từ định nghĩa ngữ nghĩa của ngôn ngữ được dịch, hoặc ít nhất là xác minh nó dựa trên nó. Chúng ta hãy chú ý đến thực tế là định nghĩa toán học về ngữ nghĩa của một ngôn ngữ cũng tương tự như các chương trình diễn giải.

Một vị trí đặc biệt được chiếm giữ bởi thông dịch viên tương tác, tăng dần (từng bước). Họ không nhất thiết phải chuẩn bị toàn bộ chương trình trước tiên, bao gồm cả dữ liệu đầu vào và chỉ sau đó mới diễn giải nó. Với tính năng diễn giải tương tác, chương trình và dữ liệu đầu vào có thể được chuẩn bị thành các phần riêng biệt và phần kết quả - càng nhiều càng tốt - có thể được diễn giải ngay lập tức (ngôn ngữ BASIC được định hướng đặc biệt theo hướng diễn giải tăng dần).

Giờ đây, chúng tôi đang tiến gần hơn đến việc tạo trình thông dịch cho các ngôn ngữ trông khác với các ngôn ngữ thiên về tính toán cổ điển. Đặc biệt, nhờ nghiên cứu lâu dài, người ta có thể diễn giải một số ngôn ngữ nhất định thiên về thông số kỹ thuật hơn là hướng tới tính toán (ví dụ: ngôn ngữ PROLOG, được sử dụng để soạn chương trình theo logic có thể hiểu được bằng máy). ). Tuy nhiên, đối với những ngôn ngữ như vậy, có một số rào cản không thể vượt qua nhất định do giới hạn về khả năng tính toán và độ phức tạp, điều này đối với nhiều vấn đề khiến việc sử dụng các ngôn ngữ này gần như không thể.

Trình biên dịch lấy chương trình bằng ngôn ngữ nguồn làm đầu vào và tạo ra chương trình bằng ngôn ngữ đối tượng mà máy có thể hiểu được.

Nếu chúng ta muốn thực thi lặp đi lặp lại một chương trình được viết bằng ngôn ngữ cấp cao với dữ liệu nguồn luôn mới, thì điều đó thường xảy ra chương trình hiệu quả hơn không diễn giải mà trước tiên dịch sang ngôn ngữ đã được triển khai, có thể gần hơn với ngôn ngữ máy, rồi thực hiện chương trình được tạo theo cách này. Phương pháp này giúp chương trình có thể thích ứng tốt hơn với cấu trúc của máy thực sự được sử dụng và từ đó đạt được sự tối ưu hóa sâu rộng. Về nguyên tắc, việc dịch như vậy có thể được thực hiện thủ công, nhưng việc này tốn thời gian và có thể xảy ra sai sót. Vì vậy, các chương trình dịch thuật đặc biệt được gọi là dịch giả hoặc trình biên dịch(máy tính tiếng Anh).



Trình biên dịch và thông dịch thường khá chương trình phức tạp, nhận biết chương trình bằng ngôn ngữ nguồn dưới dạng văn bản, thiết lập cấu trúc bên trong của chương trình nhất định đó, kiểm tra tính chính xác về cú pháp của nó (phân tích cú pháp) và dịch chương trình sang ngôn ngữ (đối tượng) khác hoặc thực thi chương trình này thông qua các hành động thích hợp .

Một ngôn ngữ được xác định bởi cú pháp và ngữ nghĩa của nó. Trong quá trình biên dịch hoặc giải thích, một chương trình, được hiểu là một đối tượng cú pháp, được lấy làm đầu vào và theo ngữ nghĩa của nó, được chuyển đổi thành một chương trình bằng ngôn ngữ khác hoặc thành một chuỗi hành động (quy trình thực thi).

Ngôn ngữ lập trình có cấp độ cao và thấp.

Ngôn ngữ hướng tới loại cụ thể bộ xử lý và các tính năng của nó được gọi là ngôn ngữ cấp thấp. Mỗi lệnh ngôn ngữ cấp thấp thực hiện trực tiếp một lệnh của bộ vi xử lý và chúng luôn được định hướng theo tập lệnh của một bộ vi xử lý cụ thể. Ngôn ngữ cấp thấp nhất là ngôn ngữ hợp ngữ, đơn giản biểu thị từng lệnh mã máy, không phải dưới dạng số mà sử dụng ký hiệu biểu tượng, được gọi là ghi nhớ.

Ngôn ngữ cấp độ cao cho phép bạn thiết lập hành động mong muốn trong chương trình sử dụng một bộ nhất định các nhà khai thác. Chúng gần gũi và dễ hiểu hơn đối với con người hơn là với máy tính. Mỗi lệnh của một ngôn ngữ như vậy có thể bao gồm hàng tá lệnh vi xử lý trở lên. Viết chương trình bằng tiếng nước ngoài dễ dàng hơn.


1 – phụ thuộc vào máy (Trình biên dịch mã). Ngôn ngữ cấp thấp.

2 – hướng máy (C)

3 – phổ quát (Fortran, Pascal, Basic)

4 - hướng đến vấn đề (GPSS, Logo, hướng đối tượng (fort, Smalltalk))

5,6,7 – (Mở đầu, Nói ngọng, BÓNG LÓT).

C, C++ - toàn bộ phần phụ thuộc vào máy của chương trình khá dễ dàng được bản địa hóa và sửa đổi khi chuyển chương trình sang kiến ​​trúc khác.

Fortran – ngôn ngữ cấp cao đầu tiên (1958, IBM), vẫn được sử dụng cho đến ngày nay, hỗ trợ lập trình mô-đun, được các nhà toán học đặc biệt ưa thích.

Pascal – một trong những phổ biến nhất cho mục đích giáo dục (N. Wirth), thực hiện hầu hết các ý tưởng về lập trình có cấu trúc.

NỀN TẢNG – dành cho người mới bắt đầu lập trình, có khả năng đàm thoại tốt tiếng anh, hỗ trợ lập trình mô-đun và có cấu trúc.

Logo , trong số các ngôn ngữ hướng đến vấn đề, được sử dụng chủ yếu cho mục đích giảng dạy. Nó là một ngôn ngữ thủ tục đàm thoại (cú pháp đơn giản).

GPS – tập trung vào việc mô hình hóa hệ thống bằng cách sử dụng các sự kiện. Nó được sử dụng khi kết quả nghiên cứu được thể hiện dưới dạng thời gian chờ đợi, độ dài hàng đợi, việc sử dụng tài nguyên.

Chuyện nhỏ – một trong những OO PL đầu tiên, thiết kế chính là một đối tượng và các hành động với nó, dành cho các nhiệm vụ phi số (khi xây dựng hệ thống trí tuệ nhân tạo).

pháo đài – Dùng để giải các bài toán mô phỏng mô phỏng trong hệ thống đồ họa.

Ngôn ngữ nhóm chức năng được sử dụng chủ yếu trong các hệ thống trí tuệ nhân tạo. Họ có hỗ trợ công cụ mạnh mẽ, trình biên dịch nhanh, các công cụ tổ chức tích hợp chế độ đa cửa sổ, nghệ thuật đồ họa độ phân giải cao, một tập hợp các hàm toán học được phát triển.

Lời mở đầu – ngôn ngữ của AI, các thuật ngữ và kết nối được đưa ra và với sự trợ giúp của nó, những ngôn ngữ mới được tạo ra.

nói ngọng – có thiết kế đồ họa mạnh mẽ, cho phép bạn tạo các chương trình thiết kế (ví dụ: các bộ phận). Nó tập trung vào các hoạt động thiết kế. Có một thư viện nguyên thủy.

BÓNG ĐÁ – Ngôn ngữ trí tuệ nhân tạo.

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

Tất cả các ngôn ngữ lập trình thường được chia thành 5 thế hệ.

1. Đầu những năm 50. Những chiếc máy tính đầu tiên và ngôn ngữ hợp ngữ đầu tiên xuất hiện, trong đó việc lập trình được thực hiện theo nguyên tắc “Một lệnh - một dòng”.

2. Cuối thập niên 50 đầu thập niên 60. Một trình biên dịch ký hiệu đã được phát triển, trong đó xuất hiện khái niệm về một biến. Tốc độ phát triển và độ tin cậy của các chương trình đã tăng lên.

3. Thập niên 60. Sự ra đời của ngôn ngữ bậc cao Dễ lập trình, độc lập với một máy tính cụ thể, cấu trúc ngôn ngữ mới mạnh mẽ.

4. Đầu thập niên 70 đến nay. Ngôn ngữ 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. Các toán tử mạnh mẽ yêu cầu hàng nghìn dòng mã nguồn bằng các ngôn ngữ thế hệ thấp hơn.

5. Giữa những năm 90. Hệ thống tạo tự động chương trình ứng dụng bằng cách sử dụng phương tiện trực quan phát triển mà không có kiến ​​thức lập trình. Các hướng dẫn được nhập vào máy tính dưới dạng trực quan bằng các phương pháp thuận tiện nhất cho người chưa quen với lập trình.

Tại viện của chúng tôi, trong các khóa học khác nhau, bạn sẽ học cách lập trình nhiều ngôn ngữ khác nhau lập trình.