36

posibles duplicados:
References Needed for Implementing an Interpreter in C/C++
How to create a language these days?
Learning to write a compilercrear mi propio lenguaje de programación

Sé que algunos C++, muy bueno en php, profesional en html css, bien en Javascript . Así que estaba pensando en cómo se creó C++. Quiero decir, ¿cómo puede la computadora entender qué significan los códigos? ¿Cómo se puede leer ... así que es posible que pueda crear mi propio idioma y cómo?

+7

ya una gran selección de recursos aquí: http://stackoverflow.com/questions/1669/learning-to-write-a-compiler –

+39

Gracias por ese comentario constructivo Paul. –

+2

@Pierre Aquí para ayudar! –

Respuesta

46

Si le interesa el diseño del compilador ("¿cómo puede la computadora entender qué significan los códigos?"), Recomiendo Dragon Book. Lo utilicé en la universidad e incluso creé un lenguaje de programación.

+2

+1: Eso es lo que también leo y creo [Hindi Programming Language] (http://www.sktnetwork.com/portfolio/hindi-programming-language) – shamittomar

+34

No creo que recomiende el libro de dragones a un 13 -edad. –

+19

@mmyers, si él ya sabe algo de C++ y * muy * bueno en php ... él puede tener las habilidades y el conocimiento necesarios para entender Dragon book. Si nada más ayudará a enseñarle qué más necesita saber/aprender * primero *. –

3

Es posible. Debe aprender sobre compiladores y/o intérpretes: para qué sirven y cómo se hacen.

3

inicio aprendizaje ASM y leer sobre cómo funciona el código de bytes y que podría tener una oportunidad :)

+3

La mayoría de los compiladores están escritos en sus propios idiomas [http://en.wikipedia.org/wiki/Bootstrapping_(compilers)]. De manera similar, el intérprete de PHP está escrito principalmente en C, hay poco, si es que hay algún ensamblado involucrado. –

+1

Err, puede escribir compiladores para cualquier idioma en cualquier otro idioma. Quiero decir para la práctica en la universidad creamos lisp usando java, luego java usando labios. Por supuesto, era una sintaxis muy exacta y no extremadamente inteligente. – Parris

+1

@Frank: @Parris: No creo que el argumento de Marc fuera que el compilador debería escribirse en ensamblaje, pero que debería compilarse para el ensamblaje. O tal vez solo estaba respondiendo la parte de la pregunta que decía "¿cómo puede la computadora entender qué significan los códigos?". – sepp2k

19

Si se quiere entender cómo el equipo entiende el código, es posible que desee aprender un poco de lenguaje ensamblador. Es un lenguaje de nivel mucho más bajo y le dará una mejor idea de los tipos de instrucciones simples que realmente se ejecutan. También debería poder hacerse una idea de cómo se implementan construcciones de nivel superior, como bucles con saltos condicionales.

Para una comprensión aún más baja, necesitará estudiar sobre electrónica. La lógica digital le muestra cómo puede tomar "puertas" electrónicas e implementar una CPU genérica que pueda comprender el código máquina generado a partir del código del lenguaje ensamblador.

Por cosas realmente de bajo nivel, se puede estudiar la ciencia de materiales que le puede enseñar cómo hacer realidad las puertas funcionan a un nivel atómico.

Parece una persona ingeniosa. Querrá buscar libros y/o sitios web sobre estos temas, adaptados a su nivel de comprensión y que se centren en lo que más le interesa. Una comprensión bastante completa de todo esto viene con una licenciatura en informática o ingeniería informática, pero muchas cosas son bastante comprensibles para una persona motivada en su posición.

+0

Ni la comprensión del montaje ni la electrónica es necesaria para escribir un lenguaje de alto nivel (aunque sin duda pueden ayudar). Por ejemplo, una gran cantidad de idiomas creados recientemente se ejecutan en la JVM: http://en.wikipedia.org/wiki/List_of_JVM_languages ​​ –

+3

Aunque estas son buenas cosas para aprender, a excepción de la primera, ninguna de estas cosas parece necesaria para escribir una compilador. Incluso el primero no es necesario si uno usa LLVM o tecnología similar. – ergosys

+6

'alto nivel' no se especificó en la pregunta –

7

Yup! Definitivamente es posible. Otros han mencionado el Libro del Dragón, pero también hay mucha información en línea. llvm, por ejemplo, tiene un tutorial sobre la implementación de un lenguaje de programación: http://llvm.org/docs/tutorial/

+3

Ugh, he escrito varios compiladores profesionalmente para lenguajes específicos de dominios pequeños, y recientemente hice mi primer proyecto LLVM y encontré la curva de aprendizaje muy empinada. Seguramente para un estudiante sería mejor hacer un lenguaje de juguete muy pequeño y escribir su propio compilador de bajadas recursivas y el intérprete de códigos de bytes, en lugar de tratar de entender todos los conceptos de compilador de fuerza industrial que necesita para hacer uso de LLVM. –

+0

@Larry Gritz: dependa si está interesado en escribir el compilador o diseñar el idioma. Si compites con generar ensamblado llvm, creo que podría ser bastante simple (una vez que hayas generado tu AST), no significa que no deberías leer un buen libro. –

3

Si sabes C - suena como usted - agarrar una copia usada de este antiguo libro: http://www.amazon.com/Craft-Take-Charge-Programming-Book-Disk/dp/0078818826

En ella hay un capítulo donde el autor crea un intérprete "C", en C. No es académicamente serio como lo sería el libro del Dragón, pero recuerdo que es bastante simple, muy práctico y fácil de seguir, y desde que recién comienza, sería una introducción impresionante a las ideas de una "gramática" para los idiomas, y "tokenizar" un programa.

sería un lugar perfecto para empezar. Además, a $ 0.01 por una copia usada, más barata que el Dragon Book. ;)

11

Sí, es posible crear su propio idioma. Eche un vistazo a los compiladores de compiladores. O el código fuente de algunos lenguajes de scripting si te atreves.Algunas herramientas útiles son yacc, bison y lexx.

Otros han mencionado el libro del dragón. Usamos un libro que creo que se llamaba "teoría y práctica del compilador" en mi época universitaria.

No es necesario aprender ensamblador para escribir un idioma. Por ejemplo, Javascript se ejecuta en algo llamado intérprete, que es una aplicación que ejecuta archivos javascript. En este caso, el intérprete generalmente está integrado en el navegador.

El lenguaje de programa de inicio más fácil podría ser escribir una calculadora basada en texto simple. es decir, tomar un archivo de texto, ejecutarlo y realizar los cálculos. Podrías escribir eso en C++ muy fácilmente.

Mi primer idioma para un proyecto universitario fue un lenguaje definido en BNF. Luego tuvimos que escribir un analizador sintáctico que lo analizó en una estructura de árbol en memoria y luego en algo llamado código de dirección 3 (que es como ensamblador). Podría fácilmente convertir el código de 3 direcciones en ensamblador real o escribir un intérprete para eso.

+4

+1 para comenzar a escribir una calculadora. Sin embargo, trataría de leer algo como el Libro del Dragón y usar un compilador de compilación como Bison o ANTLR. –

+0

De acuerdo, escribir un analizador de expresiones simples e intérprete es un buen primer paso, pero probablemente no responderá a las preguntas del OP sobre cómo funciona C++, cómo funciona el código de la computadora. Sin embargo, no estoy seguro si estoy de acuerdo con los compiladores de compiladores/generadores de analizadores (en este caso particular de aprender cómo funcionan las cosas). Puede valer la pena escribir tu propio tokenizador y analizador de la mano primero, solo para entender qué hacen esas herramientas por ti. – uliwitness

3

Comience con la creación de un analizador. Lea sobre gramáticas EBNF. Esto responderá a su pregunta sobre cómo la computadora puede leer el código. Este es un tema muy avanzado, así que no esperes demasiado de ti, pero diviértete. Algunos recursos que he usado para esto son bison, flex y PLY.

37

"De vez en cuando siento la tentación de diseñar un lenguaje de programación pero luego simplemente me acuesto hasta que se va". - L. Peter Deutsch

EDIT (para aquellos que anhelan contexto):

"[L. Peter Deutsch] also wrote the PDP-1 Lisp 1.5 implementation, Basic PDP-1 LISP, 'while still in short pants' between the age of 12-15 years old."

+1

+1 para defender el sentido común y evitar el masoquismo ... =) (** editado ** para agregar un enlace a una fuente de la cita: http://books.google.com/books?id = nneBa6-mWfgC & lpg = PA436 & ots = gDzsJhOQ3A & dq = Todo% 20now% 20y% 20entonces 20I% 20feel% 20a% 20temptation% 20to% 20design% 20a% 20programación% 20idioma% 20but% 20then% 20I% 20just% 20lie% 20down% 20until% 20it% 20eses% 20away & pg = PA436 # v = onepage & q = Every% 20now% 20and% 20then% 20I% 20feel% 20a% 20temptation% 20to% 20design% 20a% 20programming% 20idioma% 20but% 20then% 20I% 20just% 20lie% 20down% 20todo% 20it% 20esto% 20away & f = falso) –

+0

gracias por el enlace. Me pregunto si mi vida hubiera sido mejor o peor si hubiera leído "Coders at Work" cuando tenía 13 ... – anthony

+2

Podría decir exactamente lo mismo. También hago esto con "big space game" y "mmo". –

1

Si desea una introducción muy general (pero muy bien escrito) a este tema - fundamentos de computación - Recomiendo un libro titulado Código por Charles Petzold. Él explica una serie de temas que le interesan y desde allí puede decidir qué quiere crear usted mismo.

4

Realmente recomiendo Programming Language Pragmatics. Es un gran libro que te lleva desde el lenguaje hasta el funcionamiento de los compiladores y la creación del tuyo. Es un poco más accesible que el Libro del Dragón y explica cómo funcionan las cosas antes de saltar de cabeza.

3

Sí! Interesarse en los compiladores fue mi gancho en CS profesional (anteriormente había estado en una ruta hacia EE, y solo cambié formalmente de bando en la universidad), es una gran manera de aprender un TON por una amplia gama de temas de informática. Eres un poco más joven (yo estaba en la escuela secundaria cuando comencé a perder el tiempo con analizadores e intérpretes), pero ahora hay mucha más información al alcance de la mano.

Comience pequeño: Diseñe el lenguaje más pequeño que pueda imaginar, comience con nada más que una simple calculadora matemática que permita la asignación y sustitución de variables. Cuando te vuelves aventurero, intenta agregar "si" o bucles. Olvídese de las herramientas arcanas como Lex y Yacc, intente escribir a mano un analizador de descenso recursivo simple, tal vez conviértalo en códigos de bytes simples y escriba un intérprete para ello (evite todas las partes difíciles de entender el ensamblaje de una máquina en particular, asignación de registro, etc.). Aprenderás muchísimo con este proyecto.

Como otros, recomiendo el libro del dragón (edición de 1986, no me gusta el nuevo, francamente).

Agregaré que para sus otros proyectos, yo recomiendo usar C o C++, zanjar PHP, no porque sea un intolerante del lenguaje, sino porque creo que trabajar con las dificultades en C/C++ le enseñará mucho más sobre la arquitectura subyacente de la máquina y los problemas del compilador.

(Nota:... Si fueras un profesional, el consejo sería no crear un nuevo lenguaje Eso es casi nunca es la solución correcta, pero como un proyecto para el aprendizaje y la exploración, es fantástico)

Cuestiones relacionadas