সংক্ষিপ্ত উত্তরটি হ'ল, সি দ্বারা সমর্থিত বেশিরভাগ ভাষা নির্মাণগুলিও লক্ষ্য কম্পিউটারের মাইক্রোপ্রসেসর দ্বারা সমর্থিত, তাই সংকলিত সি কোড মাইক্রোপ্রসেসরের সমাবেশ ভাষায় খুব সুন্দর এবং দক্ষ অনুবাদ করে, যার ফলে ছোট কোড এবং একটি ছোট পায়ের ছাপ তৈরি হয়।
দীর্ঘ উত্তরটির জন্য অ্যাসেম্বলি ভাষার কিছুটা জ্ঞান প্রয়োজন। সি তে, একটি বিবৃতি যেমন:
int myInt = 10;
সমাবেশে এরকম কিছুতে অনুবাদ করবে:
myInt dw 1
mov myInt,10
এটি সি ++ এর মতো কিছুতে তুলনা করুন:
MyClass myClass;
myClass.set_myInt(10);
ফলস্বরূপ অ্যাসেম্বলি ভাষার কোড (মাইক্লাস কত বড় হয় তার উপর নির্ভর করে () কতগুলি সমাবেশ ভাষা লাইন যোগ করতে পারে।
অ্যাসেম্বলি ভাষায় প্রকৃতপক্ষে প্রোগ্রাম তৈরি না করে খাঁটি সি সম্ভবত আপনি "একটি প্রোগ্রাম তৈরি করতে পারেন" ত্বকের সবচেয়ে ত্বকযুক্ত এবং "কঠোরতম" কোড।
সম্পাদনা
আমার উত্তরে মন্তব্যগুলি দেওয়া, আমি কেবল নিজের স্বচ্ছলতার জন্য পরীক্ষা চালানোর সিদ্ধান্ত নিয়েছি। আমি "টেস্ট.সি." নামে একটি প্রোগ্রাম তৈরি করেছি, যা দেখে মনে হচ্ছে:
#include <stdio.h>
void main()
{
int myInt=10;
printf("%d\n", myInt);
}
আমি এটি জিসিসি ব্যবহার করে সমাবেশে সংকলিত করেছি। এটি সঙ্কলনের জন্য আমি নিম্নলিখিত কমান্ড লাইনটি ব্যবহার করেছি:
gcc -S -O2 test.c
এখানে ফলাফল ফলাফল সমাবেশ:
.file "test.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d\n"
.section .text.unlikely,"ax",@progbits
.LCOLDB1:
.section .text.startup,"ax",@progbits
.LHOTB1:
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB24:
.cfi_startproc
movl $10, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
jmp __printf_chk
.cfi_endproc
.LFE24:
.size main, .-main
.section .text.unlikely
.LCOLDE1:
.section .text.startup
.LHOTE1:
.ident "GCC: (Ubuntu 4.9.1-16ubuntu6) 4.9.1"
.section .note.GNU-stack,"",@progbits
আমি তারপরে "test.cpp" নামে একটি ফাইল তৈরি করি যা একটি শ্রেণি সংজ্ঞায়িত করে এবং একই জিনিসটিকে "test.c" হিসাবে আউটপুট করে:
#include <iostream>
using namespace std;
class MyClass {
int myVar;
public:
void set_myVar(int);
int get_myVar(void);
};
void MyClass::set_myVar(int val)
{
myVar = val;
}
int MyClass::get_myVar(void)
{
return myVar;
}
int main()
{
MyClass myClass;
myClass.set_myVar(10);
cout << myClass.get_myVar() << endl;
return 0;
}
আমি এই কমান্ডটি ব্যবহার করে এটি একইভাবে সংকলিত করেছি:
g++ -O2 -S test.cpp
এখানে ফলাফল ফলাফল সমাবেশ:
.file "test.cpp"
.section .text.unlikely,"ax",@progbits
.align 2
.LCOLDB0:
.text
.LHOTB0:
.align 2
.p2align 4,,15
.globl _ZN7MyClass9set_myVarEi
.type _ZN7MyClass9set_myVarEi, @function
_ZN7MyClass9set_myVarEi:
.LFB1047:
.cfi_startproc
movl %esi, (%rdi)
ret
.cfi_endproc
.LFE1047:
.size _ZN7MyClass9set_myVarEi, .-_ZN7MyClass9set_myVarEi
.section .text.unlikely
.LCOLDE0:
.text
.LHOTE0:
.section .text.unlikely
.align 2
.LCOLDB1:
.text
.LHOTB1:
.align 2
.p2align 4,,15
.globl _ZN7MyClass9get_myVarEv
.type _ZN7MyClass9get_myVarEv, @function
_ZN7MyClass9get_myVarEv:
.LFB1048:
.cfi_startproc
movl (%rdi), %eax
ret
.cfi_endproc
.LFE1048:
.size _ZN7MyClass9get_myVarEv, .-_ZN7MyClass9get_myVarEv
.section .text.unlikely
.LCOLDE1:
.text
.LHOTE1:
.section .text.unlikely
.LCOLDB2:
.section .text.startup,"ax",@progbits
.LHOTB2:
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB1049:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $10, %esi
movl $_ZSt4cout, %edi
call _ZNSolsEi
movq %rax, %rdi
call _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
xorl %eax, %eax
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE1049:
.size main, .-main
.section .text.unlikely
.LCOLDE2:
.section .text.startup
.LHOTE2:
.section .text.unlikely
.LCOLDB3:
.section .text.startup
.LHOTB3:
.p2align 4,,15
.type _GLOBAL__sub_I__ZN7MyClass9set_myVarEi, @function
_GLOBAL__sub_I__ZN7MyClass9set_myVarEi:
.LFB1056:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $_ZStL8__ioinit, %edi
call _ZNSt8ios_base4InitC1Ev
movl $__dso_handle, %edx
movl $_ZStL8__ioinit, %esi
movl $_ZNSt8ios_base4InitD1Ev, %edi
addq $8, %rsp
.cfi_def_cfa_offset 8
jmp __cxa_atexit
.cfi_endproc
.LFE1056:
.size _GLOBAL__sub_I__ZN7MyClass9set_myVarEi, .-_GLOBAL__sub_I__ZN7MyClass9set_myVarEi
.section .text.unlikely
.LCOLDE3:
.section .text.startup
.LHOTE3:
.section .init_array,"aw"
.align 8
.quad _GLOBAL__sub_I__ZN7MyClass9set_myVarEi
.local _ZStL8__ioinit
.comm _ZStL8__ioinit,1,1
.hidden __dso_handle
.ident "GCC: (Ubuntu 4.9.1-16ubuntu6) 4.9.1"
.section .note.GNU-stack,"",@progbits
আপনি স্পষ্ট দেখতে পাচ্ছেন যে, ফলস্বরূপ অ্যাসেমবিলি ফাইলটি সি ++ ফাইলে অনেক বড় তবে এটি সি ফাইলে রয়েছে। এমনকি যদি আপনি অন্য সমস্ত জিনিসগুলি কেটে ফেলে থাকেন এবং কেবলমাত্র "সি" প্রধানকে সি ++ "প্রধান" সাথে তুলনা করেন, সেখানে প্রচুর অতিরিক্ত স্টাফ রয়েছে।