পাইথনকে মেশিন কোডে সংকলন করা কি সম্ভব?


128

পাইথন (সম্ভবত একটি মধ্যবর্তী সি উপস্থাপনার মাধ্যমে) মেশিন কোডে সংকলন করা কতটা সম্ভব হবে?

সম্ভবত এটি একটি পাইথন রানটাইম লাইব্রেরির সাথে লিঙ্ক করার প্রয়োজন হবে এবং পাইথন স্ট্যান্ডার্ড লাইব্রেরির যে কোনও অংশ যা পাইথন ছিল সেগুলিও সংকলিত (এবং সংযুক্ত) করা দরকার।

এছাড়াও, আপনি যদি অভিব্যক্তিগুলির গতিশীল মূল্যায়ন করতে চান তবে আপনাকে পাইথন ইন্টারপ্রেটারকে বান্ডিল করতে হবে, তবে সম্ভবত পাইথনের একটি উপসেট এটি এখনও কার্যকর হতে পারে না।

এটি কোনও গতি এবং / অথবা মেমরি ব্যবহারের সুবিধা সরবরাহ করবে? সম্ভবত পাইথন ইন্টারপ্রেটারের প্রারম্ভকালীন সময়টি মুছে ফেলা হত (যদিও ভাগ করে নেওয়া লাইব্রেরিগুলি এখনও প্রারম্ভকালে লোডিংয়ের প্রয়োজন হবে)।


2
বিটিডব্লিউ, আপনি যদি আইটেম কোডের পরিবর্তে "মেশিন কোড" চেয়েছিলেন তবে আপনার প্রশ্নটি আরও পরিষ্কার হবে O
টর্স্টেন মেরেক

ব্যবহার করে দেখুন পাইথন → 11l → সি ++ transpiler
টাভ

উত্তর:


31

ব্যবহার করে দেখুন ShedSkin পাইথন-টু-সি ++ কম্পাইলার, কিন্তু এটা নিখুঁত থেকে অনেক দূরে। এছাড়াও সাইকো রয়েছে - পাইথন জেআইটি যদি কেবল স্পিডআপ প্রয়োজন হয়। তবে আইএমএইচও এটি চেষ্টা করার মতো নয়। কোডের গতি-সমালোচনামূলক অংশগুলির জন্য সেরা সমাধান হ'ল সেগুলিকে সি / সি ++ এক্সটেনশন হিসাবে লিখতে হবে।


5
এফওয়াইআই, শেডস্কিন উইন্ডোজ সমর্থন বাদ দিয়েছে।
sorin

2
@ সোরিন: ভাল, আজ এটি উইন্ডো সমর্থন করে ... কোড. google.com/p/shedskin/downloads/…

2
সবচেয়ে ভালো সমাধান, speedwise, এখনও হতে পারে PyPy
সিস টিমারম্যান

শেডস্কিনের প্রায় দুই বছরে এটির কোনও কাজ হয়নি। :(
পারকিন্স

53

@ গ্রেগ হিউগিল যেমনটি বলেছেন, এটি সবসময় সম্ভব না হওয়ার কারণগুলি রয়েছে good তবে নির্দিষ্ট ধরণের কোড (যেমন খুব অ্যালগোরিদমিক কোডের মতো) "রিয়েল" মেশিন কোডে রূপান্তরিত হতে পারে।

বেশ কয়েকটি বিকল্প রয়েছে:

  • সাইকো ব্যবহার করুন , যা মেশিন কোডকে গতিশীলভাবে নির্গত করে। আপনার কোন পদ্ধতি / ফাংশন রূপান্তর করতে হবে তা সতর্কতার সাথে বেছে নেওয়া উচিত।
  • ব্যবহারের Cython , যা একটি Python- হয় মত ভাষা করে একটি পাইথন সি এক্সটেনশন মধ্যে কম্পাইল করা হয়
  • ব্যবহারের PyPy , যা RPython থেকে একজন অনুবাদক (ক হয়েছে সীমাবদ্ধ উপসেট Python- র যে অধিকাংশ "গতিশীল" Python- র বৈশিষ্ট্যগুলির কয়েকটির সমর্থন করে না) C অথবা LLVM করতে।
    • পাইপাই এখনও অত্যন্ত পরীক্ষামূলক
    • সমস্ত এক্সটেনশন উপস্থিত হবে না

এর পরে, সমস্ত বাইনারি রাখার জন্য আপনি বিদ্যমান প্যাকেজগুলির একটি (ফ্রিজ, পাই 2 এক্সি, পাইআইনস্টলার) ব্যবহার করতে পারেন।

সব মিলিয়ে: আপনার প্রশ্নের কোনও সাধারণ উত্তর নেই। যদি আপনার কাছে পাইথন কোড রয়েছে যা পারফরম্যান্স-সমালোচনামূলক, যথাসম্ভব বিল্টিন কার্যকারিতাটি ব্যবহার করার চেষ্টা করুন (বা "আমি কীভাবে পাইথন কোডটি আরও দ্রুত করব" প্রশ্ন জিজ্ঞাসা করুন)। যদি এটি সহায়তা না করে, কোডটি সনাক্ত করার চেষ্টা করুন এবং সি (বা সিথন) এ এটি পোর্ট করুন এবং এক্সটেনশনটি ব্যবহার করুন।


3
পাইপাই হলেন সাইকোর উত্তরসূরি
বিকেটল

19

পাই 2 সি ( https://github.com/pradyun/Py2C ) পাইথন কোডটিকে সি / সি ++ এ রূপান্তর করতে পারে আমি পাই 2 সি এর একক বিকাশকারী।


এটি দেখতে একটি দরকারী সরঞ্জামের মতো দেখাচ্ছে। এটি এখনও রক্ষণাবেক্ষণ করা হচ্ছে?
অ্যান্ডারসন গ্রিন

@ অ্যান্ডারসগ্রিন এটি প্রথম বারের মতো কাজ করার সময় প্রাথমিক পর্যায়ে এসেছিল (সম্ভবত এখন একই রকম)। আমি প্রকল্পটি ফেলে রেখেছি কারণ I̶'̶m̶ ̶b̶u̶s̶y̶ আমি অলস। যদি আপনি "গুরুত্বপূর্ণ" পাঠ্যটি লক্ষ্য না করে থাকেন তবে এটি এখন গিটহাবে চলে গেছে।
রামচন্দ্র আপ্তে

লিঙ্কটি অযাচিত-ইনস্টলারকে নির্দেশ করে , যা অন্যরকম প্রকল্প বলে মনে হচ্ছে। পাইপিসি কি এখনও গিটহাবে পাওয়া যায়?
অ্যান্ডারসন গ্রীন

@ অ্যান্ডারসগ্রিন ওয়া যে এত দিন নজর রাখেনি! আপনি এখানে যান।
রামচন্দ্র আপ্তে

কোড. google.com/p/py2c এ থাকা লিঙ্কটি এখনও অযাচিত-ইনস্টলারকে নির্দেশ করে, তাই এটি এখনই আপডেট করা দরকার।
অ্যান্ডারসন গ্রিন

15

PyPy হল পাইথনের পাইথনকে পুনরায় বাস্তবায়ন করার একটি প্রকল্প, বাস্তবায়ন কৌশলগুলির মধ্যে একটি হিসাবে নেটিভ কোডে সংকলন ব্যবহার করে (অন্যরা জেআইটি-র সাথে ভিএম, জেভিএম ব্যবহার করে ইত্যাদি) using তাদের সংকলিত সি সংস্করণগুলি সিপিথনের তুলনায় গড়ে ধীর হলেও কিছু প্রোগ্রামের জন্য খুব দ্রুত faster

শেডস্কিনটি পরীক্ষামূলক পাইথন-টু-সি ++ সংকলক।

পাইরেক্স হ'ল পাইথন এক্সটেনশন মডিউল লেখার জন্য বিশেষভাবে তৈরি একটি ভাষা। এটি পাইথনের সুন্দর, উচ্চ-স্তরের, সহজেই ব্যবহারের সহজ পৃথিবী এবং অগোছালো, সি-এর নিম্ন স্তরের বিশ্বের মধ্যে ব্যবধানটি পূরণ করার জন্য ডিজাইন করা হয়েছে


3
সাইথন হ'ল পাইরেক্সের বহুল ব্যবহৃত, আরও সক্রিয়ভাবে-উন্নত বন্ধুত্বপূর্ণ কাঁটাচামচ।
মাইক গ্রাহাম

"সুন্দর, উচ্চ-স্তরের, অজস্র ব্যবহারের সহজ পাইথন এবং অগোছালো, সি-এর নিম্ন স্তরের বিশ্ব" - মজার আমি কেবল ভাবছিলাম যে সি এবং এসেম্বলার কীভাবে "সুন্দর" এবং সাধারণ, এবং পাইথন কীভাবে বাস করে " অগোছালো "," উচ্চ-স্তরের "বিশ্ব
বিপরীত প্রকৌশলী

14

নুইটকা হলেন পাইথন থেকে সি ++ সংকলক যা লিবিপথনের সাথে লিঙ্ক করে। এটি তুলনামূলকভাবে নতুন প্রকল্প বলে মনে হচ্ছে। পাইপথন বেঞ্চমার্কে লেখক সিপিথনের চেয়ে গতি উন্নতির দাবি করেছেন ।


10

এটি প্রথম নজরে যুক্তিসঙ্গত বলে মনে হতে পারে, তবে পাইথনের অনেকগুলি সাধারণ জিনিস রয়েছে যা পাইথন রানটাইম সমর্থন বহন না করে সি উপস্থাপনায় সরাসরি মাপ দিতে পারে না। উদাহরণস্বরূপ, হাঁসের টাইপিংয়ের কথা মনে আসে। পাইথনের অনেক ফাংশন যা ইনপুট পড়ে তা ফাইল বা ফাইলের মতো নিতে পারে অবজেক্ট নিতে পারে, যতক্ষণ না এটি নির্দিষ্ট ক্রিয়াকলাপ সমর্থন করে, যেমন। () বা পঠন () পড়ুন। আপনি যদি এই ধরণের সিটিতে সমর্থনটি ম্যাপ করার জন্য কী চিন্তা করেন তবে আপনি পাইথন রানটাইম সিস্টেমটি ইতিমধ্যে কী ধরণের জিনিসগুলি কল্পনা করতে শুরু করে।

পাই 2 এক্সির মতো ইউটিলিটি রয়েছে যা পাইথন প্রোগ্রাম বান্ডিল করবে এবং রানটাইমকে একক এক্সিকিউটেবল (যতদূর সম্ভব) রূপান্তর করবে।


1
আমার লক্ষ্যটি যদি কোডটি সংকলন করে তা নিশ্চিত করা হয়, কারণ স্ট্যাটিকালি সংকলিত ভাষাগুলি (কমপক্ষে আমার মতে) রান টাইমে ফুঁপিয়ে যাওয়ার সম্ভাবনা কম থাকে? এটি নির্ধারণ করা সম্ভব যে কিছু foo.xঅভিব্যক্তি কাজ fooকরবে না কারণ xএটি বলা হওয়ার সময় থাকবে না । পাইথনের জন্য কোনও স্থির কোড চেকার রয়েছে? পাইথন একটি। নেট
অ্যাসেমব্লিতে

10

পাইরেক্স পাইথন ভাষার একটি উপসেট যা সি এর সাথে সংকলন করে, যে লোকটি প্রথমে পাইথনের জন্য তালিকা উপলব্ধি তৈরি করেছিল by এটি মূলত মোড়ক তৈরির জন্য তৈরি করা হয়েছিল তবে আরও সাধারণ প্রসঙ্গে ব্যবহার করা যেতে পারে। সাইথন পাইরেক্সের আরও সক্রিয়ভাবে রক্ষণাবেক্ষণযোগ্য কাঁটাচামচ।


2
সাইথন হ'ল পাইরেক্সের বহুল ব্যবহৃত, আরও সক্রিয়ভাবে-উন্নত বন্ধুত্বপূর্ণ কাঁটাচামচ।
মাইক গ্রাহাম

5

কিছু অতিরিক্ত রেফারেন্স:

  • https://github.com/DPbox/pyston হ'ল ড্রপবক্স দ্বারা নির্মিত পাইথনের একটি জেআইটি সংকলক

  • http://pythran.readthedocs.io/ বৈজ্ঞানিক কম্পিউটিংয়ের জন্য সি ++ অনুবাদককে একটি সংকলন-পাইথন

  • https://github.com/cosmo-ethz/hope একটি JIT পাইথন থেকে সি ++ অনুবাদককে বৈজ্ঞানিক কম্পিউটিংয়ের জন্য


3

জাইথনের জেভিএম বাইটকোডকে লক্ষ্য করে একটি সংকলক রয়েছে। বাইকোড পুরোপুরি গতিশীল, ঠিক পাইথন ভাষার মতোই! খুব ঠান্ডা. (হ্যাঁ, গ্রেগ হিউগিলের উত্তরটি ইঙ্গিত হিসাবে, বাইটোকডটি জাইথন ​​রানটাইম ব্যবহার করে এবং তাই জাইথন ​​জার ফাইলটি অবশ্যই আপনার অ্যাপ্লিকেশন দিয়ে বিতরণ করা উচিত))


2

সাইকো হ'ল এক ধরণের জাস্ট-ইন-টাইম (জেআইটি) সংকলক: পাইথনের গতিশীল সংকলক, 2-100 বার দ্রুত কোড চালায়, তবে এর জন্য অনেক স্মৃতি দরকার needs

সংক্ষেপে: এটি আপনার বিদ্যমান পাইথন সফ্টওয়্যারটি আপনার উত্সে কোনও পরিবর্তন ছাড়াই আরও দ্রুত চালিত করে তবে এটি সি সংকলক যেভাবে কোড কোড করবে সেভাবে কোড আপত্তি করতে সংকলন করে না।


2

উত্তরটি "হ্যাঁ, এটি সম্ভব"। আপনি পাইথন কোডটি নিতে এবং সিপিথন এপিআই ব্যবহার করে এটি সমতুল্য সি কোডে সংকলনের চেষ্টা করতে পারেন। আসলে, এখানে একটি পাইথন 2 সি প্রকল্প ছিল যা এটি কেবল করেছিল, তবে আমি বহু বছর এটির বিষয়ে শুনিনি (পাইথনের 1.5 দিনের মধ্যে আমি যখন শেষবার দেখেছি।)

আপনি পাইথন কোডটি যথাসম্ভব নেটিভ সিতে অনুবাদ করার চেষ্টা করতে পারেন এবং যখন আপনার আসল পাইথন বৈশিষ্ট্য প্রয়োজন তখন সিপিথন এপিআইতে ফিরে যেতে পারেন। আমি এই ধারণাটি নিজের সাথে গত দু'মাস ধরেছিলাম। তবে এটি একটি দুর্দান্ত কাজ, এবং অজস্র পাইথন বৈশিষ্ট্যগুলি সিতে অনুবাদ করা খুব শক্ত: নেস্টেড ফাংশন, জেনারেটর, সাধারণ পদ্ধতিগুলির সাথে সাধারণ ক্লাস ছাড়া কিছুই নয়, মডিউলের বাইরে থেকে মডিউল গ্লোবালগুলি সংশোধন করা ইত্যাদি anything ইত্যাদি


2

এটি পাইথনকে মেশিন কোডে সংকলন করে না। তবে পাইথন কোডটি কল করতে একটি ভাগ করা লাইব্রেরি তৈরি করতে দেয়।

আপনি যা সন্ধান করছেন তা যদি এক্স এক্সপ্যাক্ট স্টাফের উপর নির্ভর না করে সি থেকে পাইথন কোড চালানোর সহজ উপায়। পাইথন এম্বেডিং এপিআইতে কয়েকটি কল দিয়ে মোড়ানো পাইথন কোড থেকে আপনি একটি ভাগ করে নেওয়া গ্রন্থাগার তৈরি করতে পারেন । ঠিক আছে অ্যাপ্লিকেশনটি একটি শেয়ার্ড লাইব্রেরি, একটি। সুতরাং যা আপনি অন্যান্য অনেক লাইব্রেরি / অ্যাপ্লিকেশনগুলিতে ব্যবহার করতে পারেন।

এখানে একটি সাধারণ উদাহরণ যা একটি ভাগ করা লাইব্রেরি তৈরি করে, যা আপনি একটি সি প্রোগ্রামের সাথে লিঙ্ক করতে পারেন। ভাগ করা লাইব্রেরি পাইথন কোড চালায়।

যে অজগর ফাইলটি কার্যকর করা হবে তা হ'ল 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

আপনি এটি দিয়ে চেষ্টা করতে পারেন python2 -c "import pythoncalledfromc; pythoncalledfromc.main('HELLO')। এটি আউটপুট দেবে:

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

ভাগ করা লাইব্রেরি নিম্নলিখিত দ্বারা সংজ্ঞায়িত করা হবে callpython.h:

#ifndef CALL_PYTHON
#define CALL_PYTHON

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

#endif

সম্পর্কিতটি callpython.cহ'ল:

// 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();
}

আপনি এটি নিম্নলিখিত কমান্ড দিয়ে সংকলন করতে পারেন:

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

callpythonfromc.cনিম্নলিখিত ফাইল রয়েছে এমন একটি ফাইল তৈরি করুন :

#include "callpython.h"

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

এটি কম্পাইল করে চালান:

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

এটি একটি খুব মৌলিক উদাহরণ। এটি কাজ করতে পারে তবে লাইব্রেরির উপর নির্ভর করে পাইথন এবং পাইথন থেকে সি পর্যন্ত সি তথ্য কাঠামোগুলি সিরিয়ালায়িত করা এখনও কঠিন হতে পারে কিছু কিছু স্বয়ংক্রিয়ভাবে ...

নুইটকা সহায়ক হতে পারে।

এছাড়াও নাম্বা রয়েছে তবে তারা দুজনেই ঠিক যা করতে চান তা করার লক্ষ্য রাখে না। পাইথন কোড থেকে সি হেডার তৈরি করা সম্ভব তবে আপনি যদি পাইথন প্রকারকে সি প্রকারে রূপান্তর করতে চান বা সেই তথ্যটি নির্ধারণ করতে পারেন তবেই। পাইথন অ্যাস্ট বিশ্লেষকের জন্য পাইথন অ্যাস্ট্রয়েড দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.