Hướng dẫn is c used in python? - c được sử dụng trong python?

Từ tất cả mọi thứ tôi đã thấy, đó là sự kết hợp của lý do thực tế và lịch sử. Lý do lịch sử [chủ yếu] là Cpython 1.0 đã được phát hành vào năm 1989. Vào thời điểm đó, C vừa mới được tiêu chuẩn hóa gần đây. C ++ gần như không được biết đến và không thể xác định được, bởi vì hầu như không ai có trình biên dịch C ++.

Mặc dù C ++ phổ biến rộng rãi và dễ dàng hơn ngày hôm nay, nhưng vẫn sẽ mất một lượng lớn công việc để viết lại Cpython vào tập hợp con của C tương thích với C ++. Chính nó, công việc đó sẽ cung cấp ít hoặc không có lợi ích thực sự.

Nó giống như bài đăng trên blog của Joel về việc bắt đầu lại và viết hoàn toàn là sai lầm tồi tệ nhất mà công ty phần mềm có thể mắc phải. Tôi sẽ chống lại điều đó bằng cách chỉ vào chuyển đổi của Microsoft từ lõi Windows 3.0 sang lõi Windows NT và chuyển đổi của Apple từ MacOS 9 sang Mac OS/X. Không ai giết chết công ty-nhưng cả hai đều chắc chắn là những dự án lớn, đắt tiền, dài hạn. Cả hai cũng chỉ ra một cái gì đó rất quan trọng để thành công: duy trì cả hai cơ sở mã đủ lâu để [hầu hết] người dùng có thể chuyển sang cơ sở mã mới khi giải trí, dựa trên lợi ích [ít nhất là nhận thức].

Tuy nhiên, đối với một nhóm phát triển, quy mô của Python, loại thay đổi đó khó khăn hơn nhiều. Ngay cả sự thay đổi từ Python 2 thành 3 cũng đã mất khá nhiều công việc và đòi hỏi phải có sự chồng chéo tương tự. Tuy nhiên, ít nhất trong trường hợp đó, có những lợi ích trực tiếp cho các thay đổi, viết lại thành C ++ [tự nó] sẽ không [ít nhất là ngay lập tức] cung cấp.

Linus Torvalds của C ++ đã được đưa lên, vì vậy tôi cũng sẽ đề cập đến điều đó. Không có gì tôi thấy từ Guido chỉ ra rằng anh ấy có những cảm giác mạnh mẽ, tiêu cực đối với C ++. Về điều tồi tệ nhất tôi thấy anh ấy nói là việc dạy C ++ thường là một thảm họa - nhưng anh ấy ngay lập tức nói rằng điều này phần lớn là do các giáo viên không/không biết C ++.

Tôi cũng nghĩ rằng mặc dù có thể chuyển đổi nhiều mã C thành C ++ một cách dễ dàng tương đối, thì việc nhận được nhiều lợi thế thực sự từ C ++ không chỉ cần viết lại nhiều hơn một chút so với thế, mà còn yêu cầu tái giáo dục đáng kể cho hầu hết các nhà phát triển liên quan. Hầu hết C ++ được viết tốt về cơ bản khác với C viết tốt để làm những điều tương tự. Đây không chỉ là vấn đề thay đổi

static PyObject *SpamError;
1 thành
static PyObject *SpamError;
2 và
static PyObject *SpamError;
3 thành
static PyObject *SpamError;
4, bởi bất kỳ sự tưởng tượng nào.

Thật dễ dàng để thêm các mô-đun tích hợp mới vào Python, nếu bạn biết cách lập trình trong C. Các mô-đun mở rộng như vậy có thể làm hai việc không thể thực hiện trực tiếp trong Python: chúng có thể triển khai các loại đối tượng tích hợp mới, Và họ có thể gọi các chức năng thư viện C và các cuộc gọi hệ thống.

Để hỗ trợ các tiện ích mở rộng, API Python [giao diện lập trình viên ứng dụng] xác định một tập hợp các hàm, macro và biến cung cấp quyền truy cập vào hầu hết các khía cạnh của hệ thống thời gian chạy Python. API Python được tích hợp trong tệp nguồn C bằng cách bao gồm tiêu đề

static PyObject *SpamError;
5.

Việc tổng hợp một mô -đun mở rộng phụ thuộc vào mục đích sử dụng cũng như trên thiết lập hệ thống của bạn; Chi tiết được đưa ra trong các chương sau.

Ghi chú

Giao diện mở rộng C dành riêng cho CPython và các mô -đun mở rộng không hoạt động trên các triển khai Python khác. Trong nhiều trường hợp, có thể tránh viết các phần mở rộng C và bảo tồn tính di động cho các triển khai khác. Ví dụ: nếu trường hợp sử dụng của bạn đang gọi các chức năng thư viện C hoặc cuộc gọi hệ thống, bạn nên xem xét sử dụng mô -đun

static PyObject *SpamError;
6 hoặc thư viện CFFI thay vì viết mã C tùy chỉnh. Các mô -đun này cho phép bạn viết mã Python vào giao diện với mã C và có khả năng di động hơn giữa các triển khai Python hơn là viết và biên dịch mô -đun mở rộng C.

1.1. Một ví dụ đơn giảnA Simple Example¶

Hãy tạo một mô-đun mở rộng có tên

static PyObject *SpamError;
7 [món ăn yêu thích của người hâm mộ Monty Python] và giả sử chúng tôi muốn tạo giao diện Python cho chức năng thư viện C . Chúng tôi muốn chức năng này được gọi từ Python như sau:

>>> import spam
>>> status = spam.system["ls -l"]

Bắt đầu bằng cách tạo một tệp

static PyObject *SpamError;
9. .

Hai dòng đầu tiên của tệp của chúng tôi có thể là:

#define PY_SSIZE_T_CLEAN
#include 

trong đó kéo trong API Python [bạn có thể thêm một nhận xét mô tả mục đích của mô -đun và thông báo bản quyền nếu bạn muốn].

Ghi chú

Vì Python có thể xác định một số định nghĩa tiền xử lý ảnh hưởng đến các tiêu đề tiêu chuẩn trên một số hệ thống, bạn phải bao gồm

PyMODINIT_FUNC
PyInit_spam[void]
{
    PyObject *m;

    m = PyModule_Create[&spammodule];
    if [m == NULL]
        return NULL;

    SpamError = PyErr_NewException["spam.error", NULL, NULL];
    Py_XINCREF[SpamError];
    if [PyModule_AddObject[m, "error", SpamError] 

Bài Viết Liên Quan

Chủ Đề