Back home

SENI #004

SENI #004

SENI adalah kegiatan yang diprakarsai oleh 由左耳朵耗子--陈皓: Kerjakan setidaknya satu pertanyaan algoritma leetcode setiap minggu, baca dan komentari setidaknya satu artikel teknis berbahasa Inggris, pelajari setidaknya satu keterampilan teknis, dan bagikan artikel yang berisi opini dan pemikiran. (Artinya, Algoritma, Review, Tip, dan Share disebut sebagai SENI) dan bertahan setidaknya selama satu tahun.

SENI 004

Ini adalah artikel keempat. Tulisannya relatif buruk. Saya berharap ini akan menjadi lebih baik dan lebih baik lagi di masa depan.

Pertanyaan algoritma algoritma

pertanyaan algoritma leetcode 321 Buat Angka Maksimum (angka penyambungan maksimum) Mungkinkah: sulit

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]

Ide pemecahan masalah:

  • 1 Tentukan berapa banyak bilangan yang diambil masing-masing dua larik, misalnya k=5, yang dapat dipecah menjadi 1, 4; 2, 3; 3, 2; 4, 1; dan harus lebih kecil dari jumlah angka1 atau angka2. Langkah ini relatif sederhana.

  • 2 Gabungkan subarray yang memenuhi kondisi menjadi satu Langkah ini lebih rumit. Misalnya angka1 = [6, 7, 0]; angka2 = [6, 0, 4], k=5; k dapat dipecah menjadi 2, 3; 3, 2; Sekarang perhatikan kasus 2 dan 3, angka1_1 = [6, 7]; angka2_1 = [6, 0, 4]; Lalu bagaimana cara menggabungkan kedua sub-array ini menjadi jumlah maksimum? Sekilas memang terlihat cukup sederhana. Ambil saja satu dari masing-masing dua larik dan pilih mana yang lebih besar. Tapi ada jebakan di sini. Apa yang harus saya lakukan jika ukurannya sama? Misal angka pertama angka 1_1 dan angka 2_1 sama-sama 6, yang mana yang harus dipilih? Mari kita lihat apa yang berbeda. Jika pertama kali mengambil 6 dari angka2_1, setelah mengambilnya, angka1_1 = [6, 7]; angka2_1 = [0, 4]; Kedua kalinya nums1_1 mengambil 6, nums2_1 hanya dapat mengambil 0, 6 lebih besar dari 0, jadi ambil 6, setelah diambil, nums1_1 = [7]; angka2_1 = [0, 4];, hasil akhirnya adalah [6,6,7,0,4]

    Jika pertama kali mengambil 6 dari angka1_1, setelah mengambilnya, angka1_1 = [7]; angka2_1 = [6,0, 4]; Untuk kedua kalinya, nums1_1 mengambil 7, dan nums2_1 mengambil 6. 7 lebih besar dari 6, jadi diambil 7. Setelah diambil, nums1_1 = []; angka2_1 = [6,0, 4];, hasil akhirnya adalah [6,7,6,0,4]

    Hasilnya berbeda, yang jelas yang kedua benar. Apakah metode penggabungan yang kita gunakan di atas mirip dengan algoritma yang digunakan dalam pengurutan gabungan, tetapi ketika menggabungkan array dalam pengurutan gabungan, kedua array tersebut berurutan, tetapi dua array yang kita gabungkan di sini tidak berurutan, jadi kita akan menemui masalah ini. Kode magang saya adalah sebagai berikut:

  /**
 * 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;
}  

Waktu berjalan di LeetCode adalah 20 ms. Kode berikut adalah kode yang dikirimkan dalam LeetCode dengan waktu berjalan 8 ms. Rasanya mirip dengan implementasi saya. Saya tidak tahu di mana lebih cepat:

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];
}


Ulasan

Artikel ini berasal dari: https://medium.com/exploring-code/why-should-you-learn-go-f607681fad65

Mengapa Anda harus belajar Go? (Mengapa Anda harus belajar Go)

1_vHUiXvBE0p0fLRwFHZuAY

Gambar dari: http://kirael-art.deviantart.com/art/Go-lang-Mascot-458285682

“Go akan menjadi bahasa server masa depan.” — Tobias Lutke, Shopify

Dalam beberapa tahun terakhir, ada kebangkitan bahasa pemrograman baru: Go atau GoLang. Tidak ada yang membuat seorang pengembang tergila-gila dengan bahasa pemrograman baru, bukan? Jadi, saya mulai belajar Go sebelum 4 hingga 5 bulan dan di sini saya akan memberi tahu Anda mengapa Anda juga harus mempelajari bahasa baru ini.

Dalam beberapa tahun terakhir, muncul bahasa pemrograman baru: Go atau GoLang. Tidak ada yang membuat pengembang gila kecuali bahasa pemrograman baru, bukan? Jadi, saya mulai belajar Go 4 hingga 5 bulan yang lalu dan di sini saya akan memberi tahu Anda mengapa Anda juga harus mempelajari bahasa baru ini.

Saya tidak akan mengajari Anda, bagaimana Anda bisa menulis “Halo Dunia!!” dalam artikel ini. Ada banyak artikel online lainnya untuk itu. I am going the explain current stage of computer hardware-software and why we need new language like Go? Karena kalau tidak ada masalah, maka kita tidak perlu solusinya kan? Pada artikel ini, saya tidak akan mengajari Anda cara menulis “Halo Dunia!!”. Sudah banyak artikel serupa di Internet. “Saya akan menjelaskan sekarang mengapa kita memerlukan bahasa baru seperti Go pada tahap perangkat keras dan perangkat lunak komputer saat ini?” Karena kalau tidak ada masalah, maka kita tidak butuh solusinya kan?

#####Batasan perangkat keras: Hukum Moore gagal. Prosesor Pentium 4 pertama dengan kecepatan clock 3.0GHz diperkenalkan pada tahun 2004 oleh Intel. Saat ini, Mackbook Pro 2016 saya memiliki kecepatan clock 2,9GHz. Jadi, hampir dalam satu dekade, tidak banyak keuntungan yang didapat dari kekuatan pemrosesan mentah. Anda dapat melihat perbandingan peningkatan kekuatan pemrosesan dengan waktu pada grafik di bawah ini.

摩尔定律失效了 Intel meluncurkan prosesor Pentium 4 pertama dengan kecepatan clock 3,0GHz pada tahun 2004. Saat ini, Mackbook Pro 2016 saya memiliki kecepatan clock 2,9GHz. Oleh karena itu, selama hampir sepuluh tahun, kekuatan pemrosesan mentah tidak banyak meningkat. Anda dapat melihat peningkatan kekuatan pemrosesan versus waktu pada grafik di bawah.

Dari grafik di atas Anda dapat melihat bahwa kinerja single-thread dan frekuensi prosesor tetap stabil selama hampir satu dekade. Jika Anda berpikir menambahkan lebih banyak transistor adalah solusinya, Anda salah. Hal ini karena pada skala yang lebih kecil, beberapa sifat kuantum mulai muncul (seperti penerowongan) dan karena sebenarnya memerlukan biaya lebih besar untuk memasang lebih banyak transistor (mengapa?) dan jumlah transistor yang dapat Anda tambahkan per dolar mulai berkurang.

Seperti yang Anda lihat dari grafik di atas, kinerja single-thread dan frekuensi prosesor tetap stabil selama hampir satu dekade. Jika Anda berpikir menambahkan lebih banyak transistor adalah solusinya, Anda salah. Hal ini karena pada skala yang lebih kecil, beberapa sifat kuantum mulai muncul (seperti penerowongan), dan karena memasang lebih banyak transistor sebenarnya memerlukan biaya lebih banyak mengapa, dan jumlah transistor yang dapat ditambahkan per dolar mulai berkurang.

Nah, untuk mengatasi permasalahan di atas, Jadi solusi dari permasalahan di atas adalah sebagai berikut,

  • Produsen mulai menambahkan lebih banyak inti ke prosesor. Saat ini kami memiliki CPU quad-core dan octa-core.
  • Produsen mulai menambahkan lebih banyak inti pada prosesor. Saat ini kami memiliki CPU quad-core dan delapan-core.
  • Kami juga memperkenalkan hyper-threading.
  • Kami juga memperkenalkan Hyper-Threading.
  • Menambahkan lebih banyak cache ke prosesor untuk meningkatkan kinerja.
  • Menambahkan lebih banyak cache ke prosesor untuk meningkatkan kinerja.

Namun solusi di atas juga memiliki keterbatasannya sendiri. Kita tidak dapat menambahkan lebih banyak cache ke prosesor untuk meningkatkan kinerja karena cache memiliki batas fisik: semakin besar cache, semakin lambat. Menambahkan lebih banyak inti ke prosesor juga memerlukan biaya. Selain itu, hal ini tidak dapat dilakukan tanpa batas waktu. Prosesor multi-core ini dapat menjalankan banyak thread secara bersamaan dan hal ini menghadirkan konkurensi. Kita akan membahasnya nanti.

Namun solusi di atas juga memiliki keterbatasannya masing-masing. Kami tidak dapat menambahkan lebih banyak cache ke prosesor untuk meningkatkan kinerja karena cache memiliki keterbatasan fisik: semakin besar cache, semakin lambat kinerjanya. Menambahkan lebih banyak inti ke prosesor juga memerlukan biaya. Dan, skalanya tidak terbatas. Prosesor multi-core ini dapat menjalankan beberapa thread secara bersamaan, sehingga menghasilkan konkurensi pada gambar. Kita akan membahasnya nanti.Jadi, jika kita tidak dapat mengandalkan peningkatan perangkat keras, satu-satunya cara adalah menggunakan perangkat lunak yang lebih efisien untuk meningkatkan kinerja. Namun sayangnya, bahasa pemrograman modern tidak begitu efisien. Oleh karena itu, jika kita tidak dapat mengandalkan perbaikan perangkat keras, satu-satunya jalan keluar adalah meningkatkan kinerja perangkat lunak. Namun sayangnya, bahasa pemrograman modern tidak terlalu efisien.

“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 punya goroutine!!

Seperti yang telah kita bahas di atas, produsen perangkat keras menambahkan lebih banyak inti ke prosesor untuk meningkatkan kinerja. Semua pusat data berjalan pada prosesor tersebut dan kita memperkirakan akan terjadi peningkatan jumlah inti di tahun-tahun mendatang. Lebih dari itu, aplikasi saat ini menggunakan beberapa layanan mikro untuk memelihara koneksi database, antrian pesan, dan memelihara cache. Jadi, perangkat lunak yang kami kembangkan dan bahasa pemrograman harus mendukung konkurensi dengan mudah dan dapat diskalakan dengan jumlah inti yang lebih banyak.

Seperti disebutkan di atas, produsen perangkat keras menambahkan lebih banyak inti ke prosesor untuk meningkatkan kinerja. Semua pusat data dijalankan dengan prosesor ini, dan kami memperkirakan jumlah inti akan meningkat di tahun-tahun mendatang. Terlebih lagi, aplikasi saat ini menggunakan beberapa layanan mikro untuk memelihara koneksi database, antrian pesan, dan memelihara cache. Oleh karena itu, perangkat lunak dan bahasa pemrograman yang kami kembangkan harus mendukung konkurensi dengan mudah, dan harus dapat diskalakan seiring dengan bertambahnya jumlah inti.

Namun, sebagian besar bahasa pemrograman modern (seperti Java, Python, dll.) berasal dari lingkungan single threaded tahun 90an. Sebagian besar bahasa pemrograman tersebut mendukung multi-threading. Namun masalah sebenarnya muncul pada eksekusi bersamaan, penguncian threading, kondisi balapan, dan kebuntuan. Hal-hal tersebut menyulitkan pembuatan aplikasi multi-threading dalam bahasa tersebut.

Namun, sebagian besar bahasa pemrograman modern seperti Java, Python, dll. berasal dari lingkungan single-threaded tahun 90an. Sebagian besar bahasa pemrograman mendukung multithreading. Namun masalah sebenarnya adalah eksekusi bersamaan, penguncian thread, kondisi balapan, dan kebuntuan. Hal-hal ini menyulitkan pembuatan aplikasi multi-thread pada bahasa-bahasa tersebut.

Misalnya, membuat thread baru di Java bukanlah memori yang efisien. Karena setiap thread menghabiskan sekitar 1MB ukuran heap memori dan pada akhirnya jika Anda mulai memutar ribuan thread, hal tersebut akan memberikan tekanan yang luar biasa pada heap dan akan menyebabkan shutdown karena kehabisan memori. Selain itu, jika Anda ingin berkomunikasi antara dua thread atau lebih, itu sangat sulit. Misalnya, membuat thread baru di Java tidak efisien dalam memori. Karena setiap thread menghabiskan sekitar 1MB ukuran heap memori, dan pada akhirnya jika Anda mulai memutar ribuan thread, hal tersebut akan memberikan tekanan besar pada heap dan menyebabkan penghentian karena memori tidak mencukupi. Selain itu, jika Anda ingin berkomunikasi antara dua thread atau lebih, itu sangat sulit.

Di sisi lain, Go dirilis pada tahun 2009 ketika prosesor multi-core sudah tersedia. Itu sebabnya Go dibuat dengan mempertimbangkan konkurensi. Go memiliki goroutine, bukan thread. Mereka menghabiskan hampir 2KB memori dari heap. Jadi, Anda dapat memutar jutaan goroutine kapan saja. Go, sebaliknya, dirilis pada tahun 2009, ketika prosesor multi-core sudah tersedia. Inilah sebabnya Go dibangun dengan mempertimbangkan konkurensi. Go memiliki goroutine, bukan thread. Mereka mengkonsumsi sekitar 2KB memori dari heap. Jadi, Anda dapat membuat jutaan goroutine kapan saja. Bagaimana cara kerja Goroutine? Perancis: http://golangtutorials.blogspot.in/2011/06/goroutines.html

Manfaat lainnya adalah:

  • Goroutine memiliki tumpukan tersegmentasi yang dapat dikembangkan. Artinya, mereka akan menggunakan lebih banyak memori hanya bila diperlukan.
  • Goroutine memiliki tumpukan tersegmentasi yang dapat dikembangkan. Ini berarti mereka hanya menggunakan lebih banyak memori bila diperlukan.
  • Goroutine memiliki waktu startup yang lebih cepat dibandingkan thread.
  • Goroutine memiliki waktu startup yang lebih cepat dibandingkan thread.
  • Goroutine dilengkapi dengan primitif bawaan untuk berkomunikasi dengan aman satu sama lain (saluran).
  • Goroutine hadir dengan primitif bawaan untuk berkomunikasi dengan aman di antara mereka (saluran).
  • Goroutine memungkinkan Anda menghindari penggunaan penguncian mutex saat berbagi struktur data.
  • Goroutine memungkinkan Anda menghindari penggunaan kunci mutex saat berbagi struktur data.
  • Selain itu, goroutine dan thread OS tidak memiliki pemetaan 1:1. Sebuah goroutine dapat berjalan di banyak thread. Goroutine dimultipleks menjadi sejumlah kecil thread OS.
  • Selain itu, tidak ada pemetaan 1:1 antara goroutine dan thread OS. Sebuah goroutine dapat berjalan di banyak thread. Goroutine dimultipleks menjadi sejumlah kecil thread OS.
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.

Semua poin di atas, menjadikan Go sangat kuat untuk menangani konkurensi seperti Java, C, dan C++ sekaligus menjaga kode eksekusi konkurensi tetap lurus dan indah seperti Erlang. Poin di atas menjadikan Go sangat kuat. Ini bisa seefisien Java, C dan C++ ketika menangani operasi bersamaan, dan seindah Erlang.

Go membawa kebaikan bagi kedua dunia. Mudah untuk menulis secara bersamaan dan efisien untuk mengelola konkurensi Jadilah yang terbaik di kedua dunia. Mudah untuk menulis konkurensi dan manajemen konkurensi yang efisien

#####Go berjalan langsung pada perangkat keras yang mendasarinya (Go berjalan langsung pada perangkat keras yang mendasarinya.). Salah satu manfaat terbesar menggunakan C, C++ dibandingkan bahasa modern tingkat tinggi lainnya seperti Java/Python adalah kinerjanya. Karena C/C++ dikompilasi dan tidak diinterpretasikan. Salah satu manfaat terbesar menggunakan C, C++ adalah kinerjanya dibandingkan dengan bahasa tingkat tinggi modern lainnya seperti Java/Python. Karena C/C++ dikompilasi bukan ditafsirkan.Prosesor memahami biner. Umumnya, ketika Anda membangun aplikasi menggunakan Java atau bahasa berbasis JVM lainnya saat Anda mengkompilasi proyek Anda, aplikasi tersebut akan mengkompilasi kode yang dapat dibaca manusia menjadi kode byte yang dapat dipahami oleh JVM atau mesin virtual lain yang berjalan di atas OS yang mendasarinya. Saat dieksekusi, VM menafsirkan bytecode tersebut dan mengonversinya menjadi biner yang dapat dipahami oleh prosesor. Prosesor memahami file biner. Biasanya ketika membangun aplikasi menggunakan Java atau bahasa berbasis JVM lainnya saat mengkompilasi proyek, aplikasi tersebut mengkompilasi kode yang dapat dibaca manusia menjadi kode byte yang dapat dipahami oleh JVM atau mesin virtual lain yang berjalan di atas sistem operasi yang mendasarinya. Saat dijalankan, VM menafsirkan bytecode ini dan mengubahnya menjadi biner yang dapat dipahami oleh prosesor

Langkah-langkah eksekusi untuk bahasa berbasis VM

Sementara di sisi lain, C/C++ tidak dijalankan pada VM dan menghilangkan satu langkah dari siklus eksekusi dan meningkatkan kinerja. Itu secara langsung mengkompilasi kode yang dapat dibaca manusia ke biner. C/C++ di sisi lain tidak dijalankan di VM dan menghapus langkah ini dari siklus eksekusi dan meningkatkan kinerja. Ini mengkompilasi kode yang dapat dibaca manusia langsung ke dalam biner.

Namun, membebaskan dan mengalokasikan variabel dalam bahasa-bahasa tersebut sangat menyusahkan. Sementara sebagian besar bahasa pemrograman menangani alokasi dan penghapusan objek menggunakan algoritma Pengumpul Sampah atau Penghitungan Referensi. Namun, membebaskan dan menugaskan variabel sangat menyusahkan dalam bahasa-bahasa ini. Sementara sebagian besar bahasa pemrograman menggunakan algoritma pengumpul sampah atau penghitungan referensi untuk menangani pembuatan dan pelepasan objek.

Go menghadirkan yang terbaik dari kedua dunia. Seperti bahasa tingkat rendah seperti C/C++, Go adalah bahasa yang dikompilasi. Itu berarti kinerjanya hampir mendekati bahasa tingkat rendah. Itu juga menggunakan pengumpulan sampah untuk mengalokasikan dan menghapus objek. Jadi, tidak ada lagi pernyataan malloc() dan free()!!! Dingin!!! Go menghadirkan yang terbaik dari kedua dunia. Seperti bahasa tingkat rendah seperti C/C++, Go adalah bahasa yang dikompilasi. Ini berarti kinerjanya hampir mendekati bahasa tingkat rendah. Itu juga menggunakan pengumpulan sampah untuk mengalokasikan dan menghapus objek. Jadi, tidak ada lagi pernyataan malloc() dan free()! Dingin! ! !

#####Kode yang ditulis di Go mudah dipelihara (kode yang ditulis di Go mudah dipelihara). Izinkan saya memberi tahu Anda satu hal. Go tidak memiliki sintaks pemrograman yang gila seperti bahasa lain. Ini memiliki sintaks yang sangat rapi dan bersih. Biarkan aku memberitahumu sesuatu. Go tidak memiliki sintaks pemrograman yang gila seperti bahasa lain. Ini memiliki sintaks yang sangat rapi dan jelas.

Para desainer Go di Google memikirkan hal ini ketika mereka menciptakan bahasa tersebut. Karena Google memiliki basis kode yang sangat besar dan ribuan pengembang sedang mengerjakan basis kode yang sama, kode harus mudah dipahami oleh pengembang lain dan satu segmen kode harus memiliki efek samping minimal pada segmen kode lainnya. Itu akan membuat kode mudah dipelihara dan dimodifikasi. Para desainer Go memikirkan hal ini ketika mereka menciptakan bahasa tersebut di Google. Karena Google memiliki basis kode yang sangat besar dengan ribuan pengembang yang mengerjakan basis kode yang sama, kode tersebut harus mudah dipahami oleh pengembang lain dan satu bagian kode harus memiliki efek samping minimal pada bagian kode lainnya. Ini akan membuat kode dapat dipelihara dan mudah dimodifikasi.

Go sengaja menghilangkan banyak fitur bahasa OOP modern. Go sengaja menghilangkan banyak fitur bahasa OOP modern.

  • Tidak ada kelas. Setiap barang dibagi menjadi paket saja. Go hanya memiliki struct, bukan kelas.
  • Tidak ada kelas. Semuanya dibagi menjadi paket-paket saja. Go hanya memiliki struct, bukan kelas. *Does not support inheritance. Itu akan membuat kode mudah dimodifikasi. Dalam bahasa lain seperti Java/Python, jika kelas ABC mewarisi kelas XYZ dan Anda membuat beberapa perubahan di kelas XYZ, hal itu mungkin menimbulkan beberapa efek samping di kelas lain yang mewarisi XYZ. Dengan menghapus warisan, Go juga memudahkan untuk memahami kodenya (karena tidak ada kelas super yang harus dilihat sambil melihat sepotong kode). *不支持继承. Ini akan membuat kode mudah untuk dimodifikasi. Dalam bahasa lain seperti Java/Python, jika kelas ABC mewarisi kelas XYZ dan Anda membuat beberapa perubahan di kelas XYZ, hal ini mungkin menimbulkan beberapa efek samping di kelas lain yang mewarisi XYZ. Dengan menghapus warisan, Go mempermudah pemahaman kode (karena tidak ada superkelas yang perlu dilihat saat melihat sepotong kode).
  • Tidak ada konstruktor.
  • Tidak ada anotasi.
  • Tidak ada obat generik.
  • Tidak ada pengecualian.

Perubahan di atas membuat Go sangat berbeda dari bahasa lain dan membuat pemrograman di Go berbeda dari bahasa lain. Anda mungkin tidak menyukai beberapa poin dari atas. Namun, bukan berarti Anda tidak dapat membuat kode aplikasi Anda tanpa fitur-fitur di atas. Yang harus Anda lakukan hanyalah menulis 2–3 baris lagi. Namun sisi positifnya, ini akan membuat kode Anda lebih bersih dan menambah kejelasan pada kode Anda. Perubahan di atas membuat Go sangat berbeda dari bahasa lain, dan pemrograman di Go juga berbeda dari bahasa lain. Anda mungkin tidak menyukai beberapa poin di atas. Namun, Anda tidak dapat membuat kode aplikasi Anda tanpa fitur di atas. Yang harus Anda lakukan adalah menulis 2-3 baris lagi. Namun sisi positifnya, ini akan membuat kode Anda lebih bersih dan menambah kejelasan pada kode Anda.

Keterbacaan kode vs. Efisiensi.

Grafik di atas menunjukkan bahwa Go hampir sama efisiennya dengan C/C++, sekaligus menjaga sintaksis kode tetap sederhana seperti Ruby, Python, dan bahasa lainnya. Itu adalah situasi win-win bagi manusia dan prosesor!!! Gambar di atas menunjukkan bahwa Go hampir sama efisiennya dengan C/C++ dengan tetap menjaga sintaks kode tetap sederhana seperti Ruby, Python, dan bahasa lainnya. Ini adalah situasi yang saling menguntungkan bagi manusia dan prosesor!

Tidak seperti bahasa baru lainnya seperti Swift, sintaksis Go sangat stabil. Itu tetap sama sejak rilis publik awal 1.0, pada tahun 2012. Itu membuatnya kompatibel ke belakang. Tidak seperti bahasa baru lainnya seperti Swift, sintaksis Go sangat stabil. Ini tetap tidak berubah sejak rilis publik pertama 1.0 pada tahun 2012. Hal ini membuatnya kompatibel.##### Go didukung oleh Google.(Go didukung oleh Google.)

  • Saya tahu ini bukan keuntungan teknis langsung. Namun, Go dirancang dan didukung oleh Google. Google memiliki salah satu infrastruktur cloud terbesar di dunia dan skalanya ditingkatkan secara besar-besaran. Go dirancang oleh Google untuk memecahkan masalah mereka dalam mendukung skalabilitas dan efektivitas. Itu adalah masalah yang sama yang akan Anda hadapi saat membuat server Anda sendiri. *Saya tahu ini bukan keuntungan teknis langsung. Namun, Go dirancang dan didukung oleh Google. Google memiliki salah satu infrastruktur cloud terbesar di dunia dan sangat besar. Go dirancang oleh Google untuk memecahkan masalah dalam mendukung skalabilitas dan efektivitas. Ini adalah pertanyaan yang sama yang akan Anda hadapi saat membuat server Anda sendiri.
  • Lebih dari itu Go juga digunakan oleh beberapa perusahaan besar seperti Adobe, BBC, IBM, Intel dan bahkan Medium.(Sumber: https://github.com/golang/go/wiki/GoUsers)
  • Yang lebih penting lagi Go juga digunakan oleh beberapa perusahaan besar, seperti Adobe, BBC, IBM, Intel bahkan Medium. (Sumber: https://github.com/golang/go/wiki/GoUsers)
Kesimpulan:
  • Meskipun Go sangat berbeda dari bahasa berorientasi objek lainnya, Go tetap sama. Go memberi Anda kinerja tinggi seperti C/C++, penanganan konkurensi super efisien seperti Java, dan kesenangan membuat kode seperti Python/Perl.
  • Meskipun Go sangat berbeda dari bahasa berorientasi objek lainnya, Go tetap sama. Go memberi Anda performa tinggi seperti C/C++, pemrosesan konkurensi ultra-efisien seperti Java, dan kesenangan coding seperti Python/Perl.
  • Jika Anda tidak memiliki rencana untuk mempelajari Go, menurut saya batasan perangkat keras memberikan tekanan kepada kami, pengembang perangkat lunak, untuk menulis kode yang sangat efisien. Pengembang perlu memahami perangkat keras dan mengoptimalkan programnya. Perangkat lunak yang dioptimalkan dapat berjalan pada perangkat keras yang lebih murah dan lebih lambat (seperti perangkat IOT) dan secara keseluruhan memberikan dampak yang lebih baik pada pengalaman pengguna akhir.
  • Jika Anda tidak memiliki rencana untuk mempelajari Go, menurut saya keterbatasan perangkat keras memberi tekanan pada kami sebagai pengembang perangkat lunak untuk menulis kode yang sangat efisien. Pengembang perlu memahami perangkat keras dan mengoptimalkan program mereka. Perangkat lunak yang dioptimalkan dapat berjalan pada perangkat keras yang lebih murah dan lebih lambat (seperti perangkat IoT) dan secara keseluruhan memiliki dampak yang lebih baik terhadap pengalaman pengguna akhir.

Kiat

Cara mengumpulkan log kerusakan melalui aplikasi online

  1. Gunakan NSSetUncaughtExceptionHandler, fungsi siap pakai yang disediakan di iOS SDK. NSSetUncaughtExceptionHandler digunakan untuk penanganan pengecualian. Penggunaannya adalah sebagai berikut:

    //异常回调方法
    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;
    }
    

    Satu hal yang perlu Anda perhatikan saat menggunakannya adalah ketika beberapa layanan pengumpulan log kerusakan hidup berdampingan, misalnya, SDK pihak ketiga yang digunakan dalam proyek mungkin memiliki layanan pengumpulan kerusakan terintegrasi sendiri. Ketika ada beberapa layanan pengumpulan Crash, akan terjadi persaingan sehingga menyebabkan beberapa layanan Crash tidak berfungsi dengan baik. Jika beberapa pihak mendaftarkan penangan pengecualian melalui NSSetUncaughtExceptionHandler pada saat yang sama, pendekatan damai adalah: pendaftar berikutnya akan menggunakan NSGetUncaughtExceptionHandler untuk mengambil dan mencadangkan penangan yang sebelumnya didaftarkan oleh orang lain, dan setelah penangannya sendiri diproses, secara sadar mendaftarkan kembali penangan orang lain, dan menyebarkannya secara tertib. Konsekuensi dari tidak lolosnya force override adalah Crash log yang ditulis oleh layanan pengumpulan log yang didaftarkan sebelumnya akan kehilangan Last Exception Backtrace dan informasi lainnya karena tidak bisa mendapatkan NSException. (P.S. Crash Reporter yang disertakan dengan sistem iOS tidak terpengaruh) Selama fase pengembangan dan pengujian, Anda dapat menggunakan kerangka kerja fishhook untuk mengaitkan metode NSSetUncaughtExceptionHandler, sehingga Anda dapat dengan jelas melihat di mana proses pengiriman handler rusak, dan dengan cepat menemukan lokasi pencemar lingkungan. Tidak disarankan menggunakan debugger untuk menambahkan breakpoint simbolis untuk memeriksa karena beberapa kerangka pengumpulan kerusakan tidak berfungsi dalam keadaan debugging.

    Contoh kode deteksi:

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

    Paragraf di atas dikutip dari - Berbicara tentang iOS Crash Collection Framework: http://www.cocoachina.com/ios/20150701/12301.html

  2. Menggunakan sinyal, NSSetUncaughtExceptionHandler tidak dapat menangani semua pengecualian. Untuk kerusakan yang disebabkan oleh EXC_BAD_ACCESS, NSSetUncaughtExceptionHandler tidak berdaya. Dalam hal ini, sinyal perlu digunakan untuk menanganinya. Apa itu Sinyal?

    Dalam ilmu komputer, sinyal adalah metode komunikasi antar-proses terbatas di Unix, mirip Unix, dan sistem operasi lain yang mendukung POSIX. Ini adalah mekanisme pemberitahuan asinkron yang digunakan untuk mengingatkan proses bahwa suatu peristiwa telah terjadi. Ketika sinyal dikirim ke suatu proses, sistem operasi mengganggu aliran normal kendali proses. Pada saat ini, segala operasi non-atom akan terganggu. Jika proses mendefinisikan penangan sinyal, maka akan dieksekusi, jika tidak, penangan default akan dieksekusi.

    Cara penggunaannya sama seperti di atas, yang juga dilakukan dengan mendaftarkan callback. 1 Daftar

    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];
    }
    

    Untuk detailnya silakan lihat kode: https://github.com/dandan2009/Signal

    Koleksi iOS Crash adalah topik besar. Artikel ini adalah pengantar awal. Jika ingin mendalami lebih dalam, Anda perlu memahami sistem operasi dan ilmu lainnya. Mari kita pelajari secara mendalam nanti.

    Referensi: Berbicara tentang kerangka koleksi iOS Crash: http://www.cocoachina.com/ios/20150701/12301.html Analisis kerusakan iOS: https://www.jianshu.com/p/1b804426d212、http://www.qidiandasheng.com/2016/04/10/crash-xuebeng/ Analisis log kerusakan aplikasi iOS: http://www.cocoachina.com/industry/20130725/6677.html Pengambilan pengecualian iOS: http://www.iosxxx.com/blog/2015-08-29-iosyi-chang-bu-huo.html Gunakan sinyal untuk memungkinkan aplikasi mogok dengan tenang: https://www.cnblogs.com/daxiaxiaohao/p/4466097.html https://github.com/walkdianzi/DSSignalHandlerDemo

Bagikan

Bagikan beberapa metode pembelajaran bahasa Inggris untuk siswa yang belum lulus CET-4, memiliki dasar bahasa Inggris yang buruk, dan ingin meningkatkan bahasa Inggris mereka: (Sebagian besar konten berikut dikutip, silakan klik tautan yang sesuai untuk detailnya)

  1. Aplikasi Belajar Bahasa Inggris: Bahkan, buka App Store dan cari kata kunci Bahasa Inggris dan Bacaan Bahasa Inggris. Ada banyak APP, ada yang berbayar dan ada pula yang gratis. Anda dapat memilih sesuai dengan kebutuhan Anda.

  2. Situs web pembelajaran bahasa Inggris https://www.rong-chang.com/ http://www.bbc.co.uk/learningenglish/ https://dictionary.cambridge.org/ http://www.dictionary.com/ Artikel ilmiah berbahasa Inggris: https://medium.com/

  3. Latihan pengucapan: Kursus Simbol Fonetik Himalaya Lai Shixiong4. Mouse di telinga kiri–saran Chen Hao (lihat kursus https://time.geekbang.org/column/intro/48 Chen Hao untuk detailnya):

    1. Gunakan kata kunci Google berbahasa Inggris daripada mencari bahasa Mandarin di Google. 2 Hanya dalam bahasa Inggris di GitHub. Tulis komentar kode dalam bahasa Inggris, tulis informasi Code Commit, tulis Masalah dan Permintaan Tarik dalam bahasa Inggris, dan tulis Wiki dalam bahasa Inggris. 3 Berkomitmen untuk menonton video 5 menit di YouTube setiap hari. Ada subtitle mesin terkait di YouTube. Jika tidak berhasil, aktifkan saja subtitlenya.
    2. Bersikeras menggunakan kamus bahasa Inggris daripada kamus bahasa Mandarin. Misalnya: Kamus Bahasa Inggris Cambridge (https://dictionary.cambridge.org/) atau Dictionary.com (http://www.dictionary.com/). Anda dapat memasang ekstensi Chrome yang disebut Kamus Google (https://chrome.google.com/webstore/detail/google-dictionary-by-goog/mgijmajocgfcbeboacabfgobmjgjcoja).
    3. Bersikeras menggunakan bahan ajar bahasa Inggris dibandingkan bahan ajar bahasa Mandarin. Misalnya: BBC’s Learning English (http://www.bbc.co.uk/learningenglish/), atau kunjungi beberapa situs web ESL, seperti ESL: English as a Second Language (https://www.rong-chang.com/), yang memiliki beberapa kursus. 6 Habiskan uang untuk mengikuti kursus bahasa Inggris online dan berlatih dengan orang asing menggunakan video.
  4. Bagaimana saya belajar bahasa Inggris dari tinyfool (Cara menerobos mendengarkan, berbicara, membaca dan menulis tanpa lulus CET-4) (https://mp.weixin.qq.com/s?__biz=MjM5MjUwNzIyMA==&mid=207623278&idx=1&sn=051a2ecae8f0392631eb0967eefc607a#rd)摘录: Membaca dokumentasi tidak mengharuskan bahasa Inggris Anda sebaik saya. Cari saja di kamus. Hanya ada beberapa ratus kata dalam dokumentasi teknis. Anda tidak perlu menghafalnya sama sekali. Cari saja setiap kali Anda tidak memahami sesuatu. Anda pada dasarnya bisa menguasainya setelah menontonnya selama seminggu. Metode ini telah diucapkan berkali-kali, dan mereka yang menolak mencobanya secara teknis akan tetap buta huruf dalam bahasa Inggris selama sisa hidup mereka.

    Saya belum lulus CET-4… Lagi pula, ketika saya melihat dokumen, jika saya menemukan kata yang saya tidak tahu, saya hanya menggunakan Google Translate… Saya memeriksa API 3 atau 5 kali dan Anda bahkan tidak dapat mengingatnya… Hanya ada beberapa kata teknis…

    1. Belajar dengan giat. Anda harus menonton drama Amerika yang tidak Anda pahami, Anda harus mendengarkan podcast yang tidak Anda pahami, Anda harus membaca buku yang tidak Anda pahami, Anda harus melakukan percakapan dengan orang asing yang tidak Anda mengerti, dan Anda harus menulis artikel berbahasa Inggris yang tidak bisa Anda tulis dengan baik.

    2. Langkah demi langkah. Walaupun belajarnya sulit, namun Anda pasti akan maju dari yang dangkal ke yang lebih dalam di awal, sehingga Anda selalu memiliki rasa pencapaian.

    3. Kejar jumlah materi yang maksimal. Tujuan dari langkah demi langkah adalah agar tidak pernah merasa frustasi, sehingga Anda dapat menghabiskan banyak waktu menonton serial TV Amerika (minimal ribuan jam), mendengarkan podcast (ratusan jam), berbicara omong kosong dengan orang asing, dan menulis artikel.

    4. Secara bertahap meningkat, dan berkembang secara perlahan dari pembelajaran bahasa itu sendiri ke pembelajaran budaya dan pembelajaran berkomunikasi dengan dunia. Semakin dalam proses ini, semakin termotivasi Anda untuk belajar.

    5. Jangan tidak sabar dan jangan terburu-buru maju. Setiap hari akan menjadikan Anda pion, dan Anda tidak akan mencapai apa pun dengan cepat. Butuh waktu setengah tahun bagi saya untuk berhasil menonton serial TV Amerika, tetapi saya masih menontonnya sampai sekarang. Saya membutuhkan waktu sebulan untuk mendengarkan Podcast untuk mendapatkan terobosan. Butuh beberapa bulan untuk berbicara dan beberapa bulan untuk menulis. Kedengarannya seperti membuang-buang waktu saja, namun setelah beberapa tahun, ketika saya ingin meningkatkan kemampuan saya, saya merasa waktu yang saya habiskan tidak banyak, sangat sedikit, dan sangat berharga.

    6. Tetap bahagia, agar bisa terus belajar sepanjang hayat. Apakah tingkat bahasa Inggris saya tinggi? Ini jauh lebih tinggi dari sebelumnya. Apakah cukup tinggi? Tidak cukup tinggi. Namun yang bisa saya banggakan adalah sekarang pembelajaran bahasa Inggris saya adalah pembelajaran seumur hidup. Tidak masalah jika kamu lebih tinggi dariku. Kebanyakan orang tidak belajar secepat saya, dan tidak seperti saya yang terus belajar, suatu hari nanti saya akan melampaui Anda. (Tentu saja, hal yang paling penting adalah selalu mengejar diri sendiri setiap hari untuk melampaui hari kemarin.)

  5. Tanya Jawab dari Zhihu: Namun pada akhirnya, saya menemukan bahwa metode yang paling efektif sebenarnya adalah metode yang paling bodoh - membaca lebih banyak, mendengarkan lebih banyak, membuat lebih banyak catatan, menulis lebih banyak, meringkas, berlatih lagi dan lagi…

    Faktanya, tidak banyak cara untuk belajar bahasa Inggris.

    Jika Anda memikirkannya dengan hati-hati, sering kali, apa yang disebut metode pembelajaran “paling efisien” seringkali merupakan metode yang paling tidak efisien. Karena mereka hanya memberi Anda kepuasan jangka pendek.

    Kunci kemajuan jangka panjang adalah apakah Anda bisa bertahan. Kegigihan berarti melakukan hal yang sama berulang kali.

    Dan lambat laun saya menyadari,

    Saya tidak akan pernah belajar bahasa Inggris,

    Karena selalu ada kata dan penggunaannya yang saya tidak tahu,

    Namun saya bersedia terus belajar hingga hari terakhir.

    Karena belajar seumur hidup adalah cara hidup yang paling keren bagi seseorang.

    ======== https://www.zhihu.com/question/19853667/answer/134793017 Metode saya sangat sederhana dan tidak berotak, dan seharusnya berhasil bagi siswa yang benar-benar menyukai dan ingin belajar bahasa Inggris dengan baik.

    Setiap kali saya melihat seseorang menghafal kata-kata dengan serius, saya merasa orang tersebut pasti tidak bisa belajar bahasa Inggris dengan baik. Semakin banyak kata yang dihafalnya dan semakin serius ia menghafalkannya, maka semakin jauh pula ia dari cita-cita menjadi master bahasa Inggris.

    Saya ingat ketika saya masih kuliah, saya selalu mendengar beberapa teman sekelas mengucapkan “tinggalkan, tinggalkan, a, b, a, n, d, o,” dengan lantang di koridor.

    n, a, b, a, n, d, o, n" berulang kali. Semakin saya melafalkannya, saya semakin bersemangat. Saya mulai melafalkannya dari halaman pertama buku kosakata. Saya bisa melafalkan beberapa halaman dalam satu malam. Saya begitu bersemangat belajar. Itu tidak menyia-nyiakan usaha. Saya mungkin akan melupakan semuanya keesokan harinya setelah saya kembali tidur di malam hari.

    Jika seorang siswa SD atau SMP menghafal kata-kata seperti ini untuk belajar bahasa Inggris, menurut saya tidak ada salahnya. Jika seorang mahasiswa yang ingin mengikuti ujian CET-6 menghafal kata-kata seperti ini untuk persiapan ujian, saya sangat ingin pergi dan mengambil bukunya dan memberinya seteguk. Apakah ini benar-benar belajar bahasa Inggris? Belakangan, saya melihat bahwa orang-orang yang menghafal kata-kata tersebut memiliki anggota tubuh yang relatif berkembang, jadi saya menyerah.

    Namun saya ingin mengatakan, jika Anda mengikuti metode belajar ini untuk belajar bahasa Inggris, maka Anda harus belajar bahasa Mandarin seperti ini. Mulai dari halaman pertama daftar kosakata, sebaiknya Anda menghafalnya seperti ini:

    “Satu, satu, horizontal, horizontal, horizontal.”

    “Dua, dua, horizontal, horizontal, horizontal.”

    “Tiga, tiga, horizontal, horizontal, horizontal, horizontal, horizontal.”

    “Empat, empat, lipatan vertikal, horizontal, lipatan kiri, tangan kanan, horizontal, vertikal, lipatan horizontal, lipatan kiri, tangan kanan, horizontal, vertikal, lipatan horizontal, tangan kiri, tangan kanan, horizontal.”

    . . . . . .

    Jika Anda menghafal “mie biang biang” di Shaanxi, saya pikir Anda akan mati.

    Mari kita lihat cara menulis kata biang! Ini sebenarnya bukan cara Anda belajar bahasa Inggris. Saya belum pernah melihat orang belajar bahasa Mandarin dengan cara ini, tapi banyak orang belajar bahasa Inggris dengan cara ini. Walaupun bahasa Inggris dan Cina berbeda, prinsipnya sama.

    Jadi bagaimana kita harus mempelajarinya?

    Faktanya, Anda bisa membayangkan bagaimana Anda belajar bahasa Mandarin, dan Anda bisa belajar bahasa Inggris darinya.

    Ketika kami masih muda, kami belajar menulis aksara Cina, menulis aksara baru, dan mengenali kata-kata. Hal ini dapat dibandingkan dengan menghafal kata-kata, tapi ini adalah hal-hal yang Anda lakukan ketika Anda berada di sekolah dasar. Anda dapat melakukan ini saat pertama kali belajar suatu bahasa, karena fondasi Anda sangat buruk pada tahap ini, dan Anda tidak tahu kata-kata yang paling umum, jadi Anda perlu menulis kata-kata baru dan menghafal kata-kata, tetapi Anda sudah duduk di bangku SMA, Anda sedang belajar bahasa Mandarin, dan Anda mulai menulis kata-kata baru dari daftar kosakata di buku pelajaran sekolah dasar. Apa konsep penulisan kata-kata baru? Anda sedang kuliah dan harus mengikuti ujian CET-6. Anda menghabiskan sebagian besar waktu Anda mempelajari kata-kata bahasa Inggris. Saya tidak percaya Anda bisa belajar bahasa Inggris dengan baik.

    Bagaimana kita belajar bahasa Mandarin di sekolah menengah?

    Membaca, membaca, dan membaca lagi, dalam bahasa Inggris adalah membaca, membaca, dan membaca, menulis, menulis, dan menulis lagi, dalam bahasa Inggris adalah menulis, menulis, dan menulis.

    Beberapa orang pasti akan membantah saya dan berkata, bagaimana saya bisa membaca jika saya tidak tahu kata-katanya?

    Anda dapat menemukan beberapa artikel yang cocok untuk Anda baca dan banyak membaca. Selama proses membaca, Anda pasti akan menjumpai banyak kata yang belum Anda ketahui. Anda juga akan menemukan kata-kata yang tidak diketahui atau kata-kata yang tidak Anda pahami selama membaca bahasa Mandarin. Ini normal. Apa yang harus kamu lakukan? Cari saja di kamus lalu lanjutkan membaca. Saat volume bacaan Anda meningkat, Anda akan menemukan bahwa artikel pada tingkat ini mengharuskan Anda mencari lebih sedikit kata, dan kemudian Anda akan beralih ke artikel tingkat tinggi untuk dibaca. Terus lakukan ini. Ketika volume bacaan bahasa Inggris Anda mencapai tingkat tertentu, kosakata Anda akan meningkat secara alami.

    Apakah Anda mengerti maksud saya? Jangan menghafal kata-kata, itu akan membosankan untuk diingat. Banyak membaca, membaca seperti orang gila. Ketika kemampuan membaca Anda mencapai tingkat tertentu, kecuali mendengarkan dan berbicara, bahasa Inggris Anda akan lulus.

    Saya khawatir bahasa Inggris saya akan memburuk jika suatu hari saya lupa membaca dalam bahasa Inggris, jadi ponsel saya selalu dalam mode bahasa Inggris. Terkadang orang ingin menggunakan ponsel saya tetapi tidak bisa.

    Belajar bahasa Inggris sangat sederhana dan tidak memerlukan otak. https://www.zhihu.com/question/26677313/answer/230847636?group_id=892423340218806272

=======

Banyak dari konten di atas adalah kutipan. Untuk detailnya, silakan klik tautan yang sesuai: Untuk meringkas cara di atas, jangan takut dengan bahasa Inggris, tetapi pelajarilah dengan giat. Maksud belajar disini adalah berani membaca artikel berbahasa inggris dan pantang menyerah. Saat Anda menemukan kata-kata yang tidak Anda ketahui, Anda harus mencari kamus secara aktif daripada menyerah. Seharusnya tidak menyakitkan. Begitu Anda merasa belajar bahasa Inggris itu menyakitkan, sebaiknya Anda berhenti belajar. Sungguh, pengaruhnya pasti sangat buruk saat ini.

Faktanya, nilai bahasa Inggris saya saat ujian masuk perguruan tinggi naik dari nilai rendah 30 menjadi lebih dari 100. Bagaimana peningkatan saya saat itu? Itu sebenarnya sedang membaca. Saat membaca, saya mencari kata-kata di kamus dan kemudian menghafalnya. Menghafal kata-kata melalui membaca artikel jauh lebih baik daripada menghafal kata-kata saja. Jika fondasinya kurang bagus, Anda bisa memulai dengan artikel sederhana terlebih dahulu, lalu tingkatkan kesulitannya secara bertahap. Untuk artikel teknis, sebenarnya Anda bisa membaca sebagian besarnya dengan bantuan Google Translate. Itu tergantung apakah Anda bisa bertahan. Selama Anda bisa bertahan selama setengah tahun dan membaca tiga artikel berbahasa Inggris dalam seminggu, saya rasa kemampuan bahasa Inggris Anda juga akan meningkat.

=======