2009-10-04 37 views
14

Tôi đã lập trình được nhiều năm (chủ yếu là Python), nhưng tôi không hiểu điều gì xảy ra sau khi biên dịch hoặc thực thi mã của mình.Học cách ngôn ngữ lập trình hoạt động

Trong tĩnh mạch của question Tôi đã hỏi trước về các hệ điều hành, tôi đang tìm kiếm giới thiệu nhẹ nhàng về kỹ thuật ngôn ngữ lập trình. Tôi muốn có thể xác định và hiểu các khái niệm cơ bản về các thuật ngữ như trình biên dịch, thông dịch viên, mã gốc, mã được quản lý, máy ảo, v.v. Điều gì sẽ là một cách thú vị và tương tác để tìm hiểu về điều này?

+2

câu hỏi tài nguyên trình biên dịch dứt khoát trên SO: http: // stackoverflow.com/questions/1669/learning-to-write-a-compiler Có một số tài nguyên được đề xuất ở đó có một cách tiếp cận rất dễ dàng: nếu bạn có thể lập trình, bạn đã sẵn sàng để tìm hiểu các phương pháp biên dịch. Đừng sợ. Tôi thích hướng dẫn Crenshaw. – dmckee

+0

^Đó là danh sách tài nguyên tuyệt vời. Cảm ơn. –

Trả lời

12

Mã để thực hiện trong một

Một chương trình Tóm lại (code) được đưa vào trình biên dịch (hoặc thông dịch).

Ký tự được sử dụng để tạo mã thông báo (+, số nhận dạng, số) và giá trị của chúng được lưu trữ trong một số thứ được gọi là bảng biểu tượng.

Các mã thông báo này được đặt cùng nhau để tạo thành câu lệnh: (int a = 6 + b * c;). Chủ yếu dưới dạng một cây cú pháp:

     = 
        /\ 
       / \ 
        a  + 
        /\ 
        / \ 
        6  * 
         /\ 
         b c 

Trong vòng một diễn giải, cây được thực hiện trực tiếp.

Với trình biên dịch, cây cuối cùng được dịch sang mã trung gian hoặc mã lắp ráp.

Bây giờ bạn có một hoặc nhiều "tệp đối tượng". Chúng chứa mã lắp ráp mà không có các bước nhảy chính xác (vì các giá trị này chưa được biết đến, đặc biệt nếu các mục tiêu nằm trong các tệp đối tượng khác). Các tệp đối tượng được liên kết với nhau bằng một trình liên kết lấp đầy chỗ trống cho các bước nhảy (tham chiếu ans). Đầu ra của trình liên kết là một thư viện (có thể được liên kết quá) hoặc một tệp thi hành.

Nếu bạn bắt đầu thực thi, dữ liệu chương trình được sao chép vào bộ nhớ và có một số liên kết khác để khớp với các con trỏ có vị trí bộ nhớ chính xác. Và sau đó kiểm soát được đưa ra cho các hướng dẫn đầu tiên.

3

This site has a great series các bài giảng về cấu trúc và giải thích các chương trình máy tính, chính xác là loại điều bạn muốn học. Sách giáo khoa kèm theo cũng hữu ích, tho i havent cá nhân đọc qua toàn bộ điều. Tôi nghĩ rằng xem các bài giảng khá tốt, giúp bạn đạt được 60% con đường ở đó.

0

Bạn có thể tìm thấy nhiều bài giảng. Ví dụ tại Itunes U

2

Whoa, đây là một câu hỏi rất lớn với hàng tấn sách viết về tất cả điều này. Tôi thực sự nghi ngờ bạn sẽ nhận được một câu trả lời khá trong SO về điều này. Bạn cần phải đến cửa hàng sách địa phương của bạn hoặc chọn một vài lớp học sci comp.

Để cung cấp cho bạn giới thiệu nhanh:

  • Compiler: Một chương trình có thể chuyển đổi văn bản mã vào hướng dẫn được natively hiểu bởi bộ vi xử lý.
  • Thông dịch viên: Chương trình đọc mã được viết và, trực tiếp, dịch và đưa ra hướng dẫn gốc tương ứng với bộ xử lý.
  • Mã được quản lý: Mã chạy trong máy ảo, ví dụ: để cung cấp tính tương thích đa nền tảng (Java).
  • Máy ảo: Chương trình mô phỏng hành vi, hoặc đúng hơn là API, của môi trường máy tính toàn diện. Trong số những thứ khác, điều này mang lại một số lợi thế bảo mật và khả năng tương thích nền tảng chéo.
4

trình biên dịch, thông dịch viên và máy ảo chỉ là ví dụ về chi tiết triển khai. Những gì bạn có thể tìm kiếm là lý thuyết ngôn ngữ lập trình, ngữ pháp sinh học, dịch giả ngôn ngữ và bạn cần một số kiến ​​trúc máy tính để liên kết lý thuyết với việc triển khai thực hiện.

Cá nhân, tôi đã học được từ Sebesta's book. Nó đưa ra một giới thiệu rất rộng về chủ đề mà không đi vào chi tiết phút. Nó cũng có một chương tốt về lịch sử ngôn ngữ lập trình (~ 20 ngôn ngữ ~ 3 giấy tờ cho mỗi ngôn ngữ). Nó có lời giải thích tốt đẹp về ngữ pháp và lý thuyết về ngôn ngữ nói chung. Ngoài ra, nó cung cấp cho một giới thiệu tốt về Đề án, Prolog, và mô hình lập trình (Logic, chức năng, bắt buộc ^, hướng đối tượng).

^Nó tập trung nhiều hơn vào mô hình mệnh lệnh hơn hai mô hình đầu tiên.

1

Khi tôi biết về lập trình, ở đâu đó trong nửa sau của thế kỷ trước, tôi đã học được rằng mọi thứ cần phải được chuyển đổi thành mã máy. Các ngôn ngữ kịch bản sẽ quyết định mã nào cần gọi dựa trên mã kịch bản. Mã biên dịch đầu tiên sẽ được biên dịch thành mã p, viết tắt của mã được biên dịch trước, mã này cần được liên kết với mã được biên dịch trước khác để tạo ra một ứng dụng đầy đủ. Tôi thích Turbo Pascal trở lại sau đó, chỉ đơn giản bởi vì Turbo Pascal biên dịch trực tiếp mã machione và nó không sử dụng mã p trung gian ở giữa. Đó là, cho đến khi Turbo Pascal 4.0, tạo ra các đơn vị biên dịch * .tpu. Hầu hết các trình biên dịch khác sẽ biên dịch sang định dạng .obj.

Khi Java được tạo, một cái gì đó tương đối mới bắt đầu trở nên phổ biến. Về cơ bản, một trình biên dịch Java chỉ biên dịch mã cho một số tệp tập lệnh nhị phân. Kịch bản này sau đó có thể được giải thích, mặc dù cơ chế đó cũng sớm thay đổi.

Ngày nay, phiên dịch đã gần như tuyệt chủng. Hầu hết các ngôn ngữ kịch bản đầu tiên sẽ được biên dịch thành mã máy, mã máy sau đó được lưu trữ trong một số bộ nhớ cache và do đó nó có thể được thực thi nhanh chóng, mà không cần phải giải thích lại bất kỳ lệnh lặp nào. Điều này hoạt động tốt cho văn bản và tập lệnh nhị phân. PHP sẽ là một ví dụ về một kịch bản dựa trên văn bản. Java và .NET là các tập lệnh nhị phân, vì bạn thường biên dịch mã sang định dạng tập lệnh nhị phân này. (Họ sẽ gọi nó là khác nhau, nhưng tôi nghĩ rằng các tập lệnh nhị phân có vẻ tốt hơn.)

Nói chung, mẹo là chuyển đổi mã thành mã máy, sử dụng bất kỳ phương tiện nào có thể. Đã có nhiều cách để làm như vậy và nó có một chút phức tạp để làm cho nó tất cả rõ ràng.

Tôi cũng nhớ thời gian khi tôi có thể viết một ứng dụng C++ trong đó các câu lệnh SQL sẽ được đặt bên trong chính mã đó. Điều này cũng rất thiết thực, nhưng nó yêu cầu một bộ tiền xử lý trước tiên sẽ phân tích các câu lệnh SQL từ mã để chuyển đổi nó sang các câu lệnh C++ khác và bằng cách thay thế các câu lệnh SQL bằng các lệnh C++ phức tạp hơn. Sau đó toàn bộ điều sẽ được biên dịch thành mã p. Sau đó, bạn cần phải liên kết nó với các thư viện SQL bổ sung và cuối cùng bạn đã có một tệp thực thi.

4

Về cơ bản, bạn viết source files. Đây là những tập tin văn bản ưa thích, được đưa vào bởi compiler mà đầu ra một số hình thức mã thực thi (những gì thực hiện nó phụ thuộc vào loại mã bạn đang nói về).Trình biên dịch có một số phần:

  • Một số hình thức preprocessing trên tệp xử lý macro và các loại tương tự (như từ C).
  • A parser, có tệp nguồn, xác minh rằng chúng tuân theo các quy tắc cú pháp của ngôn ngữ của bạn và chuyển tệp thành cấu trúc dữ liệu trong bộ nhớ dễ dàng thao tác hơn bởi các phần khác của chương trình. Điều này được gọi là Abstract Syntax Cây hoặc AST.
  • Một số hình thức phân tích AST, xác minh rằng mã thực tế bạn đã viết không vi phạm bất kỳ quy tắc nào của ngôn ngữ (ví dụ: đệ quy bằng ngôn ngữ không hỗ trợ), cũng như nhiều thứ khác.
  • Optimization chẳng hạn như tối ưu hóa cuộc gọi đuôi, tối ưu hóa vòng lặp và nhiều loại tối ưu hóa khác.
  • Code generation, đây là quá trình thực tế lấy AST cuối cùng và bất kỳ dữ liệu được tạo nào khác và biến nó thành tệp nhị phân của một số loại có thể được thực thi hoặc diễn giải.

Interpreter:

Một thông dịch viên là một chương trình mà mất trong một số hình thức dữ liệu nhị phân đại diện cho một chương trình không được biên dịch mã trực tiếp thực thi bởi các máy tính mục tiêu, và chạy các lệnh bên trong. Ví dụ là python, java và lua.

Native code:

Đây là mã đã được biên dịch vào hướng dẫn bản địa thực thi trực tiếp bằng máy mục tiêu. Ví dụ; nếu bạn chạy trên kiến ​​trúc x86 thì C++ sẽ biên dịch thành một tệp thực thi mà bộ vi xử lý có thể hiểu được.

Virtual Machine:

này thường là một chương trình được xây dựng để mô phỏng việc xây dựng và hoạt động của một bộ xử lý. Nó có thể đơn giản như một chương trình đọc trong bytecode và chạy các hoạt động ngôn ngữ gốc dựa trên các lệnh bytecode đại diện (mặc dù gọi đây là một máy ảo có thể là một đoạn), hoặc nó có thể phức tạp như mô phỏng hoàn toàn hành vi của một bộ xử lý và tất cả các thiết bị ngoại vi liên quan.

các câu trả lời khác có điểm tốt trong đó nhưng thông tin và liên kết này sẽ giúp bạn bắt đầu. Còn câu hỏi nào khác không!

(Hầu hết các bài viết này được viết với sự giúp đỡ của wikipedia mặc dù một số đã được viết từ bộ nhớ)

1

này series of lectures từ Stanford bao gồm một số ngôn ngữ lập trình xuống các bit và bu lông, bao gồm Python (mặc dù tôi đã chỉ theo dõi một vài trong số những người C).

2

Nếu bạn muốn biết làm thế nào người ta đi từ mã nguồn đến một cái gì đó thực sự chạy trên một máy tính mục tiêu, bạn sẽ nhận được một bản sao của Red Dragon Book nổi tiếng. Tôi đã sử dụng nó để xây dựng phân tích cú pháp và phân tích từ vựng. Trong khi nó bắt đầu từ năm 1986, và tôi chắc chắn đã có tiến bộ trong thời gian tạm thời, theo như tôi có thể nói, nó đã không được vượt qua như một văn bản.

Có vẻ như Addison-Wesley đã thực hiện một bản in lại của người tiền nhiệm của nó, Sách Rồng Xanh và đang chuyển nó thành một cái gì đó gần đây, vì vậy hãy cẩn thận để có được bài viết chính hãng.

Các vấn đề liên quan