در این مطلب قرار است با هم چند نکته در مورد نحوه کار رمزارزها با محوریت بیتکوین و کمی عمیقتر، بلاک چین و الگوریتم های هش بیاموزیم.
در این مطلب قرار است با هم چند نکته در مورد نحوه کار رمزارزها با محوریت بیتکوین و کمی عمیقتر، بلاک چین و الگوریتم های هش بیاموزیم.
توجه: این مطلب ترجمه(با اندکی تلخیص) از مطلبی با همین نام در سایت geeksforgeeks است.
وقتی در مورد پایتون صحبت میکنیم معمولا فقط در مورد زبان حرف نمیزنیم بلکه در مورد پیادهسازی هم صحبت میکنیم. پایتون درواقع مشخصاتِ یک زبان است که میتواند به روشهای بسیار متعددی پیادهسازی شود.
قبل از جلوتر رفتن اجازه دهید تفاوت بین بایتکد(byte code) و کد ماشین(machine code or native code) را درک کنیم.
کد ماشین مجموعه دستورالعملهایی هست که مستقیما توسط پردازندهمرکزی(CPU) اجرا میشود. هر دستورالعمل، یک کار یکتا انجام میدهد، مثل لودِ اطلاعات یا عملیات منطقی روی اطلاعات در حافظه CPU. تقریبا تمام زبانهای سطح بالا مثل C سورسکد را با کمک کامپایلرها، لینکر(linker)ها و لودر(loader)ها به کد قابلاجرا برای ماشین ترجمه میکنند. هر پردازنده یا خانواده پردازنده مجموعهدستورات منحصر به خود را دارد.
بایتکد هم نمایش دودوییاست که توسط ماشینمجازی(نه مستقیما توسط CPU) اجرا میشود. ماشین مجازی(که برای ماشینهای متفاوت جدا توسعه داده شده) نمایش دودویی(همان بایتکد) را به دستورات خاص ماشین تبدیل میکند. یکی از زبانهایی که از مفهوم byte-code استفاده میکند جاوا است.
کد ماشین بسیار سریعتر از بایتکد است ولی بایتکد قابلحمل (portable) و ایمنتر از کد ماشین است.
پیادهسازی پیشفرض زبان برنامهنویسی پایتون، Cpython است. همان طور که از نام آن مشخص است با زبان C نوشته شدهاست. Cpython برنامهی پایتون را به بایتکد سطح میانی (intermediate byte-code)کامپایل میکند، که توسط ماشینمجازی Cpython اجرا میشود. Cpython با کتابخانه استاندارد بزرگی که با ترکیب C و python نوشتهشده است، عرضه میشود. Cpython بیشترین سطح سازگاری با پکیجهای پایتون و ماژولهای توسعهی سی (C extension modules) دارد. همهی نسخههای زبان برنامهنویسی پایتون با C پیادهسازی میشوند چون Cpython پیادهسازی مرجع است.
برخی پیادهسازیهای پایتون که بر اساس هستهاجرایی(run-time core) Cpython ولی با رفتارها یا قابلیتهای گسترشیافته در برخیجنبه عبارتاند از Stackless python و wpython و Micropython.
نکته: Stackless python یک نسخه از Cpython است با تمرکز بر concurrency با استفادهاز tasklet ها و channelها.
پیادهسازیهای دیگری از python هم در دسترس هستند. تنها پیادهسازیهایی که به عنوان سازگار با نسخههای مشخص پایتون شناخته شدهاند عبارتاند از:IronPython و Jython و PyPy.
جایتون یک پیادهسازی جاوا است که میتواند روی بستر جاوا اجرا شود. برنامههای جایتون از کلاسهای جاوا به جای ماژولهای پایتون استفاده میکنند. جایتون به بایتکد کامپایل میشود که در نهایت توسط ماشینمجازی جاوا اجرا شود. جایتون استفاده از کلاسهای کتابخانهای جاوا(java class libraries)را از برنامه پایتون میسر میکند. جایتون در مقایسه با Cpython کند است و با کتابخانههای Cpython سازگار نیست.
یک پیادهسازی پایتون که در زبان سیشارپ نوشته شده است و فریمورک .NET از مایکروسافت را هدف قرار دادهاست.. مشابه جایتون، از ماشین مجازی داتنت استفاده میکند. IronPython میتواند از فریمورک داتنت و کتابخانههای پایتون استفاده کند و دیگر زبانهای داتنت میتوانند از کدهای پایتون به طور کارآمد استفاده کنند. IronPython در برنامههای پایتون که از thread ها و چندهسته استفاده میکنند بهتر عمل میکند. ازآنجا که به JIT (کامپایلر در زمان اجرا) مجهز است و همچنین فاقد GIL(قفل مفسر سراسری) است.
اگر میخواهید کدتان سریعتر اجرا شود، شما احتمالا فقط باید از PyPy استفاده کنید. (از خیدو ون روسم سازنده پایتون)
پایتون یک زبان پویاست. گفته میشود پایتون کند است چون پیادهسازی پیشفرض Cpython سورسکد پایتون را به byte-code کامپایل میکند که در مقایسه با کد ماشین (machine code or native code) کندتر است. اینجا جاییاست که PyPy وارد میشود.
در واقع PyPy یک پیادهسازی از زبان برنامهنویسی پایتون است که به زبان Python نوشته شده است. مفسر به زبان RPytohn (یک زیرمجموعه از پایتون) نوشته شده است.
پایپای از JIT (کامپایل زمان اجرا) استفاده میکند. به زبان ساده JIT از شیوه کامپایل کردن استفاده میکند تا سیستم تفسیر کاراتر و سریع شود. به زبان ساده JIT این امکان را میدهد که سورسکد به زبان ماشین کامپایل شود که آن را بسیار سریع میکند.
پایپای همچنین به صورت پیشفرض با پشتیبانی از Stackless mode عرضه میشود که امکان micro-threadها برای همروندی(concurrency)های بزرگ را فراهم میکند. گفته میشود PyPy هفت و نیم برابر سریعتر از Cpython است.
پیادهسازیهای دیگر Python عبارتاند از: CLPytohn و Pyston و Psyco و Cython و IPytohn.
منابع:
https://www.geeksforgeeks.org/difference-various-implementations-python/
https://wiki.python.org/moin/PythonImplementations
http://pypy.org/
https://wiki.python.org/moin/IronPython
https://www.jython.org/
با سلام، چند سری مطلب قصد دارم بگذارم برای معرفی زبانهایی که خودم "اندکی" باهاشون کار کردم و یک یا چند نکته از آنها برایم جالب بودهاند. طبیعتا تعدادی از زبانهایی که معرفی میکنم برنامهنویس حرفهای دارند و خیلی بهتر و بیشتر از من به مفاهیم زبان مسلط هستند، از آن ها تقاضا دارم مطلب من را کامل کنند :)
زبان اولی که قصد معرفی دارم(و زبان محبوب خودم هست) زبان brainf*ck هست که اولین نکتهای که باید بدونید اینه که اسمش کاملا شایستهاست و سعی نکنید باهاش برنامهنویسی کنید و از اون بدتر برنامه نویسی رو باهاش به کسی آموزش بدید.
یادگیریاین زبان بسیار ساده است ولی برنامهنویسی با اون بسیار سخته به این دلیل که کلا از ۸ تا کامند پشتیبانی میکنه و به جز اونها هرچی در فایل برنامه باشه به عنوان کامنت در نظر گرفته میشه.
فکر میکنم این زبان مختصر ترین زبان Turing complete باشه و برای همینه که اینقدر معروف شده ولی در عمل کسی ازش استفاده نمیکنه :)
دستورات این زبان به شرح زیر است:
> = increases memory pointer, or moves the pointer to the right 1 block.
< = decreases memory pointer, or moves the pointer to the left 1 block.
+ = increases value stored at the block pointed to by the memory pointer
- = decreases value stored at the block pointed to by the memory pointer
[ = like c while(cur_block_value != 0) loop.
] = if block currently pointed to's value is not zero, jump back to [
, = like c getchar(). input 1 character.
. = like c putchar(). print 1 character to the console
توضیحات بیشتر را در این لینک مطالعه کنید
اما زبان چطوری کار میکند: در این زبان شما یک اشارهگر و یک حافظه نامحدود دارید که با دستور های < و > می توانید در خانههای حافظه جا به جا شوید، با دستور های + و − مقدار آن خانه حافظه یکی کم یا زیاد میشود و وظیفه چاپ و گرفتن اطلاعات از کاربر با "." و "," است.
احتمالا سخت ترین قسمت زبان for آن باشد(شاید هم while مناسب تر باشد) که با دستورات ] , [ کار میکند و دستورات داخل براکت را تا وقتی اجرا میکند (دقیقا نفهمیدم با چه زمانی :)) )
همونطورکه حدس میزنید در این زبان string به کلی وجود ندارد، آن هم نه مثل c که با char* هندل بشود بلکه به کلی وجود ندارد و یه helloworld ساده مشابه زیر خواهد بود:
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-] >++++++++[<++++>-] <.>+++++++++++[<++++++++>-]<-.--------.+++ .------.--------.[-]>++++++++[<++++>- ]<+.[-]++++++++++.
البته چندین مدل دیگر هم امکان پیادهسازی helloworld وجود دارد و این نشان از قدرت و انعطاف پذیری زبان است. #شوخی
از مصاعب استفاده از زبان غیر از خود زبان، سرچ کردن چیزی مربوط به آن است که با توجه به تعدد روش های نوشتن اسم زبان شما را مجبور به چندین با سرچ میکند.
چند آموزش مفید برای زبان:
https://blog.klipse.tech//brainfuck/2016/12/17/brainfuck.html
http://cydathria.com/bf/brainfuck.html
به نظرم ایشون واقعا تلاش شایسته تقدیری کرده و چندین الگوریتم و برنامه معروف رو به این زبان نوشته:
http://www.hevanet.com/cristofd/brainfuck/
چند مفسر آنلاین هم هست که برنامههاتون رو میتونید توش اجرا کنید:
https://fatiherikli.github.io/brainfuck-visualizer/
https://sange.fi/esoteric/brainfuck/impl/interp/i.html
https://copy.sh/brainfuck/
یکی از تمرینهای خوب هم نوشتن یک کامپایلر برای brainf*ck هست (که من هم انجامش دادم :) ) با کمی سرچ آموزشها و سورس کدهای مرتبط رو میتونید پیدا کنید.
با سلام
شاید شما هم مثل من دوست داشته باشید هر از گاهی یک برنامه کاربردی جدید امتحان کنید! مدتیست vim , nano , Emacs و vi و ... را امتحان کردهام و هر کدام نکات مثبت و منفی خودشون را داشتند ولی امروز با ادیتوری آشنا شدم که قواعد بازی رو (برای من) عوض کرد!
در سایت slant.co به مقالهای برخوردم که بهترین ادیتورهای تحت ترمینال را از نظر خودش رتبهبندی کرده بود و در رتبه اول ادیتور micro بود، ادیتورهای رده های بعدی عموما clone هایی از Emacs و vim بودند ولی چرا micro انتخاب شده:
یک اصطلاح معروف هست که میگویند فلانی اقیانوسی به عمق یک سانت(یا یک وجب!) است یعنی دانش وسیعی در حوزههای محتلف دارد ولی دانشش عمق کمی دارد و هیچکدام برای انجام کار جدی مفید نیستند، در بیشتر وقتها فرد عطش یادگیری دارد(که بسیار خوب است) ولی در زمینههای مختلف یادگیری میکند ولی در نهایت در هیچ کدام تخصّص ندارد (یعنی مثلاً hello world بلد هست!)؟
چی شد من متوجه نشدم، من؟ من باید محتوا تولید کنم؟ به من گفتن همه چی پای کاروانه!
داستان را از اوّل تعریف میکنم، از جایی که شنیدم محتوای فارسی در خیلی زمینهها به اندازه کافی نیست و اگر مطلب خوبی نوشته بشود خواننده خودش را دارد، خیلی اوقات مخصوصاً در زمینههای فنّی توصیه به استفاده از مطالب انگلیسی میشود چون مطالب فارسی به اندازه کافی قوی نیستند و طبیعی است که اگر آنها که دانش و توانایی لازم را دارند شروع به نوشتن کنند مطالبشان محبوب میشود.
ولی دغدغه من این است آیا مطلب خوبی نوشته میشود؟ به عنوان یک نویسنده در ویرگول(خودم و احتمالاً شما) مطلب به درد بخور و مفید منتشر میکنیم که خواننده بعدها استفاده کند و نه تنها وقتش هدر نرود بلکه چیزی به دانستههایش اضافه شود؟
مطلب به زبان مادریمان از جمله چیزهاییست که وارداتیاش خوب از آب در نمیآید و خود ما فارسی زبانها باید تولید و انتشارش را به عهده بگیریم ولی آیا ما وب فارسی را ما روزمره نویسی و به اشتراک گذاشتن مطالب بیهوده پر میکنیم(قضاوت نمیکنم صرفاً سوال میپرسم) یا مطلبی تولید میکنیم به به اصطلاح سرش به تنش بیارزد و ارزش وقت گذاشتن برای نوشتن و خواندن (و نگهداری و برق سرور و گرمایش زمین و .. ) را دارد؟
آیا ما مطلب رو بعد از زدن آخرین نقطه(تازه اگر وقتمان اجازه دهد نقطه بگذاریم) منتشر میکنیم یا چند بار متن را خوانده و چکشکاری میکنیم؟ آیا علائم نگارشی را رعایت میکنیم؟(من خودم رعایت میکنم؟) اصلاً بلدیم از کیبرد فارسی درست استفاده کنیم؟
مثل همیشه شاد باشید و خندون چرا که فقط یک بار زندگی میکنیم.
با نظراتتون به این مطلب ارزش بدید.
نظر دوست خوبمون:
برای تولید محتوا بناگزیر از ترجمه هستید. یعنی نویسنده نمیتواند همیشه مطلب اصیل خلق کند. شاید بهترین حالت ترکیبی از ترجمه و تجربه باشد.