Hướng dẫn does python compile to machine code? - python biên dịch thành mã máy?

Điều này không biên dịch Python với mã máy. Nhưng cho phép tạo một thư viện được chia sẻ để gọi mã Python.

Nếu những gì bạn đang tìm kiếm là một cách dễ dàng để chạy mã Python từ C mà không cần dựa vào công cụ EXECP. Bạn có thể tạo một thư viện được chia sẻ từ mã Python được bọc bằng một vài cuộc gọi đến API nhúng Python. Vâng, ứng dụng là một thư viện được chia sẻ, một. Vì vậy mà bạn có thể sử dụng trong nhiều thư viện/ứng dụng khác.

Dưới đây là một ví dụ đơn giản tạo ra một thư viện chia sẻ, mà bạn có thể liên kết với chương trình C. Thư viện được chia sẻ thực thi mã Python.

Tệp Python sẽ được thực thi là pythoncalledfromc.py:

# -*- encoding:utf-8 -*-
# this file must be named "pythoncalledfrom.py"

def main(string):  # args must a string
    print "python is called from c"
    print "string sent by «c» code is:"
    print string
    print "end of «c» code input"
    return 0xc0c4  # return something

Bạn có thể thử nó với python2 -c "import pythoncalledfromc; pythoncalledfromc.main('HELLO'). Nó sẽ xuất hiện:

python is called from c
string sent by «c» code is:
HELLO
end of «c» code input

Thư viện được chia sẻ sẽ được xác định bởi các phần sau của callpython.h:

#ifndef CALL_PYTHON
#define CALL_PYTHON

void callpython_init(void);
int callpython(char ** arguments);
void callpython_finalize(void);

#endif

python is called from c
string sent by «c» code is:
HELLO
end of «c» code input
0 liên quan là:

// gcc `python2.7-config --ldflags` `python2.7-config --cflags` callpython.c -lpython2.7 -shared -fPIC -o callpython.so

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <python2.7/Python.h>

#include "callpython.h"

#define PYTHON_EXEC_STRING_LENGTH 52
#define PYTHON_EXEC_STRING "import pythoncalledfromc; pythoncalledfromc.main(\"%s\")"


void callpython_init(void) {
     Py_Initialize();
}

int callpython(char ** arguments) {
  int arguments_string_size = (int) strlen(*arguments);
  char * python_script_to_execute = malloc(arguments_string_size + PYTHON_EXEC_STRING_LENGTH);
  PyObject *__main__, *locals;
  PyObject * result = NULL;

  if (python_script_to_execute == NULL)
    return -1;

  __main__ = PyImport_AddModule("__main__");
  if (__main__ == NULL)
    return -1;

  locals = PyModule_GetDict(__main__);

  sprintf(python_script_to_execute, PYTHON_EXEC_STRING, *arguments);
  result = PyRun_String(python_script_to_execute, Py_file_input, locals, locals);
  if(result == NULL)
    return -1;
  return 0;
}

void callpython_finalize(void) {
  Py_Finalize();
}

Bạn có thể biên dịch nó với lệnh sau:

gcc `python2.7-config --ldflags` `python2.7-config --cflags` callpython.c -lpython2.7 -shared -fPIC -o callpython.so

Tạo một tệp có tên

python is called from c
string sent by «c» code is:
HELLO
end of «c» code input
1 chứa các mục sau:

#include "callpython.h"

int main(void) {
  char * example = "HELLO";
  callpython_init();
  callpython(&example);
  callpython_finalize();
  return 0;
}

Biên dịch nó và chạy:

gcc callpythonfromc.c callpython.so -o callpythonfromc
PYTHONPATH=`pwd` LD_LIBRARY_PATH=`pwd` ./callpythonfromc

Đây là một ví dụ rất cơ bản. Nó có thể hoạt động, nhưng tùy thuộc vào thư viện, có thể vẫn khó để tuần tự hóa các cấu trúc dữ liệu C thành Python và từ Python đến C. Mọi thứ có thể được tự động hóa phần nào ...

Nuitka có thể hữu ích.

Ngoài ra có numba nhưng cả hai đều không nhằm mục đích làm những gì bạn muốn chính xác. Việc tạo tiêu đề C từ mã Python là có thể, nhưng chỉ khi bạn chỉ định cách chuyển đổi các loại Python thành các loại C hoặc có thể suy ra thông tin đó. Xem Python Astroid cho một máy phân tích Python AST.

Theo tôi hiểu, nguyên nhân của sự khác biệt tốc độ giữa các ngôn ngữ được biên dịch và Python là, mã đầu tiên biên dịch tất cả các cách cho mã của máy gốc, trong khi Python biên dịch thành mã byte python, được PVM giải thích. Tôi thấy rằng theo cách này, mã Python có thể được sử dụng trên nhiều hệ thống hoạt động (ít nhất là trong hầu hết các trường hợp), tuy nhiên tôi không hiểu, tại sao không có trình biên dịch bổ sung (và tùy chọn) cho Python, biên dịch theo cách tương tự như các trình biên dịch truyền thống . Điều này sẽ để lại cho lập trình viên để chọn, điều này quan trọng hơn đối với họ; Khả năng thực thi đa nền tảng hoặc hiệu suất trên máy gốc. Nói chung; Tại sao không có bất kỳ ngôn ngữ nào có thể cư xử cả như được biên soạn và giải thích?

Kilian Foth

104K44 Huy hiệu vàng287 Huy hiệu bạc 304 Huy hiệu đồng44 gold badges287 silver badges304 bronze badges

Đã hỏi ngày 7 tháng 6 năm 2014 lúc 8:51Jun 7, 2014 at 8:51

Hướng dẫn does python compile to machine code? - python biên dịch thành mã máy?

4

Không. Lý do tại sao có sự khác biệt về tốc độ giữa các ngôn ngữ như Python và C ++ là vì các ngôn ngữ được tính bằng tĩnh cung cấp cho trình biên dịch hàng tấn thông tin về cấu trúc của chương trình và dữ liệu của nó cho phép nó tối ưu hóa cả tính toán và truy cập bộ nhớ. Bởi vì C ++ biết rằng biến là loại int, nên nó có thể xác định cách tối ưu để thao tác biến đó ngay cả trước khi chương trình được chạy. Mặt khác, trong Python, thời gian chạy không biết giá trị nào trong một biến ngay cho đến khi người phiên dịch đạt được dòng. Điều này cực kỳ quan trọng đối với các cấu trúc, trong đó trong C ++, trình biên dịch có thể dễ dàng cho biết kích thước của cấu trúc và mọi vị trí của các trường trong bộ nhớ trong quá trình biên dịch. Điều này mang lại cho nó sức mạnh rất lớn trong việc dự đoán cách sử dụng dữ liệu và cho phép nó tối ưu hóa theo những dự đoán đó. Không có điều đó là có thể đối với các ngôn ngữ như Python.

Để biên dịch các ngôn ngữ một cách hiệu quả như Python, bạn sẽ cần:

  1. Đảm bảo rằng cấu trúc của dữ liệu là tĩnh trong quá trình thực hiện chương trình. Điều này có vấn đề vì Python có Eval và Metaclasses. Cả hai đều có thể thay đổi cấu trúc của chương trình dựa trên đầu vào của chương trình. Đây là một trong những điều mang lại cho Python sức mạnh biểu cảm như vậy.
  2. Suy ra các loại của tất cả các biến, cấu trúc và các lớp từ chính mã nguồn. Mặc dù có thể ở một mức độ nào đó, hệ thống và thuật toán loại tĩnh sẽ rất phức tạp đến nỗi gần như không thể thực hiện theo cách có thể sử dụng. Bạn có thể làm điều đó cho một tập hợp con của ngôn ngữ, nhưng chắc chắn không phải cho toàn bộ các tính năng ngôn ngữ.

Đã trả lời ngày 7 tháng 6 năm 2014 lúc 11:03Jun 7, 2014 at 11:03

EuphoriceUphoricEuphoric

Phim huy hiệu vàng 35,7k66 gold badges74 silver badges104 bronze badges

6

Hai khái niệm có thể giúp chúng tôi hiểu rõ hơn tại sao Python được biên dịch cho mã máy gốc "có thể" không chạy nhanh như được biên dịch C hoặc các ngôn ngữ thường được biên dịch khác. Chúng được gọi là ràng buộc sớm và ràng buộc muộn.

Tôi nên bắt đầu bằng cách nói rằng tôi không phải là một chuyên gia Python, và tôi đã đến trang web này một cách tình cờ. Nhưng tôi thích trang web này.

Như đã đề cập trong một phản hồi khác ở đây, trình biên dịch C ++ có thể biết rất nhiều về chương trình và đưa ra quyết định về hoạt động sử dụng cho các cấu trúc dữ liệu cụ thể. Ví dụ, nếu hai biến số nguyên cần được thêm vào, trình biên dịch biết chúng là số nguyên gốc, ví dụ: rộng 32 bit và nó có thể thêm chúng cùng với một lệnh "thêm". Vì vậy, nó biên dịch hướng dẫn thêm vào mã. Nó bị khóa và không thể thay đổi trong khi chương trình đang chạy. Đó là ràng buộc sớm.

Mặt khác bằng một ngôn ngữ như Python, chúng ta có thể mong đợi chương trình sẽ kết hợp các loại dữ liệu khác nhau theo những cách phức tạp. Bây giờ trình biên dịch không biết liệu 2 biến của chúng tôi là số nguyên, phao, chuỗi hoặc danh sách. Vì vậy, nó phải biên dịch mã xác định thông tin đó vào thời gian chạy và chọn thao tác chính xác trong khi chương trình đang chạy. Đây là ràng buộc muộn và chúng ta có thể hiểu rằng sẽ có một hiệu suất nhấn để thực hiện công việc thêm đó trong khi chương trình đang chạy. Đó là cái giá bạn phải trả cho việc giữ các tùy chọn đó mở bằng ngôn ngữ như Python nhưng nó cung cấp tính linh hoạt thời gian chạy tối đa.

Đã trả lời ngày 6 tháng 2 năm 2016 lúc 13:49Feb 6, 2016 at 13:49

1

Tôi nghĩ rằng nó có liên quan nhiều hơn đến chính các chi tiết cụ thể của Python, cùng một lý do bạn không thể biên dịch C# với mã máy. Các chi tiết cụ thể ngôn ngữ thực sự sẽ khiến các chương trình của bạn lỗi ngay cả khi có thể do bản chất của ngôn ngữ. Tại sao không học ngôn ngữ C. Nó dễ dàng hơn nhiều so với C ++ và hơi tiên tiến so với Python nhưng vẫn có thể tiếp cận.

Đã trả lời ngày 11 tháng 11 năm 2015 lúc 20:18Nov 11, 2015 at 20:18

1

Python biên dịch thành gì?

Python là một ngôn ngữ được giải thích, có nghĩa là mã nguồn của chương trình Python được chuyển đổi thành mã byte sau đó được thực hiện bởi máy ảo Python.interpreted language, which means the source code of a Python program is converted into bytecode that is then executed by the Python virtual machine.

Python có chạy trên máy ảo không?

Python, giống như nhiều ngôn ngữ được giải thích, thực sự biên dịch mã nguồn cho một tập hợp các hướng dẫn cho một máy ảo và trình thông dịch Python là một triển khai của máy ảo đó., and the Python interpreter is an implementation of that virtual machine.

Mã Python có biên dịch thành C không?

Mã Python có thể thực hiện các cuộc gọi trực tiếp vào các mô -đun C.Các mô -đun C này có thể là thư viện C chung hoặc thư viện được xây dựng đặc biệt để hoạt động với Python.Cython tạo ra loại mô -đun thứ hai: các thư viện C nói chuyện với nội bộ của Python và có thể được gói với mã Python hiện có.. Those C modules can be either generic C libraries or libraries built specifically to work with Python. Cython generates the second kind of module: C libraries that talk to Python's internals, and that can be bundled with existing Python code.

Tại sao Python không phải là trình biên dịch?

Python không cần trình biên dịch vì nó dựa vào ứng dụng (được gọi là trình thông dịch) biên dịch và chạy mã mà không lưu trữ mã máy được tạo dưới dạng mà bạn có thể dễ dàng truy cập hoặc phân phối.because it relies on an application (called an interpreter) that compiles and runs the code without storing the machine code being created in a form that you can easily access or distribute.