cPython tam olarak nedir?

Bu konuda yabancı kaynaklar dahil araştırma yaptım. İngilizce okuyup anlamada problemim yok. Ama yazılım diliinde implementation tam olarak ne demektir. Yani CPython, python.org’da indirilip kurulan programla gelen IDLE isimli kodları yazdığımız programın c dilinde yazıldığı anlamına mı geliyor?

En açıklayıcı cevap burada var ama benim kafama tam olarak yatmadı.

Diğer implementasyonlar olan jpython (zaten java hiç bilmediğimden anlamadım) nedir?

Benim kullandığım Pycharm evet tamam bir IDE (integrated development environment = yani içinde derleyici dahil bir çok araç barındıran tümleşik bir program arayüzü) ama ben örneğin Fırat Özgül’ün kitabındaki örnekleri yaparken tam olarak ne yapıyorum. Yani cpython ile yazılmış bir programda bu kodları mı çalıştırıyorum. Bu noktada kafam karışık.

Mesela PyQt ve diğer GUI yazılımları da anlıyorum. En azından kafama oturdu. Çünkü yazdığın python kodlarını görsel bir arayüzlü program tasarlamak için kullanıyorsun.

Ama bu cpython nedir? Tabi bir de cython var ki onu şuan hiç anlamadım. Yani bir çeşit yazdığın kodları c’ye ceviren bir program sanırım. Ama her pyhon kodunu ya da karmaşık bir kod yığınını c’ye çevirebiliyor mu bilmiyorum?

Merhaba, aşağıdaki linkler umarım faydalı olur.


Yazılımlarda bir belirtim(specification), bir de gerçekleme(implementation) vardır. Belirtim, yazılımın doğal bir dille yapısal bir şekilde yazılmasıdır. Buna yazılımın tasarımı da diyebiliriz. Gerçekleme ise, belirtime bakarak bir programlama dili ile yazılımın yazılmasıdır. Örneğin, Python belgeleri bir belirtim, C dili ile yazılmış CPython bir gerçeklemedir.

Bu arada Pycharm’da derleyici yok. Pycharm’da yorumlayıcıyı tanıtıyoruz.
Yorumlayıcı, dile ait kodları satır satır, sanal makine üzerinde yorumlayan bir programdır. Yani bir python dosyasını çalıştırabilmek için bilgisayarda Python yorumlayıcısının bulunması gerekir.
Derleyici ise, script içindeki kodları, makinenin anlayabileceği türden kodlara dönüştürür. Bir kez derleyici ile bir betik dosyası derlendikten sonra derleyici ile işiniz o dosya için biter, derleme sonucunda oluşan dosya, içinde makine kodları bulunan bir dosyadır.

CPython, standart Python yorumlayıcısıdır. Yani yazdığımız .py uzantılı dosyaların içindeki kodların kabuk ile etkileşime girmesini sağlayan bytecode’larını üretir ve bu kodlar sanal makinede çalıştırılır. Bytecode, makine kodu değildir, sanal makine kodudur.

Cython ise yazdığımız python scriptlerini c diline çeviren bir modüldür.

Cython ile Ubuntu üzerinde basit bir örnek yapalım:

Not: Örneği uygulayabilmek için Cython’un ve gcc’nin yüklenmiş olması gerekir.

# hello.py isimli bir dosya oluşturalım:
# içine aşağıdakini yazalım:
print("Hello World!")

Şimdi önce Cython ile “hello.py” dosyamızı “hello.c” ye dönüştürelim:

Uç birime şunları yazıyoruz:

~$ cython hello.py --embed

hello.c dosyamız oluşmuş olmalı.

https://www.dropbox.com/s/qvsv0pqfig0nq6s/hello.c

Madem bu dosya bir C dosyası, o halde bunu gcc derleyicisi ile derleyebiliriz artık.
Ama ondan önce Python.h gibi header dosyalarının nerede olduğunu bilmemiz gerekiyor.
Bunun için Python kabuğuna giriyoruz ve aşağıdaki kodları yazıyoruz:

from distutils import sysconfig
sysconfig.get_python_inc()

Bu komut şu çıktıyı verdi:

‘/usr/include/python2.7’

Şimdi derleme işlemine geçebiliriz:

~$ gcc -Os -I /usr/include/python2.7 -o hello hello.c -lpython2.7 -lpthread -lm -lutil -ldl

Bu komut sonucunda “hello” isimli, içinde makine kodları bulunan bir dosyamızın oluşması gerekir ve bu dosya uç birimden aşağıdaki gibi çağrılarak çalıştırılabilir:

~$ ./hello
Hello World!
~$ 

Mesela aşağıdaki “hello” dosyasını indirdikten sonra bir text editörü ile açıp içine bakarsanız, söz diziminin oldukça karışık olduğunu görürsünüz.

https://www.dropbox.com/s/8wa6fzbuf8ihu6y/hello?dl=0

Dilerseniz bir Tkinter uygulaması oluşturun, yukarıdaki işlemleri yaptıktan sonra onu da ./<dosya_ismi> şeklinde çalıştırabilirsiniz.

Özet: Python dosyalarını çalıştırabilmek için CPython yorumlayıcısına ihtiyaç vardır (yani Python’ın yüklü olması lazım). Ancak Cython sayesinde, bir python dosyası C dosyasına dönüştürülebilir ve oluşan bu C dosyası gcc ile derlenebilir. Derleme sonucunda oluşan yeni dosya ise, python yüklü olmayan bir bilgisayarda çalıştırılabilir.

Aşağıdaki sitedeki gcc komut seçenekleri umarım faydalı olur:

Öncelikle vermiş olduğunuz detaylı açıklama için teşekkür ederim.

Cython ile Python 2 üzerinden bir header yüklemekten bahsetmişsiniz. Peki ya Python 3 kaynak kodları için nasıl bir yol izlemem gerek.? Ayrıca oluşturulan Hello.c dosyasını clion gibi bir ide ile derleyebilir miyim? Şimdi clion da benzer şekilde yanılmıyorsam gcc derleyicisini kullanıyor. Ayrıca daha önce elimle basit bir c kodu olarak yazdığım Hello World çıktısı veren kaynak kodunu ubuntu üzerindeyken Windows için .exe derleme yani çapraz derleme yapabiliyordum. Ama bu Hello.c dosyası yüzlerce satır. Yani bu Hello.c dosyası için Python 3 header Kütüphanesi falan nasıl kullanılır? Bu kısım karışık geldi.

İkinci sorum da şu:

Jython kurdum. Terminal den python 3 ile yazdığım “.py” dosyalarını Jython ile çalıştırmayı denedim. Tabi hüsran. Anladığım kadarıyla Jython, Python 2 dilini destekliyor ve çalıştırıyor. çünkü raw_input kodunu çalıştırdı. Ve ascii hatası veriyor eğer gerekli utf8 satırını başa eklemediysen.

Peki nasıl bir ihtiyaçtan Jython kurulur ve kullanılır? JAVA işin neresinde.? Yani diğer implementation denilen yorumlayıcılar niçin var?

Önce cython3’ü indirelim.

sudo apt-get install cython3

İçinde “Hello World!” yazan hello.py dosyamız olduğu gibi duruyor.

Dosyamızı dönüştürelim:

cython3 hello.py --embed 

Şimdi de gcc ile derleyelim:

gcc -Os -I /usr/include/python3.5m -o hello hello.c -lpython3.5m -lpthread -lm -lutil -ldl

Python3 ve Python2 header kütüphanelerinin kapsamlı olarak nasıl kullanılacağını ben de bilmiyorum.

clion hakkında da şuanlık bir bilgim yok, o yüzden sorunuza cevap veremiyorum. Dediğiniz gibi hello.c dosyasının içinde yüzlerce satır var. Halbuki biz kendimiz <stdio.h>'ı kullanarak çok çok az karakterle yine “Hello World!” yazdırabiliriz. Ancak Cython’un geliştirilmesinin Numpy’nin geliştirilmesine benzer bir amacı olduğunu o amacın da işlemlerin daha hızlı (C hızında veya C hızına yakın) yaptırılabilmesi olduğunu okudum.

Örneğin Kivy uygulaması Cython’a gereksinim duyuyormuş, geçenlerde öğrendim. Kivy kullanmak için cython’u yükledim. Basit bir kivy uygulaması yazarken, uygulamanın derlenmesi sırasında cython kullanılıyor. Şuanki bilgimle bu derleme sürecinde ne olup bitiyor bilemem, cython kivy modülüyle çalışırken arka planda ne işlemler oluyordur, sırf ekrana çıktı olarak verilenler bile bana bu işlemleri düşündürüyor. Orası biraz karışık, beni aşıyor.

Daha Jython’la da yeni yeni ilgilenmeye başladım. Java’nın sanal makinesinde çalışan bir uygulama veya diğer java dosyalarıyla birlikte çalışan bir uygulama yazmak istiyorsanız herhalde Jython kullanılabilir. Bu konuda da bilgim oldukça kısıtlı.

~$ jython
*sys-package-mgr*: can't create package cache dir, '/usr/share/jython/cachedir/packages'
Jython 2.5.3 (, Sep 18 2017, 05:43:55) 
[OpenJDK 64-Bit Server VM (Oracle Corporation)] on java1.8.0_131
>>> print("Hello")
Hello
>>> 

Gördüğünüz gibi sanal makine Java’nın sanal makinesi. Ama dil Python dili. Jython’da CPython gibi bir yorumlayıcıdır.

Ayrıca aşağıdaki linkleri de inceleyebilirsiniz.

https://wiki.python.org/moin/PythonImplementations

Merhaba,
Verdiğiniz linki önceden incelemiştim. Ama hangi ihtiyaca yönelik olarak bu çeşitlilik var bilemiyorum.

CLion, code:blocks a göre kullanımı daha rahat olan bir IDE tavsiye ederim. Tabi 30 günlük deneme sürümü var. Eğer üniversite öğrencisi iseniz 1 senelik ücretsiz lisans veriyorlar.

Cython ile cevirilen C kodunu gcc ile daha denemedim. Çapraz derleme konusunu bir bilgisayar mühendisi Son sınıf arkadaşıma sormuştum. O da bilmediğini zaten kaynak dosyalarını hocalarına mail atarak dersi geçtiğini söyledi. Yani hiç merak edip araştırmamış. Ben de kendim netten uzun araştırmalarım sonucu birçok bilgi edindim ve şöyle bir Metin dosyası hazırlamıştım:

Linux işletim sistemini kullanarak, windows 32bit ve 64bit sistemlerinde çalışabilen .exe dosyaları üretebilmek için

sudo apt-get install mingw-w64
sudo apt-get install g++-mingw-w64 mingw-w64-{tools,x86-64-dev}

paketlerini yüklüyoruz. Ayrıca sisteme wine yüklüyoruz.

sudo apt-get install wine

Daha sonra bir kaynak dosyasını derlemek için terminalde şu komutları veriyoruz.

C için

32-bit

i686-w64-mingw32-gcc hello.c -o hello32.exe --static

64-bit

x86_64-w64-mingw32-gcc hello.c -o hello64.exe --static

(NOT: C’de derlerken --static demeye gerek yok)

C++ için

32-bit

i686-w64-mingw32-g++ hello.cc -o cc_hello32.exe --static

64-bit

x86_64-w64-mingw32-g++ hello.cc -o cc_hello64.exe --static

VEYA

C++ için

32-bit

i686-w64-mingw32-g++ hello.cpp -o cpp_hello32.exe --static

64-bit

x86_64-w64-mingw32-g++ hello.cpp -o cpp_hello64.exe --static

NOT: BURADA EĞER DERLENMEK İSTENEN KAYNAK KODU YENİ NESİL STANDARTLARDA YAZILMIŞ İSE OZAMAN
c++ için " -std=c++17 veya -std=gnu++17 "
c için " -std=c11 veya -std=gnu11
eklemek gerekiyor.

(Eksik ya da hata varsa ya da ekleme yapmak isteyen olursa uyarabilir).

Bunu da bir deneyeceğim. Aslında buraya cpython ile ilgili soru sormamın nedeni sololearn adlı mobil uygulamanın (ki bence harika) Python dersinin başında verdiği şu bilgidir :
This course covers Python 3.x, but it isn’t hard to change from one version to another.

Python has several different implementations, written in various languages.
The version used in this course, CPython, is the most popular by far.

O zaman benim aklıma şu geldi. Benim öğrendiğim mesela Fırat Özgül Python 3 kitabındaki örnek kodlar sadece cpython yorumlayıcısında mı çalışacak? İşte bu noktada Jython kurup denedim ve çalıştırmadı. Ama Jython galiba Python 3 dilini desteklemiyor. Belki pypy veya diğerlerinde sıkıntı yoktur.

Peki benim şöyle bir sorum daha var. Yazılan Python kodları önce bir .pyc dosyasına bytecode olarak kaydediliyormuş. Sonra sanal makine bu .pyc dosyasını yorumlayarak çıktı veriyormuş. Şimdi benim yazdığım Python kodlarında (modüller konusuna daha gelmedim). .pyc dosyaları üretiliyor mu? Nerede üretiliyor.? Ben elimle bu. .pyc dosyalarını yorumlayıcıya direkt olarak nasıl okutabilirim?

Verdiğiniz bilgiler için çok teşekkür ederim, bir ara inceleyeceğim.
Sizin yazdığınız Python kodlarının da pyc dosyaları üretiliyor ve pycache’nin içinde bulunuyor. Bu dosyaları direkt olarak şöyle okutabilirsiniz.

# Diyelim dosyanın adı sozluk.py
~/.../__pycache__$ ./sozluk.cpython-35.pyc

Her scriptin pyc dosyası yok pycache’nin içinde, neden bilmiyorum.

Az önce Jython’da, standart Python yorumlayıcısında yapıldığı gibi bir modül import etmeye çalıştım olmadı. Modül import etme nasıl olur henüz öğrenmedim, ama dil bazı özellikleriyle Python dili, ondan şüphem yok.

Jython 2.5.3 (, Sep 18 2017, 05:43:55) 
[OpenJDK 64-Bit Server VM (Oracle Corporation)] on java1.8.0_131
>>> import os
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/share/jython/Lib/os.py", line 132, in <module>
    raise ImportError, 'no os specific module found'
ImportError: no os specific module found
>>> 
>>> a = []
>>> a.append("a")
>>> a
['a']

Belki Jython 2.7 versiyonu için çalışır. Sitesinden yüklerseniz.
Ben teşekkür ederim. Az önce yazdıklarım ile ilgili yeni bilgiler edinirseniz ve paylaşırsanız sevinirim.