الفنون رقم 004
الفنون رقم 004
ARTS هو نشاط بدأه
由左耳朵耗子--陈皓: قم بإجراء سؤال واحد على الأقل عن خوارزمية leetcode كل أسبوع، واقرأ مقالًا تقنيًا واحدًا على الأقل باللغة الإنجليزية وعلق عليه، وتعلم مهارة فنية واحدة على الأقل، وشارك المقالة مع الآراء والأفكار. (أي أن الخوارزمية والمراجعة والنصائح والمشاركة يشار إليها باسم ARTS) وتستمر لمدة عام واحد على الأقل.
فنون 004
هذه هي المادة الرابعة. إنه مكتوب بشكل سيء نسبيًا. وآمل أن تصبح أفضل وأفضل في المستقبل.
سؤال خوارزمية الخوارزمية
سؤال خوارزمية leetcode 321 إنشاء الحد الأقصى للرقم (الحد الأقصى لعدد الربط) يمكن أن يكون: صعبا
Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum number of length k <= m + n from digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the k digits.
Note: You should try to optimize your time and space complexity.
Example 1:
Input:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
Output:
[9, 8, 6, 5, 3]
Example 2:
Input:
nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
Output:
[6, 7, 6, 0, 4]
Example 3:
Input:
nums1 = [3, 9]
nums2 = [8, 9]
k = 3
Output:
[9, 8, 9]
给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。
求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。
说明: 请尽可能地优化你算法的时间和空间复杂度。
示例 1:
输入:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
输出:
[9, 8, 6, 5, 3]
示例 2:
输入:
nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
输出:
[6, 7, 6, 0, 4]
示例 3:
输入:
nums1 = [3, 9]
nums2 = [8, 9]
k = 3
输出:
[9, 8, 9]
أفكار لحل المشكلات:
-
1 تحديد عدد الأرقام التي تأخذها كل من المصفوفتين، على سبيل المثال، k=5، والتي يمكن تقسيمها إلى 1، 4؛ 2، 3؛ 3، 2؛ 4، 1؛ ويجب أن يكون أصغر من عدد nums1 أو nums2. هذه الخطوة بسيطة نسبيا.
-
2 اجمع المصفوفات الفرعية التي تستوفي الشروط في واحدة هذه الخطوة أكثر تعقيدًا. على سبيل المثال، nums1 = [6, 7, 0]; الأعداد 2 = [6، 0، 4]، ك = 5؛ يمكن تقسيم k إلى 2، 3؛ 3، 2؛ الآن فكر في الحالتين 2 و3، nums1_1 = [6, 7]; nums2_1 = [6, 0, 4]; إذًا كيف يمكنك دمج هاتين الصفيفتين الفرعيتين في أكبر عدد ممكن؟ للوهلة الأولى، يبدو الأمر بسيطًا جدًا. ما عليك سوى أخذ واحدة من كل من المصفوفتين واختيار أيهما أكبر. ولكن هناك مأزق هنا. ماذا علي أن أفعل إذا كانت الأحجام هي نفسها؟ على سبيل المثال، الرقمان الأولان من nums1_1 وnums2_1 كلاهما يساوي 6، أيهما يجب اختياره؟ دعونا نرى ما هو مختلف. إذا أخذت 6 من nums2_1 لأول مرة، بعد أخذها، nums1_1 = [6, 7]; nums2_1 = [0, 4]; في المرة الثانية التي تأخذ فيها nums1_1 6، يمكن أن تأخذ nums2_1 0 فقط، 6 أكبر من 0، لذا خذ 6، بعد أخذها، nums1_1 = [7]; nums2_1 = [0, 4]؛، النتيجة النهائية هي [6,6,7,0,4]
إذا أخذت 6 من nums1_1 لأول مرة، بعد أخذها، nums1_1 = [7]; nums2_1 = [6,0, 4]; للمرة الثانية، nums1_1 يأخذ 7، وnums2_1 يأخذ 6. 7 أكبر من 6، لذلك 7 مأخوذ. بعد أخذها، nums1_1 = []; nums2_1 = [6,0, 4]؛، النتيجة النهائية هي [6,7,6,0,4]
النتائج مختلفة، ومن الواضح أن النتيجة الثانية هي الصحيحة. هل طريقة الدمج التي استخدمناها أعلاه تشبه الخوارزمية المستخدمة في فرز الدمج، ولكن عند دمج المصفوفات في فرز الدمج، يكون الصفيفان مرتبان، لكن المصفوفتين اللتين ندمجهما هنا غير مرتبة، لذلك سنواجه هذه المشكلة. رمز التدريب الخاص بي هو كما يلي:
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int maxInexd(int* nums,int max,int min){
int maxindex = min;
int count = nums[maxindex];
for (int i = min; i<=max; i++) {
if (nums[i] > count) {
count = nums[i];
maxindex = i;
}
}
return maxindex;
}
int* maxNumber1(int* nums, int numsSize, int numcount){
int *a = (int *)malloc(numcount*sizeof(int));
int index = -1;
for (int i = 0; i < numcount; i++) {
index = maxInexd(nums, numsSize - numcount +i, index+1);
a[i] = nums[index];
}
return a;
}
int* merge(int* num11, int nums1count, int* num22, int nums2count, int k){
//把两个数组合并为一个
int* tempReturnSize = (int *)malloc(k*sizeof(int));
int mm = 0;
int nn = 0;
for (int i = 0; i < k; i++) {
if (mm == nums1count) {
int a = num22[nn];
tempReturnSize[i] = a;
nn++;
continue;
}
if (nn == nums2count) {
int b = num11[mm];
tempReturnSize[i] = b;
mm++;
continue;
}
int aa = num11[mm];
int bb = num22[nn];
if (aa >bb) {
tempReturnSize[i] = aa;
mm++;
}
else if (aa == bb){
int aa1 = aa;
int bb1 = bb;
int ii = 0;
while (mm + ii +1 != nums1count && nn + ii+1 != nums2count && aa1 ==bb1 ) {
ii++;
aa1 = num11[mm + ii];
bb1 = num22[nn + ii];
}
if (aa1 > bb1) {
tempReturnSize[i] = aa;
mm++;
continue;
}
else if(aa1 < bb1){
tempReturnSize[i] = bb;
nn++;
continue;
}
if (mm + ii +1 == nums1count) {//说明没有下一个
tempReturnSize[i] = bb;
nn++;
continue;
}
if (nn + ii +1 == nums2count) {//说明没有下一个
tempReturnSize[i] = bb;
mm++;
continue;
}
}
else{
tempReturnSize[i] = bb;
nn++;
}
}
return tempReturnSize;
}
int* maxNumber(int* nums1, int nums1Size, int* nums2, int nums2Size, int k, int* returnSize) {
*returnSize = k; //在leetcode提交的时候,不知道为什么要加上这个
if (nums1Size ==0) {
return nums2;
}
if (nums2Size ==0) {
return nums1;
}
int* relsut = (int*)malloc(sizeof(int) * k);
memset(relsut, 0, sizeof(int) * k);
int nums1count, nums2count;
for (nums1count = 1; nums1count <= nums1Size; nums1count++) {//nums1count 表示从nums1数组取的数的个数 最少是1 最大是nums1Size
nums2count = k - nums1count;
if (nums2count > nums2Size) {
continue;
}
if(nums2count == 0){//不能不从nums2取值
break;
}
//从nums1中按序取出nums1count个数,且这个几个数按序组装成整数之后是最大的
int *num11 = maxNumber1(nums1, nums1Size,nums1count);
//从nums2中按序取出nums2count个数,且这个几个数按序组装成整数之后是最大的
int *num22 = maxNumber1(nums2, nums2Size,nums2count);
//把两个数组合并为一个
int* tempReturnSize =merge( num11, nums1count, num22, nums2count, k);
//比较最大的数值
for (int i = 0; i < k; i++) {
int aa = tempReturnSize[i];
int bb = relsut[i];
if (aa > bb) {
for (int j = 0; j < k; j++){
relsut[j] = tempReturnSize[j];
}
break;
}
else if (bb >aa){
break;
}
}
free(tempReturnSize);
free(num11);
free(num22);
}
return relsut;
}
وقت التشغيل في LeetCode هو 20 مللي ثانية. الكود التالي هو كود تم إرساله في LeetCode مع وقت تشغيل يبلغ 8 مللي ثانية. يبدو الأمر مشابهًا لتطبيقي. لا أعرف أين يكون أسرع:
void maxNum(int*, int, int, int*);
void merge(int*, int, int*, int, int*);
void max(int*, int*, int);
int* maxNumber(int* nums1, int nums1Size, int* nums2, int nums2Size, int k, int* returnSize)
{
*returnSize = k;
int* result = (int*)malloc(sizeof(int) * k);
memset(result, 0, sizeof(int) * k);
int* merged = (int*)malloc(sizeof(int) * k);
int *max1 = NULL, *max2 = NULL;
for (int i = 0; i <= k; i++) {
int n1 = i, n2 = k - i;
if (n1 > nums1Size || n2 > nums2Size)
continue;
max1 = realloc(max1, sizeof(int) * n1);
maxNum(nums1, nums1Size, n1, max1);
max2 = realloc(max2, sizeof(int) * n2);
maxNum(nums2, nums2Size, n2, max2);
merge(max1, n1, max2, n2, merged);
max(result, merged, k);
}
free(max1), free(max2), free(merged);
return result;
}
void maxNum(int* nums, int n, int k, int* r)
{
for (int i = 0, j = 0; i < n; i++) {
// drop last one
while (j > 0 && k - j < n - i && nums[i] > r[j - 1])
j--;
if (j < k)
r[j++] = nums[i];
}
}
void merge(int* nums1, int n1, int* nums2, int n2, int* r)
{
for (int i = 0, j = 0, k = 0; k < n1 + n2; k++) {
int val1 = i < n1 ? nums1[i] : -1;
int val2 = j < n2 ? nums2[j] : -1;
int t = 1;
while (val1 == val2 && val1 != -1) {
val1 = i + t < n1 ? nums1[i + t] : -1;
val2 = j + t < n2 ? nums2[j + t] : -1;
t++;
}
if (val1 > val2)
r[k] = nums1[i++];
else if (val1 < val2)
r[k] = nums2[j++];
else
// val1 == val2 == -1
r[k] = nums1[i++];
}
}
void max(int* nums1, int* nums2, int n)
{
int i;
for (i = 0; i < n; i++) {
if (nums1[i] < nums2[i])
break;
if (nums1[i] > nums2[i])
return;
}
if (i != n)
// set the new max
for (i = 0; i < n; i++)
nums1[i] = nums2[i];
}
مراجعة
هذه المقالة مأخوذة من: https://medium.com/exploring-code/why-should-you-learn-go-f607681fad65
لماذا يجب أن تتعلم لغة Go؟ (لماذا يجب أن تتعلم الذهاب)

الصورة من: http://kirael-art.deviantart.com/art/Go-lang-Mascot-458285682
“Go ستكون لغة الخادم في المستقبل.” - توبياس لوتكي، Shopify
في العامين الماضيين، ظهرت لغة برمجة جديدة: Go or GoLang. لا شيء يجعل المطور مجنونًا أكثر من لغة برمجة جديدة، أليس كذلك؟ لذلك، بدأت في تعلم لغة Go قبل 4 إلى 5 أشهر، وهنا سأخبرك عن سبب ضرورة تعلم هذه اللغة الجديدة أيضًا.
في السنوات القليلة الماضية، ظهرت لغة برمجة جديدة: Go أو GoLang. لا شيء يدفع المطورين إلى الجنون سوى لغات البرمجة الجديدة، أليس كذلك؟ لذلك، بدأت تعلم Go منذ 4 إلى 5 أشهر وهنا سأخبرك لماذا يجب عليك أيضًا تعلم هذه اللغة الجديدة.
لن أعلمك كيف يمكنك كتابة “Hello World!!” في هذه المقالة. هناك الكثير من المقالات الأخرى على الإنترنت لذلك. I am going the explain current stage of computer hardware-software and why we need new language like Go? لأنه إذا لم تكن هناك أي مشكلة، فلن نحتاج إلى حل، أليس كذلك؟
في هذه المقالة، لن أعلمك كيفية كتابة “Hello World!!”. يوجد بالفعل العديد من المقالات المماثلة على الإنترنت. “سأشرح الآن لماذا نحتاج إلى لغة جديدة مثل لغة Go في المرحلة الحالية من أجهزة وبرامج الكمبيوتر؟” لأنه إذا لم تكن هناك أية مشاكل، فلا نحتاج إلى حل، أليس كذلك؟
#####حدود الأجهزة: قانون مور فاشل. تم طرح أول معالج Pentium 4 بسرعة 3.0 جيجا هرتز في عام 2004 بواسطة شركة Intel. اليوم، تبلغ سرعة جهاز Mackbook Pro 2016 الخاص بي 2.9 جيجا هرتز. لذلك، خلال عقد واحد تقريبًا، لم يكن هناك الكثير من المكاسب في قوة المعالجة الخام. يمكنك رؤية المقارنة بين زيادة قوة المعالجة مع الوقت في الرسم البياني أدناه.
摩尔定律失效了
أطلقت شركة Intel أول معالج Pentium 4 بسرعة ساعة 3.0 جيجا هرتز في عام 2004. واليوم، يتمتع جهاز Mackbook Pro 2016 الخاص بي بسرعة ساعة تبلغ 2.9 جيجا هرتز. لذلك، منذ ما يقرب من عشر سنوات، لم تتحسن قوة المعالجة الخام كثيرًا. يمكنك رؤية الزيادة في قوة المعالجة مقابل الوقت في الرسم البياني أدناه.

من الرسم البياني أعلاه يمكنك أن ترى أن أداء الخيط الواحد وتردد المعالج ظلا ثابتين لمدة عقد تقريبًا. إذا كنت تعتقد أن إضافة المزيد من الترانزستور هو الحل، فأنت مخطئ. هذا لأنه على نطاق أصغر تبدأ بعض الخصائص الكمومية في الظهور (مثل حفر الأنفاق) ولأنه في الواقع يكلف المزيد من الترانزستورات (لماذا؟) ويبدأ عدد الترانزستورات التي يمكنك إضافتها لكل دولار في الانخفاض.
كما ترون من الرسم البياني أعلاه، ظل أداء الخيط الواحد وتردد المعالج مستقرين لما يقرب من عقد من الزمن. إذا كنت تعتقد أن إضافة المزيد من الترانزستورات هو الحل، فأنت مخطئ. هذا لأنه على المقاييس الأصغر، تبدأ بعض الخصائص الكمومية في الظهور (مثل الأنفاق)، ولأن وضع المزيد من الترانزستورات يكلف في الواقع أكثر لماذا)، ويبدأ عدد الترانزستورات التي يمكن إضافتها لكل دولار في الانخفاض.
لذلك، لحل المشكلة أعلاه، لذا فإن حل المشكلة المذكورة أعلاه هو كما يلي:
- بدأ المصنعون بإضافة المزيد والمزيد من النوى إلى المعالج. في الوقت الحاضر، تتوفر لدينا وحدات المعالجة المركزية رباعية النواة وثمانية النواة.
- بدأ المصنعون بإضافة المزيد والمزيد من النوى إلى المعالجات. اليوم لدينا وحدات المعالجة المركزية رباعية النواة وثمانية النواة متاحة.
- قدمنا أيضًا تقنية الترابط الفائق.
- قدمنا أيضًا تقنية Hyper-Threading.
- تمت إضافة المزيد من ذاكرة التخزين المؤقت للمعالج لزيادة الأداء.
- تمت إضافة المزيد من ذاكرة التخزين المؤقت للمعالج لتحسين الأداء.
لكن الحلول المذكورة أعلاه لها حدودها الخاصة أيضًا. لا يمكننا إضافة المزيد والمزيد من ذاكرة التخزين المؤقت إلى المعالج لزيادة الأداء لأن ذاكرة التخزين المؤقت لها حدود مادية: كلما كانت ذاكرة التخزين المؤقت أكبر، أصبحت أبطأ. إن إضافة المزيد من النواة إلى المعالج له تكلفته أيضًا. كما أن هذا لا يمكن أن يمتد إلى أجل غير مسمى. يمكن لهذه المعالجات متعددة النواة تشغيل عدة سلاسل عمليات في وقت واحد مما يؤدي إلى التزامن في الصورة. سنناقش ذلك لاحقا.
لكن الحلول المذكورة أعلاه لها أيضًا حدودها الخاصة. لا يمكننا إضافة المزيد والمزيد من ذاكرة التخزين المؤقت إلى المعالج لتحسين الأداء لأن ذاكرة التخزين المؤقت لها قيود مادية: كلما كانت ذاكرة التخزين المؤقت أكبر، كلما أصبحت أبطأ. إن إضافة المزيد من النوى إلى المعالج له تكاليفه أيضًا. وهذا لا يتسع إلى ما لا نهاية. يمكن لهذه المعالجات متعددة النواة تشغيل عدة سلاسل عمليات في وقت واحد، مما يوفر التزامن للصور. سنناقش ذلك لاحقا.لذا، إذا لم نتمكن من الاعتماد على تحسينات الأجهزة، فإن الطريقة الوحيدة هي استخدام برامج أكثر كفاءة لزيادة الأداء. لكن للأسف، لغات البرمجة الحديثة ليست فعالة كثيرًا. لذلك، إذا لم نتمكن من الاعتماد على تحسينات الأجهزة، فإن المخرج الوحيد هو تحسين أداء البرنامج. لكن لسوء الحظ فإن لغات البرمجة الحديثة ليست فعالة جدًا.
“Modern processors are a like nitro fueled funny cars, they excel at the quarter mile. Unfortunately modern programming languages are like Monte Carlo, they are full of twists and turns.” — David Ungar
“现代处理器就像硝基燃料有趣的汽车,他们擅长四分之一英里。 不幸的是,现代编程语言就像蒙特卡罗,它们充满了曲折。“ - David Ungar
Go لديه goroutines !!
كما ناقشنا أعلاه، يقوم مصنعو الأجهزة بإضافة المزيد والمزيد من النوى إلى المعالجات لزيادة الأداء. تعمل جميع مراكز البيانات على تلك المعالجات ويجب أن نتوقع زيادة في عدد النوى في السنوات القادمة. علاوة على ذلك، تستخدم تطبيقات اليوم خدمات صغيرة متعددة للحفاظ على اتصالات قاعدة البيانات وقوائم انتظار الرسائل والحفاظ على ذاكرة التخزين المؤقت. لذلك، يجب أن تدعم البرامج التي نطورها ولغات البرمجة التزامن بسهولة ويجب أن تكون قابلة للتطوير مع زيادة عدد النوى.
كما ذكرنا أعلاه، يقوم مصنعو الأجهزة بإضافة المزيد والمزيد من النوى إلى المعالجات لتحسين الأداء. تعمل جميع مراكز البيانات على هذه المعالجات، ونتوقع أن يزداد العدد الأساسي في السنوات القادمة. علاوة على ذلك، تستخدم تطبيقات اليوم خدمات صغيرة متعددة للحفاظ على اتصالات قاعدة البيانات وقوائم انتظار الرسائل والحفاظ على ذاكرة التخزين المؤقت. لذلك، يجب أن تدعم البرامج ولغات البرمجة التي نطورها التزامن بسهولة، ويجب أن تكون قابلة للتطوير مع زيادة عدد النوى.
لكن معظم لغات البرمجة الحديثة (مثل Java وPython وما إلى ذلك) تنتمي إلى بيئة الخيوط الفردية في التسعينيات. تدعم معظم لغات البرمجة هذه تعدد الخيوط. لكن المشكلة الحقيقية تأتي مع التنفيذ المتزامن، وقفل الترابط، وظروف السباق، والجمود. هذه الأشياء تجعل من الصعب إنشاء تطبيق متعدد الخيوط على تلك اللغات.
ومع ذلك، فإن معظم لغات البرمجة الحديثة مثل Java وPython وما إلى ذلك تأتي من البيئة ذات الخيط الواحد في التسعينيات. تدعم معظم لغات البرمجة تعدد مؤشرات الترابط. لكن المشاكل الحقيقية هي التنفيذ المتزامن، وقفل الخيط، وظروف السباق، والجمود. هذه الأشياء تجعل من الصعب إنشاء تطبيقات متعددة الخيوط على هذه اللغات.
على سبيل المثال، إنشاء مؤشر ترابط جديد في Java ليس ذاكرة فعالة. نظرًا لأن كل مؤشر ترابط يستهلك حوالي 1 ميجابايت من حجم كومة الذاكرة، وفي النهاية إذا بدأت في تدوير آلاف سلاسل الرسائل، فسوف تضع ضغطًا هائلاً على الكومة وستتسبب في إيقاف التشغيل بسبب نفاد الذاكرة. وأيضًا، إذا كنت تريد التواصل بين موضوعين أو أكثر، فهذا صعب جدًا. على سبيل المثال، إنشاء مؤشر ترابط جديد في Java ليس فعالاً في استخدام الذاكرة. نظرًا لأن كل خيط يستهلك حوالي 1 ميجابايت من حجم كومة الذاكرة، وفي النهاية إذا بدأت في تدوير آلاف سلاسل الرسائل، فسوف تضع ضغطًا كبيرًا على الكومة وتتسبب في إيقاف التشغيل بسبب عدم كفاية الذاكرة. وأيضًا، إذا كنت تريد التواصل بين موضوعين أو أكثر، فهذا أمر صعب للغاية.
من ناحية أخرى، تم إصدار Go في عام 2009 عندما كانت المعالجات متعددة النواة متاحة بالفعل. ولهذا السبب تم تصميم Go مع وضع التزامن في الاعتبار. يحتوي Go على goroutines بدلاً من المواضيع. أنها تستهلك ما يقرب من 2 كيلو بايت من الذاكرة من الكومة. لذلك، يمكنك تدوير الملايين من goroutines في أي وقت.
من ناحية أخرى، تم إصدار Go في عام 2009، عندما كانت المعالجات متعددة النواة متاحة بالفعل. ولهذا السبب تم تصميم Go مع وضع التزامن في الاعتبار. يحتوي Go على goroutines بدلاً من المواضيع. أنها تستهلك حوالي 2 كيلو بايت من الذاكرة من الكومة. حتى تتمكن من تشغيل الملايين من goroutines في أي وقت.
كيف تعمل الغوروتينات؟ الانكسار: http://golangtutorials.blogspot.in/2011/06/goroutines.html
الفوائد الأخرى هي:
- تحتوي Goroutines على مكدسات مجزأة قابلة للنمو. وهذا يعني أنهم سيستخدمون المزيد من الذاكرة فقط عند الحاجة.
- تحتوي Goroutines على مكدسات مجزأة قابلة للنمو. هذا يعني أنهم يستخدمون المزيد من الذاكرة فقط عند الحاجة.
- تتمتع Goroutines بوقت بدء تشغيل أسرع من الخيوط.
- تتمتع Goroutines بوقت بدء تشغيل أسرع من الخيوط.
- تأتي Goroutines مع عناصر أولية مدمجة للتواصل بأمان فيما بينها (القنوات).
- تأتي Goroutines مع عناصر أولية مدمجة للتواصل الآمن بينها (القنوات).
- تتيح لك Goroutines تجنب الاضطرار إلى اللجوء إلى قفل كائن المزامنة (mutex lock) عند مشاركة هياكل البيانات.
- تتيح لك Goroutines تجنب استخدام أقفال كائن المزامنة عند مشاركة هياكل البيانات.
- أيضًا، لا تحتوي goroutines وسلاسل عمليات نظام التشغيل على تعيين 1:1. يمكن تشغيل goroutine واحد على عدة سلاسل رسائل. يتم مضاعفة إرسال Goroutines إلى عدد صغير من سلاسل عمليات نظام التشغيل.
- بالإضافة إلى ذلك، لا يوجد تعيين 1:1 بين goroutines وسلاسل عمليات نظام التشغيل. يمكن تشغيل goroutine واحد على عدة سلاسل رسائل. يتم مضاعفة إرسال Goroutines إلى عدد صغير من سلاسل عمليات نظام التشغيل.
You can see Rob Pike’s excellent talk [concurrency is not parallelism](https://blog.golang.org/concurrency-is-not-parallelism) to get more deep understanding on this.
كل النقاط المذكورة أعلاه تجعل Go قويًا جدًا للتعامل مع التزامن مثل Java وC وC++ مع الحفاظ على كود تنفيذ التزامن ضيقًا وجميلًا مثل Erlang. النقاط المذكورة أعلاه تجعل Go قوية جدًا. يمكن أن تكون فعالة مثل Java وC وC++ عند التعامل مع العمليات المتزامنة، وجميلة مثل Erlang.
اذهب يستفيد من كلا العالمين. من السهل الكتابة بشكل متزامن وفعال لإدارة التزامن
انطلق متفوقًا في كلا العالمين. من السهل كتابة التزامن والإدارة الفعالة للتزامن
يعمل Go مباشرة على الأجهزة الأساسية (يعمل Go مباشرة على الأجهزة الأساسية.).
إحدى أهم فوائد استخدام C وC++ على اللغات الحديثة ذات المستوى الأعلى مثل Java/Python هو أدائها. لأن C/C++ يتم تجميعها ولا يتم تفسيرها. أحد أكبر فوائد استخدام C وC++ هو أدائها مقارنة باللغات الحديثة الأخرى عالية المستوى مثل Java/Python. لأن C/C++ يتم تجميعه ولم يتم تفسيره.المعالجات تفهم الثنائيات. بشكل عام، عندما تقوم بإنشاء تطبيق باستخدام Java أو اللغات الأخرى المستندة إلى JVM عند تجميع مشروعك، فإنه يقوم بتجميع التعليمات البرمجية القابلة للقراءة البشرية إلى كود بايت يمكن فهمه بواسطة JVM أو الأجهزة الافتراضية الأخرى التي تعمل أعلى نظام التشغيل الأساسي. أثناء التنفيذ، يقوم VM بتفسير تلك الرموز الثانوية وتحويلها إلى ثنائيات يمكن للمعالجات فهمها. يفهم المعالج الملفات الثنائية. عادةً، عند إنشاء تطبيق باستخدام Java أو اللغات الأخرى المستندة إلى JVM، عند تجميع المشروع، فإنه يقوم بتجميع التعليمات البرمجية التي يمكن قراءتها بواسطة الإنسان إلى كود بايت يمكن فهمه بواسطة JVM أو أي جهاز ظاهري آخر يعمل أعلى نظام التشغيل الأساسي. عند التنفيذ، يقوم الجهاز الظاهري بتفسير هذه الرموز الثانوية وتحويلها إلى ثنائيات يمكن للمعالج فهمها
خطوات التنفيذ للغات المعتمدة على VM
بينما على الجانب الآخر، لا يتم تنفيذ C/C++ على الأجهزة الافتراضية وهذا يزيل خطوة واحدة من دورة التنفيذ ويزيد من الأداء. يقوم مباشرة بتجميع التعليمات البرمجية القابلة للقراءة البشرية إلى الثنائيات.
من ناحية أخرى، لا يتم تنفيذ C/C++ على الجهاز الافتراضي ويزيل هذه الخطوة من دورة التنفيذ ويحسن الأداء. يقوم بتجميع التعليمات البرمجية التي يمكن قراءتها بواسطة الإنسان مباشرة في الثنائيات.

لكن تحرير وتخصيص المتغير في تلك اللغات يمثل ألمًا كبيرًا. بينما تتعامل معظم لغات البرمجة مع تخصيص الكائنات وإزالتها باستخدام خوارزميات Garbage Collector أو Reference Counting. ومع ذلك، فإن تحرير وتعيين المتغيرات يمثل ألمًا كبيرًا في هذه اللغات. بينما تستخدم معظم لغات البرمجة أداة تجميع البيانات المهملة أو خوارزمية العد المرجعي للتعامل مع إنشاء الكائنات وإصدارها.
اذهب يجلب أفضل ما في العالمين. مثل اللغات ذات المستوى الأدنى مثل C/C++، فإن لغة Go هي لغة مجمعة. وهذا يعني أن الأداء أقرب تقريبًا إلى اللغات ذات المستوى الأدنى. ويستخدم أيضًا جمع البيانات المهملة لتخصيص الكائن وإزالته. لذلك، لا مزيد من بيانات malloc() و free() !!! رائع!!! اذهب يجلب أفضل ما في العالمين. مثل اللغات منخفضة المستوى مثل C/C++، فإن Go هي لغة مجمعة. وهذا يعني أن الأداء قريب تقريبًا من اللغات ذات المستوى الأدنى. ويستخدم أيضًا جمع البيانات المهملة لتخصيص الكائنات وحذفها. لذا، لا مزيد من عبارات malloc() وfree()! رائع! ! !
من السهل الحفاظ على الكود المكتوب في Go (الكود المكتوب في Go سهل الصيانة).
اسمحوا لي أن أقول لك شيئا واحدا. لا يحتوي Go على بنية برمجة مجنونة مثل اللغات الأخرى. لديها بناء جملة أنيق ونظيف للغاية. اسمحوا لي أن أقول لك شيئا. لا تحتوي لغة Go على بنية برمجة مجنونة مثل اللغات الأخرى. لديها بناء جملة أنيق وواضح للغاية.
لقد وضع مصممو Go في Google هذا الشيء في الاعتبار عندما كانوا ينشئون اللغة. نظرًا لأن Google لديها قاعدة تعليمات برمجية كبيرة جدًا وكان الآلاف من المطورين يعملون على نفس قاعدة التعليمات البرمجية، فيجب أن تكون التعليمات البرمجية سهلة الفهم للمطورين الآخرين ويجب أن يكون لجزء واحد من التعليمات البرمجية الحد الأدنى من التأثير الجانبي على جزء آخر من التعليمات البرمجية. سيؤدي ذلك إلى جعل الكود سهل الصيانة وسهل التعديل. لقد وضع مصممو Go هذا في الاعتبار عندما أنشأوا اللغة في Google. نظرًا لأن Google لديها قاعدة أكواد برمجية كبيرة جدًا تضم آلاف المطورين الذين يعملون على نفس قاعدة الأكواد، فيجب أن يكون الكود سهل الفهم للمطورين الآخرين ويجب أن يكون لقسم واحد من الكود آثار جانبية قليلة على قسم آخر من الكود. سيؤدي ذلك إلى جعل الكود قابلاً للصيانة وسهل التعديل.
يتجاهل Go عمدًا العديد من ميزات لغات OOP الحديثة. يتجاهل Go عمدًا العديد من ميزات لغات OOP الحديثة.
- لا يوجد فصول. كل شيء مقسم إلى حزم فقط. يحتوي Go على بنيات فقط بدلاً من الفئات.
- لا يوجد فئة. كل شيء مقسم إلى حزم فقط. Go يحتوي فقط على بنيات وليس فئات.
Does not support inheritance. وهذا سيجعل من السهل تعديل الكود. في لغات أخرى مثل Java/Python، إذا ورثت الفئة ABC الفئة XYZ وقمت بإجراء بعض التغييرات في الفئة XYZ، فقد يؤدي ذلك إلى بعض الآثار الجانبية في الفئات الأخرى التي ترث XYZ. من خلال إزالة الوراثة، يسهل Go فهم الكود أيضًا (نظرًا لعدم وجود فئة فائقة يمكن النظر إليها أثناء النظر إلى جزء من الكود). *不支持继承. وهذا سيجعل من السهل تعديل الكود. في لغات أخرى مثل Java/Python، إذا ورثت الفئة ABC الفئة XYZ وقمت بإجراء بعض التغييرات في الفئة XYZ، فقد يكون لهذا بعض الآثار الجانبية في الفئات الأخرى التي ترث من XYZ. من خلال إزالة الوراثة، يسهل Go فهم الكود (نظرًا لعدم وجود فئة فائقة يمكن النظر إليها عند النظر إلى جزء من الكود).- لا يوجد بناة.
- لا يوجد تعليقات توضيحية.
- لا الأدوية العامة.
- لا توجد استثناءات.
التغييرات المذكورة أعلاه تجعل لغة Go مختلفة تمامًا عن اللغات الأخرى وتجعل البرمجة في لغة Go مختلفة عن اللغات الأخرى. قد لا تعجبك بعض النقاط من الأعلى. ولكن، ليس الأمر كما لو أنه لا يمكنك برمجة تطبيقك بدون الميزات المذكورة أعلاه. كل ما عليك فعله هو كتابة 2-3 أسطر أخرى. ولكن على الجانب الإيجابي، فإنه سيجعل التعليمات البرمجية الخاصة بك أكثر وضوحًا ويضيف المزيد من الوضوح إلى التعليمات البرمجية الخاصة بك. التغييرات المذكورة أعلاه تجعل لغة Go مختلفة تمامًا عن اللغات الأخرى، كما أن البرمجة في لغة Go تختلف أيضًا عن اللغات الأخرى. قد لا تعجبك بعض النقاط المذكورة أعلاه. ومع ذلك، لا يمكنك برمجة التطبيق الخاص بك دون الميزات المذكورة أعلاه. كل ما عليك فعله هو كتابة 2-3 أسطر أخرى. ولكن على الجانب الإيجابي، فإنه سيجعل التعليمات البرمجية الخاصة بك أكثر وضوحًا ويضيف المزيد من الوضوح إلى التعليمات البرمجية الخاصة بك.
سهولة قراءة الكود مقابل الكفاءة.
يوضح الرسم البياني أعلاه أن Go فعالة تقريبًا مثل C/C++، مع الحفاظ على بناء جملة التعليمات البرمجية بسيطًا مثل Ruby وPython واللغات الأخرى. وهذا وضع مربح للجانبين لكل من البشر والمعالجات!!! توضح الصورة أعلاه أن Go فعالة تقريبًا مثل C/C++ مع الحفاظ على بناء جملة التعليمات البرمجية بسيطًا مثل Ruby وPython واللغات الأخرى. إنه وضع مربح للجانبين لكل من البشر والمعالجات!
على عكس اللغات الجديدة الأخرى مثل Swift، فإن بناء جملة Go مستقر جدًا. لقد ظل كما هو منذ الإصدار العام الأولي 1.0، في عام 2012. وهذا يجعله متوافقًا مع الإصدارات السابقة. على عكس اللغات الجديدة الأخرى مثل Swift، فإن بناء جملة Go مستقر جدًا. لقد ظل دون تغيير منذ الإصدار العام الأولي للإصدار 1.0 في عام 2012. وهذا يجعله متوافقًا مع الإصدارات السابقة.##### Go مدعوم من Google.(Go مدعوم من Google.)
- أعلم أن هذه ليست ميزة تقنية مباشرة. لكن Go تم تصميمه ودعمه بواسطة Google. تمتلك Google واحدة من أكبر البنى التحتية السحابية في العالم ويتم توسيع نطاقها على نطاق واسع. تم تصميم Go بواسطة Google لحل مشاكلها المتعلقة بدعم قابلية التوسع والفعالية. هذه هي نفس المشكلات التي ستواجهها أثناء إنشاء خوادمك الخاصة. *أعلم أن هذه ليست ميزة تقنية مباشرة. ومع ذلك، تم تصميم Go ودعمه بواسطة Google. تمتلك Google واحدة من أكبر البنى التحتية السحابية في العالم، وهي ضخمة. تم تصميم Go بواسطة Google لحل مشكلات دعم قابلية التوسع والفعالية. هذه هي نفس الأسئلة التي ستواجهها عند إنشاء خادمك الخاص.
- المزيد من ذلك يتم استخدامه أيضًا من قبل بعض الشركات الكبرى مثل Adobe وBBC وIBM وIntel وحتى Medium. (المصدر: https://github.com/golang/go/wiki/GoUsers)
- والأهم من ذلك هو أن Go تستخدمه أيضًا بعض الشركات الكبرى، مثل Adobe وBBC وIBM وIntel وحتى Medium. (المصدر: https://github.com/golang/go/wiki/GoUsers)
الخلاصة:
- على الرغم من أن لغة Go مختلفة تمامًا عن اللغات الشيئية الأخرى، إلا أنها لا تزال نفس الوحش. يوفر لك Go أداءً عاليًا مثل C/C++، ومعالجة متزامنة فائقة الكفاءة مثل Java ومتعة في البرمجة مثل Python/Perl.
- على الرغم من أن لغة Go مختلفة جدًا عن اللغات الشيئية الأخرى، إلا أنها لا تزال نفس الوحش. يمنحك Go أداءً عاليًا مثل C/C++، ومعالجة متزامنة فائقة الكفاءة مثل Java، ومتعة البرمجة مثل Python/Perl.
- إذا لم تكن لديك أي خطط لتعلم لغة Go، سأظل أقول إن الحد الأقصى للأجهزة يضغط علينا، نحن مطوري البرامج، لكتابة تعليمات برمجية فائقة الكفاءة. يحتاج المطور إلى فهم الأجهزة وتحسين برامجه وفقًا لذلك. يمكن تشغيل البرنامج المُحسّن على أجهزة أرخص وأبطأ (مثل أجهزة IOT) ويكون له تأثير أفضل بشكل عام على تجربة المستخدم النهائي.
- إذا لم تكن لديك أي خطط لتعلم لغة Go، فما زلت أقول إن القيود المفروضة على الأجهزة تشكل ضغطًا علينا كمطوري برامج لكتابة تعليمات برمجية فائقة الكفاءة. يحتاج المطورون إلى فهم الأجهزة وتحسين برامجهم وفقًا لذلك. يمكن تشغيل البرامج المُحسّنة على أجهزة أرخص وأبطأ (مثل أجهزة إنترنت الأشياء) ويكون لها بشكل عام تأثير أفضل على تجربة المستخدم النهائي.
نصيحة
كيفية جمع سجلات الأعطال من خلال التطبيق عبر الإنترنت
-
استخدم NSSetUncaughtExceptionHandler، وهي وظيفة جاهزة متوفرة في iOS SDK. يتم استخدام NSSetUncaughtExceptionHandler لمعالجة الاستثناءات. الاستخدام هو كما يلي:
//异常回调方法 void UncaughtExceptionHandler(NSException *exception) { NSArray *arr = [exception callStackSymbols]; NSString *reason = [exception reason]; NSString *name = [exception name]; NSLog(@"%@\n%@\n%@",arr, reason, name); } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);//注册异常回调方法 NSArray *arr = @[@(0), @(1)]; NSLog(@"%@", arr[2]); //模拟越界异常 return YES; }هناك شيء واحد يجب عليك الانتباه إليه عند استخدامه وهو أنه عند وجود العديد من خدمات جمع سجلات الأعطال، على سبيل المثال، قد يكون لدى SDK التابع لجهة خارجية المستخدمة في المشروع خدمة تجميع الأعطال المتكاملة الخاصة بها. عندما يكون هناك العديد من خدمات تجميع الأعطال، ستحدث منافسة، مما يتسبب في عدم عمل بعض خدمات الأعطال بشكل صحيح. إذا قامت أطراف متعددة بتسجيل معالجات الاستثناء من خلال NSSetUncaughtExceptionHandler في نفس الوقت، فإن النهج السلمي هو: سيستخدم المسجل اللاحق NSGetUncaughtExceptionHandler لإخراج المعالج المسجل مسبقًا من قبل الآخرين وعمل نسخة احتياطية منه، وبعد معالجة المعالج الخاص به، يقوم بتسجيل معالجات الأشخاص الآخرين مرة أخرى بوعي، وتمريرهم بطريقة منظمة. نتيجة عدم اجتياز التجاوز القسري هي أن سجل الأعطال المكتوب بواسطة خدمة جمع السجلات المسجلة من قبل سيفقد Last Exception Backtrace والمعلومات الأخرى لأنه لا يمكنه الحصول على NSException. (ملاحظة: برنامج Crash Reporter الذي يأتي مع نظام iOS لا يتأثر) أثناء مرحلة التطوير والاختبار، يمكنك استخدام إطار عمل [خطاف السمكة] (https://github.com/facebook/fishhook) لربط طريقة NSSetUncaughtExceptionHandler، بحيث يمكنك رؤية مكان تعطل عملية تسليم المعالج بوضوح، وتحديد موقع الملوثات البيئية بسرعة. لا يُنصح باستخدام مصحح الأخطاء لإضافة نقاط توقف رمزية للتحقق لأن بعض أطر عمل تجميع الأعطال لا تعمل في حالة تصحيح الأخطاء.
مثال على رمز الكشف:
static NSUncaughtExceptionHandler *g_vaildUncaughtExceptionHandler; static void (*ori_NSSetUncaughtExceptionHandler)( NSUncaughtExceptionHandler * ); void my_NSSetUncaughtExceptionHandler( NSUncaughtExceptionHandler * handler) { g_vaildUncaughtExceptionHandler = NSGetUncaughtExceptionHandler(); if (g_vaildUncaughtExceptionHandler != NULL) { NSLog(@"UncaughtExceptionHandler=%p",g_vaildUncaughtExceptionHandler); } ori_NSSetUncaughtExceptionHandler(handler); NSLog(@"%@",[NSThread callStackSymbols]); g_vaildUncaughtExceptionHandler = NSGetUncaughtExceptionHandler(); NSLog(@"UncaughtExceptionHandler=%p",g_vaildUncaughtExceptionHandler); }الفقرة أعلاه مقتبسة من - الحديث عن iOS Crash Collection Framework: http://www.cocoachina.com/ios/20150701/12301.html
-
باستخدام الإشارة، لا يمكن لـ NSSetUncaughtExceptionHandler التعامل مع كافة الاستثناءات. بالنسبة للأعطال الناجمة عن EXC_BAD_ACCESS، فإن NSSetUncaughtExceptionHandler لا حول له ولا قوة. في هذه الحالة، يجب استخدام الإشارة للتعامل معها. ما هي الإشارة؟
في علوم الكمبيوتر، تعد الإشارات طريقة مقيدة للاتصال بين العمليات في أنظمة التشغيل Unix وأنظمة التشغيل المشابهة لـ Unix وأنظمة التشغيل الأخرى المتوافقة مع POSIX. إنها آلية إعلام غير متزامنة تستخدم لتذكير العملية بحدوث حدث ما. عندما يتم إرسال إشارة إلى عملية ما، يقوم نظام التشغيل بمقاطعة التدفق الطبيعي للتحكم في العملية. في هذا الوقت، سيتم مقاطعة أي عمليات غير ذرية. إذا حددت العملية معالج الإشارة، فسيتم تنفيذه، وإلا فسيتم تنفيذ المعالج الافتراضي.
طريقة الاستخدام هي نفسها المذكورة أعلاه، والتي يتم تحقيقها أيضًا عن طريق تسجيل عمليات الاسترجاعات. 1 سجل
void InstallUncaughtExceptionHandler(void){ //设置信号类型的异常处理 signal(SIGABRT, HandleSignal); signal(SIGILL, HandleSignal); signal(SIGSEGV, HandleSignal); signal(SIGFPE, HandleSignal); signal(SIGBUS, HandleSignal); signal(SIGPIPE, HandleSignal); } void HandleSignal(int signal){ int32_t exceptionCount= OSAtomicIncrement32(&exceptionCount); if (exceptionCount>exceptionMaximum) { return; } NSMutableDictionary *userInfo=[NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:signal] forKey:UncaughtExceptionHandlerSignalKey]; NSArray *callBack=[UncaughtExceptionHandler backtrace]; [userInfo setObject:callBack forKey:UncaughtExceptionHandlerAddressesKey]; UncaughtExceptionHandler *uncaughtExceptionHandler=[[UncaughtExceptionHandler alloc] init]; NSException *signalException=[NSException exceptionWithName:UncaughtExceptionHandlerSignalExceptionName reason:[NSString stringWithFormat:@"Signal %d was raised.",signal] userInfo:userInfo]; [uncaughtExceptionHandler performSelectorOnMainThread:@selector(handleException:) withObject:signalException waitUntilDone:YES]; }لمزيد من التفاصيل، يرجى الرجوع إلى الرمز: https://github.com/dandan2009/Signal
تعد مجموعة iOS Crash موضوعًا كبيرًا. هذه المقالة مقدمة أولية. إذا كنت تريد التعمق أكثر، فأنت بحاجة إلى فهم نظام التشغيل والمعرفة الأخرى. دعونا ندرسها بعمق لاحقًا.
المرجع: الحديث عن إطار عمل مجموعة Crash لنظام التشغيل iOS: http://www.cocoachina.com/ios/20150701/12301.html تحليل أعطال iOS: https://www.jianshu.com/p/1b804426d212、http://www.qidiandasheng.com/2016/04/10/crash-xuebeng/ تحليل سجل أعطال تطبيق iOS: http://www.cocoachina.com/industry/20130725/6677.html التقاط استثناء iOS: http://www.iosxxx.com/blog/2015-08-29-iosyi-chang-bu-huo.html استخدم الإشارة للسماح للتطبيق بالتعطل بهدوء: https://www.cnblogs.com/daxiaxiaohao/p/4466097.html https://github.com/walkdianzi/DSSignalHandlerDemo
شارك
شارك بعض طرق تعلم اللغة الإنجليزية للطلاب الذين لم يجتازوا CET-4، ولديهم أساس ضعيف في اللغة الإنجليزية، ويريدون تحسين لغتهم الإنجليزية: (معظم المحتوى التالي مقتطف، يرجى النقر على الرابط المقابل للحصول على التفاصيل)
-
تطبيق تعلم اللغة الإنجليزية: في الواقع، انتقل إلى متجر التطبيقات وابحث عن الكلمات الرئيسية الإنجليزية والإنجليزية القراءة. هناك العديد من التطبيقات، بعضها مدفوع وبعضها مجاني. يمكنك الاختيار وفقا لاحتياجاتك.
-
موقع تعلم اللغة الإنجليزية https://www.rong-chang.com/ http://www.bbc.co.uk/learningenglish/ https://dictionary.cambridge.org/ http://www.dictionary.com/ المقالات العلمية الانجليزية: https://medium.com/
-
ممارسة النطق: دورة الرمز الصوتي في هيمالايا لاي شيشيونغ4. الفأر في الأذن اليسرى - اقتراح تشين هاو (راجع دورة https://time.geekbang.org/column/intro/48 الخاصة بتشن هاو للحصول على التفاصيل):
- التزم بالكلمات الرئيسية باللغة الإنجليزية في Google بدلاً من البحث باللغة الصينية في Google. 2 فقط باللغة الإنجليزية على جيثب. اكتب تعليقات التعليمات البرمجية باللغة الإنجليزية، واكتب معلومات تنفيذ التعليمات البرمجية، واكتب المشكلات وطلبات السحب باللغة الإنجليزية، واكتب Wiki باللغة الإنجليزية. 3 التزم بمشاهدة مقاطع فيديو مدتها 5 دقائق على اليوتيوب كل يوم. هناك ترجمات الآلة ذات الصلة على موقع يوتيوب. إذا لم يعمل، فقط قم بتشغيل الترجمة.
- الإصرار على استخدام قاموس إنجليزي بدلاً من قاموس صيني. على سبيل المثال: قاموس كامبريدج الإنجليزي (https://dictionary.cambridge.org/) أو Dictionary.com (http://www.dictionary.com/). يمكنك تثبيت ملحق Chrome يسمى Google Dictionary (https://chrome.google.com/webstore/detail/google-dictionary-by-goog/mgijmajocgfcbeboacabfgobmjgjcoja).
- الإصرار على استخدام المواد التعليمية للغة الإنجليزية بدلاً من المواد الصينية. على سبيل المثال: موقع BBC’s Learning English (http://www.bbc.co.uk/learningenglish/)، أو قم بزيارة بعض مواقع ESL، مثل ESL: English as a Second Language (https://www.rong-chang.com/)، الذي يحتوي على بعض الدورات. 6 أنفق المال لأخذ بعض دورات اللغة الإنجليزية عبر الإنترنت والتدرب مع الأجانب باستخدام مقاطع الفيديو.
-
كيف تعلمت اللغة الإنجليزية من tinyfool (كيفية اختراق الاستماع والتحدث والقراءة والكتابة دون اجتياز CET-4) (https://mp.weixin.qq.com/s?__biz=MjM5MjUwNzIyMA==&mid=207623278&idx=1&sn=051a2ecae8f0392631eb0967eefc607a#rd)摘录:) قراءة الوثائق لا تتطلب أن تكون لغتك الإنجليزية جيدة مثل لغتي. فقط ابحث عنه في القاموس. لا يوجد سوى بضع مئات من الكلمات في الوثائق الفنية. لا تحتاج إلى حفظه على الإطلاق. فقط ابحث عنه في كل مرة لا تفهم فيها شيئًا ما. يمكنك إتقانه بشكل أساسي بعد مشاهدته لمدة أسبوع. لقد قيلت هذه الطريقة مرات لا تحصى، وأولئك الذين يرفضون تجربتها سيبقون أميين من الناحية الفنية في اللغة الإنجليزية لبقية حياتهم.
لم أجتاز CET-4… على أي حال، عندما أنظر إلى المستند، إذا واجهت كلمة لا أعرفها، أستخدم ترجمة Google فقط… أتحقق من واجهة برمجة التطبيقات (API) 3 أو 5 مرات ولا يمكنك حتى تذكرها… لا يوجد سوى عدد قليل من الكلمات التقنية…
-
تعلم بجد. عليك أن تشاهد الأعمال الدرامية الأمريكية التي لا تفهمها، عليك أن تستمع إلى البودكاست التي لا تفهمها، عليك أن تقرأ الكتب التي لا تفهمها، عليك أن تجري محادثات مع أجانب لا تستطيع فهمها، وعليك أن تكتب مقالات باللغة الإنجليزية لا يمكنك كتابتها جيدًا.
-
خطوة بخطوة. على الرغم من صعوبة التعلم، إلا أنك ستتقدم بالتأكيد من المستوى السطحي إلى المستوى الأعمق في البداية، بحيث يكون لديك دائمًا شعور بالإنجاز.
-
متابعة أكبر قدر ممكن من المواد. الغرض من الخطوة بخطوة هو عدم الشعور بالإحباط أبدًا، لذلك يمكنك قضاء الكثير من الوقت في مشاهدة المسلسلات التلفزيونية الأمريكية (آلاف الساعات على الأقل)، والاستماع إلى البودكاست (مئات الساعات)، والتحدث هراء للأجانب، وكتابة المقالات.
-
التحسن التدريجي، والتطور ببطء من تعلم اللغة نفسها إلى تعلم الثقافة وتعلم التواصل مع العالم. كلما كانت هذه العملية أعمق، كلما زاد تحفيزك للتعلم.
-
لا تنفد الصبر ولا تتقدم بتهور. كل يوم سيجعلك بيدقًا، ولن تحقق أي شيء بسرعة. لقد استغرق الأمر مني نصف عام حتى أتمكن من مشاهدة المسلسلات التلفزيونية الأمريكية، لكنني ما زلت أشاهدها الآن. لقد استغرق الأمر مني شهرًا للاستماع إلى البودكاست لتحقيق اختراق. استغرق الأمر بضعة أشهر للتحدث وبضعة أشهر للكتابة. يبدو الأمر وكأنه مضيعة للوقت، ولكن بعد بضع سنوات، عندما أرغب في تحسين قدراتي، أشعر أن الوقت الذي أمضيته ليس كثيرًا، وقليلًا جدًا، وهو جدير بالاهتمام للغاية.
-
كن سعيدًا حتى تتمكن من الاستمرار في التعلم مدى الحياة. هل مستواي في اللغة الإنجليزية مرتفع؟ وهو أعلى بكثير من ذي قبل. هل هو مرتفع بما فيه الكفاية؟ ليست عالية بما فيه الكفاية. ولكن ما يمكنني أن أفخر به هو أن تعلم اللغة الإنجليزية الذي أتعلمه أصبح بمثابة التعلم مدى الحياة. لا يهم إذا كنت أعلى مني. معظم الناس لا يتعلمون بنفس سرعة تعلمي، وعلى عكسي الذي يستمر في التعلم، سأتفوق عليك يومًا ما. (بالطبع، الشيء الأكثر أهمية هو أن تسعى دائمًا إلى تحقيق نفسك كل يوم لتتجاوز الأمس.)
-
-
أسئلة وأجوبة من زيهو: ولكن في النهاية، وجدت أن الطريقة الأكثر فعالية هي في الواقع الطريقة الأكثر غباءً - اقرأ المزيد، استمع أكثر، دوّن المزيد من الملاحظات، اكتب أكثر، لخص، تدرب مرارًا وتكرارًا…
في الواقع، لا توجد طرق كثيرة لتعلم اللغة الإنجليزية.
إذا فكرت في الأمر بعناية، ستجد أن ما يسمى بطرق التعلم “الأكثر كفاءة” غالبًا ما تكون الأقل كفاءة. لأنها تمنحك الرضا على المدى القصير فقط.
إن مفتاح التقدم على المدى الطويل هو ما إذا كان بإمكانك المثابرة. المثابرة تعني القيام بنفس الشيء مرارًا وتكرارًا.
وأدركت تدريجياً،
لن أتعلم اللغة الإنجليزية أبدًا،
لأن هناك دائمًا كلمات واستخدامات لا أعرفها،
لكنني على استعداد لمواصلة التعلم حتى اليوم الأخير.
لأن التعلم مدى الحياة هو أروع طريقة لعيش الإنسان.
======== https://www.zhihu.com/question/19853667/answer/134793017 طريقتي بسيطة جدًا وغير ذكية، ويجب أن تناسب الطلاب الذين يحبون حقًا ويريدون حقًا تعلم اللغة الإنجليزية جيدًا.
كلما رأيت شخصًا يحفظ الكلمات بجدية، أشعر أن هذا الشخص لا بد أن يكون غير قادر على تعلم اللغة الإنجليزية جيدًا. كلما زاد عدد الكلمات التي يحفظها، وكلما كان حفظها أكثر جدية، كلما ابتعد عن هدف إتقان اللغة الإنجليزية.
أتذكر عندما كنت في الكلية، كنت أسمع دائمًا بعض زملائي يرددون “التخلي، التخلي، أ، ب، أ، ن، د، أو،” بصوت عالٍ في الممر.
n، a، b، a، n، d، o، n" مرارًا وتكرارًا. كلما قرأتها، أصبحت أكثر شغفًا. أبدأ في قراءتها من الصفحة الأولى من كتاب المفردات. يمكنني قراءة عدة صفحات في ليلة واحدة. أنا متحمس جدًا للتعلم. إنه ليس مضيعة للجهد. ربما سأنسى كل شيء في اليوم التالي بعد أن أعود للنوم ليلاً.
إذا كان طالب في المدرسة الابتدائية أو طالب في المدرسة الإعدادية يحفظ كلمات كهذه لتعلم اللغة الإنجليزية، فأعتقد أنه لا حرج في ذلك. إذا كان الطالب الجامعي الذي يريد إجراء اختبار CET-6 يحفظ كلمات مثل هذه للتحضير للامتحان، فأنا أريد حقًا أن أذهب وأأخذ كتبه وأعطيه جرعة. هل هذا حقا تعلم اللغة الإنجليزية؟ لاحقًا، رأيت أن هؤلاء الأشخاص الذين يحفظون الكلمات لديهم أطراف متطورة نسبيًا، لذلك تخليت عن الفكرة.
ولكن أريد أن أقول، إذا اتبعت طريقة التعلم هذه لتعلم اللغة الإنجليزية، فيجب عليك تعلم اللغة الصينية بهذه الطريقة. بدءًا من الصفحة الأولى من قائمة المفردات، يجب أن تحفظ على النحو التالي:
“واحد، واحد، أفقي، أفقي، أفقي.”
“اثنان، اثنان، أفقي، أفقي، أفقي.”
“ثلاثة، ثلاثة، أفقي، أفقي، أفقي، أفقي، أفقي.”
“أربعة، أربعة، عمودي، طية أفقية، أعسر، أيمن، أفقي، رأسي، طية أفقية، أعسر، أيمن، أفقي، رأسي، طية أفقية، أعسر، أيمن، أفقي.”
. . . . . .
إذا كنت تحفظ “شعرية بيانج بيانج” لشنشي، أعتقد أنك سوف تموت.
دعونا نرى كيفية كتابة كلمة بيانج! هذه ليست حقًا الطريقة التي تتعلم بها اللغة الإنجليزية. لم يسبق لي أن رأيت أي شخص يتعلم اللغة الصينية بهذه الطريقة، ولكن الكثير من الناس يتعلمون اللغة الإنجليزية بهذه الطريقة. على الرغم من اختلاف اللغة الإنجليزية والصينية، إلا أن المبادئ هي نفسها.
فكيف ينبغي لنا أن نتعلم ذلك؟
في الواقع، يمكنك أن تتخيل كيف تتعلم اللغة الصينية، ويمكنك تعلم اللغة الإنجليزية منها.
عندما كنا صغارًا، تعلمنا كتابة الحروف الصينية، وكتابة أحرف جديدة، والتعرف على الكلمات. يمكن مقارنة ذلك بحفظ الكلمات، لكن هذه هي الأشياء التي تفعلها عندما تكون في المدرسة الابتدائية. يمكنك القيام بذلك عندما تتعلم لغة لأول مرة، لأن مؤسستك ضعيفة جدًا في هذه المرحلة، ولا تعرف الكلمات الأكثر شيوعًا، لذا عليك أن تكتب كلمات جديدة وتحفظ الكلمات، لكنك بالفعل في المدرسة الثانوية، وتتعلم اللغة الصينية، وتبدأ في كتابة كلمات جديدة من قائمة المفردات في الكتب المدرسية للمرحلة الابتدائية. ما هو مفهوم كتابة كلمات جديدة؟ أنت في الكلية ويجب عليك إجراء اختبار CET-6. تقضي معظم وقتك في دراسة اللغة الإنجليزية وحفظ الكلمات. لا أعتقد أنه يمكنك تعلم اللغة الإنجليزية جيدًا.
كيف نتعلم اللغة الصينية في المدرسة الثانوية؟
القراءة والقراءة والقراءة مرة أخرى، في اللغة الإنجليزية هي القراءة، والقراءة، والقراءة، والكتابة، والكتابة، والكتابة مرة أخرى، في اللغة الإنجليزية هي الكتابة، والكتابة، والكتابة.
بالتأكيد سوف يدحضني البعض ويقولون، كيف يمكنني القراءة إذا كنت لا أعرف الكلمات؟
يمكنك العثور على بعض المقالات المناسبة لك لقراءتها وقراءتها كثيرًا. أثناء عملية القراءة، بالتأكيد ستواجه العديد من الكلمات التي لا تعرفها. ستواجه أيضًا كلمات غير معروفة أو كلمات لا تفهمها أثناء القراءة باللغة الصينية. هذا أمر طبيعي. ماذا يجب عليك أن تفعل؟ فقط ابحث عنه في القاموس ثم تابع القراءة. مع زيادة حجم قراءتك، ستجد أن المقالات في هذا المستوى تتطلب منك البحث عن كلمات أقل وأقل، وبعد ذلك ستتحول إلى مقالة عالية المستوى لقراءتها. فقط استمر في فعل هذا. عندما يصل حجم قراءتك للغة الإنجليزية إلى مستوى معين، ستزداد مفرداتك بشكل طبيعي.
هل تفهم ما أعنيه؟ لا تحفظ الكلمات، سيكون تذكرها مملاً للغاية. اقرأ كثيرًا، اقرأ كالمجنون. عندما تصل قراءتك إلى مستوى معين، باستثناء الاستماع والتحدث، ستنجح مستواك في اللغة الإنجليزية.
أخشى أن تتدهور لغتي الإنجليزية إذا نسيت القراءة باللغة الإنجليزية يومًا ما، لذلك يكون هاتفي دائمًا في وضع اللغة الإنجليزية. أحيانًا يرغب الأشخاص في استخدام هاتفي لكنهم لا يستطيعون ذلك.
تعلم اللغة الإنجليزية بسيط للغاية وبلا عقل. https://www.zhihu.com/question/26677313/answer/230847636?group_id=892423340218806272
=======
العديد من المحتويات المذكورة أعلاه مقتطفات. لمزيد من التفاصيل، الرجاء الضغط على الرابط المقابل: لتلخيص الطريقة المذكورة أعلاه، لا تخف من اللغة الإنجليزية، ولكن تعلمها بجد. معنى التعلم هنا هو الجرأة على قراءة المقالات الإنجليزية وعدم الاستسلام. عندما تواجه كلمات لا تعرفها، يجب عليك البحث بنشاط في القاموس بدلاً من الاستسلام. لا ينبغي أن تكون مؤلمة. بمجرد أن تشعر أن تعلم اللغة الإنجليزية أمر مؤلم، يجب عليك التوقف عن التعلم. حقًا، يجب أن يكون التأثير سيئًا جدًا في هذا الوقت.
في الواقع، ارتفعت درجتي في اللغة الإنجليزية خلال امتحان القبول بالجامعة من درجة منخفضة 30 إلى أكثر من 100. كيف تحسنت في ذلك الوقت؟ وكان في الواقع القراءة. عندما كنت أقرأ، كنت أبحث عن الكلمات في القاموس ثم أحفظها. إن حفظ الكلمات من خلال قراءة المقالات أفضل بكثير من حفظ الكلمات وحدها. إذا لم يكن الأساس جيدًا، يمكنك البدء بمقالات بسيطة أولاً، ثم زيادة الصعوبة تدريجيًا. بالنسبة للمقالات الفنية، يمكنك في الواقع قراءة معظمها بمساعدة الترجمة من Google. يعتمد ذلك على ما إذا كان بإمكانك الاستمرار أم لا. وطالما يمكنك المثابرة لمدة نصف عام وقراءة ثلاث مقالات باللغة الإنجليزية أسبوعيًا، أعتقد أن قدرتك على اللغة الإنجليزية 读 ستتحسن أيضًا.
=======
What to read next
Want more posts about ARTS?
Posts in the same category are usually the best next step for reading more on this topic.
View same categoryWant to keep following #iOS?
Tags are useful for related tools, specific problems, and similar troubleshooting notes.
View same tagWant to explore another direction?
If you are not sure what to read next, return to the homepage and start from categories, topics, or latest updates.
Back home